- multiple "producer" shortcuts possible
[mir.git] / source / mircoders / localizer / basic / MirBasicProducerLocalizer.java
index a54ba00..7515714 100755 (executable)
-/*
- * Copyright (C) 2001, 2002 The Mir-coders group
- *
- * This file is part of Mir.
- *
- * Mir is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * Mir is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Mir; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * In addition, as a special exception, The Mir-coders gives permission to link
- * the code of this program with  any library licensed under the Apache Software License, 
- * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library 
- * (or with modified versions of the above that use the same license as the above), 
- * and distribute linked combinations including the two.  You must obey the 
- * GNU General Public License in all respects for all of the code used other than 
- * the above mentioned libraries.  If you modify this file, you may extend this 
- * exception to your version of the file, but you are not obligated to do so.  
- * If you do not wish to do so, delete this exception statement from your version.
- */
-package mircoders.localizer.basic;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Vector;
-
-import mir.entity.adapter.EntityAdapterModel;
-import mir.generator.Generator;
-import mir.generator.WriterEngine;
-import mir.log.LoggerWrapper;
-import mir.producer.ProducerFactory;
-import mir.producer.reader.DefaultProducerNodeBuilders;
-import mir.producer.reader.ProducerConfigReader;
-import mir.producer.reader.ProducerNodeBuilderLibrary;
-import mir.util.FileMonitor;
-import mircoders.global.MirGlobal;
-import mircoders.global.ProducerEngine;
-import mircoders.localizer.MirLocalizerExc;
-import mircoders.localizer.MirLocalizerFailure;
-import mircoders.localizer.MirProducerLocalizer;
-import mircoders.producer.reader.SupplementalProducerNodeBuilders;
-
-public class MirBasicProducerLocalizer implements MirProducerLocalizer {
-  private List producerFactories;
-  private Map nameToFactory;
-  private List allNewProducerTasks;
-
-  protected FileMonitor fileMonitor;
-  protected EntityAdapterModel model;
-  protected Generator.GeneratorLibrary generatorLibrary;
-  protected WriterEngine writerEngine;
-
-  protected LoggerWrapper logger;
-
-  public MirBasicProducerLocalizer() {
-    try {
-      logger = new LoggerWrapper("Localizer.Basic.Producer");
-
-      String allNewProducers = MirGlobal.config().getString("Mir.Localizer.Producer.AllNewProducers");
-      allNewProducerTasks = ProducerEngine.ProducerTask.parseProducerTaskList(allNewProducers);
-
-      producerFactories = new Vector();
-      model = MirGlobal.localizer().dataModel().adapterModel();
-      generatorLibrary = MirGlobal.localizer().generators().makeProducerGeneratorLibrary();
-      writerEngine = MirGlobal.localizer().generators().makeWriterEngine();
-      nameToFactory = new HashMap();
-    }
-    catch (Throwable t) {
-      logger.error("MirBasicProducerLocalizer(): Exception "+t.getMessage());
-      model = new EntityAdapterModel();
-    }
-  }
-
-  public List factories() throws MirLocalizerExc {
-    if (fileMonitor==null || producerFactories == null || fileMonitor.hasChanged()) {
-      try {
-        List newProducers = new Vector();
-        FileMonitor newFileMonitor = new FileMonitor();
-        setupFactories(newProducers, newFileMonitor);
-
-        producerFactories = newProducers;
-        fileMonitor = newFileMonitor;
-        logger.info("MirBasicProducerLocalizer.factories(): successfully setup factories");
-
-        nameToFactory.clear();
-        Iterator i = producerFactories.iterator();
-        while (i.hasNext()) {
-          ProducerFactory factory = (ProducerFactory) i.next();
-          nameToFactory.put(factory.getName(), factory);
-        }
-      }
-      catch (Throwable t) {
-        logger.error("MirBasicProducerLocalizer.factories(): Unable to setup factories: "+t.getMessage());
-        t.printStackTrace(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE));
-      }
-    }
-
-    return producerFactories;
-  };
-
-  protected void setupProducerNodeBuilderLibrary(ProducerNodeBuilderLibrary aLibrary) throws MirLocalizerFailure {
-    try {
-      DefaultProducerNodeBuilders.registerBuilders(
-          aLibrary, model, generatorLibrary, writerEngine,
-          MirGlobal.config().getString("Home"), MirGlobal.config().getString("Producer.StorageRoot"));
-      SupplementalProducerNodeBuilders.registerBuilders(aLibrary, model);
-    }
-    catch (Throwable t) {
-      throw new MirLocalizerFailure(t.getMessage(), t);
-    }
-  }
-
-  protected void setupFactories(List aFactories, FileMonitor aFileMonitor) throws MirLocalizerExc, MirLocalizerFailure {
-    ProducerConfigReader reader;
-    ProducerNodeBuilderLibrary library = new ProducerNodeBuilderLibrary();
-    setupProducerNodeBuilderLibrary(library);
-    List usedFiles = new Vector();
-    Iterator i;
-
-    aFileMonitor.clear();
-    reader = new ProducerConfigReader();
-    reader.parseFile(MirGlobal.config().getString("Home") + File.separatorChar + MirGlobal.config().getString("Mir.Localizer.ProducerConfigFile"), library, aFactories, usedFiles);
-
-    i = usedFiles.iterator();
-    while (i.hasNext())
-      aFileMonitor.addFile((File) i.next());
-  }
-
-  public void produceAllNew() {
-    MirGlobal.producerEngine().addTasks(allNewProducerTasks);
-  };
-
-  public ProducerFactory getFactoryForName(String aName) {
-    try {
-      factories();
-    }
-    catch (Throwable t) {
-    }
-
-    return (ProducerFactory) nameToFactory.get(aName);
-  }
-}
+/*\r
+ * Copyright (C) 2001, 2002 The Mir-coders group\r
+ *\r
+ * This file is part of Mir.\r
+ *\r
+ * Mir is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * Mir is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with Mir; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ *\r
+ * In addition, as a special exception, The Mir-coders gives permission to link\r
+ * the code of this program with  any library licensed under the Apache Software License,\r
+ * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library\r
+ * (or with modified versions of the above that use the same license as the above),\r
+ * and distribute linked combinations including the two.  You must obey the\r
+ * GNU General Public License in all respects for all of the code used other than\r
+ * the above mentioned libraries.  If you modify this file, you may extend this\r
+ * exception to your version of the file, but you are not obligated to do so.\r
+ * If you do not wish to do so, delete this exception statement from your version.\r
+ */\r
+package mircoders.localizer.basic;\r
+\r
+import java.io.File;\r
+import java.util.HashMap;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Vector;\r
+\r
+import mir.entity.adapter.EntityAdapterModel;\r
+import mir.generator.Generator;\r
+import mir.generator.WriterEngine;\r
+import mir.log.LoggerWrapper;\r
+import mir.producer.ProducerFactory;\r
+import mir.producer.reader.DefaultProducerNodeBuilders;\r
+import mir.producer.reader.ProducerConfigReader;\r
+import mir.producer.reader.ProducerNodeBuilderLibrary;\r
+import mir.util.*;\r
+import mircoders.global.MirGlobal;\r
+import mircoders.global.ProducerEngine;\r
+import mircoders.localizer.MirLocalizerExc;\r
+import mircoders.localizer.MirLocalizerFailure;\r
+import mircoders.localizer.MirProducerLocalizer;\r
+import mircoders.producer.reader.SupplementalProducerNodeBuilders;\r
+\r
+public class MirBasicProducerLocalizer implements MirProducerLocalizer {\r
+  private List producerFactories;\r
+  private Map nameToFactory;\r
+\r
+  private Map producerRecipes;\r
+  private List producerRecipeNames;\r
+\r
+  protected FileMonitor fileMonitor;\r
+  protected EntityAdapterModel model;\r
+  protected Generator.GeneratorLibrary generatorLibrary;\r
+  protected WriterEngine writerEngine;\r
+\r
+  protected LoggerWrapper logger;\r
+\r
+  public MirBasicProducerLocalizer() {\r
+    try {\r
+      logger = new LoggerWrapper("Localizer.Basic.Producer");\r
+\r
+      producerRecipes = new HashMap();\r
+      producerRecipeNames = new Vector();\r
+\r
+      String[] recipes = MirGlobal.config().getStringArray("Mir.Localizer.Producer.ProducerRecipes");\r
+      for (int i = 0; i<recipes.length; i++) {\r
+        try {\r
+          List parts = StringRoutines.separateString(recipes[i], "=");\r
+          if (parts.size() == 2) {\r
+            producerRecipes.put(parts.get(0), ProducerEngine.ProducerTask.parseProducerTaskList( (String) parts.get(1)));\r
+            producerRecipeNames.add(parts.get(0));\r
+          }\r
+          else {\r
+            throw new Exception("'=' expected");\r
+          }\r
+        }\r
+        catch (Throwable t) {\r
+          logger.error("Error while processing producer recipe '" + recipes[i] + "': " + t.toString());\r
+        }\r
+      }\r
+\r
+      // for backward compatibility:\r
+      String allNewProducers = MirGlobal.config().getString("Mir.Localizer.Producer.AllNewProducers");\r
+      if (allNewProducers!=null && allNewProducers.length()>0) {\r
+        producerRecipes.put("allnew", ProducerEngine.ProducerTask.parseProducerTaskList(allNewProducers));\r
+        producerRecipeNames.add("allnew");\r
+      }\r
+\r
+      producerFactories = new Vector();\r
+      model = MirGlobal.localizer().dataModel().adapterModel();\r
+      generatorLibrary = MirGlobal.localizer().generators().makeProducerGeneratorLibrary();\r
+      writerEngine = MirGlobal.localizer().generators().makeWriterEngine();\r
+      nameToFactory = new HashMap();\r
+    }\r
+    catch (Throwable t) {\r
+      logger.error("MirBasicProducerLocalizer(): Exception "+t.getMessage());\r
+      model = new EntityAdapterModel();\r
+    }\r
+  }\r
+\r
+  public List getRecipeNames() throws MirLocalizerExc, MirLocalizerFailure {\r
+    return producerRecipeNames;\r
+  }\r
+\r
+  public void produceRecipe(String aName) throws MirLocalizerExc, MirLocalizerFailure {\r
+    if (producerRecipes.containsKey(aName))\r
+      MirGlobal.producerEngine().addTasks((List) producerRecipes.get(aName));\r
+    else\r
+      throw new MirLocalizerExc("Unknown recipe name: " + aName);\r
+  }\r
+\r
+  public List factories() throws MirLocalizerExc {\r
+    if (fileMonitor==null || producerFactories == null || fileMonitor.hasChanged()) {\r
+      try {\r
+        List newProducers = new Vector();\r
+        FileMonitor newFileMonitor = new FileMonitor();\r
+        setupFactories(newProducers, newFileMonitor);\r
+\r
+        producerFactories = newProducers;\r
+        fileMonitor = newFileMonitor;\r
+        logger.info("MirBasicProducerLocalizer.factories(): successfully setup factories");\r
+\r
+        nameToFactory.clear();\r
+        Iterator i = producerFactories.iterator();\r
+        while (i.hasNext()) {\r
+          ProducerFactory factory = (ProducerFactory) i.next();\r
+          nameToFactory.put(factory.getName(), factory);\r
+        }\r
+      }\r
+      catch (Throwable t) {\r
+        logger.error("MirBasicProducerLocalizer.factories(): Unable to setup factories: "+t.getMessage());\r
+        t.printStackTrace(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE));\r
+      }\r
+    }\r
+\r
+    return producerFactories;\r
+  };\r
+\r
+  protected void setupProducerNodeBuilderLibrary(ProducerNodeBuilderLibrary aLibrary) throws MirLocalizerFailure {\r
+    try {\r
+      DefaultProducerNodeBuilders.registerBuilders(\r
+          aLibrary, model, generatorLibrary, writerEngine,\r
+          MirGlobal.config().getString("Home"), MirGlobal.config().getString("Producer.StorageRoot"));\r
+      SupplementalProducerNodeBuilders.registerBuilders(aLibrary, model);\r
+    }\r
+    catch (Throwable t) {\r
+      throw new MirLocalizerFailure(t.getMessage(), t);\r
+    }\r
+  }\r
+\r
+  protected void setupFactories(List aFactories, FileMonitor aFileMonitor) throws MirLocalizerExc, MirLocalizerFailure {\r
+    ProducerConfigReader reader;\r
+    ProducerNodeBuilderLibrary library = new ProducerNodeBuilderLibrary();\r
+    setupProducerNodeBuilderLibrary(library);\r
+    List usedFiles = new Vector();\r
+    Iterator i;\r
+\r
+    aFileMonitor.clear();\r
+    reader = new ProducerConfigReader();\r
+    reader.parseFile(MirGlobal.config().getString("Home") + File.separatorChar + MirGlobal.config().getString("Mir.Localizer.ProducerConfigFile"), library, aFactories, usedFiles);\r
+\r
+    i = usedFiles.iterator();\r
+    while (i.hasNext())\r
+      aFileMonitor.addFile((File) i.next());\r
+  }\r
+\r
+  public ProducerFactory getFactoryForName(String aName) {\r
+    try {\r
+      factories();\r
+    }\r
+    catch (Throwable t) {\r
+    }\r
+\r
+    return (ProducerFactory) nameToFactory.get(aName);\r
+  }\r
+}\r