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 RandomAccessFile raFile = (new RandomAccessFile(MirGlobal.getConfigProperty("Home") + "/" + MirGlobal.getConfigProperty("Producer.Logfile"), "rw"));
21 raFile.seek(raFile.length());
22 log = new PrintWriter(new FileWriter( raFile.getFD()));
25 // throw new ProducerEngineRuntimeExc("Creating PrintWriter log failed",e);
26 log = new PrintWriter(new NullWriter());
28 queueThread = new Thread(new ProducerJobQueueThread());
32 public void addJob(String aProducerFactory, String aVerb) {
33 // ML: TODO: should check if a similar job is already pending
34 producerJobQueue.appendJob(new ProducerJob(aProducerFactory, aVerb));
35 log.println(aProducerFactory+"."+aVerb+" added to queue");
39 public void printQueueStatus(PrintWriter aWriter) {
40 Iterator iterator = producerJobQueue.makeJobListSnapshot().iterator();
41 producerJobQueue.cleanupJobs();
44 while (iterator.hasNext()) {
45 job = (JobQueue.Job) iterator.next();
46 ProducerJob producerJob = (ProducerJob) job.getData();
48 aWriter.print(producerJob.factoryName + "." + producerJob.verb);
49 if (job.hasBeenProcessed())
50 aWriter.print(" processed");
51 else if (job.isProcessing())
52 aWriter.print(" processing");
53 else if (job.isPending())
54 aWriter.print(" pending");
56 aWriter.print(" unknown status");
58 aWriter.println("<br/>");
62 private void produceNow(String aProducerFactory, String aVerb, PrintWriter aLogger) {
66 Map startingMap = new HashMap();
68 startTime = System.currentTimeMillis();
70 aLogger.println("Producing (" + aProducerFactory + "," + aVerb + ")");
72 ProducerFactory factory = (ProducerFactory) MirGlobal.localizer().producers().factories().get(aProducerFactory);
75 throw new Exception("No producer factory '"+aProducerFactory+"' present.");
77 MirGlobal.localizer().producerAssistant().initializeGenerationValueSet(startingMap);
78 Producer producer = factory.makeProducer(aVerb, startingMap);
80 producer.produce(aLogger);
82 endTime = System.currentTimeMillis();
84 aLogger.println("Time: " + (endTime-startTime) + " ms<br>");
88 aLogger.println("exception occurred:<br>");
89 aLogger.println(e.getMessage());
90 e.printStackTrace(aLogger);
97 private class ProducerJob {
98 private String factoryName;
101 public ProducerJob(String aFactory, String aVerb) {
102 factoryName = aFactory;
106 public void execute() {
107 ProducerFactory factory;
111 Map startingMap = new HashMap();
113 startTime = System.currentTimeMillis();
114 log.println("Producing job: "+factoryName+"."+verb);
117 factory = (ProducerFactory) MirGlobal.localizer().producers().factories().get( factoryName );
120 MirGlobal.localizer().producerAssistant().initializeGenerationValueSet(startingMap);
122 synchronized(factory) {
123 producer = factory.makeProducer(verb, startingMap);
125 if (producer!=null) {
126 producer.produce(log);
130 catch (Throwable t) {
131 log.println(" exception "+t.getMessage());
132 t.printStackTrace(log);
134 log.println("Done producing job: "+factoryName+"."+verb);
135 endTime = System.currentTimeMillis();
137 log.println("Time: " + (endTime-startTime) + " ms");
142 private class ProducerJobQueueThread implements Runnable {
144 log.println("starting ProducerJobQueueThread");
148 ProducerJob job = (ProducerJob) producerJobQueue.acquirePendingJob();
151 producerJobQueue.flagOffJob(job);
158 catch (InterruptedException e) {
166 public static class ProducerEngineRuntimeExc extends Failure {
167 public ProducerEngineRuntimeExc(String msg, Exception cause){