package mircoders.global;
import java.io.PrintWriter;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
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());
}
logger.info("Producing job: "+factoryName+"."+verb);
try {
- factory = MirGlobal.localizer().producers().getFactoryForName( factoryName );
+ factory = getFactoryForName(factoryName);
if (factory!=null) {
MirGlobal.localizer().producerAssistant().initializeGenerationValueSet(startingMap);
}
}
- 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;
return producer;
}
- public static List parseProducerTaskList(String aList) throws ProducerEngineExc {
+ public static List parseProducerTaskList(String aList) throws MirGlobalExc {
Iterator i;
List result = new Vector();
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)));
}