fixed a tiny bug with the producer logger
[mir.git] / source / mircoders / global / ProducerEngine.java
index 267bd7c..b9c7fc6 100755 (executable)
@@ -4,26 +4,53 @@ import java.util.*;
 import java.io.*;
 import mir.producer.*;
 import mir.util.*;
+import multex.Exc;
+import multex.Failure;
 
 public class ProducerEngine {
   private Map producers;
-  private List Queue;
+  private JobQueue producerJobQueue;
   private Thread queueThread;
+  private PrintWriter log;
 
-  void ProducerEngine() {
+  protected ProducerEngine() {
     producers = MirGlobal.localizer().producers().factories();
-    Queue = new Vector();
+    producerJobQueue = new JobQueue();
+    try {
+      RandomAccessFile raFile = (new RandomAccessFile(MirGlobal.getConfigProperty("Home") + "/" + MirGlobal.getConfigProperty("Producer.Logfile"), "rw"));
+                       raFile.seek(raFile.length());
+               log = new PrintWriter(new FileWriter( raFile.getFD()));
+    }
+    catch (Exception e) {
+//      throw new ProducerEngineRuntimeExc("Creating PrintWriter log failed",e);
+      log = new PrintWriter(new NullWriter());
+    }
+    queueThread = new Thread(new ProducerJobQueueThread());
+    queueThread.start();
+  }
 
-//    queueThread = new Thread(
+  public void addJob(String aProducerFactory, String aVerb) {
+// ML: TODO: should check if a similar job is already pending
+    producerJobQueue.appendJob(new ProducerJob(aProducerFactory, aVerb));
+    log.println(aProducerFactory+"."+aVerb+" added to queue");
+    log.flush();
   }
 
-  void addTask(String aProducerFactory, String aVerb) {
-    produceNow(aProducerFactory, aVerb, new PrintWriter(new NullWriter()));
+  public void printQueueStatus(PrintWriter aWriter) {
+
   }
 
-  void produceNow(String aProducerFactory, String aVerb, PrintWriter aLogger) {
+  private void produceNow(String aProducerFactory, String aVerb, PrintWriter aLogger) {
     try {
-      aLogger.println("Producing <" + aProducerFactory + "," + aVerb + "><br>");
+                 long startTime;
+                 long endTime;
+
+                 startTime = System.currentTimeMillis();
+
+      aLogger.println("Producing (" + aProducerFactory + "," + aVerb + ")<br>");
+
+      if (producers == null)
+        aLogger.println("??<br>");
 
       ProducerFactory factory = (ProducerFactory) producers.get(aProducerFactory);
 
@@ -33,6 +60,10 @@ public class ProducerEngine {
       Producer producer = factory.makeProducer(aVerb);
 
       producer.produce(aLogger);
+
+                 endTime = System.currentTimeMillis();
+
+                 aLogger.println("Time: " + (endTime-startTime) + " ms<br>");
     }
     catch (Throwable e) {
       try {
@@ -45,29 +76,76 @@ public class ProducerEngine {
     }
   }
 
-  private class ProducerQueueItem {
-    String factory;
-    String verb;
+  private class ProducerJob {
+    private String factoryName;
+    private String verb;
 
-    public ProducerQueueItem(String aFactory, String aVerb) {
-      factory = aFactory;
+    public ProducerJob(String aFactory, String aVerb) {
+      factoryName = aFactory;
       verb = aVerb;
     }
 
-    public String getVerb() {
-      return verb;
-    }
+    public void execute() {
+      ProducerFactory factory;
+      Producer producer;
+                 long startTime;
+                 long endTime;
+
+                 startTime = System.currentTimeMillis();
+      log.println("Producing job: "+factoryName+"."+verb);
+
+      try {
+        factory = (ProducerFactory) producers.get(factoryName);
+
+        if (factory!=null) {
+          synchronized(factory) {
+            producer = factory.makeProducer(verb);
+          }
+          if (producer!=null) {
+            producer.produce(log);
+          }
+        }
+      }
+      catch (Throwable t) {
+        log.println("  exception "+t.getMessage());
+        t.printStackTrace(log);
+      }
+      log.println("Done producing job: "+factoryName+"."+verb);
+                 endTime = System.currentTimeMillis();
 
-    public String getFactory() {
-      return factory;
+                 log.println("Time: " + (endTime-startTime) + " ms");
+                 log.flush();
     }
   }
 
-  private class ProducerQueue implements Runnable {
+  private class ProducerJobQueueThread implements Runnable {
     public void run() {
-      while (false) {
+      log.println("starting ProducerJobQueueThread");
+      log.flush();
+
+      while (true) {
+        ProducerJob job = (ProducerJob) producerJobQueue.acquirePendingJob();
+        if (job!=null) {
+          job.execute();
+          producerJobQueue.flagOffJob(job);
+        }
+        else
+        {
+          try {
+            Thread.sleep(1500);
+          }
+          catch (InterruptedException e) {
+          }
+        }
       }
     }
   }
 
+
+  public static class ProducerEngineRuntimeExc extends Failure {
+    public ProducerEngineRuntimeExc(String msg, Exception cause){
+      super(msg,cause);
+    }
+  }
+
 }
\ No newline at end of file