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