{
_I("Initialize JobManager-%u", static_cast<unsigned>(__uid));
__restore();
- __dump();
}
JobManager::~JobManager()
int jobId = 0;
- //TODO: duplication test
+ JobInfo* duplicate = __getDuplicate(owner->getName(), jobInfo);
+ if (duplicate) {
+ _W("Duplicate found: Job-%d", duplicate->getId());
+ delete jobInfo;
+ return duplicate->getId();
+ }
if (jobInfo->getType() == JobInfo::Type::PERIODIC) {
jobId = __addPeriodicJob(static_cast<PeriodicJobInfo*>(jobInfo), owner);
int JobManager::startJob(int jobId, IClient* owner)
{
- JobRunner* jobRunner = __findRunner(owner->getName(), jobId);
+ JobRunner* jobRunner = __getRunner(owner->getName(), jobId);
IF_FAIL_RETURN(jobRunner, E_PARAM);
if (jobRunner->isStarted()) {
int JobManager::stopJob(int jobId, IClient* owner)
{
- JobRunner* jobRunner = __findRunner(owner->getName(), jobId);
+ JobRunner* jobRunner = __getRunner(owner->getName(), jobId);
IF_FAIL_RETURN(jobRunner, E_PARAM);
if (!jobRunner->isStarted()) {
int JobManager::removeJob(int jobId, IClient* owner)
{
- JobRunner* runner = __findRunner(owner->getName(), jobId);
+ JobRunner* runner = __getRunner(owner->getName(), jobId);
IF_FAIL_RETURN_TAG(runner, E_PARAM, _W, "Not found");
if (runner->isStarted())
JobInfo* JobManager::getJobInfo(int jobId, IClient* owner)
{
- JobRunner* jobRunner = __findRunner(owner->getName(), jobId);
+ JobRunner* jobRunner = __getRunner(owner->getName(), jobId);
IF_FAIL_RETURN(jobRunner, NULL);
return jobRunner->getJobInfo();
return jobInfos;
}
+JobInfo* JobManager::__getDuplicate(const std::string& ownerId, JobInfo* target)
+{
+ for (auto* runner : __jobRunners) {
+ if (runner->getOwner() != ownerId)
+ continue;
+
+ if (*(runner->getJobInfo()) != *target)
+ continue;
+
+ return runner->getJobInfo();
+ }
+
+ return NULL;
+}
+
bool JobManager::__isPermitted(IClient* client, const std::string& uri)
{
//TODO: permission check
throw static_cast<int>(E_PARAM);
}
+
+
int JobManager::__generateJobId()
{
if (++__lastJobId < 0)
return true;
}
-JobRunner* JobManager::__findRunner(const std::string& ownerId, int jobId)
+JobRunner* JobManager::__getRunner(const std::string& ownerId, int jobId)
{
for (auto& runner : __jobRunners) {
- if (runner->getJobId() == jobId)
+ if (runner->getJobId() == jobId && runner->getOwner() == ownerId)
return runner;
}
__jobRunners.clear();
}
-
-void JobManager::__dump()
-{
- for (auto& runner : __jobRunners) {
- _D("%s : %d", runner->getOwner().c_str(), runner->getJobId());
- }
-}
int __addPeriodicJob(PeriodicJobInfo* jobInfo, IClient* owner);
int __addOnDemandJob(OnDemandJobInfo* jobInfo, IClient* owner);
+ JobInfo* __getDuplicate(const std::string& onwerId, JobInfo* target);
+
bool __isPermitted(IClient* client, const std::string& uri);
void __verifyPeriodicJob(PeriodicJobInfo* jobInfo, IClient* owner);
unsigned int __addRunner(JobRunner* runner);
bool __removeRunner(JobRunner* runner);
- JobRunner* __findRunner(const std::string& ownerId, int jobId);
- std::vector<JobRunner*> __findRunners(const std::string& ownerId);
+ JobRunner* __getRunner(const std::string& ownerId, int jobId);
+ std::vector<JobRunner*> __getRunners(const std::string& ownerId);
void __restore();
void __release();
- void __dump();
uid_t __uid;
std::list<JobRunner*> __jobRunners;
bool JobInfo::operator==(const JobInfo& rhs) const
{
- //TODO: compare two JobInfo, but ignore jobId & started flag
- return false;
+ Json::Value self;
+ Json::Value opponent;
+
+ this->toJson(self);
+ rhs.toJson(opponent);
+
+ self.removeMember(KEY_JOB_ID);
+ self.removeMember(KEY_STARTED);
+
+ opponent.removeMember(KEY_JOB_ID);
+ opponent.removeMember(KEY_STARTED);
+
+ return (self == opponent);
+}
+
+bool JobInfo::operator!=(const JobInfo& rhs) const
+{
+ return !operator==(rhs);
}
bool JobInfo::isDisjunction() const