1 package mircoders.global;
10 public class ProducerEngine {
11 private Map producers;
12 private JobQueue producerJobQueue;
13 private Thread queueThread;
14 private PrintWriter log;
16 protected ProducerEngine() {
17 producers = MirGlobal.localizer().producers().factories();
18 producerJobQueue = new JobQueue();
20 log = new PrintWriter(new FileWriter(new File("/tmp/producer.log")));
23 throw new ProducerEngineRuntimeExc("Creating PrintWriter log failed",e);
25 queueThread = new Thread(new ProducerJobQueueThread());
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");
36 public void printQueueStatus(PrintWriter aWriter) {
40 private void produceNow(String aProducerFactory, String aVerb, PrintWriter aLogger) {
45 startTime = System.currentTimeMillis();
47 aLogger.println("Producing (" + aProducerFactory + "," + aVerb + ")<br>");
49 if (producers == null)
50 aLogger.println("??<br>");
52 ProducerFactory factory = (ProducerFactory) producers.get(aProducerFactory);
55 throw new Exception("No producer factory '"+aProducerFactory+"' present.");
57 Producer producer = factory.makeProducer(aVerb);
59 producer.produce(aLogger);
61 endTime = System.currentTimeMillis();
63 aLogger.println("Time: " + (endTime-startTime) + " ms<br>");
67 aLogger.println("exception occurred:<br>");
68 aLogger.println(e.getMessage());
69 e.printStackTrace(aLogger);
76 private class ProducerJob {
77 private String factoryName;
80 public ProducerJob(String aFactory, String aVerb) {
81 factoryName = aFactory;
85 public void execute() {
86 ProducerFactory factory;
91 startTime = System.currentTimeMillis();
92 log.println("Producing job: "+factoryName+"."+verb);
95 factory = (ProducerFactory) producers.get(factoryName);
98 synchronized(factory) {
99 producer = factory.makeProducer(verb);
101 if (producer!=null) {
102 producer.produce(log);
106 catch (Throwable t) {
107 log.println(" exception "+t.getMessage());
108 t.printStackTrace(log);
110 log.println("Done producing job: "+factoryName+"."+verb);
111 endTime = System.currentTimeMillis();
113 log.println("Time: " + (endTime-startTime) + " ms");
118 private class ProducerJobQueueThread implements Runnable {
120 log.println("starting ProducerJobQueueThread");
124 ProducerJob job = (ProducerJob) producerJobQueue.acquirePendingJob();
127 producerJobQueue.flagOffJob(job);
134 catch (InterruptedException e) {
142 public static class ProducerEngineRuntimeExc extends Failure {
143 public ProducerEngineRuntimeExc(String msg, Exception cause){