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