1.1 restoration
[mir.git] / source / mircoders / global / ProducerEngine.java
index 694fed9..33a6267 100755 (executable)
@@ -30,6 +30,7 @@
 package mircoders.global;
 
 import java.io.PrintWriter;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -43,49 +44,97 @@ import mir.producer.Producer;
 import mir.producer.ProducerFactory;
 import mir.util.GeneratorFormatAdapters;
 import mir.util.StringRoutines;
-import multex.Exc;
-import multex.Failure;
-import mircoders.localizer.MirLocalizerExc;
 
 public class ProducerEngine {
   private JobQueue producerJobQueue;
   private LoggerWrapper logger;
-
+  private Map nameToFactory;
+  private List factories;
 
   protected ProducerEngine() {
     logger = new LoggerWrapper("Producer");
     producerJobQueue = new JobQueue(new LoggerWrapper("Producer.Queue"));
-  }
 
-  public void addJob(String aProducerFactory, String aVerb) throws ProducerEngineExc, ProducerEngineFailure {
-    ProducerFactory factory;
+    factories = new ArrayList();
+    nameToFactory = new HashMap();
 
     try {
-      factory = MirGlobal.localizer().producers().getFactoryForName( aProducerFactory );
+      reloadConfiguration();
+    }
+    catch (Throwable t) {
+    }
+  }
+
+  /**
+   * Reloads the producer configuration
+   */
+  public void reloadConfiguration()  throws MirGlobalExc, MirGlobalFailure {
+    try {
+      factories = MirGlobal.localizer().producers().loadFactories();
+
+      synchronized (nameToFactory) {
+        nameToFactory.clear();
+
+        Iterator i = factories.iterator();
+        while (i.hasNext()) {
+          ProducerFactory factory = (ProducerFactory) i.next();
+          nameToFactory.put(factory.getName(), factory);
+        }
+      }
+    }
+    catch (Throwable t) {
+      throw new MirGlobalFailure(t);
     }
-    catch (MirLocalizerExc e) {
-      throw new ProducerEngineFailure(e);
+  }
+
+  /**
+   * Looks up a producer factory by name
+   */
+  private ProducerFactory getFactoryForName(String aName) {
+    synchronized (nameToFactory) {
+      return (ProducerFactory) nameToFactory.get(aName);
     }
+  }
+
+  /**
+   * Returns all factories
+   */
+  public List getFactories() {
+    return factories;
+  }
+  /**
+   * Adds a producer job to the queue
+   */
+  public void addJob(String aProducerFactory, String aVerb) throws MirGlobalExc, MirGlobalFailure {
+    ProducerFactory factory;
+
+    factory = getFactoryForName( aProducerFactory );
 
     if (factory==null)
-      throw new ProducerEngineExc("Unknown producer: " + aProducerFactory);
+      throw new MirGlobalExc("Unknown producer: " + aProducerFactory);
 
     if (!factory.allowVerb(aVerb))
-      throw new ProducerEngineExc("illegal producer/verb combination: " + aProducerFactory+"::"+aVerb);
+      throw new MirGlobalExc("illegal producer/verb combination: " + aProducerFactory+"::"+aVerb);
 
     producerJobQueue.appendJob(
         new ProducerJob(aProducerFactory, aVerb), aProducerFactory+"."+aVerb);
   }
 
+  /**
+   * Cancels a list of jobs by job identifier
+   */
   public void cancelJobs(List aJobs) {
     producerJobQueue.cancelJobs(aJobs);
   };
 
+  /**
+   * Cancels all jobs in the queue
+   */
   public void cancelAllJobs() {
     producerJobQueue.cancelAllJobs();
   };
 
-  public void addTask(ProducerTask aTask) throws ProducerEngineExc, ProducerEngineFailure {
+  public void addTask(ProducerTask aTask) throws MirGlobalExc, MirGlobalFailure {
     addJob(aTask.getProducer(), aTask.getVerb());
   }
 
@@ -184,7 +233,7 @@ public class ProducerEngine {
       logger.info("Producing job: "+factoryName+"."+verb);
 
       try {
-        factory = MirGlobal.localizer().producers().getFactoryForName( factoryName );
+        factory = getFactoryForName(factoryName);
 
         if (factory!=null) {
           MirGlobal.localizer().producerAssistant().initializeGenerationValueSet(startingMap);
@@ -212,22 +261,6 @@ public class ProducerEngine {
     }
   }
 
-  public static class ProducerEngineExc extends Exc {
-    public ProducerEngineExc(String aMessage) {
-      super(aMessage);
-    }
-  }
-
-  public static class ProducerEngineFailure extends Failure {
-    public ProducerEngineFailure(Throwable aCause){
-      super(aCause.getMessage(), aCause);
-    }
-
-    public ProducerEngineFailure(String msg, Exception cause){
-      super(msg,cause);
-    }
-  }
-
   public static class ProducerTask {
     private String producer;
     private String verb;
@@ -245,7 +278,7 @@ public class ProducerEngine {
       return producer;
     }
 
-    public static List parseProducerTaskList(String aList) throws ProducerEngineExc {
+    public static List parseProducerTaskList(String aList) throws MirGlobalExc {
       Iterator i;
       List result = new Vector();
 
@@ -257,7 +290,7 @@ public class ProducerEngine {
           List parts = StringRoutines.splitString(taskExpression, ".");
 
           if (parts.size() != 2)
-            throw new ProducerEngineExc("Invalid producer expression: '" + taskExpression + "'");
+            throw new MirGlobalExc("Invalid producer expression: '" + taskExpression + "'");
           else
             result.add(new ProducerEngine.ProducerTask( (String) parts.get(0), (String) parts.get(1)));
         }