source: DCWoRMS/branches/coolemall/src/schedframe/scheduling/tasks/Job.java @ 1150

Revision 1150, 6.4 KB checked in by wojtekp, 12 years ago (diff)
  • Property svn:mime-type set to text/plain
Line 
1package schedframe.scheduling.tasks;
2
3
4import org.qcg.broker.schemas.resreqs.ParentType;
5import org.qcg.broker.schemas.resreqs.ResourceRequirements;
6import org.qcg.broker.schemas.resreqs.Workflow;
7import org.qcg.broker.schemas.resreqs.types.TaskStatesName;
8
9import java.io.StringWriter;
10import java.io.Writer;
11import java.util.ArrayList;
12import java.util.Iterator;
13import java.util.List;
14
15import org.joda.time.DateTime;
16
17import qcg.shared.constants.BrokerConstants;
18
19import schedframe.scheduling.WorkloadUnitHandler;
20import schedframe.scheduling.manager.tasks.JobRegistryImpl;
21
22
23/**
24 *
25 * @author Marcin Krystek
26 *
27 */
28public class Job implements JobInterface<ResourceRequirements> {
29
30        protected List<Task> tasks;
31        protected int senderId;
32        protected boolean isRegistered;
33       
34        private int status;
35       
36        public Job(String id){
37                tasks = new ArrayList<Task>();
38        }
39       
40        public Job(ResourceRequirements resourceRequirements) throws Exception{
41                org.qcg.broker.schemas.resreqs.Task task[] = resourceRequirements.getTask();
42                if(task == null || task.length == 0)
43                        throw new NoSuchFieldException("No tasks are defined for job.");
44               
45                this.tasks = new ArrayList<Task>();
46               
47                for(int i = 0; i < task.length; i++){
48                        this.tasks.add(new Task(task[i]));
49                }
50               
51                isRegistered = true;
52        }
53
54        public void add(Task task) {
55                this.tasks.add(task);
56        }
57       
58        public String getId() {
59                if(this.tasks.size() == 0)
60                        throw new RuntimeException("No tasks are defined for job, so it is not possible to obtain job id.");
61               
62                return this.tasks.get(0).getJobId();
63        }
64       
65        public List<Task> getTask() {
66                return this.tasks;
67        }
68       
69        public Task getTask(String taskId) throws NoSuchFieldException {
70                if(taskId == null)
71                        throw new IllegalArgumentException("TaskId can not be null. Specify appropriate taskId.");
72               
73                if(this.tasks == null || this.tasks.size() == 0)
74                        throw new NoSuchFieldException("No tasks are defined for job.");
75               
76                Task retTask = null;
77               
78                Iterator<Task> itr = this.tasks.iterator();
79                while(itr.hasNext() && retTask == null){
80                        Task task = itr.next();
81                        if(taskId.equals(task.getId())){
82                                retTask = task;
83                        }
84                }
85
86                if(retTask == null)
87                        throw new NoSuchFieldException("Task "+taskId + " is not available in job " + getId());
88               
89                return retTask;
90        }
91       
92        public int getTaskCount() {
93                return this.tasks.size();
94        }
95
96       
97        public ResourceRequirements getDescription() {
98               
99                ResourceRequirements resReq = new ResourceRequirements();
100                if(this.tasks == null)
101                        return resReq;
102               
103                Iterator<Task> itr = this.tasks.iterator();
104               
105                while(itr.hasNext()){
106                        Task task = (Task) itr.next();
107                        resReq.addTask(task.getDescription());
108                }
109               
110                return resReq;
111        }
112
113        public String getDocument() throws Exception {
114                ResourceRequirements resReq = getDescription();
115                Writer writer = new StringWriter();
116               
117                resReq.marshal(writer);
118               
119                return writer.toString();
120        }
121
122        public boolean isFinished(){
123               
124                for(int i = 0; i < tasks.size(); i++){
125                        //if(tasks.get(i).getStatus() != BrokerConstants.TASK_STATUS_FINISHED)
126                        //      return false;
127                        if(!tasks.get(i).isFinished())
128                                return false;
129                }
130                return true;
131        }
132       
133        public DateTime getSubmissionTimeToBroker(){
134                return tasks.get(0).getSubmissionTimeToBroker();
135        }
136       
137        public int getStatus(){
138                boolean isForAll = true;
139                int baseStatus = tasks.get(0).getStatus();
140               
141                for(int i = 1; i < tasks.size() && isForAll; i++){
142                        Task t = tasks.get(i);
143                        isForAll = (t.getStatus() == baseStatus);
144                }
145               
146                if(isForAll && baseStatus == BrokerConstants.TASK_STATUS_FINISHED)
147                        return (int)BrokerConstants.JOB_STATUS_FINISHED;
148               
149                return status;
150        }
151       
152        public boolean setStatus(String taskId, int status){
153                boolean found = false;
154                for(int i = 0; i < tasks.size() && !found; i++){
155                        Task t = tasks.get(i);
156                        if(taskId.equals(t.getId())){
157                                try {
158                                        t.setStatus(status);
159                                } catch (Exception e) {
160                                        // TODO Auto-generated catch block
161                                        e.printStackTrace();
162                                }
163                                found = true;
164                        }
165                }
166                return found;
167        }
168       
169        public void setSenderId(int id){
170                this.senderId = id;
171        }
172       
173        public int getSenderId(){
174                return this.senderId;
175        }
176       
177        public int getUserId(){
178                return this.senderId;
179        }
180
181        public void setStatus(int status){
182                this.status = status;
183        }
184
185        public boolean isRegistered() {
186                return isRegistered;
187        }
188
189        public void register(JobRegistryImpl jobRegistry) {
190                isRegistered = jobRegistry.addJob(this);
191        }
192       
193        @Override
194        public void accept(WorkloadUnitHandler wuh) {
195                wuh.handleJob(this);
196        }
197       
198        private List<Task> getReadyTasks() throws NoSuchFieldException{
199               
200                List<Task> availableTasks = new ArrayList<Task>();
201                int size = tasks.size();
202               
203                for(int i = 0; i < size; i++){
204                        int parCnt;
205                        int previousTaskSucceedCnt = 0;
206                        Task task = tasks.get(i);
207                        if(task.getStatus() != (int)BrokerConstants.TASK_STATUS_UNSUBMITTED)
208                                continue;
209                        //the following procedure supports only one nested structure
210                        Workflow w = task.getDescription().getWorkflow();
211                        if (w == null){
212                                availableTasks.add(task);
213                                continue;
214                        }
215                        if(w.getAnd() != null) {
216                                parCnt = w.getAnd().getParentOpTypeItemCount();
217                                if(parCnt == 0)
218                                {
219                                        availableTasks.add(task);
220                                }
221                                else
222                                {
223                                        for(int j = 0; j < parCnt; j++){
224                                                ParentType par = w.getAnd().getParentOpTypeItem(j).getParent();
225                                                if(par.getTriggerState().compareTo(TaskStatesName.FINISHED) == 0){
226                                                        if(!getTask(par.getContent()).isFinished()){
227                                                                break;
228                                                        }
229                                                }
230                                                previousTaskSucceedCnt++;
231                                        }
232
233                                        if(previousTaskSucceedCnt == parCnt)
234                                                availableTasks.add(task);
235                                }
236                        }
237                        else if(w.getOr() != null) {
238                                parCnt = w.getOr().getParentOpTypeItemCount();
239                                if(parCnt == 0)
240                                {
241                                        availableTasks.add(task);
242                                }
243                                else
244                                {
245                                        for(int j = 0; j < parCnt; j++){
246                                                ParentType par = w.getOr().getParentOpTypeItem(j).getParent();
247                                                if(par.getTriggerState().compareTo(TaskStatesName.FINISHED) == 0){
248                                                        if(!getTask(par.getContent()).isFinished()){
249                                                                continue;
250                                                        }
251                                                }
252                                                previousTaskSucceedCnt++;
253                                        }
254
255                                        if(previousTaskSucceedCnt > 0)
256                                                availableTasks.add(task);
257                                }
258                        }
259                        else {
260                                parCnt = w.getParentCount();
261                                if(parCnt == 0)
262                                {
263                                        availableTasks.add(task);
264                                }
265                                else
266                                {
267                                        for(int j = 0; j < parCnt; j++){
268                                                ParentType par = w.getParent(j);
269                                                if(par.getTriggerState().compareTo(TaskStatesName.FINISHED) == 0){
270                                                        if(!getTask(par.getContent()).isFinished()){
271                                                                continue;
272                                                        }
273                                                }
274                                                previousTaskSucceedCnt++;
275                                        }
276
277                                        if(previousTaskSucceedCnt == parCnt)
278                                                availableTasks.add(task);
279                                }
280                        }
281                }               
282                return availableTasks;
283        }
284       
285}
Note: See TracBrowser for help on using the repository browser.