1 /******************************************************************************
2 
3   This source file is part of the MoleQueue project.
4 
5   Copyright 2012 Kitware, Inc.
6 
7   This source code is released under the New BSD License, (the "License").
8 
9   Unless required by applicable law or agreed to in writing, software
10   distributed under the License is distributed on an "AS IS" BASIS,
11   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   See the License for the specific language governing permissions and
13   limitations under the License.
14 
15 ******************************************************************************/
16 
17 #include "idtypeutils.h"
18 #include "job.h"
19 #include "jobdata.h"
20 #include "jobmanager.h"
21 
22 namespace MoleQueue
23 {
24 
Job(JobData * jobdata)25 Job::Job(JobData *jobdata)
26   : JobReferenceBase(jobdata)
27 {
28 }
29 
Job(JobManager * jobManager,IdType mQId)30 Job::Job(JobManager *jobManager, IdType mQId)
31   : JobReferenceBase(jobManager, mQId)
32 {
33 }
34 
Job(const JobReferenceBase & other)35 Job::Job(const JobReferenceBase &other)
36   : JobReferenceBase(other)
37 {
38 }
39 
~Job()40 Job::~Job()
41 {
42 }
43 
setFromJson(const QJsonObject & state)44 void Job::setFromJson(const QJsonObject &state)
45 {
46   if (warnIfInvalid())
47     m_jobData->setFromJson(state);
48 }
49 
toJsonObject() const50 QJsonObject Job::toJsonObject() const
51 {
52   if (warnIfInvalid())
53     return m_jobData->toJsonObject();
54   return QJsonObject();
55 }
56 
setQueue(const QString & newQueue)57 void Job::setQueue(const QString &newQueue)
58 {
59 
60   if (warnIfInvalid())
61     m_jobData->setQueue(newQueue);
62 }
63 
queue() const64 QString Job::queue() const
65 {
66   if (warnIfInvalid())
67     return m_jobData->queue();
68   return QString();
69 }
70 
setProgram(const QString & newProgram)71 void Job::setProgram(const QString &newProgram)
72 {
73   if (warnIfInvalid())
74     m_jobData->setProgram(newProgram);
75 }
76 
program() const77 QString Job::program() const
78 {
79   if (warnIfInvalid())
80     return m_jobData->program();
81   return QString();
82 }
83 
setJobState(JobState state)84 void Job::setJobState(JobState state)
85 {
86   if (warnIfInvalid())
87     m_jobData->jobManager()->setJobState(moleQueueId(), state);
88 }
89 
jobState() const90 JobState Job::jobState() const
91 {
92   if (warnIfInvalid())
93     return m_jobData->jobState();
94   return MoleQueue::Unknown;
95 }
96 
setDescription(const QString & newDesc)97 void Job::setDescription(const QString &newDesc)
98 {
99   if (warnIfInvalid())
100     m_jobData->setDescription(newDesc);
101 }
102 
description() const103 QString Job::description() const
104 {
105   if (warnIfInvalid())
106     return m_jobData->description();
107   return QString();
108 }
109 
setInputFile(const FileSpecification & spec)110 void Job::setInputFile(const FileSpecification &spec)
111 {
112   if (warnIfInvalid())
113     m_jobData->setInputFile(spec);
114 }
115 
inputFile() const116 FileSpecification Job::inputFile() const
117 {
118   if (warnIfInvalid())
119     return m_jobData->inputFile();
120   return FileSpecification();
121 }
122 
setAdditionalInputFiles(const QList<FileSpecification> & files)123 void Job::setAdditionalInputFiles(const QList<FileSpecification> &files)
124 {
125   if (warnIfInvalid())
126     m_jobData->setAdditionalInputFiles(files);
127 }
128 
additionalInputFiles() const129 QList<FileSpecification> Job::additionalInputFiles() const
130 {
131   if (warnIfInvalid())
132     return m_jobData->additionalInputFiles();
133   return QList<FileSpecification>();
134 }
135 
addInputFile(const FileSpecification & spec)136 void Job::addInputFile(const FileSpecification &spec)
137 {
138   if (warnIfInvalid()) {
139     m_jobData->additionalInputFilesRef().append(spec);
140     m_jobData->modified();
141   }
142 }
143 
setOutputDirectory(const QString & path)144 void Job::setOutputDirectory(const QString &path)
145 {
146   if (warnIfInvalid())
147     m_jobData->setOutputDirectory(path);
148 }
149 
outputDirectory() const150 QString Job::outputDirectory() const
151 {
152   if (warnIfInvalid())
153     return m_jobData->outputDirectory();
154   return QString();
155 }
156 
setLocalWorkingDirectory(const QString & path)157 void Job::setLocalWorkingDirectory(const QString &path)
158 {
159   if (warnIfInvalid())
160     m_jobData->setLocalWorkingDirectory(path);
161 }
162 
localWorkingDirectory() const163 QString Job::localWorkingDirectory() const
164 {
165   if (warnIfInvalid())
166     return m_jobData->localWorkingDirectory();
167   return QString();
168 }
169 
setCleanRemoteFiles(bool clean)170 void Job::setCleanRemoteFiles(bool clean)
171 {
172   if (warnIfInvalid())
173     m_jobData->setCleanRemoteFiles(clean);
174 }
175 
cleanRemoteFiles() const176 bool Job::cleanRemoteFiles() const
177 {
178   if (warnIfInvalid())
179     return m_jobData->cleanRemoteFiles();
180   return false;
181 }
182 
setRetrieveOutput(bool b)183 void Job::setRetrieveOutput(bool b)
184 {
185   if (warnIfInvalid())
186     m_jobData->setRetrieveOutput(b);
187 }
188 
retrieveOutput() const189 bool Job::retrieveOutput() const
190 {
191   if (warnIfInvalid())
192     return m_jobData->retrieveOutput();
193   return false;
194 }
195 
setCleanLocalWorkingDirectory(bool b)196 void Job::setCleanLocalWorkingDirectory(bool b)
197 {
198   if (warnIfInvalid())
199     m_jobData->setCleanLocalWorkingDirectory(b);
200 }
201 
cleanLocalWorkingDirectory() const202 bool Job::cleanLocalWorkingDirectory() const
203 {
204   if (warnIfInvalid())
205     return m_jobData->cleanLocalWorkingDirectory();
206   return false;
207 }
208 
setHideFromGui(bool b)209 void Job::setHideFromGui(bool b)
210 {
211   if (warnIfInvalid())
212     m_jobData->setHideFromGui(b);
213 }
214 
hideFromGui() const215 bool Job::hideFromGui() const
216 {
217   if (warnIfInvalid())
218     return m_jobData->hideFromGui();
219   return false;
220 }
221 
setPopupOnStateChange(bool b)222 void Job::setPopupOnStateChange(bool b)
223 {
224   if (warnIfInvalid())
225     m_jobData->setPopupOnStateChange(b);
226 }
227 
popupOnStateChange() const228 bool Job::popupOnStateChange() const
229 {
230   if (warnIfInvalid())
231     return m_jobData->popupOnStateChange();
232   return false;
233 }
234 
setNumberOfCores(int num)235 void Job::setNumberOfCores(int num)
236 {
237   if (warnIfInvalid())
238     m_jobData->setNumberOfCores(num);
239 }
240 
numberOfCores() const241 int Job::numberOfCores() const
242 {
243   if (warnIfInvalid())
244     return m_jobData->numberOfCores();
245   return -1;
246 }
247 
setMaxWallTime(int minutes)248 void Job::setMaxWallTime(int minutes)
249 {
250   if (warnIfInvalid())
251     m_jobData->setMaxWallTime(minutes);
252 }
253 
maxWallTime() const254 int Job::maxWallTime() const
255 {
256   if (warnIfInvalid())
257     return m_jobData->maxWallTime();
258   return -1;
259 }
260 
setMoleQueueId(IdType id)261 void Job::setMoleQueueId(IdType id)
262 {
263   if (warnIfInvalid()) {
264     m_jobData->setMoleQueueId(id);
265     m_jobData->jobManager()->moleQueueIdChanged(*this);
266   }
267 }
268 
moleQueueId() const269 IdType Job::moleQueueId() const
270 {
271   if (warnIfInvalid())
272     return m_jobData->moleQueueId();
273   return InvalidId;
274 }
275 
setQueueId(IdType id)276 void Job::setQueueId(IdType id)
277 {
278   if (warnIfInvalid())
279     m_jobData->jobManager()->setJobQueueId(m_jobData->moleQueueId(), id);
280 }
281 
queueId() const282 IdType Job::queueId() const
283 {
284   if (warnIfInvalid())
285     return m_jobData->queueId();
286   return InvalidId;
287 }
288 
setKeywords(const QHash<QString,QString> & keyrep)289 void Job::setKeywords(const QHash<QString, QString> &keyrep)
290 {
291   if (warnIfInvalid())
292     m_jobData->setKeywords(keyrep);
293 }
294 
keywords() const295 QHash<QString, QString> Job::keywords() const
296 {
297   if (warnIfInvalid())
298     return m_jobData->keywords();
299   return QHash<QString, QString>();
300 }
301 
setKeywordReplacement(const QString & keyword,const QString & replacement)302 void Job::setKeywordReplacement(const QString &keyword, const QString &replacement)
303 {
304   if (warnIfInvalid()) {
305     m_jobData->keywordsRef().insert(keyword, replacement);
306     m_jobData->modified();
307   }
308 }
309 
hasKeywordReplacement(const QString & keyword) const310 bool Job::hasKeywordReplacement(const QString &keyword) const
311 {
312   if (warnIfInvalid())
313     return m_jobData->keywords().contains(keyword);
314   return false;
315 }
316 
lookupKeywordReplacement(const QString & keyword) const317 QString Job::lookupKeywordReplacement(const QString &keyword) const
318 {
319   if (warnIfInvalid())
320     return m_jobData->keywords().value(keyword);
321   return QString();
322 }
323 
replaceKeywords(QString & launchScript) const324 void Job::replaceKeywords(QString &launchScript) const
325 {
326   if (!warnIfInvalid())
327     return;
328 
329   const QHash<QString, QString> &keywordHash = m_jobData->keywordsRef();
330   foreach (const QString &key, keywordHash.keys()) {
331     QString keyword = QString("$$%1$$").arg(key);
332     launchScript.replace(keyword, keywordHash.value(key));
333   }
334 
335   FileSpecification inputFileSpec(inputFile());
336   if (inputFileSpec.isValid()) {
337     launchScript.replace("$$inputFileName$$", inputFileSpec.filename());
338     launchScript.replace("$$inputFileBaseName$$", inputFileSpec.fileBaseName());
339   }
340 
341   launchScript.replace("$$moleQueueId$$", idTypeToString(moleQueueId()));
342 
343   launchScript.replace("$$numberOfCores$$",
344                        QString::number(numberOfCores()));
345 }
346 
347 } // end namespace MoleQueue
348