- producer links are moved to an "advanced" page, not intended for normal
authorzapata <zapata>
Fri, 25 Oct 2002 03:25:13 +0000 (03:25 +0000)
committerzapata <zapata>
Fri, 25 Oct 2002 03:25:13 +0000 (03:25 +0000)
  users. Normal users have only 1 link "generate all new"
- used br1's support for log4j at 1 place (ServletModuleDispatch)
- misc. small changes/fixes here and there

61 files changed:
bundles/admin_en.properties
etc/config.properties-dist
etc/log4j.properties
etc/producer/producers.xml
source/Mir.java
source/OpenMir.java
source/mir/log/Logger.java
source/mir/log/LoggerWrapper.java [new file with mode: 0755]
source/mir/log/log4j/LoggerImpl.java
source/mir/producer/AssignmentProducerNode.java
source/mir/producer/CompositeProducerNode.java
source/mir/producer/ConditionalProducerNode.java
source/mir/producer/DirCopyingProducerNode.java
source/mir/producer/EntityBatchingProducerNode.java
source/mir/producer/EntityEnumeratingProducerNode.java
source/mir/producer/EntityModifyingProducerNode.java
source/mir/producer/EvaluatedAssignmentProducerNode.java
source/mir/producer/ExpandedAssignmentProducerNode.java
source/mir/producer/FileOperationProducerNode.java
source/mir/producer/GeneratingProducerNode.java
source/mir/producer/LoggingProducerNode.java
source/mir/producer/LoopProducerNode.java
source/mir/producer/NodedProducer.java
source/mir/producer/NodedProducerFactory.java
source/mir/producer/Producer.java
source/mir/producer/ProducerFactory.java
source/mir/producer/ProducerNode.java
source/mir/producer/ProducerNodeDecorator.java
source/mir/producer/ResourceBundleProducerNode.java
source/mir/producer/ScriptCallingProducerNode.java
source/mir/producer/SimpleProducerVerb.java [new file with mode: 0755]
source/mir/producer/ValuesMapProducerNode.java
source/mir/producer/reader/DefaultProducerNodeBuilders.java
source/mir/producer/reader/ProducerConfigReader.java
source/mir/producer/reader/ScriptedProducerFactory.java
source/mir/producer/reader/ScriptedProducerNode.java
source/mir/servlet/ServletModule.java
source/mir/servlet/ServletModuleDispatch.java
source/mir/servlet/ServletModuleUserException.java
source/mircoders/global/JobQueue.java
source/mircoders/global/ProducerEngine.java
source/mircoders/localizer/MirProducerLocalizer.java
source/mircoders/localizer/basic/MirBasicOpenPostingLocalizer.java
source/mircoders/localizer/basic/MirBasicProducerLocalizer.java
source/mircoders/producer/CompositeProducer.java
source/mircoders/producer/CompositeProducerFactory.java
source/mircoders/producer/ContentMarkingProducerNode.java
source/mircoders/producer/ContentModifyingProducerNode.java
source/mircoders/producer/IndexingProducerNode.java
source/mircoders/producer/MediaGeneratingProducerNode.java
source/mircoders/producer/OldProducerAdapter.java
source/mircoders/producer/OldProducerAdapterFactory.java
source/mircoders/producer/PDFGeneratingProducerNode.java
source/mircoders/producer/PDFPreFormattingProducerNode.java
source/mircoders/servlet/ServletModuleComment.java
source/mircoders/servlet/ServletModuleProducer.java
templates/admin/error.template [new file with mode: 0755]
templates/admin/infomessage.template [new file with mode: 0755]
templates/admin/producerqueue.template [new file with mode: 0755]
templates/admin/start_admin.template
templates/admin/usererror.template [new file with mode: 0755]

index 6cebf69..cac3bb9 100755 (executable)
@@ -1,6 +1,6 @@
 ########## admin ##########
 # language: english
-# $Id: admin_en.properties,v 1.21 2002/10/20 03:22:44 maulwurf Exp $
+# $Id: admin_en.properties,v 1.22 2002/10/25 03:25:13 zapata Exp $
 
 # general
 yes=yes
@@ -229,21 +229,11 @@ start.content.with_media=with media
 start.content.last_changes=latest changes
 start.content.with_comments=with internal comments
 start.content.search=search
-start.generate.title=GENERATE MANUALLY
-start.generate.all.title=all areas
-start.generate.all.new=all new (standard, update to www > 5min.)
-start.generate.parts.title=specific parts of the site
-start.generate.startpages.new=new startpage
-start.generate.all_forced=all (forced)
-start.generate.all_sync=all (forced + sync)
-start.generate.content.new=new content
-start.generate.topics.new=new topics
-start.generate.postings.new=new openpostings
-start.generate.images.new=new images
-start.generate.audio.new=new audio files
-start.generate.video.new=new video files
-start.generate.other.new=new other media
-start.generate.navigation=navigation
+
+start.producers.title=GENERATE MANUALLY
+start.producers.produceAllNew=Generate all new
+start.producers.advanced=Advanced page (use with care!)
+
 start.coverage.title=COVERAGE
 start.topics.title=TOPICS
 start.images.title=PICTURES
@@ -285,14 +275,36 @@ head.logged_in=logged in
 foot.top=top
 
 
+
+
+producer.producer = Producer name
+producer.verb.name = Task name
+producer.verb.description = Task description
+producer.verb.enqueue = enqueue
+
+producer.job.name = Job
+producer.job.status = Status
+producer.job.date = Last change
+producer.job.cancel = cancel
+producer.job.abort = abort
+
+producer.jobqueue.title = Current jobs
+producer.jobqueue.refresh = refresh
+producer.producerlist.title = Add a new job
+
+
+
 ########## error ##########
 
-error.htmltitle=the system is the error
-error.title=OOPS!
-error.text=That can happen. Even if the following error message may not be very useful to you, it could be very helpful for <a href="mailto:{0}">{1}</a>:
-error.text2=So please send a mail with the <font color="Red">red text</font> and a detailed error description to <a href="mailto:{0}">{1}</a>. Thanks!
+error.htmltitle=the system caused an error
+error.title=The system caused an error
+error.text=This can happen. Even if the following error message is not be comprehensible for you, it might be helpful to <a href="mailto:{0}">{1}</a>:
+error.text2=So please send an e-mail with the <font color="Red">red text</font> and detailed information regarding the events that led to this error to <a href="mailto:{0}">{1}</a>. Thanks!
 
-usererror.htmltitle=input error
-usererror.title=OOPS!
+usererror.htmltitle=validation error
+usererror.title=Validation error
 usererror.text=Your input caused the following error:
 usererror.what_to_do=Please press the back button and try it again
+
+infomessage.title = Information
+infomessage.produceAllNewAddedToQueue = Your request has been added to the queue.
index e8775a7..a017bdc 100755 (executable)
@@ -47,6 +47,10 @@ Mir.Version=1.1beta
 StandardLanguage=de
 DirectOpenposting=yes
 
+Log.LogClass = mir.log.log4j.LoggerImpl
+Log.log4j.ConfigurationFile = etc/log4j.properties
+Log.Home = log
+
 Mir.Localizer=mircoders.localizer.basic.MirBasicLocalizer
 Mir.Localizer.Logfile=log/localizer.log
 
@@ -59,8 +63,14 @@ Mir.Localizer.Admin.GeneratorLibrary= default=freemarker(templates/admin/)
 Mir.Localizer.OpenPosting.GeneratorLibrary= default=freemarker(etc/open/)
 
 # Which producers need to be called after an article (resp. a comment) is posted
-Mir.Localizer.OpenPosting.ContentProducers= media.new;articles.new;startpage.new;synchronization.run
-Mir.Localizer.OpenPosting.CommentProducers= articles.new;synchronization.run
+Mir.Localizer.OpenPosting.ContentProducers= media.new;articles.changed;startpage.generate;synchronization.run
+Mir.Localizer.OpenPosting.CommentProducers= articles.changed;synchronization.run
+
+# Which producers need to be called after the "produce all new" link is clicked
+from admin
+Mir.Localizer.Producer.AllNewProducers= media.new;articles.changed;startpage.run;syn
+chronization.run
+
 
 #note that you can't make pdf's without making fo's
 GenerateFO=yes
index 5fe42d8..72ffb6e 100755 (executable)
@@ -1,9 +1,15 @@
-# Set root logger level to DEBUG and its only appender to A1.
-log4j.rootLogger=DEBUG, A1
 
-# A1 is set to be a ConsoleAppender.
+log4j.rootLogger= DEBUG, A1
+log4j.logger.servlet= INFO, ServletA
+
 log4j.appender.A1=org.apache.log4j.ConsoleAppender
 
+log4j.appender.ServletA=org.apache.log4j.RollingFileAppender
+log4j.appender.ServletA.File=${log.home}/servlet.log
+
 # A1 uses PatternLayout.
 log4j.appender.A1.layout=org.apache.log4j.PatternLayout
 log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
+
+log4j.appender.ServletA.layout=org.apache.log4j.PatternLayout
+log4j.appender.ServletA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
index 934e668..a5e6a29 100755 (executable)
       <List key="breakingnews" table="breakingNews" limit="10"
          order="webdb_create desc"/>
         
-        
-        
       <Language>
         <Generate 
             generator="/startpage.template" 
       </Language>
     </body>
   </producer>  
+  
+  <producer name="synchronization">
+    <verbs>
+      <verb name="run" default="1" description="Synchronizes the publication site with the production site"/>
+    </verbs>
+
+    <body>
+      <If condition="config['Rsync']">
+        <then>
+          <Execute command="${config['Rsync.Script.Path']}"/>
+        </then>
+      </If>
+    </body>
+  </producer>  
+  
 </producers>
 
 
index ea6ddaa..5ac36ec 100755 (executable)
@@ -66,10 +66,16 @@ import mir.log.Log;
 /**
  * Mir.java - main servlet, that dispatches to servletmodules
  *
- * @author $Author: bruno $
- * @version $Revision: 1.20 $ $Date: 2002/10/09 16:09:05 $
+ * @author $Author: zapata $
+ * @version $Revision: 1.21 $ $Date: 2002/10/25 03:25:13 $
  *
  * $Log: Mir.java,v $
+ * Revision 1.21  2002/10/25 03:25:13  zapata
+ * - producer links are moved to an "advanced" page, not intended for normal
+ *   users. Normal users have only 1 link "generate all new"
+ * - used br1's support for log4j at 1 place (ServletModuleDispatch)
+ * - misc. small changes/fixes here and there
+ *
  * Revision 1.20  2002/10/09 16:09:05  bruno
  * contains only admin templates which should not be changed by users
  *
@@ -229,10 +235,10 @@ public class Mir extends AbstractServlet {
         }
         catch (ServletModuleException e) {
             handleError(req, res, res.getWriter(),
-                        "ServletException in Module " + moduleName + " -- " + e.toString());
+                        "ServletException in Module " + moduleName + " -- " + e.getMessage());
         }
         catch (ServletModuleUserException e) {
-            handleUserError(req, res, res.getWriter(), e.getMsg());
+            handleUserError(req, res, res.getWriter(), e.getMessage());
         }
 
         // timing...
@@ -272,7 +278,7 @@ public class Mir extends AbstractServlet {
             }
             catch (Exception e) {
                 throw new ServletModuleException("*** error resolving classname for " +
-                                                 moduleName + " -- " + e.toString());
+                                                 moduleName + " -- " + e.getMessage());
             }
         }
         else
@@ -292,7 +298,8 @@ public class Mir extends AbstractServlet {
             out.close();
         }
         catch (Exception e) {
-            System.err.println("Error in ErrorTemplate");
+          e.printStackTrace(System.out);
+          System.err.println("Error in ErrorTemplate: " + e.getMessage());
         }
     }
 
@@ -308,7 +315,7 @@ public class Mir extends AbstractServlet {
             out.close();
         }
         catch (Exception e) {
-            System.err.println("Fehler in UserErrorTemplate");
+            System.err.println("Error in UserErrorTemplate");
         }
 
     }
@@ -322,7 +329,7 @@ public class Mir extends AbstractServlet {
             return usersModule.getUserForLogin(user, password);
         }
         catch (Exception e) {
-            theLog.printDebugInfo(e.toString());
+            theLog.printDebugInfo(e.getMessage());
             e.printStackTrace();
             return null;
         }
@@ -361,6 +368,7 @@ public class Mir extends AbstractServlet {
 
             mergeData.put("articletypes", DatabaseArticleType.getInstance().selectByWhereClause("", "id", 0, 20));
 
+/*
             SimpleList producersData = new SimpleList();
             Iterator i = MirGlobal.localizer().producers().factories().entrySet().iterator();
             while (i.hasNext()) {
@@ -379,14 +387,14 @@ public class Mir extends AbstractServlet {
               producersData.add(producerData);
             }
             mergeData.put("producers", producersData);
-
+ */
 
 
             HTMLTemplateProcessor.process(res, startTemplate, mergeData, out, getLocale(req));
         }
         catch (Exception e) {
             e.printStackTrace(System.out);
-            handleError(req, res, out, "error while trying to send startpage. " + e.toString());
+            handleError(req, res, out, "error while trying to send startpage. " + e.getMessage());
         }
     }
 
index aeefb12..2c6f092 100755 (executable)
@@ -99,11 +99,11 @@ public class OpenMir extends AbstractServlet {
       ServletModuleDispatch.dispatch(ServletModuleOpenIndy.getInstance(),req,res);
     }
     catch (ServletModuleUserException e) {
-      handleUserError(req,res,res.getWriter(), e.getMsg());
+      handleUserError(req,res,res.getWriter(), e.getMessage());
     }
     catch (ServletModuleException e){
       e.printStackTrace();
-      handleError(req,res,res.getWriter(), "OpenIndy :: ServletException in Module ServletModule -- " + e.toString());
+      handleError(req,res,res.getWriter(), "OpenIndy :: ServletException in Module ServletModule -- " + e.getMessage());
     }
     // timing...
     sessionConnectTime = new java.util.Date().getTime() - startTime;
@@ -122,7 +122,7 @@ public class OpenMir extends AbstractServlet {
       out.close();
     }
     catch (Exception e) {
-      System.err.println("Fehler in UserErrorTemplate");
+      System.err.println("Error in UserErrorTemplate");
     }
 
   }
@@ -140,7 +140,7 @@ public class OpenMir extends AbstractServlet {
       out.close();
     }
     catch (Exception e) {
-      System.err.println("Fehler in ErrorTemplate");
+      System.err.println("Error in ErrorTemplate");
     }
 
   }
index 8468fde..9f1f4a1 100755 (executable)
@@ -2,9 +2,9 @@ package mir.log;
 
 
 public interface Logger {
-    public void debug( Object o, String s);
-    public void info( Object o, String s);
-    public void warn( Object o, String s);
-    public void error( Object o, String s);
-    public void fatal( Object o, String s);
+  public void debug( Object o, String s);
+  public void info( Object o, String s);
+  public void warn( Object o, String s);
+  public void error( Object o, String s);
+  public void fatal( Object o, String s);
 }
diff --git a/source/mir/log/LoggerWrapper.java b/source/mir/log/LoggerWrapper.java
new file mode 100755 (executable)
index 0000000..7912c50
--- /dev/null
@@ -0,0 +1,30 @@
+package mir.log;
+
+public class LoggerWrapper {
+  private Object object;
+
+  public LoggerWrapper( Object anObject ) {
+    object = anObject;
+  }
+
+  public void debug( String aMessage ) {
+    Log.debug(object, aMessage);
+  };
+
+  public void info( String aMessage ) {
+    Log.info(object, aMessage);
+  };
+
+  public void warn( String aMessage ) {
+    Log.warn(object, aMessage);
+  };
+
+
+  public void error( String aMessage ) {
+    Log.error(object, aMessage);
+  };
+
+  public void fatal( String aMessage ) {
+    Log.fatal(object, aMessage);
+  };
+}
\ No newline at end of file
index 298a6d9..d821f5c 100755 (executable)
@@ -6,13 +6,16 @@ import org.apache.log4j.Logger;
 import java.util.Map;
 import java.util.HashMap;
 
+import mir.misc.MirConfig;
+
 
 public class LoggerImpl implements mir.log.Logger {
 
     private static Map loggers = new HashMap();
 
     public LoggerImpl() {
-        PropertyConfigurator.configure("log4j.properties");
+      System.setProperty("log.home", MirConfig.getPropWithHome("Log.Home"));
+        PropertyConfigurator.configure(MirConfig.getPropWithHome("Log.log4j.ConfigurationFile").trim());
     }
 
 
@@ -39,7 +42,10 @@ public class LoggerImpl implements mir.log.Logger {
 
     private Logger getLogger( Object o ) {
         String name;
-        if (o instanceof Class) {
+
+        if (o instanceof String) {
+            name = (String) o;
+        } else if (o instanceof Class) {
             name = ((Class)o).getName();
         } else if (o!=null) {
             name = o.getClass().getName();
index af35ad1..37bb08c 100755 (executable)
@@ -58,5 +58,4 @@ public class AssignmentProducerNode extends ProducerNodeDecorator {
       throw new ProducerFailure(t.getMessage(), t);
     }
   };
-
 }
\ No newline at end of file
index b1dd376..29c5450 100755 (executable)
@@ -68,22 +68,19 @@ public class CompositeProducerNode implements ProducerNode {
     subNodes.clear();
   }
 
-  public void produce(Map aValueSet, String aVerb, PrintWriter aLogger) throws ProducerFailure, ProducerExc {
-    Iterator i = subNodes.iterator();
-
-    while (i.hasNext()) {
-      ProducerNode node = (ProducerNode) i.next();
-      node.produce(aValueSet, aVerb, aLogger);
-    }
+  protected boolean isAborted(Map aValueMap) {
+    Object producerValue = aValueMap.get(NodedProducer.PRODUCER_KEY);
+    return (
+       (producerValue instanceof NodedProducer) &&
+      ((NodedProducer) producerValue).getIsAborted());
   }
 
-  public Set buildVerbSet() {
+  public void produce(Map aValueMap, String aVerb, PrintWriter aLogger) throws ProducerFailure, ProducerExc {
     Iterator i = subNodes.iterator();
-    Set result = new HashSet();
 
-    while (i.hasNext())
-      result.addAll(((ProducerNode) i.next()).buildVerbSet());
-
-    return result;
+    while (i.hasNext() && !isAborted(aValueMap)) {
+      ProducerNode node = (ProducerNode) i.next();
+      node.produce(aValueMap, aVerb, aLogger);
+    }
   }
 }
\ No newline at end of file
index 6d5430f..85e7eb2 100755 (executable)
@@ -61,8 +61,4 @@ public class ConditionalProducerNode implements ProducerNode {
       throw new ProducerFailure(e);
     }
   }
-
-  public Set buildVerbSet() {
-    return new HashSet();
-  }
 }
\ No newline at end of file
index c943c98..13d13b3 100755 (executable)
@@ -64,8 +64,4 @@ public class DirCopyingProducerNode implements ProducerNode  {
       throw new ProducerFailure("Copying " + source + " into " + destination + " failed: " + e.getMessage(), e);
     }
   }
-
-  public Set buildVerbSet() {
-    return new HashSet();
-  }
 }
index fd8e8ba..2f49115 100755 (executable)
@@ -39,8 +39,6 @@ import mir.storage.*;
 import mir.util.*;
 
 public class EntityBatchingProducerNode implements ProducerNode {
-  private Map verbs;
-
   private String batchInfoKey;
   private String batchDataKey;
   private EntityAdapterModel model;
@@ -50,7 +48,7 @@ public class EntityBatchingProducerNode implements ProducerNode {
   private String nrEntitiesToSkipExpression;
   private String nrEntitiesPerBatchExpression;
   private String minNrEntitiesInFirstBatchExpression;
-  private String defaultNrBatchesToProcessExpression;
+  private String nrBatchesToProcessExpression;
   private ProducerNode batchSubNode;
   private ProducerNode batchListSubNode;
 
@@ -61,57 +59,16 @@ public class EntityBatchingProducerNode implements ProducerNode {
         String aDefinition,
         String aWhereClause,
         String anOrderByClause,
-        int anrEntitiesPerBatchExpression,
-        int aminNrEntitiesInFirstBatchExpression,
-        int anrEntitiesToSkipExpression,
-        ProducerNode aBatchSubNode) {
-    this(aBatchDataKey, aBatchInfoKey, aModel, aDefinition, aWhereClause,
-        anOrderByClause, anrEntitiesPerBatchExpression, aminNrEntitiesInFirstBatchExpression, anrEntitiesToSkipExpression,
-        aBatchSubNode, null);
-  }
-
-  public EntityBatchingProducerNode(
-        String aBatchDataKey,
-        String aBatchInfoKey,
-        EntityAdapterModel aModel,
-        String aDefinition,
-        String aWhereClause,
-        String anOrderByClause,
-        int aNrEntitiesPerBatch,
-        int aMinNrEntitiesInFirstBatch,
-        int aNrEntitiesToSkip,
-        ProducerNode aBatchSubNode,
-        ProducerNode aBatchListSubNode) {
-
-    this(aBatchDataKey, aBatchInfoKey, aModel, aDefinition,
-         aWhereClause, anOrderByClause,
-        Integer.toString(aNrEntitiesPerBatch),
-        Integer.toString(aMinNrEntitiesInFirstBatch),
-        Integer.toString(aNrEntitiesToSkip),
-        "1",
-        aBatchSubNode, aBatchListSubNode);
-
-  }
-
-  public EntityBatchingProducerNode(
-        String aBatchDataKey,
-        String aBatchInfoKey,
-        EntityAdapterModel aModel,
-        String aDefinition,
-        String aWhereClause,
-        String anOrderByClause,
         String anrEntitiesPerBatchExpression,
         String aminNrEntitiesInFirstBatchExpression,
         String anrEntitiesToSkipExpression,
-        String aDefaultNrBatchesToProcessExpression,
+        String aNrBatchesToProcessExpression,
         ProducerNode aBatchSubNode,
         ProducerNode aBatchListSubNode) {
 
     batchSubNode = aBatchSubNode;
     batchListSubNode = aBatchListSubNode;
 
-    verbs = new HashMap();
-
     batchDataKey = aBatchDataKey;
     batchInfoKey = aBatchInfoKey;
     model = aModel;
@@ -121,7 +78,14 @@ public class EntityBatchingProducerNode implements ProducerNode {
     nrEntitiesToSkipExpression = anrEntitiesToSkipExpression;
     nrEntitiesPerBatchExpression = anrEntitiesPerBatchExpression;
     minNrEntitiesInFirstBatchExpression = aminNrEntitiesInFirstBatchExpression;
-    defaultNrBatchesToProcessExpression = aDefaultNrBatchesToProcessExpression;
+    nrBatchesToProcessExpression = aNrBatchesToProcessExpression;
+  }
+
+  protected boolean isAborted(Map aValueMap) {
+    Object producerValue = aValueMap.get(NodedProducer.PRODUCER_KEY);
+    return (
+       (producerValue instanceof NodedProducer) &&
+      ((NodedProducer) producerValue).getIsAborted());
   }
 
   public void produce(Map aValueMap, String aVerb, PrintWriter aLogger) throws ProducerFailure {
@@ -136,7 +100,6 @@ public class EntityBatchingProducerNode implements ProducerNode {
     Map batchData;
     String expandedWhereClause;
     String expandedOrderByClause;
-    EntityBatchingProducerNodeVerb verb = (EntityBatchingProducerNodeVerb) verbs.get(aVerb);
 
     List batchLocations;
     BatchLocation location;
@@ -150,12 +113,7 @@ public class EntityBatchingProducerNode implements ProducerNode {
 
 
     try {
-      if (verb==null) {
-        nrBatchesToProcess = ParameterExpander.evaluateIntegerExpressionWithDefault( aValueMap, defaultNrBatchesToProcessExpression, -1 );
-      }
-      else {
-        nrBatchesToProcess=verb.nrBatchesToProcess;
-      }
+      nrBatchesToProcess = ParameterExpander.evaluateIntegerExpressionWithDefault( aValueMap, nrBatchesToProcessExpression, -1 );
 
       expandedWhereClause = ParameterExpander.expandExpression( aValueMap, whereClause );
       expandedOrderByClause = ParameterExpander.expandExpression( aValueMap, orderByClause );
@@ -196,7 +154,7 @@ public class EntityBatchingProducerNode implements ProducerNode {
       batchData.put("last", batchesData.get(batchesData.size()-1));
       batchData.put("count", new Integer(batchesData.size()));
 
-      if (batchListSubNode!=null) {
+      if (batchListSubNode!=null && (!isAborted(aValueMap))) {
         batchListSubNode.produce(aValueMap, aVerb, aLogger);
       }
 
@@ -205,7 +163,7 @@ public class EntityBatchingProducerNode implements ProducerNode {
       }
 
       if (batchSubNode!=null) {
-        for (i=0; i<nrBatchesToProcess; i++) {
+        for (i=0; i<nrBatchesToProcess && !isAborted(aValueMap); i++) {
           location = (BatchLocation) batchLocations.get(i);
 
           batchData.put("current", batchesData.get(i));
@@ -246,21 +204,5 @@ public class EntityBatchingProducerNode implements ProducerNode {
       nrEntities = aNrEntities;
     }
   }
-
-  public Set buildVerbSet() {
-    return verbs.keySet();
-  };
-
-  public void addVerb(String aVerb, int aNrPagesToGenerate) {
-    verbs.put(aVerb, new EntityBatchingProducerNodeVerb(aNrPagesToGenerate));
-  }
-
-  private class EntityBatchingProducerNodeVerb {
-    int nrBatchesToProcess;
-
-    EntityBatchingProducerNodeVerb(int aNrBatchesToProcess) {
-      nrBatchesToProcess = aNrBatchesToProcess;
-    }
-  }
 }
 
index e9d3f5d..4b16de6 100755 (executable)
@@ -39,69 +39,48 @@ import mir.storage.*;
 import mir.util.*;
 
 public class EntityEnumeratingProducerNode extends ProducerNodeDecorator {
-  private Map verbs;
-  private EntityEnumeratingProducerNodeVerb defaultVerb;
   private String key;
   private EntityAdapterModel model;
   private String definition;
   private String skip;
   private String limit;
+  private String whereClause;
+  private String orderByClause;
+
 
   public EntityEnumeratingProducerNode(
-                String aKey,
-                EntityAdapterModel aModel, String aDefinition,
-                ProducerNode aSubNode) {
+              String aKey,
+              EntityAdapterModel aModel, String aDefinition,
+              String aWhereClause, String anOrderByClause,
+              String aLimit, String aSkip,
+              ProducerNode aSubNode) {
     super(aSubNode);
 
-    defaultVerb = null;
-    verbs = new HashMap();
     model = aModel;
     definition = aDefinition;
     key = aKey;
-  }
 
-  public EntityEnumeratingProducerNode(
-              String aKey,
-              EntityAdapterModel aModel, String aDefinition,
-              String aDefaultWhereClause, String aDefaultOrderByClause,
-              ProducerNode aSubNode) {
-    this(aKey, aModel, aDefinition, aDefaultWhereClause, aDefaultOrderByClause, "", "", aSubNode);
-  }
-
-  public EntityEnumeratingProducerNode(
-              String aKey,
-              EntityAdapterModel aModel, String aDefinition,
-              String aDefaultWhereClause, String aDefaultOrderByClause,
-              String aLimit, String aSkip,
-              ProducerNode aSubNode) {
-    this(aKey, aModel, aDefinition, aSubNode);
+    whereClause = aWhereClause;
+    orderByClause = anOrderByClause;
 
     limit= aLimit;
     skip = aSkip;
-    defaultVerb = new EntityEnumeratingProducerNodeVerb(aDefaultWhereClause, aDefaultOrderByClause);
   }
 
   public void produce(Map aValueMap, String aVerb, PrintWriter aLogger) throws ProducerFailure {
-    EntityEnumeratingProducerNodeVerb verb = (EntityEnumeratingProducerNodeVerb) verbs.get(aVerb);
     Iterator browser;
 
-    if (verb==null)
-      verb = defaultVerb;
-
-    if (verb==null)
-      throw new ProducerFailure("EntityEnumeratingProducerNode: unknown verb '"+aVerb+"'", null);
-
     try {
       browser = new EntityIteratorAdapter(
-          ParameterExpander.expandExpression( aValueMap, verb.whereClause ),
-          ParameterExpander.expandExpression( aValueMap, verb.orderByClause ),
+          ParameterExpander.expandExpression( aValueMap, whereClause ),
+          ParameterExpander.expandExpression( aValueMap, orderByClause ),
           100,
           model,
           definition,
           ParameterExpander.evaluateIntegerExpressionWithDefault( aValueMap, limit, -1),
           ParameterExpander.evaluateIntegerExpressionWithDefault( aValueMap, skip, 0));
 
-      while (browser.hasNext()) {
+      while (browser.hasNext() && !isAborted(aValueMap)) {
         ParameterExpander.setValueForKey( aValueMap, key, browser.next());
         super.produce(aValueMap, aVerb, aLogger);
       }
@@ -110,27 +89,4 @@ public class EntityEnumeratingProducerNode extends ProducerNodeDecorator {
       throw new ProducerFailure(t.getMessage(), t);
     }
   };
-
-  public Set buildVerbSet() {
-    Set set;
-
-    set = super.buildVerbSet();
-    set.addAll(verbs.keySet());
-
-    return set;
-  };
-
-  public void addVerb(String aVerb, String aWhereClause, String anOrderByClause) {
-    verbs.put(aVerb, new EntityEnumeratingProducerNodeVerb(aWhereClause, anOrderByClause));
-  }
-
-  private class EntityEnumeratingProducerNodeVerb {
-    String whereClause;
-    String orderByClause;
-
-    EntityEnumeratingProducerNodeVerb(String aWhereClause, String anOrderByClause) {
-      whereClause = aWhereClause;
-      orderByClause = anOrderByClause;
-    }
-  }
 }
\ No newline at end of file
index d76395b..b33cfab 100755 (executable)
@@ -68,8 +68,4 @@ public abstract class EntityModifyingProducerNode implements ProducerNode {
       throw new ProducerFailure(t.getMessage(), t);
     }
   }
-
-  public Set buildVerbSet() {
-    return new HashSet();
-  }
 }
\ No newline at end of file
index a9fb388..5d6f542 100755 (executable)
@@ -57,8 +57,4 @@ public class EvaluatedAssignmentProducerNode implements ProducerNode {
       throw new ProducerFailure(t.getMessage(), t);
     }
   };
-
-  public Set buildVerbSet() {
-    return new HashSet();
-  }
 }
\ No newline at end of file
index fee5b00..cdc4992 100755 (executable)
@@ -57,8 +57,4 @@ public class ExpandedAssignmentProducerNode implements ProducerNode {
       throw new ProducerFailure(t.getMessage(), t);
     }
   };
-
-  public Set buildVerbSet() {
-    return new HashSet();
-  }
 }
\ No newline at end of file
index a8c5d84..5ab999b 100755 (executable)
@@ -63,8 +63,4 @@ public abstract class FileOperationProducerNode implements ProducerNode {
       throw new ProducerFailure(t.getMessage(), t);
     }
   }
-
-  public Set buildVerbSet() {
-    return new HashSet();
-  }
 }
\ No newline at end of file
index 67002b7..ba3dc05 100755 (executable)
@@ -90,8 +90,4 @@ public class GeneratingProducerNode implements ProducerNode {
     aLogger.println("  Time: " + (endTime-startTime) + " ms");
     aLogger.flush();
   }
-
-  public Set buildVerbSet() {
-    return new HashSet();
-  }
 }
\ No newline at end of file
index 0645dd3..7303117 100755 (executable)
@@ -54,8 +54,4 @@ public class LoggingProducerNode implements ProducerNode {
       throw new ProducerFailure(t.getMessage(), t);
     }
   }
-
-  public Set buildVerbSet() {
-    return new HashSet();
-  }
 }
\ No newline at end of file
index 2e40b89..a62d5dd 100755 (executable)
@@ -50,6 +50,7 @@ public class LoopProducerNode extends ProducerNodeDecorator {
     condition = aCondition;
   }
 
+
   public void produce(Map aValueMap, String aVerb, PrintWriter aLogger) throws ProducerFailure {
     int loopNr;
     int maxNrLoops;
@@ -57,7 +58,9 @@ public class LoopProducerNode extends ProducerNodeDecorator {
     try {
       loopNr = 0;
       maxNrLoops = ParameterExpander.evaluateIntegerExpressionWithDefault(aValueMap, limit, 1000);
-      while (ParameterExpander.evaluateBooleanExpression(aValueMap, condition) && (loopNr<maxNrLoops)) {
+      while (ParameterExpander.evaluateBooleanExpression(aValueMap, condition) &&
+             (loopNr<maxNrLoops) &&
+             !isAborted(aValueMap)) {
         super.produce(aValueMap, aVerb, aLogger);
         loopNr++;
       }
index 273446d..b9e3012 100755 (executable)
@@ -35,14 +35,19 @@ import java.util.*;
 import java.io.*;
 
 public class NodedProducer implements Producer {
-  ProducerNode rootNode;
-  String verb;
-  Map baseValues;
+  private ProducerNode rootNode;
+  private String verb;
+  private Map baseValues;
+  private boolean isAborted;
+  private boolean isFinished;
+  protected final static String PRODUCER_KEY = "$producer";
 
   public NodedProducer( ProducerNode aRootNode, String aVerb, Map aBaseValues) {
     rootNode = aRootNode;
     verb = aVerb;
     baseValues = aBaseValues;
+    isAborted = false;
+    isAborted = false;
   }
 
   public void produce( PrintWriter aLogger ) throws ProducerFailure, ProducerExc {
@@ -50,7 +55,31 @@ public class NodedProducer implements Producer {
 
     valueMap = new HashMap();
     valueMap.putAll(baseValues);
+    valueMap.put(PRODUCER_KEY, this);
 
     rootNode.produce(valueMap, verb, aLogger);
+
+    synchronized(this) {
+      isFinished=true;
+    }
   };
+
+  public void abort() {
+    synchronized(this) {
+      if (!isFinished)
+        isAborted=true;
+    }
+  }
+
+  public boolean getIsAborted() {
+    synchronized(this) {
+      return isAborted;
+    }
+  }
+
+  public boolean getIsFinished() {
+    synchronized(this) {
+      return isFinished;
+    }
+  }
 }
index b5a8471..129f469 100755 (executable)
@@ -36,9 +36,21 @@ import mir.producer.*;
 
 public class NodedProducerFactory implements ProducerFactory {
   private ProducerNode rootNode;
+  private List verbs;
+  private String name;
 
-  public NodedProducerFactory(ProducerNode aRootNode) {
+  public NodedProducerFactory(String aName, ProducerNode aRootNode) {
     rootNode = aRootNode;
+    verbs = new Vector();
+    name = aName;
+  }
+
+  public void addVerb(String aName, String aDescription) {
+    verbs.add(new SimpleProducerVerb(aName, aDescription));
+  }
+
+  public String getName() {
+    return name;
   }
 
   public mir.producer.Producer makeProducer(String aVerb, Map aBasicValueSet) throws ProducerFailure {
@@ -56,15 +68,7 @@ public class NodedProducerFactory implements ProducerFactory {
   };
 
   public Iterator verbs() {
-    Set verbSet = rootNode.buildVerbSet();
-
-    if (verbSet.isEmpty()) {
-      verbSet = new HashSet();
-
-      verbSet.add("(default)");
-    }
-
-    return verbSet.iterator();
+    return verbs.iterator();
   };
 }
 
index 62751c4..3b13de1 100755 (executable)
@@ -35,4 +35,5 @@ import java.io.*;
 
 public interface Producer {
   public void produce( PrintWriter aLogger ) throws ProducerFailure, ProducerExc;
+  public void abort();
 }
index fe985f8..47efeac 100755 (executable)
@@ -34,7 +34,13 @@ package mir.producer;
 import java.util.*;
 
 public interface ProducerFactory {
+  public interface ProducerVerb {
+    String getName();
+    String getDescription();
+  }
+
+  public String getName();
   public Producer makeProducer(String aVerb, Map aStartingValues) throws ProducerFailure, ProducerExc;
-  public Iterator verbs();
+  public Iterator verbs(); /* returns ProducerVerbs */
 }
 
index 6aa8aef..1afaa59 100755 (executable)
@@ -36,5 +36,4 @@ import java.io.*;
 
 public interface ProducerNode {
   public void produce(Map aValueSet, String aVerb, PrintWriter aLogger) throws ProducerExc, ProducerFailure;
-  public Set buildVerbSet();
 }
\ No newline at end of file
index cc3fff7..d0cceed 100755 (executable)
@@ -41,15 +41,15 @@ public class ProducerNodeDecorator implements ProducerNode {
     slave = aSlave;
   }
 
-  public void produce(Map aValueSet, String aVerb, PrintWriter aLogger) throws ProducerFailure, ProducerExc {
-    if (slave!=null)
-      slave.produce(aValueSet, aVerb, aLogger);
+  protected boolean isAborted(Map aValueMap) {
+    Object producerValue = aValueMap.get(NodedProducer.PRODUCER_KEY);
+    return (
+       (producerValue instanceof NodedProducer) &&
+      ((NodedProducer) producerValue).getIsAborted());
   }
 
-  public Set buildVerbSet() {
+  public void produce(Map aValueMap, String aVerb, PrintWriter aLogger) throws ProducerFailure, ProducerExc {
     if (slave!=null)
-      return slave.buildVerbSet();
-    else
-      return new HashSet();
+      slave.produce(aValueMap, aVerb, aLogger);
   }
 }
\ No newline at end of file
index c88e2de..533c9fc 100755 (executable)
@@ -37,18 +37,16 @@ import org.apache.struts.util.MessageResources;
 import mir.util.*;
 import mir.misc.*;
 
-public class ResourceBundleProducerNode extends ProducerNodeDecorator {
+public class ResourceBundleProducerNode implements ProducerNode {
   private String key;
   private String bundleIdentifier;
   private String languageIdentifier;
 
-  public ResourceBundleProducerNode(String aKey, String aBundleIdentifier, ProducerNode aSubNode) {
-    this (aKey, aBundleIdentifier, null, aSubNode);
+  public ResourceBundleProducerNode(String aKey, String aBundleIdentifier) {
+    this (aKey, aBundleIdentifier, null);
   }
 
-  public ResourceBundleProducerNode(String aKey, String aBundleIdentifier, String aLanguageIdentifier, ProducerNode aSubNode) {
-    super(aSubNode);
-
+  public ResourceBundleProducerNode(String aKey, String aBundleIdentifier, String aLanguageIdentifier) {
     bundleIdentifier = aBundleIdentifier;
     languageIdentifier = aLanguageIdentifier;
     key = aKey;
@@ -57,7 +55,6 @@ public class ResourceBundleProducerNode extends ProducerNodeDecorator {
   public void produce(Map aValueMap, String aVerb, PrintWriter aLogger) throws ProducerFailure {
     Object messages;
 
-
     try {
       if (languageIdentifier!=null) {
         messages =
@@ -72,8 +69,6 @@ public class ResourceBundleProducerNode extends ProducerNodeDecorator {
               ParameterExpander.expandExpression( aValueMap, bundleIdentifier ));
       }
       ParameterExpander.setValueForKey( aValueMap, key, messages );
-
-      super.produce(aValueMap, aVerb, aLogger);
     }
     catch (Throwable t) {
       throw new ProducerFailure(t.getMessage(), t);
index 6c7b873..7080a08 100755 (executable)
@@ -59,8 +59,4 @@ public class ScriptCallingProducerNode implements ProducerNode  {
       throw new ProducerFailure("Executing script failed: " + e.getMessage(), e);
     }
   }
-
-  public Set buildVerbSet() {
-    return new HashSet();
-  }
 }
diff --git a/source/mir/producer/SimpleProducerVerb.java b/source/mir/producer/SimpleProducerVerb.java
new file mode 100755 (executable)
index 0000000..57c39cc
--- /dev/null
@@ -0,0 +1,21 @@
+package mir.producer;
+
+public class SimpleProducerVerb implements ProducerFactory.ProducerVerb {
+  private String name;
+  private String description;
+
+  public SimpleProducerVerb(String aName, String aDescription) {
+    super();
+
+    name = aName;
+    description = aDescription;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public String getDescription() {
+    return description;
+  }
+}
\ No newline at end of file
index 567bafd..05d154d 100755 (executable)
@@ -55,5 +55,4 @@ public class ValuesMapProducerNode extends ProducerNodeDecorator {
       throw new ProducerFailure(t.getMessage(), t);
     }
   };
-
 }
\ No newline at end of file
index 86ce89a..3c28b99 100755 (executable)
@@ -345,7 +345,7 @@ public class DefaultProducerNodeBuilders {
     };
 
     public ProducerNode constructNode() {
-      return new ResourceBundleProducerNode(key, bundle, language, null );
+      return new ResourceBundleProducerNode(key, bundle, language);
     };
   }
 
@@ -707,9 +707,9 @@ public class DefaultProducerNodeBuilders {
         Map.Entry entry = (Map.Entry) i.next();
 
         if (definition.getIntegerParameters().keySet().contains(entry.getKey()))
-            integerParameterValues.put(entry.getKey(), entry.getValue());
+          integerParameterValues.put(entry.getKey(), entry.getValue());
         else
-            stringParameterValues.put(entry.getKey(), entry.getValue());
+          stringParameterValues.put(entry.getKey(), entry.getValue());
       }
     };
 
index b6219e5..52d589f 100755 (executable)
@@ -55,11 +55,11 @@ public class ProducerConfigReader {
     super();
   };
 
-  public void parseFile(String aFileName, ProducerNodeBuilderLibrary aBuilderLibrary, Map aProducerFactories) throws ProducerConfigFailure {
+  public void parseFile(String aFileName, ProducerNodeBuilderLibrary aBuilderLibrary, List aProducerFactories) throws ProducerConfigFailure {
     parseFile(aFileName, aBuilderLibrary, aProducerFactories, new Vector());
   }
 
-  public void parseFile(String aFileName, ProducerNodeBuilderLibrary aBuilderLibrary, Map aProducerFactories, List aUsedFiles) throws ProducerConfigFailure {
+  public void parseFile(String aFileName, ProducerNodeBuilderLibrary aBuilderLibrary, List aProducerFactories, List aUsedFiles) throws ProducerConfigFailure {
     try {
       builderLibrary = aBuilderLibrary;
       scriptedNodeBuilderLibrary = new ProducerNodeBuilderLibrary();
@@ -91,7 +91,7 @@ public class ProducerConfigReader {
     private List usedFiles;
     private InputSource inputSource;
 
-    public ProducerConfigHandler(SAXParserFactory aParserFactory, Map aProducers, List aUsedFiles) {
+    public ProducerConfigHandler(SAXParserFactory aParserFactory, List aProducers, List aUsedFiles) {
       super();
 
       includeFileStack=new Stack();
@@ -254,9 +254,9 @@ public class ProducerConfigReader {
   }
 
   public class RootSectionHandler extends SectionHandler {
-    private Map producers;
+    private List producers;
 
-    public RootSectionHandler(Map aProducers) {
+    public RootSectionHandler(List aProducers) {
       producers = aProducers;
     }
 
@@ -285,11 +285,13 @@ public class ProducerConfigReader {
   private final static String[] NODE_DEFINITION_OPTIONAL_ATTRIBUTES = {  };
 
   public class ProducersSectionHandler extends SectionHandler {
-    private Map producers;
+    private List producers;
+    private Set producerNames;
     private String name;
 
-    public ProducersSectionHandler(Map aProducers) {
+    public ProducersSectionHandler(List aProducers) {
       producers = aProducers;
+      producerNames = new HashSet();
     }
 
     public SectionHandler startElement(String aTag, Map anAttributes) throws ProducerConfigExc {
@@ -300,12 +302,12 @@ public class ProducerConfigReader {
         name = (String) anAttributes.get(PRODUCER_NAME_ATTRIBUTE);
         ReaderTool.checkValidIdentifier( name );
 
-        if (producers.containsKey(name))
+        if (producerNames.contains(name))
           throw new ProducerConfigExc("Duplicate producer name: '" + name + "'");
 
         name = (String) anAttributes.get(PRODUCER_NAME_ATTRIBUTE);
 
-        return new ProducerSectionHandler();
+        return new ProducerSectionHandler(name);
       }
       else if (aTag.equals("nodedefinition")) {
         ReaderTool.checkAttributes(anAttributes, NODE_DEFINITION_REQUIRED_ATTRIBUTES, NODE_DEFINITION_OPTIONAL_ATTRIBUTES);
@@ -326,7 +328,8 @@ public class ProducerConfigReader {
 
     public void endElement(SectionHandler aHandler) throws ProducerConfigExc {
       if (aHandler instanceof ProducerSectionHandler) {
-        producers.put(name, ((ProducerSectionHandler) aHandler).getProducerFactory());
+        producers.add(((ProducerSectionHandler) aHandler).getProducerFactory());
+        producerNames.add(((ProducerSectionHandler) aHandler).getProducerFactory().getName());
       }
       else if (aHandler instanceof NodeDefinitionSectionHandler) {
         scriptedNodeBuilderLibrary.registerFactory(name,
@@ -342,11 +345,17 @@ public class ProducerConfigReader {
 
   public class ProducerSectionHandler extends SectionHandler {
     private ProducerFactory producerFactory;
+    private String factoryName;
 
     private ProducerNode body;
-    private Map verbs;
+    private Map verbNodes;
+    private List verbs;
     private String defaultVerb;
 
+    public ProducerSectionHandler(String aName) {
+      factoryName = aName;
+    }
+
     public SectionHandler startElement(String aTag, Map anAttributes)  throws ProducerConfigExc {
       if (aTag.equals("verbs")) {
         if (verbs!=null)
@@ -372,6 +381,7 @@ public class ProducerConfigReader {
       else if (aHandler instanceof ProducerVerbsSectionHandler)
       {
         verbs = ((ProducerVerbsSectionHandler) aHandler).getVerbs();
+        verbNodes = ((ProducerVerbsSectionHandler) aHandler).getVerbNodes();
         defaultVerb = ((ProducerVerbsSectionHandler) aHandler).getDefaultVerb();
       }
       else throw new ProducerConfigExc("ProducerSectionHandler.endElement Internal error: Unexpected handler: " + aHandler.getClass().getName());
@@ -384,7 +394,7 @@ public class ProducerConfigReader {
       if (body==null)
         throw new ProducerConfigExc("No body defined");
 
-      producerFactory = new ScriptedProducerFactory(verbs, body, defaultVerb);
+      producerFactory = new ScriptedProducerFactory(factoryName, verbs, verbNodes, body, defaultVerb);
     }
 
     public ProducerFactory getProducerFactory() {
@@ -399,13 +409,15 @@ public class ProducerConfigReader {
   private final static String[] PRODUCER_VERB_OPTIONAL_ATTRIBUTES = { PRODUCER_VERB_DEFAULT_ATTRIBUTE, PRODUCER_VERB_DESCRIPTION_ATTRIBUTE };
 
   public class ProducerVerbsSectionHandler extends SectionHandler {
-    private Map verbs;
+    private Map verbNodes;
+    private List verbs;
     private String defaultVerb;
     private String currentVerb;
     private String currentVerbDescription;
 
     public ProducerVerbsSectionHandler() {
-      verbs = new HashMap();
+      verbNodes = new HashMap();
+      verbs = new Vector();
       defaultVerb = null;
     }
 
@@ -416,7 +428,7 @@ public class ProducerConfigReader {
 
         ReaderTool.checkValidIdentifier( currentVerb );
 
-        if (verbs.containsKey(currentVerb))
+        if (verbNodes.containsKey(currentVerb))
           throw new ProducerConfigExc( "Duplicate definition of verb '" + currentVerb + "'" );
 
         if (anAttributes.containsKey(PRODUCER_VERB_DEFAULT_ATTRIBUTE)) {
@@ -437,7 +449,8 @@ public class ProducerConfigReader {
     }
 
     public void endElement(SectionHandler aHandler) {
-      verbs.put(currentVerb, ((ProducerNodeSectionHandler) aHandler).getProducerNode());
+      verbNodes.put(currentVerb, ((ProducerNodeSectionHandler) aHandler).getProducerNode());
+      verbs.add(new SimpleProducerVerb(currentVerb, currentVerbDescription));
     }
 
     public void finishSection() {
@@ -447,9 +460,13 @@ public class ProducerConfigReader {
       return defaultVerb;
     }
 
-    public Map getVerbs() {
+    public List getVerbs() {
       return verbs;
     }
+
+    public Map getVerbNodes() {
+      return verbNodes;
+    }
   }
 
   public class EmptySectionHandler extends SectionHandler {
@@ -748,13 +765,3 @@ public class ProducerConfigReader {
     }
   }
 }
-
-
-/*
- /                 (expecting producers)
- producers/        (expecting nodedefinition, producer)
-   nodedefinition  (expecting parameters, definition)
-     parameters    (expecting parameter declarations)
-     definition    (expecting nodes, subnodes)
-*/
-
index 9e328d5..483754f 100755 (executable)
@@ -35,31 +35,39 @@ import java.util.*;
 import mir.producer.*;
 
 public class ScriptedProducerFactory implements ProducerFactory {
-  private Map verbs;
+  private List verbs;
+  private Map verbNodes;
   private ProducerNode body;
   private String defaultVerb;
+  private String name;
 
-  public ScriptedProducerFactory(Map aVerbs, ProducerNode aBody, String aDefaultVerb) {
+  public ScriptedProducerFactory(String aName, List aVerbs, Map aVerbNodes, ProducerNode aBody, String aDefaultVerb) {
     verbs = aVerbs;
+    verbNodes = aVerbNodes;
     body = aBody;
     defaultVerb = aDefaultVerb;
+    name = aName;
   }
 
-  public ScriptedProducerFactory(Map aVerbs, ProducerNode aBody) {
-    this(aVerbs, aBody, null);
+  public String getName() {
+    return name;
+  }
+
+  public ScriptedProducerFactory(String aName, List aVerbs, Map aVerbNodes, ProducerNode aBody) {
+    this(aName, aVerbs, aVerbNodes, aBody, null);
   }
 
   public Producer makeProducer(String aVerb, Map aStartingValues) throws ProducerFailure, ProducerExc {
     CompositeProducerNode rootNode;
     ProducerNode verbNode;
 
-    if (verbs.containsKey(aVerb)) {
-      verbNode = (ProducerNode) verbs.get(aVerb);
+    if (verbNodes.containsKey(aVerb)) {
+      verbNode = (ProducerNode) verbNodes.get(aVerb);
     }
-    else if (defaultVerb!=null && verbs.containsKey(defaultVerb)) {
-      verbNode = (ProducerNode) verbs.get(defaultVerb);
+    else if (defaultVerb!=null && verbNodes.containsKey(defaultVerb)) {
+      verbNode = (ProducerNode) verbNodes.get(defaultVerb);
     }
-    else throw new ProducerExc("Undefined verb: " + aVerb);
+    else throw new ProducerExc("Undefined verb: " + aVerb + " (and no default verb was defined)");
 
     rootNode = new CompositeProducerNode();
     rootNode.addSubNode(verbNode);
@@ -69,6 +77,6 @@ public class ScriptedProducerFactory implements ProducerFactory {
   };
 
   public Iterator verbs() {
-    return verbs.keySet().iterator();
+    return verbs.iterator();
   }
 }
\ No newline at end of file
index 324b12e..c3100b5 100755 (executable)
@@ -52,10 +52,6 @@ public class ScriptedProducerNode implements ProducerNode {
     nodeParameterValues.putAll(aNodeParameterValues);
   }
 
-  public Set buildVerbSet() {
-    return new HashSet();
-  }
-
   public void produce(Map aValues, String aVerb, PrintWriter aLogger) throws ProducerFailure, ProducerExc {
     try {
       Map oldValues = new HashMap();
index 74282c4..d15b61d 100755 (executable)
@@ -155,7 +155,7 @@ public abstract class ServletModule {
             }
         }
         catch (Exception e) {
-            throw new ServletModuleException(e.toString());
+            throw new ServletModuleException(e.getMessage());
         }
     }
 
@@ -175,7 +175,7 @@ public abstract class ServletModule {
             deliver(req, res, mergeData, templateObjektString);
         }
         catch (Exception e) {
-            throw new ServletModuleException(e.toString());
+            throw new ServletModuleException(e.getMessage());
         }
     }
 
@@ -198,7 +198,7 @@ public abstract class ServletModule {
             list(req, res);
         }
         catch (Exception e) {
-            throw new ServletModuleException(e.toString());
+            throw new ServletModuleException(e.getMessage());
         }
     }
 
@@ -248,7 +248,7 @@ public abstract class ServletModule {
             }
         }
         catch (Exception e) {
-            throw new ServletModuleException(e.toString());
+            throw new ServletModuleException(e.getMessage());
         }
     }
 
@@ -267,7 +267,7 @@ public abstract class ServletModule {
             deliver(req, res, mainModule.getById(idParam), templateObjektString);
         }
         catch (ModuleException e) {
-            throw new ServletModuleException(e.toString());
+            throw new ServletModuleException(e.getMessage());
         }
     }
 
@@ -300,7 +300,7 @@ public abstract class ServletModule {
             //list(req,res);
         }
         catch (Exception e) {
-            throw new ServletModuleException(e.toString());
+            throw new ServletModuleException(e.getMessage());
         }
     }
 
@@ -315,45 +315,46 @@ public abstract class ServletModule {
      * @param tmpl Name des Templates
      * @exception ServletModuleException
      */
-       public void deliver(HttpServletRequest req, HttpServletResponse res,
-                                                                                       TemplateModelRoot rtm, TemplateModelRoot popups,
-                                                                                       String templateFilename)
-       throws ServletModuleException {
-               if (rtm == null) rtm = new SimpleHash();
-               try {
-                       PrintWriter out = res.getWriter();
-                       HTMLTemplateProcessor.process(res, templateFilename, rtm, popups, out,
-                                                                                                                                               getLocale(req), "bundles.admin");
+        public void deliver(HttpServletRequest req, HttpServletResponse res,
+                            TemplateModelRoot rtm, TemplateModelRoot popups,
+                            String templateFilename)
+        throws ServletModuleException {
+                if (rtm == null) rtm = new SimpleHash();
+                try {
+                        PrintWriter out = res.getWriter();
+                        HTMLTemplateProcessor.process(res, templateFilename, rtm, popups, out,
+                                                                                                                                                getLocale(req), "bundles.admin");
         // we default to admin bundles here, which is not exactly beautiful...
         // but this whole producer stuff is going to be rewritten soon.
         // ServletModuleOpenIndy overwrites deliver() to use open bundles
         // (br1)
-                       out.close();
-               }       catch (HTMLParseException e) {
-                       throw new ServletModuleException(e.toString());
-               } catch (IOException e) {
-                       throw new ServletModuleException(e.toString());
-               }
-       }
-
-       
-       /**
-        * deliver liefert das Template mit dem Filenamen templateFilename
-        * an den HttpServletResponse res aus, nachdem es mit den Daten aus
-        * TemplateModelRoot rtm gemischt wurde
-        *
-        * @param res Http-Response, die vom Dispatcher durchgereicht wird
-        * @param rtm beinahalten das freemarker.template.TempalteModelRoot mit den
-        *   Daten, die ins Template gemerged werden sollen.
-        * @param tmpl Name des Templates
-        * @exception ServletModuleException
-        */
-       public void deliver(HttpServletRequest req, HttpServletResponse res,
-                                                                                       TemplateModelRoot rtm, String templateFilename)
-       throws ServletModuleException {
-               deliver(req, res, rtm, null, templateFilename);
-       }
-       
+                        out.close();
+                }
+                catch (HTMLParseException e) {
+                        throw new ServletModuleException(e.getMessage());
+                } catch (IOException e) {
+                        throw new ServletModuleException(e.getMessage());
+                }
+        }
+
+
+        /**
+         * deliver liefert das Template mit dem Filenamen templateFilename
+         * an den HttpServletResponse res aus, nachdem es mit den Daten aus
+         * TemplateModelRoot rtm gemischt wurde
+         *
+         * @param res Http-Response, die vom Dispatcher durchgereicht wird
+         * @param rtm beinahalten das freemarker.template.TempalteModelRoot mit den
+         *   Daten, die ins Template gemerged werden sollen.
+         * @param tmpl Name des Templates
+         * @exception ServletModuleException
+         */
+        public void deliver(HttpServletRequest req, HttpServletResponse res,
+                            TemplateModelRoot rtm, String templateFilename)
+        throws ServletModuleException {
+                deliver(req, res, rtm, null, templateFilename);
+        }
+
     /**
      * deliver liefert das Template mit dem Filenamen templateFilename
      * an den HttpServletResponse res aus, nachdem es mit den Daten aus
@@ -365,7 +366,8 @@ public abstract class ServletModule {
      * @param tmpl Name des Templates
      * @exception ServletModuleException
      */
-    public void deliver_compressed(HttpServletRequest req, HttpServletResponse res, TemplateModelRoot rtm, String templateFilename)
+    public void deliver_compressed(HttpServletRequest req, HttpServletResponse res,
+                                   TemplateModelRoot rtm, String templateFilename)
             throws ServletModuleException {
         if (rtm == null) rtm = new SimpleHash();
         try {
@@ -375,10 +377,10 @@ public abstract class ServletModule {
             out.close();
         }
         catch (HTMLParseException e) {
-            throw new ServletModuleException(e.toString());
+            throw new ServletModuleException(e.getMessage());
         }
         catch (IOException e) {
-            throw new ServletModuleException(e.toString());
+            throw new ServletModuleException(e.getMessage());
         }
     }
 
@@ -393,7 +395,8 @@ public abstract class ServletModule {
      * @param tmpl Name des Templates
      * @exception ServletModuleException
      */
-    private void deliver(HttpServletResponse res, HttpServletRequest req, PrintWriter out, TemplateModelRoot rtm, String templateFilename)
+    private void deliver(HttpServletResponse res, HttpServletRequest req, PrintWriter out,
+                         TemplateModelRoot rtm, String templateFilename)
             throws HTMLParseException {
         HTMLTemplateProcessor.process(res, templateFilename, rtm, out, getLocale(req));
     }
@@ -431,7 +434,7 @@ public abstract class ServletModule {
             theFieldList = theStorage.getFields();
         }
         catch (StorageObjectException e) {
-            throw new ServletModuleException("ServletModule.getIntersectingValues: " + e.toString());
+            throw new ServletModuleException("ServletModule.getIntersectingValues: " + e.getMessage());
         }
 
         HashMap withValues = new HashMap();
index 944defe..b98d35f 100755 (executable)
@@ -35,81 +35,91 @@ import  java.lang.reflect.*;
 import  javax.servlet.http.*;
 import  mir.servlet.ServletModuleException;
 import  mir.misc.*;
+import  mir.log.*;
 
 
 /**
  * Dispatcher, calls the method passed to ServletModule Class, through the "do"
  * Parameter (via POST or GET)
  *
- * @version $Id: ServletModuleDispatch.java,v 1.7 2002/09/01 22:05:52 mh Exp $
+ * @version $Id: ServletModuleDispatch.java,v 1.8 2002/10/25 03:25:15 zapata Exp $
  *
  * @Author rk
  *
  */
 public final class ServletModuleDispatch {
 
-       private static Logfile theLog;
-       private static final    Class[] SIGNATURE =
-                                                                                                               { HttpServletRequest.class, HttpServletResponse.class };
+  private static LoggerWrapper logger;
+  private static final Class[] SIGNATURE = { HttpServletRequest.class, HttpServletResponse.class };
 
+  static {
+    logger = new LoggerWrapper("servlet.dispatch");
+  }
 
-       static {
-               theLog = Logfile.getInstance("/tmp/smod.dispatch");
-       }
+ /**
+  * private constructor to prevent unwanted instantiation;
+  */
 
-       /**
-        * privater Konstruktor, um versehentliche Instantiierung zu verhindern
-        */
-       private ServletModuleDispatch () {
-       }
+  private ServletModuleDispatch () {
+  }
 
-       /**
-        *  Die Dispatch-Routine ruft das von dem Hauptservlet kommende ServletModule
-        *  mit dem per HttpServletRequest angegebenen Paramter <code>do</code> auf.
-        *  Ist kein Parameter angegeben, so wird versucht, in die <code>defaultAction</code>
-        *  des ServletModules zu springen.
-        *
-        * @param req Http-Request, das vom Dispatcher an die Methode des
-        *    ServletModules durchgereicht wird
-        * @param res Http-Response, die vom Dispatcher an die Methode des
-        *    ServletModules durchgereicht wird
-        * @param sMod ServletModule, an das dispatched wird.
-        * @param mod Name des Modules als String (für Logfile)
-        */
+        /**
+         *  Die Dispatch-Routine ruft das von dem Hauptservlet kommende ServletModule
+         *  mit dem per HttpServletRequest angegebenen Paramter <code>do</code> auf.
+         *  Ist kein Parameter angegeben, so wird versucht, in die <code>defaultAction</code>
+         *  des ServletModules zu springen.
+         *
+         * @param req Http-Request, das vom Dispatcher an die Methode des
+         *    ServletModules durchgereicht wird
+         * @param res Http-Response, die vom Dispatcher an die Methode des
+         *    ServletModules durchgereicht wird
+         * @param sMod ServletModule, an das dispatched wird.
+         * @param mod Name des Modules als String (für Logfile)
+         */
 
-       public static void dispatch(ServletModule sMod, HttpServletRequest req,
-               HttpServletResponse res) throws ServletModuleException, ServletModuleUserException
-       {
-                       //sMod.predeliver(req,res);
+  public static void dispatch(ServletModule sMod, HttpServletRequest req,
+                              HttpServletResponse res) throws ServletModuleException, ServletModuleUserException
+  {
+    //sMod.predeliver(req,res);
 
-                       String doParam = req.getParameter("do");
-                       theLog.printInfo("SerletModuleDispatch: " + sMod.toString() + " with method " + doParam);
-                       if (doParam == null) {
-                               if (sMod.defaultAction() != null) doParam = sMod.defaultAction();
-                               else throw new ServletModuleException("no parameter do supplied!");
-                       }
+    String doParam = req.getParameter("do");
+    logger.info("ServletModuleDispatch: " + sMod.toString() + " with method " + doParam);
+    if (doParam == null) {
+      if (sMod.defaultAction() != null)
+        doParam = sMod.defaultAction();
+      else
+        throw new ServletModuleException("no parameter do supplied!");
+    }
 
-                       try {
-                               Method method = sMod.getClass().getMethod(doParam,SIGNATURE);
-                               if (method != null) {
-                                       method.invoke(sMod,new Object[] {req,res} );
-                                       return;
-                               }
-                               else theLog.printDebugInfo("method lookup unsuccesful");
-                       }
-                       catch ( NoSuchMethodException e) { throw new ServletModuleException("no such method!" + e.toString());}
-                       catch ( SecurityException e) { throw new ServletModuleException("method not allowed!" + e.toString());}
-                       catch ( InvocationTargetException e) {
-                               if (e.getTargetException().getClass().getName().equals("mir.servlet.ServletModuleUserException")) {
-                                               throw new ServletModuleUserException(((ServletModuleUserException)e.getTargetException()).getMsg());
-                               } else {
-                                               e.printStackTrace();
-                                               throw new ServletModuleException(e.getTargetException().toString());
-                               }
-                       }
-                       catch ( IllegalAccessException e) { throw new ServletModuleException("illegal method not allowed!" + e.toString());}
+    try {
+      Method method = sMod.getClass().getMethod(doParam,SIGNATURE);
+      if (method != null) {
+        method.invoke(sMod,new Object[] {req,res} );
+        return;
+      }
+      else logger.debug("method lookup unsuccesful");
+    }
+    catch ( NoSuchMethodException e) {
+      throw new ServletModuleException("no such method '"+doParam+"' (" + e.getMessage() + ")");
+    }
+    catch ( SecurityException e) {
+      throw new ServletModuleException("method not allowed!" + e.getMessage());
+    }
+    catch ( InvocationTargetException e) {
+      System.out.println(e.getMessage());
+      if (e.getTargetException() instanceof ServletModuleUserException) {
+        throw new ServletModuleUserException(e.getTargetException().getMessage());
+      }
+      else {
+        e.printStackTrace();
+        throw new ServletModuleException(e.getTargetException().getMessage());
+      }
+    }
+    catch ( IllegalAccessException e) {
+      throw new ServletModuleException("illegal method not allowed!" + e.getMessage());
+    }
 
-                       //hopefully we don't get here ...
-                       throw new ServletModuleException("delivery failed! -- ");
-       }
+//hopefully we don't get here ...
+    throw new ServletModuleException("delivery failed! -- ");
+  }
 }
index a7673b8..5b85287 100755 (executable)
@@ -38,22 +38,15 @@ import java.lang.*;
  *  Return an Exception with a simple String Message Method
  *  Differentiates user errors from System bugs/errors.
  *
- * 
+ *
  * @version 02.2002
  * @author mh
  */
 
 public final class ServletModuleUserException extends Exception
 {
-  String msg;
-
   public ServletModuleUserException(String msg) {
     super(msg);
-    this.msg = msg;
-  }
-
-  public String getMsg() {
-    return msg;
   }
 }
 
index ab23c0f..34dd7b0 100755 (executable)
@@ -37,82 +37,158 @@ import java.util.*;
 
 public class JobQueue {
   private Vector jobs;
+  private Vector finishedJobs;
   private Map dataToJob;
+  private Map identifierToJob;
+  private int nrJobs;
 
   public static final int STATUS_PENDING = 0;
   public static final int STATUS_PROCESSING = 1;
   public static final int STATUS_PROCESSED = 2;
+  public static final int STATUS_CANCELLED = 3;
+  public static final int STATUS_ABORTED = 4;
+
+  public static final int PRIORITY_NORMAL = 100;
+  public static final int PRIORITY_LOW = 10;
+  public static final int PRIORITY_HIGH = 1000;
+
+  public static final int FINISHEDJOBS_LOGSIZE = 10;
 
   public JobQueue() {
+    finishedJobs = new Vector();
     jobs = new Vector();
     dataToJob = new HashMap();
+    identifierToJob = new HashMap();
+    nrJobs = 0;
   }
 
-  public void appendJob(Object aData) {
+  public String appendJob(Object aData) {
     synchronized (jobs) {
-      Job job = new Job(aData);
+      Job job = new Job(aData, Integer.toString(nrJobs));
+      nrJobs++;
       jobs.add(job);
       dataToJob.put(aData, job);
+      identifierToJob.put(job.getIdentifier(), job);
+      return job.getIdentifier();
     }
   }
 
   public Object acquirePendingJob() {
     synchronized (jobs) {
-      Iterator i = jobs.iterator();
+      int priorityFound= 0;
+      Job jobFound;
 
-      while (i.hasNext()) {
-        Job job = (Job) i.next();
+      do {
+        jobFound = null;
+        Iterator i = jobs.iterator();
+        while (i.hasNext()) {
+          Job job = (Job) i.next();
 
-        if (job.setProcessing()) {
-          return job.getData();
+          if (job.isPending() && (jobFound==null || priorityFound<job.getPriority())) {
+            jobFound = job;
+            priorityFound = job.getPriority();
+          }
         }
       }
+      while (jobFound!=null && !jobFound.setProcessing());
+
+      if (jobFound!=null)
+        return jobFound.getData();
+      else
+        return null;
     }
+  }
 
-    return null;
+  private void finishJob(Job aJob) {
+    synchronized (jobs) {
+      identifierToJob.remove(aJob.identifier);
+      jobs.remove(aJob);
+      finishedJobs.insertElementAt(aJob, 0);
+      if (finishedJobs.size()>FINISHEDJOBS_LOGSIZE)
+        finishedJobs.remove(finishedJobs.size()-1);
+    }
   }
 
-  public void flagOffJob(Object aData) {
+  public void jobProcessed(Object aData) {
     synchronized (jobs) {
       Job job = (Job) dataToJob.get(aData);
 
       if (job!=null) {
         job.setProcessed();
+        finishJob(job);
       }
     }
   }
 
-  public void cleanupJobs() {
+  public void jobAborted(Object aData) {
     synchronized (jobs) {
-      Iterator i = jobs.iterator();
+      Job job = (Job) dataToJob.get(aData);
 
-      while (i.hasNext()) {
-        Job job = (Job) i.next();
+      if (job!=null) {
+        job.setAborted();
+        finishJob(job);
+      }
+    }
+  }
 
-        if (job.hasBeenProcessed()) {
-          i.remove();
-        }
+  public void cancelJob(Object aData) {
+    synchronized (jobs) {
+      Job job = (Job) dataToJob.get(aData);
+
+      if (job!=null && job.setCancelled()) {
+        finishJob(job);
       }
     }
   }
 
+  public void makeJobListSnapshots(List aJobList, List aFinishedJobList) {
+    synchronized (jobs) {
+      aJobList.addAll(makeJobListSnapshot());
+      aFinishedJobList.addAll(makeFinishedJobListSnapshot());
+    }
+  }
+
   public List makeJobListSnapshot() {
     synchronized (jobs) {
       return (List) jobs.clone();
     }
   }
 
+  public List makeFinishedJobListSnapshot() {
+    synchronized (jobs) {
+      return (List) finishedJobs.clone();
+    }
+  }
+
   public class Job implements Cloneable {
     private Object data;
+    private Date lastChange;
+    private String identifier;
     private int status;
+    private int priority;
 
-    public Job(Object aData, int aStatus) {
+    public Job(Object aData, String anIdentifier, int aStatus, int aPriority, Date aLastChange) {
       data = aData;
       status = aStatus;
+      identifier = anIdentifier;
+      priority = aPriority;
+      lastChange = aLastChange;
+    }
+
+    public Job(Object aData, String anIdentifier, int aStatus, int aPriority) {
+      this(aData, anIdentifier, aStatus, aPriority, (new GregorianCalendar()).getTime());
+    }
+
+    public Date getLastChange() {
+      return lastChange;
+    }
+
+    public String getIdentifier() {
+      return identifier;
     }
 
-    public Job(Object aData) {
-      this(aData, STATUS_PENDING);
+    public Job(Object aData, String anIdentifier) {
+      this(aData, anIdentifier, STATUS_PENDING, PRIORITY_NORMAL);
     }
 
     public Object getData() {
@@ -125,6 +201,10 @@ public class JobQueue {
       }
     }
 
+    public int getPriority() {
+      return priority;
+    }
+
     protected boolean setProcessing() {
       return setStatus(STATUS_PENDING, STATUS_PROCESSING);
     }
@@ -133,10 +213,30 @@ public class JobQueue {
       setStatus(STATUS_PROCESSING, STATUS_PROCESSED);
     }
 
+    protected void setAborted() {
+      setStatus(STATUS_PROCESSING, STATUS_ABORTED);
+    }
+
+    protected boolean setCancelled() {
+      return setStatus(STATUS_PENDING, STATUS_CANCELLED);
+    }
+
     public boolean hasBeenProcessed() {
       return getStatus() == STATUS_PROCESSED;
     }
 
+    public boolean hasBeenAborted() {
+      return getStatus() == STATUS_ABORTED;
+    }
+
+    public boolean isCancelled() {
+      return getStatus() == STATUS_CANCELLED;
+    }
+
+    public boolean isFinished() {
+      return hasBeenProcessed() || hasBeenAborted() || isCancelled();
+    }
+
     public boolean isProcessing() {
       return getStatus() == STATUS_PROCESSING;
     }
@@ -149,6 +249,7 @@ public class JobQueue {
       synchronized(this) {
         if (status == anOldStatus) {
           status = aNewStatus;
+          lastChange = (new GregorianCalendar()).getTime();
           return true;
         }
         else {
@@ -159,7 +260,8 @@ public class JobQueue {
 
     protected Object clone() {
       synchronized(this) {
-        return new Job(data, status);
+        System.out.println("  blabla");
+        return new Job(data, identifier, status, priority, lastChange);
       }
     }
   }
index 128a947..20bbc5e 100755 (executable)
@@ -45,7 +45,6 @@ public class ProducerEngine {
   private PrintWriter log;
 
   protected ProducerEngine() {
-//    producers = MirGlobal.localizer().producers().factories();
     producerJobQueue = new JobQueue();
     try {
       RandomAccessFile raFile = (new RandomAccessFile(MirGlobal.getConfigProperty("Home") + "/" + MirGlobal.getConfigProperty("Producer.Logfile"), "rw"));
@@ -53,7 +52,6 @@ public class ProducerEngine {
                 log = new PrintWriter(new FileWriter( raFile.getFD()));
     }
     catch (Exception e) {
-//      throw new ProducerEngineRuntimeExc("Creating PrintWriter log failed",e);
       log = new PrintWriter(new NullWriter());
     }
     queueThread = new Thread(new ProducerJobQueueThread());
@@ -78,76 +76,82 @@ public class ProducerEngine {
     }
   }
 
-  public void printQueueStatus(PrintWriter aWriter) {
-    Iterator iterator = producerJobQueue.makeJobListSnapshot().iterator();
-    producerJobQueue.cleanupJobs();
-    JobQueue.Job job;
-
-    while (iterator.hasNext()) {
-      job = (JobQueue.Job) iterator.next();
-      ProducerJob producerJob = (ProducerJob) job.getData();
-
-      aWriter.print(producerJob.factoryName + "." + producerJob.verb);
-      if (job.hasBeenProcessed())
-        aWriter.print(" processed");
-      else if (job.isProcessing())
-        aWriter.print(" processing");
-      else if (job.isPending())
-        aWriter.print(" pending");
-      else
-        aWriter.print(" unknown status");
-
-      aWriter.println("<br/>");
-    }
+  private String convertStatus(JobQueue.Job aJob) {
+    if (aJob.hasBeenProcessed())
+      return "processed";
+    if (aJob.isProcessing())
+      return "processing";
+    if (aJob.isPending())
+      return "pending";
+    if (aJob.isCancelled())
+      return "cancelled";
+    if (aJob.hasBeenAborted())
+      return "aborted";
+
+    return "unknown";
   }
 
-  private void produceNow(String aProducerFactory, String aVerb, PrintWriter aLogger) {
-    try {
-      long startTime;
-      long endTime;
-      Map startingMap = new HashMap();
+  private Map convertJob(JobQueue.Job aJob) {
+    Map result = new HashMap();
+    ProducerJob producerJob = (ProducerJob) aJob.getData();
 
-      startTime = System.currentTimeMillis();
+    result.put("identifier", aJob.getIdentifier());
+    result.put("factory", producerJob.getFactoryName());
+    result.put("verb", producerJob.getVerb());
+    result.put("priority", new Integer(aJob.getPriority()));
+    result.put("status", convertStatus(aJob));
+    result.put("lastchange", new DateToMapAdapter(aJob.getLastChange()));
 
-      aLogger.println("Producing (" + aProducerFactory + "," + aVerb + ")");
+    return result;
+  }
 
-      ProducerFactory factory = (ProducerFactory) MirGlobal.localizer().producers().factories().get(aProducerFactory);
+  private void convertJobList(List aSourceJobList, List aDestination) {
+    Iterator i = aSourceJobList.iterator();
 
-      if (factory == null )
-        throw new Exception("No producer factory '"+aProducerFactory+"' present.");
+    while (i.hasNext())
+      aDestination.add(convertJob((JobQueue.Job) i.next()));
+  }
 
-      MirGlobal.localizer().producerAssistant().initializeGenerationValueSet(startingMap);
-      Producer producer = factory.makeProducer(aVerb, startingMap);
+  public List getQueueStatus() {
+    List result = new Vector();
+    List pendingJobs = new Vector();
+    List finishedJobs = new Vector();
 
-      producer.produce(aLogger);
+    producerJobQueue.makeJobListSnapshots(pendingJobs, finishedJobs);
 
-      endTime = System.currentTimeMillis();
+    convertJobList(pendingJobs, result);
+    convertJobList(finishedJobs, result);
 
-      aLogger.println("Time: " + (endTime-startTime) + " ms<br>");
-    }
-    catch (Throwable e) {
-      try {
-        aLogger.println("exception occurred:<br>");
-        aLogger.println(e.getMessage());
-        e.printStackTrace(aLogger);
-      }
-      catch (Throwable f) {
-      }
-    }
+    return result;
   }
 
-  private class ProducerJob {
+private class ProducerJob {
     private String factoryName;
     private String verb;
+    private Producer producer;
 
     public ProducerJob(String aFactory, String aVerb) {
       factoryName = aFactory;
       verb = aVerb;
+      producer=null;
+    }
+
+    public String getFactoryName() {
+      return factoryName;
+    }
+
+    public String getVerb() {
+      return verb;
+    }
+
+    public void abort() {
+      if (producer!=null) {
+        producer.abort();
+      }
     }
 
     public void execute() {
       ProducerFactory factory;
-      Producer producer;
       long startTime;
       long endTime;
       Map startingMap = new HashMap();
@@ -156,7 +160,7 @@ public class ProducerEngine {
       log.println("Producing job: "+factoryName+"."+verb);
 
       try {
-        factory = (ProducerFactory) MirGlobal.localizer().producers().factories().get( factoryName );
+        factory = MirGlobal.localizer().producers().getFactoryForName( factoryName );
 
         if (factory!=null) {
           MirGlobal.localizer().producerAssistant().initializeGenerationValueSet(startingMap);
@@ -174,10 +178,13 @@ public class ProducerEngine {
         t.printStackTrace(log);
       }
       log.println("Done producing job: "+factoryName+"."+verb);
-                  endTime = System.currentTimeMillis();
+      endTime = System.currentTimeMillis();
+      log.println("Time: " + (endTime-startTime) + " ms");
+      log.flush();
+    }
 
-                  log.println("Time: " + (endTime-startTime) + " ms");
-                  log.flush();
+    boolean isAborted() {
+      return false;
     }
   }
 
@@ -190,7 +197,10 @@ public class ProducerEngine {
         ProducerJob job = (ProducerJob) producerJobQueue.acquirePendingJob();
         if (job!=null) {
           job.execute();
-          producerJobQueue.flagOffJob(job);
+          if (job.isAborted())
+            producerJobQueue.jobAborted(job);
+          else
+            producerJobQueue.jobProcessed(job);
         }
         else
         {
@@ -204,6 +214,11 @@ public class ProducerEngine {
     }
   }
 
+  public static class ProducerEngineExc extends Exc {
+    public ProducerEngineExc(String aMessage) {
+      super(aMessage);
+    }
+  }
 
   public static class ProducerEngineRuntimeExc extends Failure {
     public ProducerEngineRuntimeExc(String msg, Exception cause){
@@ -227,5 +242,23 @@ public class ProducerEngine {
     public String getProducer() {
       return producer;
     }
+
+    public static List parseProducerTaskList(String aList) throws ProducerEngineExc {
+      Iterator i;
+      List result = new Vector();
+
+      i = StringRoutines.splitString(aList, ";").iterator();
+      while (i.hasNext()) {
+        String taskExpression = (String) i.next();
+        List parts = StringRoutines.splitString(taskExpression, ".");
+
+        if (parts.size()!=2)
+          throw new ProducerEngineExc("Invalid producer expression: '" + taskExpression + "'");
+        else
+          result.add(new ProducerEngine.ProducerTask((String) parts.get(0), (String) parts.get(1)));
+      }
+
+      return result;
+    }
   }
 }
\ No newline at end of file
index 07a4f01..475fb4e 100755 (executable)
 
 package mircoders.localizer;
 
-import java.util.*;
+import java.util.List;
+import mir.producer.ProducerFactory;
 
 public interface MirProducerLocalizer {
-  public Map factories() throws MirLocalizerException, MirLocalizerFailure;
+  public List factories() throws MirLocalizerException, MirLocalizerFailure;
+  public ProducerFactory getFactoryForName(String aName);
+  public void produceAllNew();
 }
index e3060db..55fa5ee 100755 (executable)
@@ -47,11 +47,16 @@ public class MirBasicOpenPostingLocalizer implements MirOpenPostingLocalizer {
   protected static Logfile logger = Logfile.getInstance( MirGlobal.getConfigProperty("Home") + "/" + MirGlobal.getConfigProperty("Mir.Localizer.Logfile"));
 
   public MirBasicOpenPostingLocalizer() {
-    String contentProducers = MirGlobal.getConfigProperty("Mir.Localizer.OpenPosting.ContentProducers");
-    String commentProducers = MirGlobal.getConfigProperty("Mir.Localizer.OpenPosting.CommentProducers");
+    try {
+      String contentProducers = MirGlobal.getConfigProperty("Mir.Localizer.OpenPosting.ContentProducers");
+      String commentProducers = MirGlobal.getConfigProperty("Mir.Localizer.OpenPosting.CommentProducers");
 
-    afterContentProducerTasks = parseProducerTaskList(contentProducers);
-    afterCommentProducerTasks = parseProducerTaskList(commentProducers);
+      afterContentProducerTasks = ProducerEngine.ProducerTask.parseProducerTaskList(contentProducers);
+      afterCommentProducerTasks = ProducerEngine.ProducerTask.parseProducerTaskList(commentProducers);
+    }
+    catch (Throwable t) {
+      logger.printError("Setting up MirBasicOpenPostingLocalizer failed: " + t.getMessage());
+    }
   }
 
   public void afterContentPosting() {
@@ -76,21 +81,4 @@ public class MirBasicOpenPostingLocalizer implements MirOpenPostingLocalizer {
     return locale.getLanguage();
   }
 
-  protected List parseProducerTaskList(String aList) {
-    Iterator i;
-    List result = new Vector();
-
-    i = StringRoutines.splitString(aList, ";").iterator();
-    while (i.hasNext()) {
-      String taskExpression = (String) i.next();
-      List parts = StringRoutines.splitString(taskExpression, ".");
-
-      if (parts.size()!=2)
-        logger.printError("Invalid producer expression: '" + taskExpression + "'");
-      else
-        result.add(new ProducerEngine.ProducerTask((String) parts.get(0), (String) parts.get(1)));
-    }
-
-    return result;
-  }
 }
index 2b72ee7..0c0f9ce 100755 (executable)
@@ -46,7 +46,10 @@ import mircoders.producer.reader.*;
 import mircoders.producer.*;
 
 public class MirBasicProducerLocalizer implements MirProducerLocalizer {
-  private Map producerFactories;
+  private List producerFactories;
+  private Map nameToFactory;
+  private List allNewProducerTasks;
+
   protected FileMonitor fileMonitor;
   protected EntityAdapterModel model;
   protected Generator.GeneratorLibrary generatorLibrary;
@@ -56,11 +59,17 @@ public class MirBasicProducerLocalizer implements MirProducerLocalizer {
 
   public MirBasicProducerLocalizer() {
 
+
+
     try {
-      producerFactories = new HashMap();
+      String allNewProducers = MirGlobal.getConfigProperty("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.printError("MirBasicProducerLocalizer(): Exception "+t.getMessage());
@@ -68,16 +77,23 @@ public class MirBasicProducerLocalizer implements MirProducerLocalizer {
     }
   }
 
-  public Map factories() throws MirLocalizerException {
+  public List factories() throws MirLocalizerException {
     if (fileMonitor==null || producerFactories == null || fileMonitor.hasChanged()) {
       try {
-        Map newProducers = new HashMap();
+        List newProducers = new Vector();
         FileMonitor newFileMonitor = new FileMonitor();
         setupFactories(newProducers, newFileMonitor);
 
         producerFactories = newProducers;
         fileMonitor = newFileMonitor;
-        logger.printError("MirBasicProducerLocalizer.factories(): successfully setup factories");
+        logger.printInfo("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.printError("MirBasicProducerLocalizer.factories(): Unable to setup factories: "+t.getMessage());
@@ -87,26 +103,6 @@ public class MirBasicProducerLocalizer implements MirProducerLocalizer {
     return producerFactories;
   };
 
-  protected void setupContentFactory(CompositeProducerNode aProducerNode) {
-  }
-
-  protected void setupStartPageFactory(CompositeProducerNode aProducerNode) {
-  }
-
-  protected void setupSynchronizationFactory(CompositeProducerNode aProducerNode) {
-    if(MirGlobal.getConfigBooleanProperty("Rsync")){
-      aProducerNode.addSubNode(
-        new ScriptCallingProducerNode(MirGlobal.getConfigProperty("Rsync.Script.Path"))
-      );
-    }
-  }
-
-  protected void setupStaticFactory(CompositeProducerNode aProducerNode) {
-  }
-
-  protected void setupTopicsFactory(CompositeProducerNode aProducerNode) {
-  }
-
   protected void setupProducerNodeBuilderLibrary(ProducerNodeBuilderLibrary aLibrary) {
     DefaultProducerNodeBuilders.registerBuilders(
       aLibrary, model, generatorLibrary, writerEngine,
@@ -114,58 +110,34 @@ public class MirBasicProducerLocalizer implements MirProducerLocalizer {
     SupplementalProducerNodeBuilders.registerBuilders(aLibrary, model);
   }
 
-  protected void setupFactories(Map aFactoriesMap, FileMonitor aFileMonitor) throws MirLocalizerException, MirLocalizerFailure {
+  protected void setupFactories(List aFactories, FileMonitor aFileMonitor) throws MirLocalizerException, MirLocalizerFailure {
     ProducerConfigReader reader;
     ProducerNodeBuilderLibrary library = new ProducerNodeBuilderLibrary();
     setupProducerNodeBuilderLibrary(library);
     List usedFiles = new Vector();
+    Iterator i;
 
     aFileMonitor.clear();
     reader = new ProducerConfigReader();
-    reader.parseFile(MirGlobal.getConfigProperty("Home") + File.separatorChar + MirGlobal.getConfigProperty("Mir.Localizer.ProducerConfigFile"), library, aFactoriesMap, usedFiles);
+    reader.parseFile(MirGlobal.getConfigProperty("Home") + File.separatorChar + MirGlobal.getConfigProperty("Mir.Localizer.ProducerConfigFile"), library, aFactories, usedFiles);
 
-    Iterator i = usedFiles.iterator();
+    i = usedFiles.iterator();
     while (i.hasNext())
       aFileMonitor.addFile((File) i.next());
 
-    setupFactories(aFactoriesMap);
+    setupFactories(aFactories);
   }
 
-  protected void setupFactories(Map aFactoriesMap ) throws MirLocalizerException, MirLocalizerFailure {
+  protected void setupFactories(List aFactories) throws MirLocalizerException, MirLocalizerFailure {
     CompositeProducerNode node;
 
     try {
-      node = new CompositeProducerNode();
-      setupContentFactory( node );
-      if (node.getNrSubNodes()>0)
-        aFactoriesMap.put("content", new NodedProducerFactory(node));
-
-      node = new CompositeProducerNode();
-      setupStartPageFactory( node );
-      if (node.getNrSubNodes()>0)
-        aFactoriesMap.put("startpage", new NodedProducerFactory(node));
-
-      node = new CompositeProducerNode();
-      setupSynchronizationFactory( node );
-      if (node.getNrSubNodes()>0)
-        aFactoriesMap.put("synchronization", new NodedProducerFactory(node));
-
-      node = new CompositeProducerNode();
-      setupStaticFactory( node );
-      if (node.getNrSubNodes()>0)
-        aFactoriesMap.put("static", new NodedProducerFactory(node));
-
-      node = new CompositeProducerNode();
-      setupTopicsFactory( node );
-      if (node.getNrSubNodes()>0)
-        aFactoriesMap.put("topics", new NodedProducerFactory(node));
-
-      aFactoriesMap.put("media",
-                   new CompositeProducerFactory( new ProducerFactory[] {
-                      new OldProducerAdapterFactory(new ProducerImages()),
-                      new OldProducerAdapterFactory(new ProducerAudio()),
-                      new OldProducerAdapterFactory(new ProducerVideo()),
-                      new OldProducerAdapterFactory(new ProducerOther())
+      aFactories.add(
+                   new CompositeProducerFactory("media", new ProducerFactory[] {
+                      new OldProducerAdapterFactory("images", new ProducerImages()),
+                      new OldProducerAdapterFactory("audio", new ProducerAudio()),
+                      new OldProducerAdapterFactory("video", new ProducerVideo()),
+                      new OldProducerAdapterFactory("other", new ProducerOther())
                   } )
       );
     }
@@ -173,4 +145,12 @@ public class MirBasicProducerLocalizer implements MirProducerLocalizer {
       throw new MirLocalizerFailure(e);
     }
   };
+
+  public void produceAllNew() {
+    MirGlobal.producerEngine().addTasks(allNewProducerTasks);
+  };
+
+  public ProducerFactory getFactoryForName(String aName) {
+    return (ProducerFactory) nameToFactory.get(aName);
+  }
 }
index c178ff4..dd13743 100755 (executable)
@@ -36,8 +36,7 @@ import java.io.*;
 import mir.producer.*;
 
 public class CompositeProducer implements mir.producer.Producer {
-
-  List producers;
+  private List producers;
 
   public CompositeProducer() {
     producers = new Vector();
@@ -55,4 +54,8 @@ public class CompositeProducer implements mir.producer.Producer {
     while (i.hasNext())
       ((mir.producer.Producer) i.next()).produce(aLogger);
   }
+
+  public void abort() {
+
+  }
 }
index 4184417..1a38be9 100755 (executable)
@@ -36,14 +36,18 @@ import mir.entity.*;
 import mir.producer.*;
 
 public class CompositeProducerFactory implements ProducerFactory {
-  Map factories;          // verb -> Vector ( ProducerFactory )
+  private Map factories;          // verb -> Vector ( ProducerFactory )
+  private List verbs;
+  private String name;
 
-  public CompositeProducerFactory() {
+  public CompositeProducerFactory(String aName) {
     factories = new HashMap();
+    verbs = new Vector();
+    name = aName;
   }
 
-  public CompositeProducerFactory(ProducerFactory[] aSubProducerFactories) {
-    this();
+  public CompositeProducerFactory(String aName, ProducerFactory[] aSubProducerFactories) {
+    this(aName);
 
     int i;
 
@@ -52,15 +56,25 @@ public class CompositeProducerFactory implements ProducerFactory {
     }
   }
 
-  private List factoriesForVerb(String aVerb) {
+  private List findFactoriesForVerb(String aVerb) {
+    List result = (List) factories.get(aVerb);
+
+    if (result==null)
+      result = new Vector();
+
+    return result;
+  }
+
+  private List factoriesForVerb(ProducerVerb aVerb) {
     List result;
 
-    result=(List) factories.get(aVerb);
+    result=(List) factories.get(aVerb.getName());
 
     if (result==null) {
       result=new Vector();
 
-      factories.put(aVerb, result);
+      verbs.add(aVerb);
+      factories.put(aVerb.getName(), result);
     }
 
     return result;
@@ -72,14 +86,14 @@ public class CompositeProducerFactory implements ProducerFactory {
     i=aFactory.verbs();
 
     while (i.hasNext()) {
-      factoriesForVerb((String) i.next()).add(aFactory);
+      factoriesForVerb((ProducerVerb) i.next()).add(aFactory);
     }
   }
 
   public mir.producer.Producer makeProducer(String aVerb, Map aBasicValueSet) throws ProducerExc, ProducerFailure {
     CompositeProducer result = new CompositeProducer();
 
-    Iterator i=factoriesForVerb(aVerb).iterator();
+    Iterator i=findFactoriesForVerb(aVerb).iterator();
 
     while (i.hasNext())
       result.addProducer(((ProducerFactory) i.next()).makeProducer(aVerb, aBasicValueSet));
@@ -88,6 +102,10 @@ public class CompositeProducerFactory implements ProducerFactory {
   }
 
   public Iterator verbs() {
-    return factories.keySet().iterator();
+    return verbs.iterator();
+  }
+
+  public String getName() {
+    return name;
   }
 }
index c356f49..3b1018b 100755 (executable)
@@ -72,8 +72,4 @@ public class ContentMarkingProducerNode implements ProducerNode {
       throw new ProducerFailure(t.getMessage(), t);
     }
   }
-
-  public Set buildVerbSet() {
-    return new HashSet();
-  }
 }
\ No newline at end of file
index a8bb760..7034e60 100755 (executable)
@@ -89,8 +89,4 @@ public class ContentModifyingProducerNode implements ProducerNode {
       throw new ProducerFailure(t.getMessage(), t);
     }
   }
-
-  public Set buildVerbSet() {
-    return new HashSet();
-  }
 }
index b50b4f0..d023198 100755 (executable)
@@ -164,10 +164,6 @@ public class IndexingProducerNode implements ProducerNode {
     aLogger.println("  IndexTime: " + (endTime-startTime) + " ms<br>");
     aLogger.flush();
   }
-
-  public Set buildVerbSet() {
-    return new HashSet();
-  }
 }
 
 
index 504c822..e76831b 100755 (executable)
@@ -86,8 +86,84 @@ public class MediaGeneratingProducerNode implements ProducerNode {
       throw new ProducerFailure(t.getMessage(), t);
     }
   }
+}
+
+
+/*
+
 
-  public Set buildVerbSet() {
-    return new HashSet();
+  abstract Database getStorage() throws StorageObjectException;
+
+  public void handle(PrintWriter htmlout, EntityUsers user, boolean force,
+    boolean sync) throws StorageObjectException, ModuleException {
+    handle(htmlout,user,force,sync,null);
   }
-}
+
+  public void handle(PrintWriter htmlout,EntityUsers user,boolean force,
+    boolean sync, String id) throws StorageObjectException, ModuleException
+  {
+    long                sessionConnectTime = 0;
+    long                startTime = (new java.util.Date()).getTime();
+    String              whereClause;
+    String              orderBy;
+    Entity              currentMedia;
+    MirMedia            currentMediaHandler;
+    EntityList          batchEntityList;
+
+    int contentBatchsize =
+            Integer.parseInt(MirConfig.getProp("Producer.Content.Batchsize"));
+    orderBy = "date desc, webdb_lastchange desc";
+
+    // get batch of non-produced medias, that are to be published
+    whereClause="is_published='1'";
+    if (id!= null) {
+      whereClause += " and id="+id;
+      // optimization to avoid select count(*)..
+      contentBatchsize = -1;
+    }
+    if (force==false) whereClause += " and is_produced='0'";
+
+    batchEntityList = getStorage().selectByWhereClause(whereClause,
+                                                orderBy, 0, contentBatchsize);
+
+    while (batchEntityList != null) {
+      for(int i=0;i<batchEntityList.size();i++) {
+        currentMedia = (Entity)batchEntityList.elementAt(i);
+        try {
+          Entity currentMediaType =
+                DatabaseUploadedMedia.getInstance().getMediaType(currentMedia);
+          currentMediaHandler = MediaHelper.getHandler( currentMediaType );
+
+          // now produce
+          currentMediaHandler.produce(currentMedia,currentMediaType);
+          currentMedia.setValueForProperty("publish_server",
+                                        currentMediaHandler.getPublishHost());
+          currentMedia.setValueForProperty("icon_is_produced", "1");
+          currentMedia.setValueForProperty("is_produced", "1");
+          currentMedia.update();
+          logHTML(htmlout,"produced media id "+currentMedia.getId()
+                  +": "+currentMediaType.getValue("mime_type")+" success");
+        } catch (Exception e) {
+          // don't throw and exception here, just log.
+          // we don't want to make the admin interface unuseable
+          theLog.printError("media exception: "+currentMedia.getId()+
+                            e.toString());
+          logHTML(htmlout, "problem with media id: "+currentMedia.getId()+
+                  " <font color=\"Red\"> failed!</font>: "+e.toString());
+          e.printStackTrace(htmlout);
+        }
+      }
+
+      // if next batch get it...
+      if (batchEntityList.hasNextBatch()){
+        batchEntityList = uploadedMediaModule.getByWhereClause(whereClause,
+          orderBy, batchEntityList.getNextBatch(),contentBatchsize);
+      } else {
+        batchEntityList=null;
+      }
+    }
+    // Finish
+    sessionConnectTime = new java.util.Date().getTime() - startTime;
+    logHTML(htmlout, "Producer.Media finished: " + sessionConnectTime + " ms.");
+  }
+*/
index c07df28..8eb81c2 100755 (executable)
@@ -52,4 +52,7 @@ public class OldProducerAdapter implements mir.producer.Producer {
       throw new ProducerFailure("Failure at handling old Producers",e);
     }
   }
+
+  public void abort() {
+  }
 }
\ No newline at end of file
index b5d99ca..5d70209 100755 (executable)
@@ -35,22 +35,30 @@ import mir.producer.*;
 import java.util.*;
 
 public class OldProducerAdapterFactory implements ProducerFactory {
+  private List verbs;
+  private String name;
 
   private mircoders.producer.Producer oldProducer;
 
-  public Iterator verbs() {
-    Vector verbList = new Vector();
+  public OldProducerAdapterFactory(String aName, mircoders.producer.Producer anOldProducer) {
+    name = aName;
+    verbs = new Vector();
 
-    verbList.add("new");
-    verbList.add("all");
-    return verbList.iterator();
-  }
+    verbs.add(new SimpleProducerVerb("new", "generate only altered items"));
+    verbs.add(new SimpleProducerVerb("all", "generate all items"));
 
-  public OldProducerAdapterFactory(mircoders.producer.Producer anOldProducer) {
     oldProducer = anOldProducer;
   }
 
+  public Iterator verbs() {
+    return verbs.iterator();
+  }
+
   public mir.producer.Producer makeProducer(String aVerb, Map anInitialValues) {
     return new OldProducerAdapter(oldProducer, new Boolean(aVerb.equals("all")));
   }
+
+  public String getName() {
+    return name;
+  }
 }
\ No newline at end of file
index d739073..1240bc5 100755 (executable)
@@ -62,7 +62,7 @@ public class PDFGeneratingProducerNode implements ProducerNode {
 
       destinationIdentifier = ParameterExpander.expandExpression( aValueMap, destinationExpression );
       generatorIdentifier = ParameterExpander.expandExpression( aValueMap, generatorExpression );
-      stylesheetIdentifier = ParameterExpander.expandExpression( aValueMap, stylesheet);      
+      stylesheetIdentifier = ParameterExpander.expandExpression( aValueMap, stylesheet);
 
       aLogger.println("Generating " + generatorIdentifier + " into " + destinationIdentifier + " using "+ stylesheetIdentifier);
       aLogger.flush();
@@ -71,8 +71,8 @@ public class PDFGeneratingProducerNode implements ProducerNode {
 
         }
         catch (Throwable t) {
-           t.printStackTrace();
-           aLogger.println("  error while generating: " + t.getMessage() + t.toString());
+            t.printStackTrace();
+            aLogger.println("  error while generating: " + t.getMessage() + t.toString());
       aLogger.flush();
     }
     endTime = System.currentTimeMillis();
@@ -80,10 +80,6 @@ public class PDFGeneratingProducerNode implements ProducerNode {
     aLogger.println("  Time: " + (endTime-startTime) + " ms<br>");
     aLogger.flush();
   }
-
-  public Set buildVerbSet() {
-    return new HashSet();
-  }
 }
 
 
index e4f9f21..bcff7c9 100755 (executable)
@@ -47,8 +47,8 @@ import mircoders.storage.*;
 public class PDFPreFormattingProducerNode implements ProducerNode {
   private String contentKey;
   private int numLinesBetweenImages;
-  private float contentAreaWidthCM;  
-  private float characterWidthCM;  
+  private float contentAreaWidthCM;
+  private float characterWidthCM;
   private float pixelWidthCM;
   private float lineHeightCM;
 
@@ -59,7 +59,7 @@ public class PDFPreFormattingProducerNode implements ProducerNode {
     characterWidthCM=(new Float(aCharacterWidthCM)).floatValue();
     pixelWidthCM=(new Float(aPixelWidthCM)).floatValue();
     lineHeightCM=(new Float(aLineHeightCM)).floatValue();
-    
+
     //    float characterWidthCM = 0.17F;
     //float contentAreaWidthCM = 16;
     //float pixelWidthCM = .03F;
@@ -85,121 +85,121 @@ public class PDFPreFormattingProducerNode implements ProducerNode {
       int currentPosition = 0;
 
       //int numLinesBetweenImages=3;
-      
 
 
-      
+
+
       int numCharsInAnImagelessRow = (new Float(numLinesBetweenImages * (contentAreaWidthCM/characterWidthCM))).intValue();
 
       boolean outOfText = false;
 
-      ArrayList brokenUpContent = new ArrayList();  
-      
+      ArrayList brokenUpContent = new ArrayList();
+
 
       EntityList images=DatabaseContentToMedia.getInstance().getImages((EntityContent)entity);
-      String theContent = ((EntityContent) entity).getValue("content_data"); 
+      String theContent = ((EntityContent) entity).getValue("content_data");
       if (images == null){
-         HashMap row = new HashMap();
-         row.put("text",theContent);
-         row.put("hasImage","0");
-         brokenUpContent.add(row);
+          HashMap row = new HashMap();
+          row.put("text",theContent);
+          row.put("hasImage","0");
+          brokenUpContent.add(row);
       }
       if (images != null){
-         //need to add checks for out of content!
-         HashMap row0 = new HashMap();
-         if (numCharsInAnImagelessRow>(theContent).length()){
-             row0.put("text",theContent);
-             outOfText = true;
-         }
-         else {
-             //break on words so we don't split html entities
-             int lastSpaceAt = theContent.lastIndexOf(" ",numCharsInAnImagelessRow);
-             row0.put("text",theContent.substring(0,lastSpaceAt));
-             currentPosition=lastSpaceAt;
-         }
-         row0.put("hasImage","0");
-         brokenUpContent.add(row0);
-         aLogger.println("CP1 is "+ currentPosition);
-         while(images.hasNext()){
-             HashMap row1 = new HashMap();
-             HashMap row2 = new HashMap();
-             EntityImages currentImage=(EntityImages) images.next();
-             float img_width=(new Float(currentImage.getValue("img_width"))).floatValue();
-             float img_height=(new Float(currentImage.getValue("img_height"))).floatValue();
-             
-             //oversize images must be shrunk
-             if (img_width>400){
-                 img_height=(new Float((new Float(img_height*(400.0F/img_width))).intValue())).floatValue();
-                 img_width=400.0F;
-             }
-
-
-             //calculate how much text goes in the column(use 8 pixels to pad the column)
-             float text_widthCM = contentAreaWidthCM-((img_width+8)*pixelWidthCM);
-             float number_of_lines = img_height*pixelWidthCM/lineHeightCM; //don't worry we will make it an int 
-             //add one line for image description
-             int text_amount= (new Float((text_widthCM/characterWidthCM)*(number_of_lines+1))).intValue();
-
-             row1.put("text_widthCM",Float.toString(text_widthCM));
-             
-             row1.put("img_title",currentImage.getValue("title"));
-
-             row1.put("img_width",Float.toString(img_width));
-             row1.put("img_height",Float.toString(img_height));
-             
-             aLogger.println("img_width " +Float.toString(img_width));
-             aLogger.println("img_height "+Float.toString(img_height));
-             
-             row1.put("img_src",currentImage.getValue("publish_path"));
-             row1.put("hasImage","1");
-             if (! outOfText){
-                 try {
-                     int lastSpaceAt = theContent.lastIndexOf(" ",currentPosition+text_amount);
-                     row1.put("text",theContent.substring(currentPosition,lastSpaceAt));
-                     currentPosition=lastSpaceAt;
-                 }
-                 catch (IndexOutOfBoundsException e){
-                     row1.put("text",theContent.substring(currentPosition));
-                     outOfText = true;
-                         }
-             }
-             aLogger.println("CP2 is "+ currentPosition);
-             brokenUpContent.add(row1);
-             
-             if (! outOfText){
-                 try {
-                     int lastSpaceAt = theContent.lastIndexOf(" ",currentPosition+numCharsInAnImagelessRow);
-                     row2.put("text",theContent.substring(currentPosition,lastSpaceAt));
-                     currentPosition=lastSpaceAt;
-                 }
-                 catch (IndexOutOfBoundsException e){
-                     row2.put("text",theContent.substring(currentPosition));
-                     outOfText = true;
-                         }
-             }
-             row2.put("hasImage","0");
-             brokenUpContent.add(row2);
-
-             aLogger.println("CP3 is "+ currentPosition);
-         }
-         HashMap row3 = new HashMap();
-         if (! outOfText){
-             row3.put("text",theContent.substring(currentPosition));
-             row3.put("hasImage","0");
-             brokenUpContent.add(row3);
-         }
-         
+          //need to add checks for out of content!
+          HashMap row0 = new HashMap();
+          if (numCharsInAnImagelessRow>(theContent).length()){
+              row0.put("text",theContent);
+              outOfText = true;
+          }
+          else {
+              //break on words so we don't split html entities
+              int lastSpaceAt = theContent.lastIndexOf(" ",numCharsInAnImagelessRow);
+              row0.put("text",theContent.substring(0,lastSpaceAt));
+              currentPosition=lastSpaceAt;
+          }
+          row0.put("hasImage","0");
+          brokenUpContent.add(row0);
+          aLogger.println("CP1 is "+ currentPosition);
+          while(images.hasNext()){
+              HashMap row1 = new HashMap();
+              HashMap row2 = new HashMap();
+              EntityImages currentImage=(EntityImages) images.next();
+              float img_width=(new Float(currentImage.getValue("img_width"))).floatValue();
+              float img_height=(new Float(currentImage.getValue("img_height"))).floatValue();
+
+              //oversize images must be shrunk
+              if (img_width>400){
+                  img_height=(new Float((new Float(img_height*(400.0F/img_width))).intValue())).floatValue();
+                  img_width=400.0F;
+              }
+
+
+              //calculate how much text goes in the column(use 8 pixels to pad the column)
+              float text_widthCM = contentAreaWidthCM-((img_width+8)*pixelWidthCM);
+              float number_of_lines = img_height*pixelWidthCM/lineHeightCM; //don't worry we will make it an int
+              //add one line for image description
+              int text_amount= (new Float((text_widthCM/characterWidthCM)*(number_of_lines+1))).intValue();
+
+              row1.put("text_widthCM",Float.toString(text_widthCM));
+
+              row1.put("img_title",currentImage.getValue("title"));
+
+              row1.put("img_width",Float.toString(img_width));
+              row1.put("img_height",Float.toString(img_height));
+
+              aLogger.println("img_width " +Float.toString(img_width));
+              aLogger.println("img_height "+Float.toString(img_height));
+
+              row1.put("img_src",currentImage.getValue("publish_path"));
+              row1.put("hasImage","1");
+              if (! outOfText){
+                  try {
+                      int lastSpaceAt = theContent.lastIndexOf(" ",currentPosition+text_amount);
+                      row1.put("text",theContent.substring(currentPosition,lastSpaceAt));
+                      currentPosition=lastSpaceAt;
+                  }
+                  catch (IndexOutOfBoundsException e){
+                      row1.put("text",theContent.substring(currentPosition));
+                      outOfText = true;
+                          }
+              }
+              aLogger.println("CP2 is "+ currentPosition);
+              brokenUpContent.add(row1);
+
+              if (! outOfText){
+                  try {
+                      int lastSpaceAt = theContent.lastIndexOf(" ",currentPosition+numCharsInAnImagelessRow);
+                      row2.put("text",theContent.substring(currentPosition,lastSpaceAt));
+                      currentPosition=lastSpaceAt;
+                  }
+                  catch (IndexOutOfBoundsException e){
+                      row2.put("text",theContent.substring(currentPosition));
+                      outOfText = true;
+                          }
+              }
+              row2.put("hasImage","0");
+              brokenUpContent.add(row2);
+
+              aLogger.println("CP3 is "+ currentPosition);
+          }
+          HashMap row3 = new HashMap();
+          if (! outOfText){
+              row3.put("text",theContent.substring(currentPosition));
+              row3.put("hasImage","0");
+              brokenUpContent.add(row3);
+          }
+
       }
-      
-      
-      
-      
-      
+
+
+
+
+
       ParameterExpander.setValueForKey(
-                                      aValueMap,
-                                      "data.formatted_content",
-                                      new CachingRewindableIterator(brokenUpContent.iterator())
-                                      );
+                                       aValueMap,
+                                       "data.formatted_content",
+                                       new CachingRewindableIterator(brokenUpContent.iterator())
+                                       );
 
 
     }
@@ -210,10 +210,6 @@ public class PDFPreFormattingProducerNode implements ProducerNode {
       throw new ProducerFailure(t.getMessage(), t);
     }
   }
-
-  public Set buildVerbSet() {
-    return new HashSet();
-  }
 }
 
 
index 67d73e2..045378f 100755 (executable)
@@ -174,8 +174,6 @@ public class ServletModuleComment extends ServletModule
       generator = MirGlobal.localizer().generators().makeAdminGeneratorLibrary().makeGenerator("admin/commentlist2.template");
       model = MirGlobal.localizer().dataModel().adapterModel();
 
-//    commentList = mainModule.getByWhereClause(whereClause, order, offset);
-
       generationData = new HashMap();
       MirGlobal.localizer().producerAssistant().initializeGenerationValueSet(generationData);
 
index f0924e0..b37a344 100755 (executable)
@@ -37,14 +37,18 @@ import java.util.*;
 import javax.servlet.*;
 import javax.servlet.http.*;
 
+import org.apache.struts.util.MessageResources;
+
 import freemarker.template.*;
 
 import mir.servlet.*;
 import mir.misc.*;
 import mir.producer.*;
+import mir.generator.*;
+import mir.producer.*;
+import mir.entity.adapter.*;
+import mir.util.*;
 
-import mircoders.producer.*;
-import mircoders.entity.*;
 import mircoders.global.*;
 
 /* Verteilerservlet, dass je nach Parameter task die Klasse Producer"TASK"
@@ -56,70 +60,145 @@ import mircoders.global.*;
 public class ServletModuleProducer extends ServletModule
 {
 
-       private static ServletModuleProducer instance = new ServletModuleProducer();
-       public static ServletModule getInstance() { return instance; }
+  private static ServletModuleProducer instance = new ServletModuleProducer();
+  public static ServletModule getInstance() { return instance; }
+
+  Object comments;
+  Map generationData;
+  Generator generator;
+  int totalNrComments;
+  List producersData;
+
+  void generateResponse(String aGeneratorIdentifier, PrintWriter aWriter, Map aResponseData, Locale aLocale) throws ServletModuleException {
+    try {
+      generator = MirGlobal.localizer().generators().makeAdminGeneratorLibrary().makeGenerator(aGeneratorIdentifier);
+      MirGlobal.localizer().producerAssistant().initializeGenerationValueSet(aResponseData);
+      aResponseData.put( "lang", new ResourceBundleGeneratorFunction( aLocale, MessageResources.getMessageResources("bundles.admin")));
+      generator.generate(aWriter, aResponseData, new PrintWriter(new NullWriter()));
+    }
+    catch (Throwable t) {
+      throw new ServletModuleException(t.getMessage());
+    }
+  }
+
+  private ServletModuleProducer() {
+    theLog = Logfile.getInstance(MirConfig.getProp("Home") + MirConfig.getProp("ServletModule.Producer.Logfile"));
+    defaultAction="showProducerQueueStatus";
+  }
+
+  public void showMessage(PrintWriter aWriter, Locale aLocale, String aMessage, String anArgument1, String anArgument2) throws ServletModuleException {
+    Map responseData;
+    try {
+      responseData = new HashMap();
+      responseData.put("message", aMessage);
+      responseData.put("argument1", anArgument1);
+      responseData.put("argument2", anArgument2);
+      generateResponse("infomessage.template", aWriter, responseData, aLocale);
+    }
+    catch (Throwable t) {
+      throw new ServletModuleException(t.getMessage());
+    }
+  }
 
-       private ServletModuleProducer() {
-               theLog = Logfile.getInstance(MirConfig.getProp("Home") + MirConfig.getProp("ServletModule.Producer.Logfile"));
-               defaultAction="produce";
-       }
 
+  public void showProducerQueueStatus(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleException {
+    Object comments;
+    Map generationData;
+    Generator generator;
+    int totalNrComments;
+    List producersData;
 
-       public void produce(HttpServletRequest req, HttpServletResponse res)
-               throws ServletModuleException
-       {
-               try {
-                       PrintWriter out = res.getWriter();
+    try {
+      generator = MirGlobal.localizer().generators().makeAdminGeneratorLibrary().makeGenerator("producerqueue.template");
 
+      generationData = new HashMap();
+      MirGlobal.localizer().producerAssistant().initializeGenerationValueSet(generationData);
 
-                       if (req.getParameter("producer")!=null) {
-      // ML: new producer system:
+      generationData.put( "lang", new ResourceBundleGeneratorFunction( getLocale(aRequest), MessageResources.getMessageResources("bundles.admin")));
+      generationData.put( "thisurl", "module=Producer&do=showProducerQueueStatus");
 
-                       String producerParam = req.getParameter("producer");
-                       String verbParam = req.getParameter("verb");
+      producersData = new Vector();
+      Iterator i = MirGlobal.localizer().producers().factories().iterator();
+      while (i.hasNext()) {
+        ProducerFactory factory = (ProducerFactory) i.next();
 
-                       MirGlobal.producerEngine().addJob(producerParam, verbParam);
-                       MirGlobal.producerEngine().printQueueStatus(out);
+        List producerVerbs = new Vector();
+        Iterator j = factory.verbs();
+        while (j.hasNext()) {
+          Map verbData = new HashMap();
+          ProducerFactory.ProducerVerb verb = (ProducerFactory.ProducerVerb) j.next();
+          verbData.put("name", verb.getName());
+          verbData.put("description", verb.getDescription());
 
-//        ProducerFactory factory = (ProducerFactory) MirGlobal.localizer().producers().factories().get(producerParam);
-//        mir.producer.Producer producer = factory.makeProducer(verbParam);
+          producerVerbs.add(verbData);
+        }
 
-//        producer.produce(out);
+        Map producerData = new HashMap();
+        producerData.put("name", factory.getName());
+        producerData.put("verbs", producerVerbs);
 
+        producersData.add(producerData);
       }
-      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);
-          }
-
-                       }
-               }
-               }
-               catch (Exception e) {
-      throw new ServletModuleException(e.toString());
+      generationData.put("producers", producersData);
+
+      generationData.put("queue", MirGlobal.producerEngine().getQueueStatus());
+      generator.generate(aResponse.getWriter(), generationData, new PrintWriter(new NullWriter()));
+    }
+    catch (Throwable t) {
+      throw new ServletModuleException(t.getMessage());
     }
-       }
+  }
+
+  public void produce(HttpServletRequest req, HttpServletResponse res) throws ServletModuleException {
+    /*
+     * This method will only be called by external scripts (e.g. from cron jobs).
+     * The output therefore is very simple.
+     *
+     */
 
+    try {
+      PrintWriter out = res.getWriter();
+
+      if (req.getParameter("producer")!=null) {
+        String producerParam = req.getParameter("producer");
+        String verbParam = req.getParameter("verb");
+
+        MirGlobal.producerEngine().addJob(producerParam, verbParam);
+        out.println("job added");
+      }
+    }
+    catch (Exception e) {
+      throw new ServletModuleException(e.getMessage());
+    }
+  }
+
+  public void produceAllNew(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleException {
+    try {
+      MirGlobal.localizer().producers().produceAllNew();
+      showMessage(aResponse.getWriter(), getLocale(aRequest), "produceAllNewAddedToQueue", "", "");
+    }
+    catch (Exception e) {
+      throw new ServletModuleException(e.getMessage());
+    }
+  }
+
+  public void enqueue(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleException {
+    try {
+      if (aRequest.getParameter("producer")!=null) {
+        String producerParam = aRequest.getParameter("producer");
+        String verbParam = aRequest.getParameter("verb");
+
+        MirGlobal.producerEngine().addJob(producerParam, verbParam);
+
+        showProducerQueueStatus(aRequest, aResponse);
+      }
+    }
+    catch (Exception e) {
+      throw new ServletModuleException(e.getMessage());
+    }
+  }
 
+  public void cancelAbortJob(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleException {
+    // ML: to be coded
+  }
 }
diff --git a/templates/admin/error.template b/templates/admin/error.template
new file mode 100755 (executable)
index 0000000..2a0395d
--- /dev/null
@@ -0,0 +1,37 @@
+<html>
+<head>
+    <title>${config["Mir.Name"]} | ${lang("error.htmltitle")}</title>
+    <link rel="stylesheet" type="text/css" href="${config.docRoot}/style/admin.css">
+</head>
+<body>
+<include "head.template">
+<table width="100%" border="0" align="center">
+       <tr class="grey">
+               <td>
+                       <div align="center"><h2><font class="specialtext">${lang("error.title")}</font></h2>
+                       </div>
+               </td>
+       </tr>
+       <tr>
+               <td>
+                       <p>${lang("error.text", config["Mir.Tech-email.address"], config["Mir.Tech-email.name"])}
+               </td>
+       </tr>
+       <tr>
+               <td>
+                       <p>
+                       <p align="center"><font color="red">${data.date} -- ${data.errorstring}</font>
+                       <p>
+               </td>
+       </tr>
+       <tr>
+               <td>
+                       <p align="center">
+            ${lang("error.text2", config["Mir.Tech-email.address"], config["Mir.Tech-email.name"])}
+                       <p>
+               </td>
+       </tr>
+</table>
+<include "foot.template">
+</body>
+</html>
diff --git a/templates/admin/infomessage.template b/templates/admin/infomessage.template
new file mode 100755 (executable)
index 0000000..c590018
--- /dev/null
@@ -0,0 +1,19 @@
+<html>
+<head>
+    <title>${config["Mir.Name"]} | ${lang("error.htmltitle")}</title>
+    <link rel="stylesheet" type="text/css" href="${config.docRoot}/style/admin.css">
+</head>
+<body>
+<include "head.template">
+<table width="100%" border="0" align="center">
+       <tr>
+               <td>
+                       <p>
+                         <b>${lang("infomessage."+message, argument1, argument2)}<b>
+                       <p>
+               </td>
+       </tr>
+</table>
+<include "foot.template">
+</body>
+</html>
diff --git a/templates/admin/producerqueue.template b/templates/admin/producerqueue.template
new file mode 100755 (executable)
index 0000000..ad39d7c
--- /dev/null
@@ -0,0 +1,80 @@
+<html>
+<head>
+       <title>${config["Mir.Name"]} | ${lang("producerqueue.htmltitle")}</title>
+  <link rel="stylesheet" type="text/css" href="${config.docRoot}/style/admin.css">
+</head>
+
+<body marginwidth="0" marginheight="0" topmargin="0" leftmargin="0">
+<include "head.template">
+
+<span class="spezialtext"><b>${lang("producer.jobqueue.title")}</b></span>
+<p>
+<table border="0">
+  <tr class="darkgrey">
+    <td colspan="2"><span class="witesmall">${lang("producer.job.name")}</span></td>
+    <td><span class="witesmall">${lang("producer.job.status")}</span></td>
+    <td><span class="witesmall">${lang("producer.job.date")}</span></td>
+<comment>    
+    <td>&nbsp;</td>
+</comment>    
+  </tr>
+  
+  <if queue>
+    <assign grey="1">
+    <list queue as q>
+      <tr <if grey=="1">class="list1"<else>class="list2"</if>>
+        <td><span><b>${q.factory}</b></span></td>
+        <td><span><b>${q.verb}</b></span></td>
+        <td><span>${q.status}</span></td>
+        <td><span>${q.lastchange["HH:mm:ss"]}</span></td>
+<comment> ML: needs to be implemented       
+        <td><span><a href="${config.actionRoot}?module=Producer&do=abort">${lang("producer.job.cancel")}</a></span></td>
+</comment>        
+      </tr>
+      <if grey=="1"><assign grey="0"><else><assign grey="1"></if>
+    </list>
+  <else>
+      <tr class="list1">
+        <td colspan="5">Queue is empty</td>
+      </tr>
+  </if>
+  
+</table>
+<a href="${config.actionRoot}?${thisurl}">${lang("producer.jobqueue.refresh")}</a><br><br>
+
+<br><br>
+
+<span class="spezialtext"><b>${lang("producer.producerlist.title")}</b></span>
+<p>
+<table border="0">
+  <tr class="darkgrey">
+    <td>&nbsp;</td>
+    <td><span class="witesmall">${lang("producer.verb.name")}</span></td>
+    <td><span class="witesmall">${lang("producer.verb.description")}</span></td>
+    <td><span class="witesmall">&nbsp;</span></td>
+  </tr>
+
+  <assign grey="1">
+  <list producers as p>
+    <tr <if grey=="1">class="list1"<else>class="list2"</if>>
+      <td colspan="4"><span><b>${p.name}</b></span></td>
+    </tr>
+    
+    <list p.verbs as v>
+      <tr <if grey=="1">class="list1"<else>class="list2"</if>>
+        <td width="25"></td>
+        <td><span class="small">${v.name}</span></td>
+        <td><span class="small">${v.description}</span></td>
+        <td><span class="small"><a href="${config.actionRoot}?module=Producer&do=enqueue&producer=${utility.encodeURI(p.name)}&verb=${utility.encodeURI(v.name)}">${lang("producer.verb.enqueue")}</a>&nbsp;</span></td>
+      </tr>
+    </list>
+    <if grey=="1"><assign grey="0"><else><assign grey="1"></if>
+  </list>
+</table>
+
+<include "foot.template">
+
+</body>
+</html>
+
+
index 267b29b..f73d34d 100755 (executable)
                <tr><td bgcolor="white">&nbsp;</td></tr>
                </table>
 
-       <span class="spezialtext">
-                       <b>Localizer producers</b></font>
-
-
-                       <div align="left">
-                         <table>
-                           <tr><th>producer</th><th>verbs</th></tr>
-
-                         <list data.producers as p>
-                           <tr>
-                           <td>${p.key}</td>
-
-               <td>
-                 <table>
-                   <tr>
-                             <list p.verbs as v>
-                               <td width="30">
-                               <a href="${config.actionRoot}?module=Producer&producer=${p.key}&verb=${v}">
-                                 ${v}
-                               </a>
-                               </td>
-                             </list>
-                               <tr>
-                             </table>
-               </td>
-                   </tr>
-
-                         </list>
-
-                         </table>
-                 </div>
+               <span class="spezialtext">
+               <b>${lang("start.producers.title")}</b></span>
+    <p>
+      <a href="${config.actionRoot}?module=Producer&do=produceAllNew">${lang("start.producers.produceAllNew")}</a><br>
+      <a href="${config.actionRoot}?module=Producer&do=showProducerQueueStatus">${lang("start.producers.advanced")}</a>
 
-       </td>
+    </td>
 
 
                        <td bgcolor="white" width="5%">&nbsp;
                        </td>
                        <td valign="top" width="30%" class="grey">
 
-<!-- not finished yet
+<comment> -- not finished yet --
        <span class="spezialtext">
                <b>${lang("start.coverage.title")}</b></span>
 
       <a href="${config.actionRoot}?module=Schwerpunkt&do=add" >
                  <img src="${config.docRoot}/img/pointgris.gif" border=0>&nbsp; ${lang("add")}</a>
     <p>
--->
+</comment>
+
                        <span class="spezialtext">
                        <b>${lang("start.topics.title")}</b></span>
 
                        <img src="${config.docRoot}/img/pointgris.gif" border=0>&nbsp; ${lang("add")}</a>
 
     <p>
-<!--
+<comment> -- not finished yet --
                <span class="spezialtext">
                  <b>${lang("start.languages.title")}</b></span>
 
                        <img src="${config.docRoot}/img/pointgris.gif" border=0>&nbsp; ${lang("add")}</a>
 
                <p>
--->
+</comment> 
                        <span class="spezialtext">
                  <b>${lang("start.imcs.title")}</b></span>
 
                        </td>
                        <td valign="top" width="20%" class="pink">
 
-       <!-- internes messageboard -->
+       <comment>internal messageboard</comment>
 
                <span class="spezialtext">
                <b>${lang("start.messageboard.title")}</b>
-               <span class="small"><br><a href="${config.actionRoot}?module=Message&do=add">${lang("add")}</a></span>
+               <span class="small"><br><a href="${config.actionRoot}?module=Message&do=add">${lang("add")}</a>
+               <a href="${config.actionRoot}?module=Message&do=list">${lang("edit")}</a></span>
                <if data.messages>
                        <list data.messages as m>
                                <p>
diff --git a/templates/admin/usererror.template b/templates/admin/usererror.template
new file mode 100755 (executable)
index 0000000..fc61c25
--- /dev/null
@@ -0,0 +1,37 @@
+<html>
+<head>
+<title>${lang("usererror.htmltitle")}</title>
+</head>
+<body>
+<include "templates/admin/head_nonavi.template">
+<table width="100%" border="0" align="center">
+       <tr bgcolor="#006600">
+               <td>
+                       <div align="center"><h2><font color="Pink">${lang("usererror.title")}</font></h2>
+                       </div>
+               </td>
+       </tr>
+       <tr>
+               <td>
+                       <p>${lang("usererror.text")}
+               </td>
+       </tr>
+       <tr>
+               <td>
+                       <p>
+                       <p align="center"><font size="5" color="Red"><b> ${data.errorstring}</b></font>
+            <p>
+                       <p> 
+               </td>
+       </tr>
+       <tr>
+               <td>
+                       <p align="center"><font face="Verdana, Arial, Helvetica, sans-serif" size="-1">${lang("usererror.what_to_do")}
+                       </a></font>
+                       <p>
+               </td>
+       </tr>
+</table>
+<include "foot.template">
+</body>
+</html>