comparison OrthancServer/Scheduler/ServerJob.cpp @ 781:f0ac3a53ccf2 lua-scripting

scheduler
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 30 Apr 2014 18:30:05 +0200
parents
children 13e230bbd882
comparison
equal deleted inserted replaced
779:76eb563f08f0 781:f0ac3a53ccf2
1 /**
2 * Orthanc - A Lightweight, RESTful DICOM Store
3 * Copyright (C) 2012-2014 Medical Physics Department, CHU of Liege,
4 * Belgium
5 *
6 * This program is free software: you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation, either version 3 of the
9 * License, or (at your option) any later version.
10 *
11 * In addition, as a special exception, the copyright holders of this
12 * program give permission to link the code of its release with the
13 * OpenSSL project's "OpenSSL" library (or with modified versions of it
14 * that use the same license as the "OpenSSL" library), and distribute
15 * the linked executables. You must obey the GNU General Public License
16 * in all respects for all of the code used other than "OpenSSL". If you
17 * modify file(s) with this exception, you may extend this exception to
18 * your version of the file(s), but you are not obligated to do so. If
19 * you do not wish to do so, delete this exception statement from your
20 * version. If you delete this exception statement from all source files
21 * in the program, then also delete it here.
22 *
23 * This program is distributed in the hope that it will be useful, but
24 * WITHOUT ANY WARRANTY; without even the implied warranty of
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
26 * General Public License for more details.
27 *
28 * You should have received a copy of the GNU General Public License
29 * along with this program. If not, see <http://www.gnu.org/licenses/>.
30 **/
31
32
33 #include "ServerJob.h"
34
35 #include "../../Core/OrthancException.h"
36 #include "../../Core/Toolbox.h"
37 #include "../../Core/Uuid.h"
38
39 namespace Orthanc
40 {
41 void ServerJob::CheckOrdering()
42 {
43 std::map<ServerFilterInstance*, unsigned int> index;
44
45 unsigned int count = 0;
46 for (std::list<ServerFilterInstance*>::const_iterator
47 it = filters_.begin(); it != filters_.end(); it++)
48 {
49 index[*it] = count++;
50 }
51
52 for (std::list<ServerFilterInstance*>::const_iterator
53 it = filters_.begin(); it != filters_.end(); it++)
54 {
55 const std::list<ServerFilterInstance*>& nextFilters = (*it)->GetNextFilters();
56
57 for (std::list<ServerFilterInstance*>::const_iterator
58 next = nextFilters.begin(); next != nextFilters.end(); next++)
59 {
60 if (index.find(*next) == index.end() ||
61 index[*next] <= index[*it])
62 {
63 // You must reorder your calls to "ServerJob::AddFilter"
64 throw OrthancException("Bad ordering of filters in a job");
65 }
66 }
67 }
68 }
69
70
71 size_t ServerJob::Submit(SharedMessageQueue& target,
72 ServerFilterInstance::IListener& listener)
73 {
74 if (submitted_)
75 {
76 // This job has already been submitted
77 throw OrthancException(ErrorCode_BadSequenceOfCalls);
78 }
79
80 CheckOrdering();
81
82 size_t size = filters_.size();
83
84 for (std::list<ServerFilterInstance*>::iterator
85 it = filters_.begin(); it != filters_.end(); it++)
86 {
87 target.Enqueue(*it);
88 }
89
90 filters_.clear();
91 submitted_ = true;
92
93 return size;
94 }
95
96
97 ServerJob::ServerJob()
98 {
99 jobId_ = Toolbox::GenerateUuid();
100 submitted_ = false;
101 description_ = "no description";
102 }
103
104
105 ServerJob::~ServerJob()
106 {
107 for (std::list<ServerFilterInstance*>::iterator
108 it = filters_.begin(); it != filters_.end(); it++)
109 {
110 delete *it;
111 }
112 }
113
114
115 ServerFilterInstance& ServerJob::AddFilter(IServerFilter* filter)
116 {
117 if (submitted_)
118 {
119 throw OrthancException(ErrorCode_BadSequenceOfCalls);
120 }
121
122 filters_.push_back(new ServerFilterInstance(filter, jobId_));
123
124 return *filters_.back();
125 }
126 }