yet another rewrite of the producers...
[mir.git] / source / mircoders / global / ProducerEngine.java
index 3083837..b59a523 100755 (executable)
@@ -4,24 +4,39 @@ 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;
 
   protected ProducerEngine() {
     producers = MirGlobal.localizer().producers().factories();
-    Queue = new Vector();
+    producerJobQueue = new JobQueue();
+    try {
+      log = new PrintWriter(new FileWriter(new File("/tmp/producer.log")));
+    }
+    catch (Exception e) {
+      throw new ProducerEngineRuntimeExc("Creating PrintWriter log failed",e);
+    }
+    queueThread = new Thread(new ProducerJobQueueThread());
+    queueThread.start();
+  }
 
-//    queueThread = new Thread(
+  public void addJob(String aProducerFactory, String aVerb) {
+    producerJobQueue.appendJob(new ProducerJob(aProducerFactory, aVerb));
+    log.println(aProducerFactory+"."+aVerb+" added to queue");
+    log.flush();
   }
 
-  public void addTask(String aProducerFactory, String aVerb) {
-    produceNow(aProducerFactory, aVerb, new PrintWriter(new NullWriter()));
+  public void printQueueStatus(PrintWriter aWriter) {
+
   }
 
-  public void produceNow(String aProducerFactory, String aVerb, PrintWriter aLogger) {
+  private void produceNow(String aProducerFactory, String aVerb, PrintWriter aLogger) {
     try {
                  long startTime;
                  long endTime;
@@ -57,29 +72,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);
 
-    public String getFactory() {
-      return factory;
+      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();
+
+                 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