some new files / some changes here and there for localized producers
authorzapata <zapata>
Mon, 22 Apr 2002 19:47:48 +0000 (19:47 +0000)
committerzapata <zapata>
Mon, 22 Apr 2002 19:47:48 +0000 (19:47 +0000)
25 files changed:
source/Mir.java
source/mir/util/NullWriter.java [new file with mode: 0755]
source/mircoders/global/MirGlobal.java [new file with mode: 0755]
source/mircoders/global/ProducerEngine.java [new file with mode: 0755]
source/mircoders/localizer/MirGeneratorLocalizer.java [new file with mode: 0755]
source/mircoders/localizer/MirLocalizer.java [new file with mode: 0755]
source/mircoders/localizer/MirLocalizerException.java [new file with mode: 0755]
source/mircoders/localizer/MirOpenPostingLocalizer.java [new file with mode: 0755]
source/mircoders/localizer/MirProducerLocalizer.java [new file with mode: 0755]
source/mircoders/localizer/MirProducerToolLocalizer.java [new file with mode: 0755]
source/mircoders/localizer/basic/FreemarkerGeneratorLocalizer.java [new file with mode: 0755]
source/mircoders/localizer/basic/MirBasicGeneratorLocalizer.java [new file with mode: 0755]
source/mircoders/localizer/basic/MirBasicLocalizer.java [new file with mode: 0755]
source/mircoders/localizer/basic/MirBasicOpenPostingLocalizer.java [new file with mode: 0755]
source/mircoders/localizer/basic/MirBasicProducerLocalizer.java [new file with mode: 0755]
source/mircoders/localizer/basic/MirBasicProducerToolLocalizer.java [new file with mode: 0755]
source/mircoders/producer/ContentProducer.java [new file with mode: 0755]
source/mircoders/producer/ContentProducerFactory.java [new file with mode: 0755]
source/mircoders/producer/OldProducerAdapter.java [new file with mode: 0755]
source/mircoders/producer/OldProducerAdapterFactory.java [new file with mode: 0755]
source/mircoders/producer/ScriptCallProducer.java [new file with mode: 0755]
source/mircoders/producer/ScriptCallProducerFactory.java [new file with mode: 0755]
source/mircoders/producer/StartPageProducer.java [new file with mode: 0755]
source/mircoders/producer/StartPageProducerFactory.java [new file with mode: 0755]
source/mircoders/servlet/ServletModuleProducer.java

index de34636..77412c0 100755 (executable)
@@ -1,4 +1,4 @@
-
+import freemarker.template.SimpleList;
 import freemarker.template.SimpleHash;
 import freemarker.template.SimpleScalar;
 import mir.misc.HTMLParseException;
@@ -6,6 +6,10 @@ import mir.misc.HTMLTemplateProcessor;
 import mir.misc.MirConfig;
 import mir.misc.StringUtil;
 import mir.servlet.*;
+import mir.producer.*;
+
+import mircoders.global.*;
+import mircoders.localizer.*;
 import mircoders.entity.EntityUsers;
 import mircoders.module.ModuleMessage;
 import mircoders.module.ModuleUsers;
@@ -23,6 +27,7 @@ import java.lang.reflect.Method;
 import java.util.GregorianCalendar;
 import java.util.HashMap;
 import java.util.Locale;
+import java.util.*;
 
 /**
  *  Mir.java - main servlet, that dispatches to servletmodules
@@ -294,6 +299,31 @@ public class Mir extends AbstractServlet {
             mergeData.put("login_user", userEntity);
             if (messageModule == null) messageModule = new ModuleMessage(DatabaseMessages.getInstance());
             mergeData.put("messages", messageModule.getByWhereClause(null, "webdb_create desc", 0, 10));
+
+
+
+            SimpleList producersData = new SimpleList();
+            Iterator i = MirGlobal.localizer().producers().factories().entrySet().iterator();
+            while (i.hasNext()) {
+              Map.Entry entry = (Map.Entry) i.next();
+
+              SimpleList producerVerbs = new SimpleList();
+              Iterator j = ((ProducerFactory) entry.getValue()).verbs();
+              while (j.hasNext()) {
+                producerVerbs.add((String) j.next());
+              }
+
+              SimpleHash producerData = new SimpleHash();
+              producerData.put("key", (String) entry.getKey());
+              producerData.put("verbs", producerVerbs);
+
+              producersData.add(producerData);
+            }
+
+            mergeData.put("producers", producersData);
+
+
+
             HTMLTemplateProcessor.process(res, startTemplate, mergeData, out, getLocale(req));
         }
         catch (Exception e) {
diff --git a/source/mir/util/NullWriter.java b/source/mir/util/NullWriter.java
new file mode 100755 (executable)
index 0000000..8bb9027
--- /dev/null
@@ -0,0 +1,18 @@
+package mir.util;
+
+import java.io.*;
+
+public class NullWriter extends Writer {
+
+  public NullWriter() {
+  }
+
+  public void close() {
+  }
+
+  public void flush() {
+  }
+
+  public void write(char[] cbuf, int off, int len) {
+  }
+}
\ No newline at end of file
diff --git a/source/mircoders/global/MirGlobal.java b/source/mircoders/global/MirGlobal.java
new file mode 100755 (executable)
index 0000000..bd23556
--- /dev/null
@@ -0,0 +1,67 @@
+package mircoders.global;
+
+import mir.misc.*;
+import mircoders.localizer.*;
+
+import mircoders.localizer.basic.*;
+
+
+public class MirGlobal {
+  static private MirConfig configuration;
+  static private MirLocalizer localizer;
+  static private ProducerEngine producerEngine;
+
+  public static MirLocalizer localizer() {
+    if (localizer == null ) {
+      localizer = new MirBasicLocalizer();
+    }
+
+    return localizer;
+  };
+
+  public static MirConfig config() {
+    if (configuration == null) {
+      configuration = new MirConfig();
+    }
+
+    return configuration;
+  };
+
+  public static ProducerEngine producerEngine() {
+    if (producerEngine == null) {
+      producerEngine = new ProducerEngine();
+    }
+
+    return producerEngine;
+  }
+
+  public static String getConfigProperty(String aPropertyName) {
+    String result;
+
+    result = config().getProp(aPropertyName);
+
+    if (result==null)
+      throw new ConfigException("Property '" + aPropertyName + "' not present");
+
+    return result;
+  }
+
+  public static int getConfigIntegerProperty(String aPropertyName) {
+    String result;
+
+    result = config().getProp(aPropertyName);
+
+    return Integer.parseInt(result);
+  }
+
+  public static boolean getConfigBooleanProperty(String aPropertyName) {
+    String result;
+
+    result = config().getProp(aPropertyName);
+
+    if (result==null)
+      throw new ConfigException("Boolean property '" + aPropertyName + "' not present");
+
+    return (result.equals("yes") || result.equals("1"));
+  }
+}
diff --git a/source/mircoders/global/ProducerEngine.java b/source/mircoders/global/ProducerEngine.java
new file mode 100755 (executable)
index 0000000..267bd7c
--- /dev/null
@@ -0,0 +1,73 @@
+package mircoders.global;
+
+import java.util.*;
+import java.io.*;
+import mir.producer.*;
+import mir.util.*;
+
+public class ProducerEngine {
+  private Map producers;
+  private List Queue;
+  private Thread queueThread;
+
+  void ProducerEngine() {
+    producers = MirGlobal.localizer().producers().factories();
+    Queue = new Vector();
+
+//    queueThread = new Thread(
+  }
+
+  void addTask(String aProducerFactory, String aVerb) {
+    produceNow(aProducerFactory, aVerb, new PrintWriter(new NullWriter()));
+  }
+
+  void produceNow(String aProducerFactory, String aVerb, PrintWriter aLogger) {
+    try {
+      aLogger.println("Producing <" + aProducerFactory + "," + aVerb + "><br>");
+
+      ProducerFactory factory = (ProducerFactory) producers.get(aProducerFactory);
+
+      if (factory == null )
+        throw new Exception("No producer factory '"+aProducerFactory+"' present.");
+
+      Producer producer = factory.makeProducer(aVerb);
+
+      producer.produce(aLogger);
+    }
+    catch (Throwable e) {
+      try {
+        aLogger.println("exception occurred:<br>");
+        aLogger.println(e.getMessage());
+        e.printStackTrace(aLogger);
+      }
+      catch (Throwable f) {
+      }
+    }
+  }
+
+  private class ProducerQueueItem {
+    String factory;
+    String verb;
+
+    public ProducerQueueItem(String aFactory, String aVerb) {
+      factory = aFactory;
+      verb = aVerb;
+    }
+
+    public String getVerb() {
+      return verb;
+    }
+
+    public String getFactory() {
+      return factory;
+    }
+  }
+
+  private class ProducerQueue implements Runnable {
+    public void run() {
+      while (false) {
+      }
+    }
+  }
+
+}
\ No newline at end of file
diff --git a/source/mircoders/localizer/MirGeneratorLocalizer.java b/source/mircoders/localizer/MirGeneratorLocalizer.java
new file mode 100755 (executable)
index 0000000..b6852bb
--- /dev/null
@@ -0,0 +1,7 @@
+package mircoders.localizer;
+
+import mir.generator.*;
+
+public interface MirGeneratorLocalizer {
+  public Generator makeGenerator(String anIdentifier) throws MirLocalizerException;
+}
\ No newline at end of file
diff --git a/source/mircoders/localizer/MirLocalizer.java b/source/mircoders/localizer/MirLocalizer.java
new file mode 100755 (executable)
index 0000000..8e935b4
--- /dev/null
@@ -0,0 +1,8 @@
+package mircoders.localizer;
+
+public interface MirLocalizer {
+  public MirProducerLocalizer producers();
+  public MirOpenPostingLocalizer openPostings();
+  public MirProducerToolLocalizer producerTool();
+  public MirGeneratorLocalizer generators();
+}
\ No newline at end of file
diff --git a/source/mircoders/localizer/MirLocalizerException.java b/source/mircoders/localizer/MirLocalizerException.java
new file mode 100755 (executable)
index 0000000..9bb04db
--- /dev/null
@@ -0,0 +1,11 @@
+package mircoders.localizer;
+
+public class MirLocalizerException extends Exception {
+
+  public MirLocalizerException(String aMessage) {
+    super(aMessage);
+  }
+  public MirLocalizerException(Throwable aCause) {
+    super(aCause.getMessage());
+  }
+}
\ No newline at end of file
diff --git a/source/mircoders/localizer/MirOpenPostingLocalizer.java b/source/mircoders/localizer/MirOpenPostingLocalizer.java
new file mode 100755 (executable)
index 0000000..001833e
--- /dev/null
@@ -0,0 +1,6 @@
+package mircoders.localizer;
+
+public interface MirOpenPostingLocalizer {
+  public void afterContentPosting();
+  public void afterCommentPosting();
+}
diff --git a/source/mircoders/localizer/MirProducerLocalizer.java b/source/mircoders/localizer/MirProducerLocalizer.java
new file mode 100755 (executable)
index 0000000..f6d5422
--- /dev/null
@@ -0,0 +1,7 @@
+package mircoders.localizer;
+
+import java.util.*;
+
+public interface MirProducerLocalizer {
+  public Map factories();
+}
diff --git a/source/mircoders/localizer/MirProducerToolLocalizer.java b/source/mircoders/localizer/MirProducerToolLocalizer.java
new file mode 100755 (executable)
index 0000000..3fa3d8c
--- /dev/null
@@ -0,0 +1,4 @@
+package mircoders.localizer;
+
+public interface MirProducerToolLocalizer {
+}
diff --git a/source/mircoders/localizer/basic/FreemarkerGeneratorLocalizer.java b/source/mircoders/localizer/basic/FreemarkerGeneratorLocalizer.java
new file mode 100755 (executable)
index 0000000..0af3d6a
--- /dev/null
@@ -0,0 +1,32 @@
+package mircoders.localizer.basic;
+
+import freemarker.template.*;
+import mir.generator.*;
+import mircoders.localizer.*;
+
+public class FreemarkerGeneratorLocalizer  implements MirGeneratorLocalizer {
+  private FileTemplateCache  templateCache;
+
+  public FreemarkerGeneratorLocalizer(String aTemplateRoot) {
+    templateCache = new FileTemplateCache(aTemplateRoot+"/");
+    templateCache.setLoadingPolicy(templateCache.LOAD_ON_DEMAND);
+  }
+
+  public Generator makeGenerator(String anIdentifier) throws MirLocalizerException {
+    Template template = (Template) templateCache.getItem(anIdentifier, "template");
+
+    if (template==null) {
+      throw new MirLocalizerException("FreemarkerGeneratorLocalizer: Can't find template "+templateCache.getDirectory()+anIdentifier);
+    }
+
+    prepareTemplate(template);
+
+    // ML: check for null!
+
+    return new FreemarkerGenerator(template);
+  };
+
+  public void prepareTemplate(Template aTemplate) throws MirLocalizerException {
+  }
+}
+
diff --git a/source/mircoders/localizer/basic/MirBasicGeneratorLocalizer.java b/source/mircoders/localizer/basic/MirBasicGeneratorLocalizer.java
new file mode 100755 (executable)
index 0000000..6cde527
--- /dev/null
@@ -0,0 +1,14 @@
+package mircoders.localizer.basic;
+
+import freemarker.template.*;
+import mircoders.localizer.*;
+
+public class MirBasicGeneratorLocalizer extends FreemarkerGeneratorLocalizer {
+
+  public MirBasicGeneratorLocalizer (String aTemplateRoot) {
+    super(aTemplateRoot);
+  }
+
+  public void prepareTemplate(Template aTemplate) throws MirLocalizerException {
+  }
+}
diff --git a/source/mircoders/localizer/basic/MirBasicLocalizer.java b/source/mircoders/localizer/basic/MirBasicLocalizer.java
new file mode 100755 (executable)
index 0000000..9e9acab
--- /dev/null
@@ -0,0 +1,24 @@
+package mircoders.localizer.basic;
+
+import mircoders.localizer.*;
+import mircoders.global.*;
+
+public class MirBasicLocalizer implements MirLocalizer {
+
+  public MirProducerLocalizer producers() {
+    return new MirBasicProducerLocalizer();
+  }
+
+  public MirGeneratorLocalizer generators() {
+    return new MirBasicGeneratorLocalizer(MirGlobal.getConfigProperty("Home")+MirGlobal.getConfigProperty("HTMLTemplateProcessor.Dir"));
+  }
+
+  public MirOpenPostingLocalizer openPostings() {
+    return new MirBasicOpenPostingLocalizer();
+  }
+
+  public MirProducerToolLocalizer producerTool() {
+    return new MirBasicProducerToolLocalizer();
+  }
+
+}
\ No newline at end of file
diff --git a/source/mircoders/localizer/basic/MirBasicOpenPostingLocalizer.java b/source/mircoders/localizer/basic/MirBasicOpenPostingLocalizer.java
new file mode 100755 (executable)
index 0000000..87219dd
--- /dev/null
@@ -0,0 +1,12 @@
+package mircoders.localizer.basic;
+
+import mircoders.localizer.*;
+
+public class MirBasicOpenPostingLocalizer implements MirOpenPostingLocalizer {
+
+  public void afterContentPosting() {
+  }
+
+  public void afterCommentPosting() {
+  }
+}
diff --git a/source/mircoders/localizer/basic/MirBasicProducerLocalizer.java b/source/mircoders/localizer/basic/MirBasicProducerLocalizer.java
new file mode 100755 (executable)
index 0000000..7089b0e
--- /dev/null
@@ -0,0 +1,50 @@
+package mircoders.localizer.basic;
+
+import java.util.*;
+import mir.producer.*;
+import mircoders.global.*;
+import mircoders.localizer.*;
+import mircoders.producer.*;
+
+public class MirBasicProducerLocalizer implements MirProducerLocalizer {
+  private Map producerFactories;
+
+  public MirBasicProducerLocalizer() {
+    producerFactories = new HashMap();
+
+    setupFactories(producerFactories);
+  }
+
+  public Map factories() {
+    return producerFactories;
+  };
+
+  protected void setupFactories(Map aFactoriesMap ) {
+
+    aFactoriesMap.put(
+      "content",
+      new ContentProducerFactory(
+      MirGlobal.getConfigProperty("Producer.Content.Template"),
+      "bundles.admin",
+      MirGlobal.getConfigProperty("Producer.StorageRoot"),
+      ".shtml",
+      Integer.parseInt(MirGlobal.getConfigProperty("Producer.Content.Batchsize"))));
+
+    aFactoriesMap.put("oldstartpage", new OldProducerAdapterFactory(new ProducerStartPage()));
+    aFactoriesMap.put("images", new OldProducerAdapterFactory(new ProducerImages()));
+    aFactoriesMap.put("navigation", new OldProducerAdapterFactory(new ProducerNavigation()));
+    aFactoriesMap.put("openposting", new OldProducerAdapterFactory(new ProducerOpenPosting()));
+    aFactoriesMap.put("topics", new OldProducerAdapterFactory(new ProducerTopics()));
+
+    aFactoriesMap.put("startpage", new StartPageProducerFactory(
+      MirGlobal.getConfigProperty("Producer.StartPage.Template"),
+      "bundles.admin",
+      MirGlobal.getConfigProperty("Producer.StorageRoot") + "/index.shtml",
+      MirGlobal.getConfigIntegerProperty("Producer.StartPage.Items"),
+      MirGlobal.getConfigIntegerProperty("Producer.StartPage.Newswire")));
+
+    if(MirGlobal.getConfigBooleanProperty("Rsync")){
+      aFactoriesMap.put("sync", new ScriptCallProducerFactory(MirGlobal.getConfigProperty("Rsync.Script.Path")));
+    }
+  };
+}
diff --git a/source/mircoders/localizer/basic/MirBasicProducerToolLocalizer.java b/source/mircoders/localizer/basic/MirBasicProducerToolLocalizer.java
new file mode 100755 (executable)
index 0000000..a04bff9
--- /dev/null
@@ -0,0 +1,6 @@
+package mircoders.localizer.basic;
+
+import mircoders.localizer.*;
+
+public class MirBasicProducerToolLocalizer implements MirProducerToolLocalizer {
+}
diff --git a/source/mircoders/producer/ContentProducer.java b/source/mircoders/producer/ContentProducer.java
new file mode 100755 (executable)
index 0000000..d25aa8b
--- /dev/null
@@ -0,0 +1,135 @@
+package mircoders.producer;
+
+import java.io.*;
+import java.util.*;
+
+import mir.misc.*;
+import mir.entity.*;
+import mir.producer.*;
+import mir.generator.*;
+
+import mircoders.localizer.*;
+import mircoders.global.*;
+import mircoders.entity.*;
+
+import org.apache.struts.util.MessageResources;
+
+// @todo ML: the file that gets generated should be better configurable
+
+public class ContentProducer implements mir.producer.Producer {
+
+  private String generatorIdentifier;
+  private String resourceBundle;
+
+  private String outputFilePrefix;
+  private String outputFilePostfix;
+
+  EntityBrowser browser;
+
+  public ContentProducer(
+    EntityBrowser aBrowser,
+    String aGeneratorIdentifier,
+    String aResourceBundle,
+    String anOutputFilePrefix,
+    String anOutputFilePostfix) {
+
+    browser = aBrowser;
+    generatorIdentifier=aGeneratorIdentifier;
+    resourceBundle=aResourceBundle;
+    outputFilePrefix=anOutputFilePrefix;
+    outputFilePostfix=anOutputFilePostfix;
+  }
+
+  public void produce( PrintWriter aLogger ) throws ProducerException {
+    EntityContent content;
+
+    Map configMap = new HashMap();
+    Map generationValues = new HashMap();
+    Map dataMap = new HashMap();
+    String fileName;
+
+
+
+               configMap.put("producerDocRoot", MirGlobal.getConfigProperty("Producer.DocRoot"));
+               configMap.put("storageRoot", MirGlobal.getConfigProperty("Producer.StorageRoot"));
+    configMap.put("productionHost", MirGlobal.getConfigProperty("Producer.ProductionHost"));
+               configMap.put("openAction", MirGlobal.getConfigProperty("Producer.OpenAction"));
+               configMap.put("docRoot", MirGlobal.getConfigProperty("RootUri"));
+               configMap.put("now", StringUtil.date2readableDateTime(new GregorianCalendar()));
+               configMap.put("videoHost", MirGlobal.getConfigProperty("Producer.Video.Host"));
+               configMap.put("audioHost", MirGlobal.getConfigProperty("Producer.Audio.Host"));
+               configMap.put("imageHost", MirGlobal.getConfigProperty("Producer.Image.Host"));
+               configMap.put("imagePath", MirGlobal.getConfigProperty("Producer.Image.Path"));
+               configMap.put("mirVersion", MirGlobal.getConfigProperty("Mir.Version"));
+               configMap.put("compressWhitespace", new freemarker.template.utility.CompressWhitespace() );
+    generationValues.put("config", configMap);
+
+               MessageResources messages = MessageResources.getMessageResources(resourceBundle);
+               generationValues.put("lang", new MessageMethodModel(null, messages) );
+               generationValues.put("data", dataMap);
+
+
+
+    try {
+      Generator generator = MirGlobal.localizer().generators().makeGenerator(generatorIdentifier);
+
+      aLogger.println("ContentProducer.produce:<br>");
+      aLogger.println("generatorIdentifier = " + generatorIdentifier + "<br>");
+
+      while (browser.hasNext()) {
+        content = (EntityContent) browser.next();
+        dataMap.put("content", content);
+
+        String date = content.getValue("date");
+
+
+        fileName = outputFilePrefix + "/" +
+                date.substring(0,4) + "/" + date.substring(4,6) + "/" +
+                content.getValue("id") + outputFilePostfix;
+
+        aLogger.println("fileName = " + fileName + "<br>");
+        aLogger.println("Yo1<br>");
+
+        try {
+          File file = new File(fileName);
+          FileWriter fileWriter = new FileWriter(file);
+          PrintWriter printWriter = new PrintWriter(fileWriter);
+
+          aLogger.println("generating: " + fileName + "<br/>");
+
+          aLogger.println("Yo2<br>");
+          generator.generate(printWriter, generationValues, aLogger);
+
+          aLogger.println("Yo3<br>");
+          printWriter.close();
+          fileWriter.close();
+          aLogger.println("Yo4<br>");
+
+          aLogger.println("Yo5<br>");
+
+          content.setProduced(true);
+          aLogger.println("Yo6<br>");
+
+          aLogger.println("done generating: " + fileName + "<br/>");
+        }
+        catch (Exception e) {
+          aLogger.println("exception while generating " + fileName + ":<br/>");
+          aLogger.println(e.getMessage() + "<br/>");
+          e.printStackTrace(aLogger);
+          aLogger.flush();
+        }
+      }
+    }
+    catch (Exception e) {
+      aLogger.println("exception while generating:<br/>");
+      aLogger.println(e.getMessage() + "<br/>");
+      e.printStackTrace(aLogger);
+      aLogger.flush();
+    }
+
+    aLogger.println("ContentProducer.produce: done<br>");
+
+  }
+
+}
+
diff --git a/source/mircoders/producer/ContentProducerFactory.java b/source/mircoders/producer/ContentProducerFactory.java
new file mode 100755 (executable)
index 0000000..048b2d6
--- /dev/null
@@ -0,0 +1,65 @@
+package mircoders.producer;
+
+import java.util.*;
+import mir.entity.*;
+import mir.producer.*;
+import mircoders.storage.*;
+
+public class ContentProducerFactory implements ProducerFactory {
+  private String generatorIdentifier;
+  private String resourceBundle;
+  private String outputFilePrefix;
+  private String outputFilePostfix;
+  private int batchSize;
+
+// ML: extra selection needed for article types
+  public ContentProducerFactory(
+    String aGeneratorIdentifier,
+    String aResourceBundle,
+    String anOutputFilePrefix,
+    String anOutputFilePostfix,
+    int aBatchSize) {
+
+    generatorIdentifier=aGeneratorIdentifier;
+    resourceBundle=aResourceBundle;
+    outputFilePrefix=anOutputFilePrefix;
+    outputFilePostfix=anOutputFilePostfix;
+    batchSize=aBatchSize;
+  }
+
+  public mir.producer.Producer makeProducer(String aVerb) throws ProducerException {
+    try {
+      QueryBuilder queryBuilder = new QueryBuilder();
+
+      queryBuilder.appendAndCondition("is_published='1'");
+
+      if (!aVerb.equals("all")) {
+        queryBuilder.appendAndCondition("is_produced='0'");
+      }
+
+      return new ContentProducer(
+        new EntityBrowser(
+          DatabaseContent.getInstance(),
+          queryBuilder.getWhereClause(),
+          queryBuilder.getOrderByClause(),
+          batchSize),
+        generatorIdentifier,
+        resourceBundle,
+        outputFilePrefix,
+        outputFilePostfix
+      );
+    } catch (Exception e) {
+      throw new ProducerException(e);
+    }
+  };
+
+  public Iterator verbs() {
+    Vector verbList = new Vector();
+
+    verbList.add("new");
+    verbList.add("all");
+
+    return verbList.iterator();
+  };
+}
+
diff --git a/source/mircoders/producer/OldProducerAdapter.java b/source/mircoders/producer/OldProducerAdapter.java
new file mode 100755 (executable)
index 0000000..d3a4742
--- /dev/null
@@ -0,0 +1,24 @@
+package mircoders.producer;
+
+import mir.producer.*;
+import java.io.*;
+
+public class OldProducerAdapter implements mir.producer.Producer {
+
+  private mircoders.producer.Producer oldProducer;
+  private Boolean forced;
+
+  public OldProducerAdapter( mircoders.producer.Producer anOldProducer, Boolean aForced ) {
+    oldProducer = anOldProducer;
+    forced = aForced;
+  }
+
+  public void produce( PrintWriter aLogger ) throws ProducerException {
+    try {
+      oldProducer.handle( aLogger, null, forced.booleanValue(), false );
+    }
+    catch (Throwable e) {
+      throw new ProducerException(e);
+    }
+  }
+}
\ No newline at end of file
diff --git a/source/mircoders/producer/OldProducerAdapterFactory.java b/source/mircoders/producer/OldProducerAdapterFactory.java
new file mode 100755 (executable)
index 0000000..ffb9cdb
--- /dev/null
@@ -0,0 +1,25 @@
+package mircoders.producer;
+
+import mir.producer.*;
+import java.util.*;
+
+public class OldProducerAdapterFactory implements ProducerFactory {
+
+  private mircoders.producer.Producer oldProducer;
+
+  public Iterator verbs() {
+    Vector verbList = new Vector();
+
+    verbList.add("new");
+    verbList.add("all");
+    return verbList.iterator();
+  }
+
+  public OldProducerAdapterFactory(mircoders.producer.Producer anOldProducer) {
+    oldProducer = anOldProducer;
+  }
+
+  public mir.producer.Producer makeProducer(String aVerb) {
+    return new OldProducerAdapter(oldProducer, new Boolean(aVerb.equals("all")));
+  }
+}
\ No newline at end of file
diff --git a/source/mircoders/producer/ScriptCallProducer.java b/source/mircoders/producer/ScriptCallProducer.java
new file mode 100755 (executable)
index 0000000..dc598a4
--- /dev/null
@@ -0,0 +1,32 @@
+package mircoders.producer;
+
+import mir.producer.*;
+import java.io.*;
+
+// ML: needs to be tested!
+
+public class ScriptCallProducer implements mir.producer.Producer {
+  String script;
+
+  public ScriptCallProducer(String aScript) {
+    script = aScript;
+  }
+
+  public void produce( PrintWriter aLogger ) throws ProducerException {
+    Process process;
+    int returnValue;
+
+    aLogger.println("Executing " + script + ":<br>");
+
+    try {
+      process = Runtime.getRuntime().exec(script);
+      returnValue = process.waitFor();
+      aLogger.println("Terminated successfully, return value = " + returnValue + ".<br>");
+    }
+    catch (Throwable e) {
+      aLogger.println("Exception has occurred: " + e.getMessage() + ":<br>");
+      e.printStackTrace(aLogger);
+      throw new ProducerException(e);
+    }
+  }
+}
diff --git a/source/mircoders/producer/ScriptCallProducerFactory.java b/source/mircoders/producer/ScriptCallProducerFactory.java
new file mode 100755 (executable)
index 0000000..b8ae757
--- /dev/null
@@ -0,0 +1,30 @@
+package mircoders.producer;
+
+import java.util.*;
+import mir.entity.*;
+import mir.producer.*;
+import mircoders.storage.*;
+
+public class ScriptCallProducerFactory implements ProducerFactory {
+  private String script;
+
+
+  public ScriptCallProducerFactory(String aScript) {
+    script=aScript;
+  }
+
+  public mir.producer.Producer makeProducer(String aVerb) throws ProducerException {
+
+
+    return new ScriptCallProducer(script);
+  };
+
+  public Iterator verbs() {
+    Vector verbList = new Vector();
+
+    verbList.add("run");
+
+    return verbList.iterator();
+  };
+}
+
diff --git a/source/mircoders/producer/StartPageProducer.java b/source/mircoders/producer/StartPageProducer.java
new file mode 100755 (executable)
index 0000000..8371b00
--- /dev/null
@@ -0,0 +1,105 @@
+package mircoders.producer;
+
+import java.io.*;
+import java.util.*;
+
+import mir.misc.*;
+import mir.entity.*;
+import mir.producer.*;
+import mir.generator.*;
+
+import mircoders.localizer.*;
+import mircoders.global.*;
+import mircoders.entity.*;
+
+import mircoders.module.*;
+
+import org.apache.struts.util.MessageResources;
+
+public class StartPageProducer implements mir.producer.Producer {
+
+  private String generatorIdentifier;
+  private String resourceBundle;
+  private String outputFile;
+  private EntityList newswireItems;
+  private EntityList features;
+  private EntityList topics;
+  private EntityList breakingNews;
+
+  EntityBrowser browser;
+
+  public StartPageProducer(
+    String aGeneratorIdentifier,
+    String aResourceBundle,
+    String anOutputFile,
+
+    EntityList aNewswireItems,
+    EntityList aFeatures,
+    EntityList aTopics,
+    EntityList aBreakingNews) {
+
+    generatorIdentifier=aGeneratorIdentifier;
+    resourceBundle=aResourceBundle;
+    outputFile=anOutputFile;
+    newswireItems = aNewswireItems;
+    features = aFeatures;
+    topics = aTopics;
+    breakingNews = aBreakingNews;
+  }
+
+  public void produce( PrintWriter aLogger ) throws ProducerException {
+    Map configMap = new HashMap();
+    Map generationValues = new HashMap();
+    Map dataMap = new HashMap();
+
+    try {
+                 configMap.put("producerDocRoot", MirGlobal.getConfigProperty("Producer.DocRoot"));
+                 configMap.put("storageRoot", MirGlobal.getConfigProperty("Producer.StorageRoot"));
+      configMap.put("productionHost", MirGlobal.getConfigProperty("Producer.ProductionHost"));
+                 configMap.put("openAction", MirGlobal.getConfigProperty("Producer.OpenAction"));
+                 configMap.put("docRoot", MirGlobal.getConfigProperty("RootUri"));
+                 configMap.put("now", StringUtil.date2readableDateTime(new GregorianCalendar()));
+                 configMap.put("videoHost", MirGlobal.getConfigProperty("Producer.Video.Host"));
+                 configMap.put("audioHost", MirGlobal.getConfigProperty("Producer.Audio.Host"));
+                 configMap.put("imageHost", MirGlobal.getConfigProperty("Producer.Image.Host"));
+                 configMap.put("imagePath", MirGlobal.getConfigProperty("Producer.Image.Path"));
+                 configMap.put("mirVersion", MirGlobal.getConfigProperty("Mir.Version"));
+                 configMap.put("compressWhitespace", new freemarker.template.utility.CompressWhitespace() );
+
+      generationValues.put("config", configMap);
+
+                 MessageResources messages = MessageResources.getMessageResources(resourceBundle);
+                 generationValues.put("lang", new MessageMethodModel(null, messages) );
+
+                 generationValues.put("data", dataMap);
+
+      dataMap.put("dc_now", StringUtil.date2w3DateTime(new GregorianCalendar()));
+      dataMap.put("newswire", newswireItems);
+      dataMap.put("features", features);
+                 dataMap.put("breakingnews", breakingNews);
+      dataMap.put("topics", topics);
+
+
+      Generator generator = MirGlobal.localizer().generators().makeGenerator(generatorIdentifier);
+
+      aLogger.println("StartPageProducer.produce:<br>");
+      aLogger.println("generatorIdentifier = " + generatorIdentifier + "<br>");
+
+      File file = new File(outputFile);
+      FileWriter fileWriter = new FileWriter(file);
+      PrintWriter printWriter = new PrintWriter(fileWriter);
+
+      aLogger.println("generating: " + outputFile + "<br/>");
+      generator.generate(printWriter, generationValues, aLogger);
+      printWriter.close();
+      fileWriter.close();
+      aLogger.println("done<br/>");
+    }
+    catch (Exception e) {
+      aLogger.println("exception while generating " + outputFile + ":<br/>");
+      aLogger.println(e.getMessage() + "<br/>");
+      e.printStackTrace(aLogger);
+      aLogger.flush();
+    }
+  }
+}
diff --git a/source/mircoders/producer/StartPageProducerFactory.java b/source/mircoders/producer/StartPageProducerFactory.java
new file mode 100755 (executable)
index 0000000..ad30d67
--- /dev/null
@@ -0,0 +1,60 @@
+package mircoders.producer;
+
+import java.util.*;
+import mir.entity.*;
+import mir.producer.*;
+import mircoders.storage.*;
+import mircoders.module.*;
+
+public class StartPageProducerFactory implements ProducerFactory {
+  private String generatorIdentifier;
+  private String resourceBundle;
+  private String outputFile;
+  private int nrNewswireItems;
+  private int nrFeatures;
+
+  public StartPageProducerFactory(
+    String aGeneratorIdentifier,
+    String aResourceBundle,
+    String anOutputFile,
+    int aNrFeatures,
+    int aNrNewswireItems) {
+
+    generatorIdentifier = aGeneratorIdentifier;
+    resourceBundle = aResourceBundle;
+    outputFile = anOutputFile;
+    nrFeatures = aNrFeatures;
+    nrNewswireItems = aNrNewswireItems;
+  }
+
+
+  public mir.producer.Producer makeProducer(String aVerb) throws ProducerException {
+
+    try {
+      ModuleContent contentModule = new ModuleContent(DatabaseContent.getInstance());
+      ModuleTopics topicsModule = new ModuleTopics(DatabaseTopics.getInstance());
+      ModuleBreaking breakingModule = new ModuleBreaking(DatabaseBreaking.getInstance());
+
+      return new StartPageProducer(
+                    generatorIdentifier,
+                    resourceBundle,
+                    outputFile,
+                    contentModule.getFeatures(0,nrFeatures),
+                    contentModule.getNewsWire(0,nrNewswireItems),
+                    breakingModule.getBreakingNews(),
+                    topicsModule .getTopicsList());
+    }
+    catch (Throwable e) {
+      throw new ProducerException(e);
+    }
+  };
+
+  public Iterator verbs() {
+    Vector verbList = new Vector();
+
+    verbList.add("all");
+
+    return verbList.iterator();
+  };
+}
+
index 1e4e0d2..f9d820b 100755 (executable)
@@ -10,9 +10,11 @@ import freemarker.template.*;
 
 import mir.servlet.*;
 import mir.misc.*;
+import mir.producer.*;
 
 import mircoders.producer.*;
 import mircoders.entity.*;
+import mircoders.global.*;
 
 /* Verteilerservlet, dass je nach Parameter task die Klasse Producer"TASK"
  * ueber die Methode handle(); aufruft
@@ -37,29 +39,48 @@ public class ServletModuleProducer extends ServletModule
        {
                try {
                        PrintWriter out = res.getWriter();
-                       String taskParam = req.getParameter("task");
-                       String forcedParam = req.getParameter("forced");
-      String syncParam = req.getParameter("sync");
-                       theLog.printInfo("Starting Task: " + taskParam);
-                       if (taskParam == null) {
-                               throw new ServletModuleException("Kein Task angegeben!");
-                       } else {
-        Class producerModule = Class.forName("mircoders.producer.Producer" + taskParam);
-        Producer producer = (Producer)producerModule.newInstance();
-        HttpSession session=req.getSession(false);
-                               EntityUsers user = (EntityUsers)session.getAttribute("login.uid");
-
-        if (forcedParam!=null && !forcedParam.equals("")) {
-          if (syncParam!=null && !syncParam.equals("")) {
-            producer.handle(out, user, true, true);
-          } else {
-            producer.handle(out, user, true,false);
+
+
+                       if (req.getParameter("producer")!=null) {
+      // ML: new producer system:
+
+                       String producerParam = req.getParameter("producer");
+                       String verbParam = req.getParameter("verb");
+
+        ProducerFactory factory = (ProducerFactory) MirGlobal.localizer().producers().factories().get(producerParam);
+        mir.producer.Producer producer = factory.makeProducer(verbParam);
+
+        producer.produce(out);
+
+      }
+      else
+      {
+      // ML: old producer system:
+
+                       String taskParam = req.getParameter("task");
+                       String forcedParam = req.getParameter("forced");
+        String syncParam = req.getParameter("sync");
+                       theLog.printInfo("Starting Task: " + taskParam);
+                       if (taskParam == null) {
+                               throw new ServletModuleException("Kein Task angegeben!");
+                       } else {
+          Class producerModule = Class.forName("mircoders.producer.Producer" + taskParam);
+          mircoders.producer.Producer producer = (mircoders.producer.Producer) producerModule.newInstance();
+          HttpSession session=req.getSession(false);
+                               EntityUsers user = (EntityUsers)session.getAttribute("login.uid");
+
+          if (forcedParam!=null && !forcedParam.equals("")) {
+            if (syncParam!=null && !syncParam.equals("")) {
+              producer.handle(out, user, true, true);
+            } else {
+              producer.handle(out, user, true,false);
+            }
+                               } else {
+                                       producer.handle(out, user, false,false);
           }
-                               } else {
-                                       producer.handle(out, user, false,false);
-        }
 
-                       }
+                       }
+               }
                }
                catch (Exception e) {
       throw new ServletModuleException(e.toString());