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 RandomAccessFile(MirGlobal.getConfigProperty("Home") + "/" + MirGlobal.getConfigProperty("Producer.Logfile"), "rw")).getFD()));
23 // throw new ProducerEngineRuntimeExc("Creating PrintWriter log failed",e);
24 log = new PrintWriter(new NullWriter());
26 queueThread = new Thread(new ProducerJobQueueThread());
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");
37 public void printQueueStatus(PrintWriter aWriter) {
41 private void produceNow(String aProducerFactory, String aVerb, PrintWriter aLogger) {
46 startTime = System.currentTimeMillis();
48 aLogger.println("Producing (" + aProducerFactory + "," + aVerb + ")<br>");
50 if (producers == null)
51 aLogger.println("??<br>");
53 ProducerFactory factory = (ProducerFactory) producers.get(aProducerFactory);
56 throw new Exception("No producer factory '"+aProducerFactory+"' present.");
58 Producer producer = factory.makeProducer(aVerb);
60 producer.produce(aLogger);
62 endTime = System.currentTimeMillis();
64 aLogger.println("Time: " + (endTime-startTime) + " ms<br>");
68 aLogger.println("exception occurred:<br>");
69 aLogger.println(e.getMessage());
70 e.printStackTrace(aLogger);
77 private class ProducerJob {
78 private String factoryName;
81 public ProducerJob(String aFactory, String aVerb) {
82 factoryName = aFactory;
86 public void execute() {
87 ProducerFactory factory;
92 startTime = System.currentTimeMillis();
93 log.println("Producing job: "+factoryName+"."+verb);
96 factory = (ProducerFactory) producers.get(factoryName);
99 synchronized(factory) {
100 producer = factory.makeProducer(verb);
102 if (producer!=null) {
103 producer.produce(log);
107 catch (Throwable t) {
108 log.println(" exception "+t.getMessage());
109 t.printStackTrace(log);
111 log.println("Done producing job: "+factoryName+"."+verb);
112 endTime = System.currentTimeMillis();
114 log.println("Time: " + (endTime-startTime) + " ms");
119 private class ProducerJobQueueThread implements Runnable {
121 log.println("starting ProducerJobQueueThread");
125 ProducerJob job = (ProducerJob) producerJobQueue.acquirePendingJob();
128 producerJobQueue.flagOffJob(job);
135 catch (InterruptedException e) {
143 public static class ProducerEngineRuntimeExc extends Failure {
144 public ProducerEngineRuntimeExc(String msg, Exception cause){