At last the EntityBatchingProducerNode is working. This will replace the old
[mir.git] / source / mircoders / global / JobQueue.java
1 package mircoders.global;
2
3 import java.util.*;
4
5 // important: objects passed as data must not be altered once put into a job
6
7 public class JobQueue {
8   private List jobs;
9   private Map dataToJob;
10
11   public static final int STATUS_PENDING = 0;
12   public static final int STATUS_PROCESSING = 1;
13   public static final int STATUS_PROCESSED = 2;
14
15   public JobQueue() {
16     jobs = new Vector();
17     dataToJob = new HashMap();
18   }
19
20   public void appendJob(Object aData) {
21     synchronized (jobs) {
22       Job job = new Job(aData);
23       jobs.add(job);
24       dataToJob.put(aData, job);
25     }
26   }
27
28   public Object acquirePendingJob() {
29     synchronized (jobs) {
30       Iterator i = jobs.iterator();
31
32       while (i.hasNext()) {
33         Job job = (Job) i.next();
34
35         if (job.setProcessing()) {
36           return job.getData();
37         }
38       }
39     }
40
41     return null;
42   }
43
44   public void flagOffJob(Object aData) {
45     synchronized (jobs) {
46       Job job = (Job) dataToJob.get(aData);
47
48       if (job!=null) {
49         job.setProcessed();
50       }
51     }
52   }
53
54   public void cleanupJobs() {
55     synchronized (jobs) {
56       Iterator i = jobs.iterator();
57
58       while (i.hasNext()) {
59         Job job = (Job) i.next();
60
61         if (job.hasBeenProcessed()) {
62           i.remove();
63         }
64       }
65     }
66   }
67
68   public class Job {
69     private Object data;
70     private int status;
71     private int identifier;
72
73     public Job(Object aData) {
74       data = aData;
75       status = STATUS_PENDING;
76     }
77
78     public Object getData() {
79       return data;
80     }
81
82     public int getStatus() {
83       synchronized(this) {
84         return status;
85       }
86     }
87
88     public boolean setProcessing() {
89       return setStatus(STATUS_PENDING, STATUS_PROCESSING);
90     }
91
92     public void setProcessed() {
93       setStatus(STATUS_PROCESSING, STATUS_PROCESSED);
94     }
95
96     public boolean hasBeenProcessed() {
97       return getStatus() == STATUS_PROCESSED;
98     }
99
100     public boolean isPending() {
101       return getStatus() == STATUS_PENDING;
102     }
103
104     private boolean setStatus(int anOldStatus, int aNewStatus) {
105       synchronized(this) {
106         if (status == anOldStatus) {
107           status = aNewStatus;
108           return true;
109         }
110         else {
111           return false;
112         }
113       }
114     }
115
116   }
117 }
118