55c49440f4600e1a4c835cbfdb344d2e6b3f6eb1
[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                 log = new PrintWriter(new FileWriter( (new RandomAccessFile(MirGlobal.getConfigProperty("Home") + "/" + MirGlobal.getConfigProperty("Producer.Logfile"), "rw")).getFD()));
21     }
22     catch (Exception e) {
23 //      throw new ProducerEngineRuntimeExc("Creating PrintWriter log failed",e);
24       log = new PrintWriter(new NullWriter());
25     }
26     queueThread = new Thread(new ProducerJobQueueThread());
27     queueThread.start();
28   }
29
30   public void addJob(String aProducerFactory, String aVerb) {
31 // ML: TODO: should check if a similar job is already pending
32     producerJobQueue.appendJob(new ProducerJob(aProducerFactory, aVerb));
33     log.println(aProducerFactory+"."+aVerb+" added to queue");
34     log.flush();
35   }
36
37   public void printQueueStatus(PrintWriter aWriter) {
38
39   }
40
41   private void produceNow(String aProducerFactory, String aVerb, PrintWriter aLogger) {
42     try {
43                   long startTime;
44                   long endTime;
45
46                   startTime = System.currentTimeMillis();
47
48       aLogger.println("Producing (" + aProducerFactory + "," + aVerb + ")<br>");
49
50       if (producers == null)
51         aLogger.println("??<br>");
52
53       ProducerFactory factory = (ProducerFactory) producers.get(aProducerFactory);
54
55       if (factory == null )
56         throw new Exception("No producer factory '"+aProducerFactory+"' present.");
57
58       Producer producer = factory.makeProducer(aVerb);
59
60       producer.produce(aLogger);
61
62                   endTime = System.currentTimeMillis();
63
64                   aLogger.println("Time: " + (endTime-startTime) + " ms<br>");
65     }
66     catch (Throwable e) {
67       try {
68         aLogger.println("exception occurred:<br>");
69         aLogger.println(e.getMessage());
70         e.printStackTrace(aLogger);
71       }
72       catch (Throwable f) {
73       }
74     }
75   }
76
77   private class ProducerJob {
78     private String factoryName;
79     private String verb;
80
81     public ProducerJob(String aFactory, String aVerb) {
82       factoryName = aFactory;
83       verb = aVerb;
84     }
85
86     public void execute() {
87       ProducerFactory factory;
88       Producer producer;
89                   long startTime;
90                   long endTime;
91
92                   startTime = System.currentTimeMillis();
93       log.println("Producing job: "+factoryName+"."+verb);
94
95       try {
96         factory = (ProducerFactory) producers.get(factoryName);
97
98         if (factory!=null) {
99           synchronized(factory) {
100             producer = factory.makeProducer(verb);
101           }
102           if (producer!=null) {
103             producer.produce(log);
104           }
105         }
106       }
107       catch (Throwable t) {
108         log.println("  exception "+t.getMessage());
109         t.printStackTrace(log);
110       }
111       log.println("Done producing job: "+factoryName+"."+verb);
112                   endTime = System.currentTimeMillis();
113
114                   log.println("Time: " + (endTime-startTime) + " ms");
115                   log.flush();
116     }
117   }
118
119   private class ProducerJobQueueThread implements Runnable {
120     public void run() {
121       log.println("starting ProducerJobQueueThread");
122       log.flush();
123
124       while (true) {
125         ProducerJob job = (ProducerJob) producerJobQueue.acquirePendingJob();
126         if (job!=null) {
127           job.execute();
128           producerJobQueue.flagOffJob(job);
129         }
130         else
131         {
132           try {
133             Thread.sleep(1500);
134           }
135           catch (InterruptedException e) {
136           }
137         }
138       }
139     }
140   }
141
142
143   public static class ProducerEngineRuntimeExc extends Failure {
144     public ProducerEngineRuntimeExc(String msg, Exception cause){
145       super(msg,cause);
146     }
147   }
148
149 }