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

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