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