comparison Core/JobsEngine/JobInfo.cpp @ 2569:2af17cd5eb1f jobs

reorganization
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 07 May 2018 15:37:20 +0200
parents
children 3372c5255333
comparison
equal deleted inserted replaced
2568:a46094602346 2569:2af17cd5eb1f
1 /**
2 * Orthanc - A Lightweight, RESTful DICOM Store
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
4 * Department, University Hospital of Liege, Belgium
5 * Copyright (C) 2017-2018 Osimis S.A., Belgium
6 *
7 * This program is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation, either version 3 of the
10 * License, or (at your option) any later version.
11 *
12 * In addition, as a special exception, the copyright holders of this
13 * program give permission to link the code of its release with the
14 * OpenSSL project's "OpenSSL" library (or with modified versions of it
15 * that use the same license as the "OpenSSL" library), and distribute
16 * the linked executables. You must obey the GNU General Public License
17 * in all respects for all of the code used other than "OpenSSL". If you
18 * modify file(s) with this exception, you may extend this exception to
19 * your version of the file(s), but you are not obligated to do so. If
20 * you do not wish to do so, delete this exception statement from your
21 * version. If you delete this exception statement from all source files
22 * in the program, then also delete it here.
23 *
24 * This program is distributed in the hope that it will be useful, but
25 * WITHOUT ANY WARRANTY; without even the implied warranty of
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
27 * General Public License for more details.
28 *
29 * You should have received a copy of the GNU General Public License
30 * along with this program. If not, see <http://www.gnu.org/licenses/>.
31 **/
32
33
34 #include "../PrecompiledHeaders.h"
35 #include "JobInfo.h"
36
37 #include "../OrthancException.h"
38
39 namespace Orthanc
40 {
41 JobInfo::JobInfo(const std::string& id,
42 int priority,
43 JobState state,
44 const JobStatus& status,
45 const boost::posix_time::ptime& creationTime,
46 const boost::posix_time::ptime& lastStateChangeTime,
47 const boost::posix_time::time_duration& runtime) :
48 id_(id),
49 priority_(priority),
50 state_(state),
51 timestamp_(boost::posix_time::microsec_clock::universal_time()),
52 creationTime_(creationTime),
53 lastStateChangeTime_(lastStateChangeTime),
54 runtime_(runtime),
55 hasEta_(false),
56 status_(status)
57 {
58 if (state_ == JobState_Running)
59 {
60 float ms = static_cast<float>(runtime_.total_milliseconds());
61
62 if (status_.GetProgress() > 0.01f &&
63 ms > 0.01f)
64 {
65 float remaining = boost::math::llround(1.0f - status_.GetProgress()) * ms;
66 eta_ = timestamp_ + boost::posix_time::milliseconds(remaining);
67 hasEta_ = true;
68 }
69 }
70 }
71
72
73 JobInfo::JobInfo() :
74 priority_(0),
75 state_(JobState_Failure),
76 timestamp_(boost::posix_time::microsec_clock::universal_time()),
77 creationTime_(timestamp_),
78 lastStateChangeTime_(timestamp_),
79 runtime_(boost::posix_time::milliseconds(0)),
80 hasEta_(false)
81 {
82 }
83
84
85 bool JobInfo::HasCompletionTime() const
86 {
87 return (state_ == JobState_Success ||
88 state_ == JobState_Failure);
89 }
90
91
92 const boost::posix_time::ptime& JobInfo::GetEstimatedTimeOfArrival() const
93 {
94 if (hasEta_)
95 {
96 return eta_;
97 }
98 else
99 {
100 throw OrthancException(ErrorCode_BadSequenceOfCalls);
101 }
102 }
103
104
105 const boost::posix_time::ptime& JobInfo::GetCompletionTime() const
106 {
107 if (HasCompletionTime())
108 {
109 return lastStateChangeTime_;
110 }
111 else
112 {
113 throw OrthancException(ErrorCode_BadSequenceOfCalls);
114 }
115 }
116
117
118 void JobInfo::Format(Json::Value& target) const
119 {
120 target = Json::objectValue;
121 target["ID"] = id_;
122 target["Priority"] = priority_;
123 target["ErrorCode"] = static_cast<int>(status_.GetErrorCode());
124 target["ErrorDescription"] = EnumerationToString(status_.GetErrorCode());
125 target["State"] = EnumerationToString(state_);
126 target["Timestamp"] = boost::posix_time::to_iso_string(timestamp_);
127 target["CreationTime"] = boost::posix_time::to_iso_string(creationTime_);
128 target["Runtime"] = static_cast<uint32_t>(runtime_.total_milliseconds());
129 target["Progress"] = boost::math::iround(status_.GetProgress() * 100.0f);
130 target["Description"] = status_.GetDescription();
131
132 if (HasEstimatedTimeOfArrival())
133 {
134 target["EstimatedTimeOfArrival"] = boost::posix_time::to_iso_string(GetEstimatedTimeOfArrival());
135 }
136
137 if (HasCompletionTime())
138 {
139 target["CompletionTime"] = boost::posix_time::to_iso_string(GetCompletionTime());
140 }
141 }
142 }