introduced AdapterEntityModel
[mir.git] / source / mircoders / global / ProducerEngine.java
1 package mircoders.global;
2
3 import java.util.*;
4 import java.io.*;
5 import mir.producer.*;
6 import mir.util.*;
7 import multex.Exc;
8 import multex.Failure;
9
10 public class ProducerEngine {
11 //  private Map producers;
12   private JobQueue producerJobQueue;
13   private Thread queueThread;
14   private PrintWriter log;
15
16   protected ProducerEngine() {
17 //    producers = MirGlobal.localizer().producers().factories();
18     producerJobQueue = new JobQueue();
19     try {
20       RandomAccessFile raFile = (new RandomAccessFile(MirGlobal.getConfigProperty("Home") + "/" + MirGlobal.getConfigProperty("Producer.Logfile"), "rw"));
21                         raFile.seek(raFile.length());
22                 log = new PrintWriter(new FileWriter( raFile.getFD()));
23     }
24     catch (Exception e) {
25 //      throw new ProducerEngineRuntimeExc("Creating PrintWriter log failed",e);
26       log = new PrintWriter(new NullWriter());
27     }
28     queueThread = new Thread(new ProducerJobQueueThread());
29     queueThread.start();
30   }
31
32   public void addJob(String aProducerFactory, String aVerb) {
33 // ML: TODO: should check if a similar job is already pending
34     producerJobQueue.appendJob(new ProducerJob(aProducerFactory, aVerb));
35     log.println(aProducerFactory+"."+aVerb+" added to queue");
36     log.flush();
37   }
38
39   public void printQueueStatus(PrintWriter aWriter) {
40     Iterator iterator = producerJobQueue.makeJobListSnapshot().iterator();
41     producerJobQueue.cleanupJobs();
42     JobQueue.Job job;
43
44     while (iterator.hasNext()) {
45       job = (JobQueue.Job) iterator.next();
46       ProducerJob producerJob = (ProducerJob) job.getData();
47
48       aWriter.print(producerJob.factoryName + "." + producerJob.verb);
49       if (job.hasBeenProcessed())
50         aWriter.print(" processed");
51       else if (job.isProcessing())
52         aWriter.print(" processing");
53       else if (job.isPending())
54         aWriter.print(" pending");
55       else
56         aWriter.print(" unknown status");
57
58       aWriter.println("<br/>");
59     }
60   }
61
62   private void produceNow(String aProducerFactory, String aVerb, PrintWriter aLogger) {
63     try {
64                   long startTime;
65                   long endTime;
66
67                   startTime = System.currentTimeMillis();
68
69       aLogger.println("Producing (" + aProducerFactory + "," + aVerb + ")");
70
71       ProducerFactory factory = (ProducerFactory) MirGlobal.localizer().producers().factories().get(aProducerFactory);
72
73       if (factory == null )
74         throw new Exception("No producer factory '"+aProducerFactory+"' present.");
75
76       Producer producer = factory.makeProducer(aVerb);
77
78       producer.produce(aLogger);
79
80                   endTime = System.currentTimeMillis();
81
82                   aLogger.println("Time: " + (endTime-startTime) + " ms<br>");
83     }
84     catch (Throwable e) {
85       try {
86         aLogger.println("exception occurred:<br>");
87         aLogger.println(e.getMessage());
88         e.printStackTrace(aLogger);
89       }
90       catch (Throwable f) {
91       }
92     }
93   }
94
95   private class ProducerJob {
96     private String factoryName;
97     private String verb;
98
99     public ProducerJob(String aFactory, String aVerb) {
100       factoryName = aFactory;
101       verb = aVerb;
102     }
103
104     public void execute() {
105       ProducerFactory factory;
106       Producer producer;
107                   long startTime;
108                   long endTime;
109
110                   startTime = System.currentTimeMillis();
111       log.println("Producing job: "+factoryName+"."+verb);
112
113       try {
114         factory = (ProducerFactory) MirGlobal.localizer().producers().factories().get( factoryName );
115
116         if (factory!=null) {
117           synchronized(factory) {
118             producer = factory.makeProducer(verb);
119           }
120           if (producer!=null) {
121             producer.produce(log);
122           }
123         }
124       }
125       catch (Throwable t) {
126         log.println("  exception "+t.getMessage());
127         t.printStackTrace(log);
128       }
129       log.println("Done producing job: "+factoryName+"."+verb);
130                   endTime = System.currentTimeMillis();
131
132                   log.println("Time: " + (endTime-startTime) + " ms");
133                   log.flush();
134     }
135   }
136
137   private class ProducerJobQueueThread implements Runnable {
138     public void run() {
139       log.println("starting ProducerJobQueueThread");
140       log.flush();
141
142       while (true) {
143         ProducerJob job = (ProducerJob) producerJobQueue.acquirePendingJob();
144         if (job!=null) {
145           job.execute();
146           producerJobQueue.flagOffJob(job);
147         }
148         else
149         {
150           try {
151             Thread.sleep(1500);
152           }
153           catch (InterruptedException e) {
154           }
155         }
156       }
157     }
158   }
159
160
161   public static class ProducerEngineRuntimeExc extends Failure {
162     public ProducerEngineRuntimeExc(String msg, Exception cause){
163       super(msg,cause);
164     }
165   }
166
167 }