1.1 restoration
[mir.git] / source / mir / producer / reader / DefaultProducerNodeBuilders.java
index b3024f1..c2f9a01 100755 (executable)
@@ -36,6 +36,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.io.File;
 
 import mir.entity.adapter.EntityAdapterModel;
 import mir.generator.Generator;
@@ -50,6 +51,7 @@ import mir.producer.EntityListProducerNode;
 import mir.producer.EntityModifyingProducerNode;
 import mir.producer.EvaluatedAssignmentProducerNode;
 import mir.producer.ExpandedAssignmentProducerNode;
+import mir.producer.ExternalDbProducerNode;
 import mir.producer.FileDateSettingProducerNode;
 import mir.producer.FileDeletingProducerNode;
 import mir.producer.FreeQueryProducerNode;
@@ -60,24 +62,25 @@ import mir.producer.LoopProducerNode;
 import mir.producer.ProducerNode;
 import mir.producer.RDFAggregatorProducerNode;
 import mir.producer.RSSProducerNode;
-import mir.producer.ResourceBundleProducerNode;
-import mir.producer.ScriptCallingProducerNode;
+import mir.producer.BundleProducerNode;
+import mir.producer.ExecuteProgramProducerNode;
 import mir.util.StringRoutines;
-import mir.util.xml.*;
+import mir.util.xml.XMLParserExc;
 import mir.util.xml.XMLReaderTool;
 
 public class DefaultProducerNodeBuilders {
 
   public static void registerBuilders(ProducerNodeBuilderLibrary aBuilderLibrary,
-       EntityAdapterModel aModel, Generator.GeneratorLibrary aGeneratorLibrary,
-       WriterEngine aWriterEngine, String aSourceBasePath, String aDestinationBasePath) throws ProducerConfigExc {
+       EntityAdapterModel aModel, Generator.Library aGeneratorLibrary,
+       WriterEngine aWriterEngine, File aSourceBasePath, File aDestinationBasePath) throws ProducerConfigExc {
 
     aBuilderLibrary.registerBuilder("Set", EvaluatedAssignmentProducerNodeBuilder.class);
     aBuilderLibrary.registerBuilder("Define", ExpandedAssignmentProducerNodeBuilder.class);
     aBuilderLibrary.registerBuilder("Log", LoggingProducerNodeBuilder.class);
-    aBuilderLibrary.registerBuilder("Execute", ScriptCallingProducerNodeBuilder.class);
-    aBuilderLibrary.registerBuilder("Resource", ResourceBundleProducerNodeBuilder.class);
-    aBuilderLibrary.registerFactory("CopyDir", new DirCopyProducerNodeBuilder.factory( aSourceBasePath, aDestinationBasePath));
+    aBuilderLibrary.registerBuilder("Execute", ExecuteProgramProducerNodeBuilder.class);
+    aBuilderLibrary.registerBuilder("Resource", BundleProducerNodeBuilder.class);
+    aBuilderLibrary.registerBuilder("Bundle", BundleProducerNodeBuilder.class);
+    aBuilderLibrary.registerFactory("CopyDir", new DirCopyProducerNodeBuilder.factory(aSourceBasePath, aDestinationBasePath));
 
     aBuilderLibrary.registerBuilder("DeleteFile", FileDeletingProducerNodeBuilder.class);
     aBuilderLibrary.registerBuilder("SetFileDate", FileDateSettingProducerNodeBuilder.class);
@@ -88,6 +91,7 @@ public class DefaultProducerNodeBuilders {
     aBuilderLibrary.registerBuilder("RDFAggregate", RDFAggregatorProducerNodeBuilder.class);
 
     aBuilderLibrary.registerBuilder("FreeQuery", FreeQueryProducerNodeBuilder.class);
+    aBuilderLibrary.registerBuilder("ExternalDbQuery", ExternalDbProducerNodeBuilder.class);
 
     aBuilderLibrary.registerFactory("Enumerate", new EnumeratingProducerNodeBuilder.factory(aModel));
     aBuilderLibrary.registerFactory("List", new ListProducerNodeBuilder.factory(aModel));
@@ -97,8 +101,7 @@ public class DefaultProducerNodeBuilders {
     aBuilderLibrary.registerFactory("CreateEntity", new CreateEntityProducerNodeBuilder.factory(aModel));
     aBuilderLibrary.registerFactory("DeleteEntity", new DeleteEntityProducerNodeBuilder.factory(aModel));
 
-    aBuilderLibrary.registerFactory("Generate",
-        new GeneratingProducerNodeBuilder.factory(aGeneratorLibrary, aWriterEngine));
+    aBuilderLibrary.registerFactory("Generate", new GeneratingProducerNodeBuilder.factory(aGeneratorLibrary, aWriterEngine));
   }
 
   public static abstract class AbstractProducerNodeBuilder implements ProducerNodeBuilder {
@@ -128,6 +131,7 @@ public class DefaultProducerNodeBuilders {
   // general attribute names, specifc builders reference these, to keep attribute
   //    names consistent
 
+  public final static String   EXTRA_TABLES_ATTRIBUTE = "extratables";
   public final static String   SELECTION_ATTRIBUTE = "selection";
   public final static String   ORDER_ATTRIBUTE = "order";
   public final static String   DEFINITION_ATTRIBUTE = "table";
@@ -154,7 +158,7 @@ public class DefaultProducerNodeBuilders {
     }
 
     public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLParserExc {
-      mir.util.xml.XMLReaderTool.checkAttributes(anAttributes, ASSIGNMENT_REQUIRED_ATTRIBUTES, ASSIGNMENT_OPTIONAL_ATTRIBUTES);
+      XMLReaderTool.checkAttributes(anAttributes, ASSIGNMENT_REQUIRED_ATTRIBUTES, ASSIGNMENT_OPTIONAL_ATTRIBUTES);
 
       key = (String) anAttributes.get(ASSIGNMENT_KEY_ATTRIBUTE);
       value = (String) anAttributes.get(ASSIGNMENT_VALUE_ATTRIBUTE);
@@ -177,7 +181,7 @@ public class DefaultProducerNodeBuilders {
     }
 
     public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLParserExc {
-      mir.util.xml.XMLReaderTool.checkAttributes(anAttributes, ASSIGNMENT_REQUIRED_ATTRIBUTES, ASSIGNMENT_OPTIONAL_ATTRIBUTES);
+      XMLReaderTool.checkAttributes(anAttributes, ASSIGNMENT_REQUIRED_ATTRIBUTES, ASSIGNMENT_OPTIONAL_ATTRIBUTES);
 
       key = (String) anAttributes.get(ASSIGNMENT_KEY_ATTRIBUTE);
       value = (String) anAttributes.get(ASSIGNMENT_VALUE_ATTRIBUTE);
@@ -199,7 +203,7 @@ public class DefaultProducerNodeBuilders {
     private final static String   ENUMERATION_DEFAULT_SUBNODE = "default";
     private final static String   ENUMERATION_LIMIT_ATTRIBUTE = LIMIT_ATTRIBUTE;
     private final static String   ENUMERATION_SKIP_ATTRIBUTE = SKIP_ATTRIBUTE;
-    private final static String   ENUMERATION_EXTRATABLES_ATTRIBUTE = "extratables";
+    private final static String   ENUMERATION_EXTRATABLES_ATTRIBUTE = EXTRA_TABLES_ATTRIBUTE;
     private final static String[] ENUMERATION_LIST_REQUIRED_ATTRIBUTES = { ENUMERATION_LIST_ATTRIBUTE, ENUMERATION_KEY_ATTRIBUTE };
     private final static String[] ENUMERATION_LIST_OPTIONAL_ATTRIBUTES = { };
     private final static String[] ENUMERATION_QUERY_REQUIRED_ATTRIBUTES = { ENUMERATION_DEFINITION_ATTRIBUTE, ENUMERATION_KEY_ATTRIBUTE };
@@ -209,7 +213,7 @@ public class DefaultProducerNodeBuilders {
     private String key;
     private String definition;
     private String mainTablePrefix;
-    private List   extraTables;
+    private String extraTables;
     private String list;
     private String selection;
     private String order;
@@ -232,17 +236,17 @@ public class DefaultProducerNodeBuilders {
 
 
       if (list!=null)
-        mir.util.xml.XMLReaderTool.checkAttributes(anAttributes, ENUMERATION_LIST_REQUIRED_ATTRIBUTES, ENUMERATION_LIST_OPTIONAL_ATTRIBUTES);
+        XMLReaderTool.checkAttributes(anAttributes, ENUMERATION_LIST_REQUIRED_ATTRIBUTES, ENUMERATION_LIST_OPTIONAL_ATTRIBUTES);
       if (definition!=null)
-        mir.util.xml.XMLReaderTool.checkAttributes(anAttributes, ENUMERATION_QUERY_REQUIRED_ATTRIBUTES, ENUMERATION_QUERY_OPTIONAL_ATTRIBUTES);
+        XMLReaderTool.checkAttributes(anAttributes, ENUMERATION_QUERY_REQUIRED_ATTRIBUTES, ENUMERATION_QUERY_OPTIONAL_ATTRIBUTES);
 
 
       key = (String) anAttributes.get(ENUMERATION_KEY_ATTRIBUTE);
-      selection = mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, ENUMERATION_SELECTION_ATTRIBUTE, "");
-      order = mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, ENUMERATION_ORDER_ATTRIBUTE, "");
+      selection = XMLReaderTool.getStringAttributeWithDefault(anAttributes, ENUMERATION_SELECTION_ATTRIBUTE, "");
+      order = XMLReaderTool.getStringAttributeWithDefault(anAttributes, ENUMERATION_ORDER_ATTRIBUTE, "");
       limit = (String) anAttributes.get(ENUMERATION_LIMIT_ATTRIBUTE);
       skip = (String) anAttributes.get(ENUMERATION_SKIP_ATTRIBUTE);
-      extraTables = StringRoutines.splitString(mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, ENUMERATION_EXTRATABLES_ATTRIBUTE,"").trim(), ",");
+      extraTables = XMLReaderTool.getStringAttributeWithDefault(anAttributes, ENUMERATION_EXTRATABLES_ATTRIBUTE,"");
       if (definition!=null) {
         List parts = StringRoutines.splitString(definition.trim(), " ");
         if (parts.size() > 0)
@@ -390,10 +394,10 @@ public class DefaultProducerNodeBuilders {
     }
 
     public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLParserExc  {
-      mir.util.xml.XMLReaderTool.checkAttributes(anAttributes, LOOP_REQUIRED_ATTRIBUTES, LOOP_OPTIONAL_ATTRIBUTES);
+      XMLReaderTool.checkAttributes(anAttributes, LOOP_REQUIRED_ATTRIBUTES, LOOP_OPTIONAL_ATTRIBUTES);
 
       condition = (String) anAttributes.get(LOOP_CONDITION_ATTRIBUTE);
-      limit = mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, LOOP_LIMIT_ATTRIBUTE, "");
+      limit = XMLReaderTool.getStringAttributeWithDefault(anAttributes, LOOP_LIMIT_ATTRIBUTE, "");
     };
 
     public ProducerNode constructNode() {
@@ -407,7 +411,7 @@ public class DefaultProducerNodeBuilders {
     private final static String   LIST_KEY_ATTRIBUTE = KEY_ATTRIBUTE;
     private final static String   LIST_DEFINITION_ATTRIBUTE = DEFINITION_ATTRIBUTE;
     private final static String   LIST_SELECTION_ATTRIBUTE = SELECTION_ATTRIBUTE;
-    private final static String   LIST_EXTRATABLES_ATTRIBUTE = "extratables";
+    private final static String   LIST_EXTRATABLES_ATTRIBUTE = EXTRA_TABLES_ATTRIBUTE;
     private final static String   LIST_ORDER_ATTRIBUTE = ORDER_ATTRIBUTE;
     private final static String   LIST_LIMIT_ATTRIBUTE = LIMIT_ATTRIBUTE;
     private final static String   LIST_SKIP_ATTRIBUTE = SKIP_ATTRIBUTE;
@@ -418,7 +422,7 @@ public class DefaultProducerNodeBuilders {
     private String key;
     private String definition;
     private String mainTablePrefix;
-    private List   extraTables;
+    private String extraTables;
     private String selection;
     private String order;
     private String limit;
@@ -432,15 +436,15 @@ public class DefaultProducerNodeBuilders {
     }
 
     public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLParserExc {
-      mir.util.xml.XMLReaderTool.checkAttributes(anAttributes, LIST_REQUIRED_ATTRIBUTES, LIST_OPTIONAL_ATTRIBUTES);
+      XMLReaderTool.checkAttributes(anAttributes, LIST_REQUIRED_ATTRIBUTES, LIST_OPTIONAL_ATTRIBUTES);
 
       key = (String) anAttributes.get(LIST_KEY_ATTRIBUTE);
       definition = (String) anAttributes.get(LIST_DEFINITION_ATTRIBUTE);
-      selection = mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, LIST_SELECTION_ATTRIBUTE, "");
-      order = mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, LIST_ORDER_ATTRIBUTE, "");
+      selection = XMLReaderTool.getStringAttributeWithDefault(anAttributes, LIST_SELECTION_ATTRIBUTE, "");
+      order = XMLReaderTool.getStringAttributeWithDefault(anAttributes, LIST_ORDER_ATTRIBUTE, "");
       limit = (String) anAttributes.get(LIST_LIMIT_ATTRIBUTE);
       skip = (String) anAttributes.get(LIST_SKIP_ATTRIBUTE);
-      extraTables = StringRoutines.splitString(mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, LIST_EXTRATABLES_ATTRIBUTE,"").trim(), ",");
+      extraTables = XMLReaderTool.getStringAttributeWithDefault(anAttributes, LIST_EXTRATABLES_ATTRIBUTE,"");
       List parts = StringRoutines.splitString(definition.trim()," ");
       if (parts.size()>0) definition=(String)parts.get(0);
       if (parts.size()>1) mainTablePrefix=(String)parts.get(1);
@@ -485,10 +489,10 @@ public class DefaultProducerNodeBuilders {
     }
 
     public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLParserExc {
-      mir.util.xml.XMLReaderTool.checkAttributes(anAttributes, DELETEENTITY_REQUIRED_ATTRIBUTES, DELETEENTITY_OPTIONAL_ATTRIBUTES);
+      XMLReaderTool.checkAttributes(anAttributes, DELETEENTITY_REQUIRED_ATTRIBUTES, DELETEENTITY_OPTIONAL_ATTRIBUTES);
 
       definition = (String) anAttributes.get(DELETEENTITY_DEFINITION_ATTRIBUTE);
-      selection = mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, DELETEENTITY_SELECTION_ATTRIBUTE, "");
+      selection = XMLReaderTool.getStringAttributeWithDefault(anAttributes, DELETEENTITY_SELECTION_ATTRIBUTE, "");
     };
 
     public ProducerNode constructNode() {
@@ -527,7 +531,7 @@ public class DefaultProducerNodeBuilders {
     public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLParserExc {
       String typeString;
 
-      mir.util.xml.XMLReaderTool.checkAttributes(anAttributes, LOG_REQUIRED_ATTRIBUTES, LOG_OPTIONAL_ATTRIBUTES);
+      XMLReaderTool.checkAttributes(anAttributes, LOG_REQUIRED_ATTRIBUTES, LOG_OPTIONAL_ATTRIBUTES);
 
       message = (String) anAttributes.get(LOG_MESSAGE_ATTRIBUTE);
       if (anAttributes.containsKey(LOG_TYPE_ATTRIBUTE)) {
@@ -578,7 +582,7 @@ public class DefaultProducerNodeBuilders {
     public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLParserExc {
       String typeString;
 
-      mir.util.xml.XMLReaderTool.checkAttributes(anAttributes, FREEQUERY_REQUIRED_ATTRIBUTES, FREEQUERY_OPTIONAL_ATTRIBUTES);
+      XMLReaderTool.checkAttributes(anAttributes, FREEQUERY_REQUIRED_ATTRIBUTES, FREEQUERY_OPTIONAL_ATTRIBUTES);
 
       key = (String) anAttributes.get(FREEQUERY_KEY_ATTRIBUTE);
       query = (String) anAttributes.get(FREEQUERY_QUERY_ATTRIBUTE);
@@ -606,10 +610,57 @@ public class DefaultProducerNodeBuilders {
       return new FreeQueryProducerNode(key, query, limit, type);
     };
   }
+////////////////////////////////////////////////////////////////////////////////
+
+  public static class ExternalDbProducerNodeBuilder extends AbstractProducerNodeBuilder {
+    private final static String   EXTDB_KEY_ATTRIBUTE = KEY_ATTRIBUTE;
+    private final static String   EXTDB_DRIVER_ATTRIBUTE = "driver";
+    private final static String   EXTDB_HOST_ATTRIBUTE = "host";
+    private final static String   EXTDB_PORT_ATTRIBUTE = "port";
+    private final static String   EXTDB_DATABASE_ATTRIBUTE = "database";
+    private final static String   EXTDB_USERNAME_ATTRIBUTE = "username";
+    private final static String   EXTDB_PASSWORD_ATTRIBUTE = "password";
+    private final static String   EXTDB_QUERY_ATTRIBUTE = "query";
+    private final static String   EXTDB_DEFAULT_SUBNODE = "default";
+    private final static String[] EXTDB_REQUIRED_ATTRIBUTES = { KEY_ATTRIBUTE, EXTDB_DRIVER_ATTRIBUTE, EXTDB_HOST_ATTRIBUTE, EXTDB_PORT_ATTRIBUTE, EXTDB_DATABASE_ATTRIBUTE, EXTDB_USERNAME_ATTRIBUTE, EXTDB_PASSWORD_ATTRIBUTE, EXTDB_QUERY_ATTRIBUTE };
+    private final static String[] EXTDB_OPTIONAL_ATTRIBUTES = { };
+    private final static String[] EXTDB_SUBNODES = {EXTDB_DEFAULT_SUBNODE};
+
+    private String key;
+    private String driver;
+    private String host;
+    private String port;
+    private String database;
+    private String username;
+    private String password;
+    private String query;   
+
+
+    public ExternalDbProducerNodeBuilder() {
+      super(EXTDB_SUBNODES);
+    }
+
+    public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLParserExc {
+      XMLReaderTool.checkAttributes(anAttributes, EXTDB_REQUIRED_ATTRIBUTES, EXTDB_OPTIONAL_ATTRIBUTES);
+
+      key = (String) anAttributes.get(EXTDB_KEY_ATTRIBUTE);
+      driver = (String) anAttributes.get(EXTDB_DRIVER_ATTRIBUTE);
+      host = (String) anAttributes.get(EXTDB_HOST_ATTRIBUTE);
+      port = (String) anAttributes.get(EXTDB_PORT_ATTRIBUTE);
+      database = (String) anAttributes.get(EXTDB_DATABASE_ATTRIBUTE);
+      username = (String) anAttributes.get(EXTDB_USERNAME_ATTRIBUTE);
+      password = (String) anAttributes.get(EXTDB_PASSWORD_ATTRIBUTE);
+      query = (String) anAttributes.get(EXTDB_QUERY_ATTRIBUTE);
+    };
+
+    public ProducerNode constructNode() {
+      return new ExternalDbProducerNode(key, driver, host, port, database, username, password, query,  getSubNode(EXTDB_DEFAULT_SUBNODE));
+    };
+  }
 
 ////////////////////////////////////////////////////////////////////////////////
 
-  public static class ResourceBundleProducerNodeBuilder extends AbstractProducerNodeBuilder {
+  public static class BundleProducerNodeBuilder extends AbstractProducerNodeBuilder {
     private final static String   RESOURCEBUNDLE_KEY_ATTRIBUTE = KEY_ATTRIBUTE;
     private final static String   RESOURCEBUNDLE_BUNDLE_ATTRIBUTE = "bundle";
     private final static String   RESOURCEBUNDLE_LANGUAGE_ATTRIBUTE = "language";
@@ -621,12 +672,12 @@ public class DefaultProducerNodeBuilders {
     private String bundle;
     private String language;
 
-    public ResourceBundleProducerNodeBuilder() {
+    public BundleProducerNodeBuilder() {
       super(RESOURCEBUNDLE_SUBNODES);
     }
 
     public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLParserExc {
-      mir.util.xml.XMLReaderTool.checkAttributes(anAttributes, RESOURCEBUNDLE_REQUIRED_ATTRIBUTES, RESOURCEBUNDLE_OPTIONAL_ATTRIBUTES);
+      XMLReaderTool.checkAttributes(anAttributes, RESOURCEBUNDLE_REQUIRED_ATTRIBUTES, RESOURCEBUNDLE_OPTIONAL_ATTRIBUTES);
 
       key = (String) anAttributes.get(RESOURCEBUNDLE_KEY_ATTRIBUTE);
       bundle = (String) anAttributes.get(RESOURCEBUNDLE_BUNDLE_ATTRIBUTE);
@@ -634,7 +685,7 @@ public class DefaultProducerNodeBuilders {
     };
 
     public ProducerNode constructNode() {
-      return new ResourceBundleProducerNode(key, bundle, language);
+      return new BundleProducerNode(key, bundle, language);
     };
   }
 
@@ -655,7 +706,7 @@ public class DefaultProducerNodeBuilders {
     }
 
     public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLParserExc {
-      mir.util.xml.XMLReaderTool.checkAttributes(anAttributes, FILEDATESETTING_REQUIRED_ATTRIBUTES, FILEDATESETTING_OPTIONAL_ATTRIBUTES);
+      XMLReaderTool.checkAttributes(anAttributes, FILEDATESETTING_REQUIRED_ATTRIBUTES, FILEDATESETTING_OPTIONAL_ATTRIBUTES);
 
       fileNameKey = (String) anAttributes.get(FILEDATESETTING_FILE_ATTRIBUTE);
       dateKey = (String) anAttributes.get(FILEDATESETTING_DATE_ATTRIBUTE);
@@ -681,7 +732,7 @@ public class DefaultProducerNodeBuilders {
     }
 
     public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLParserExc {
-      mir.util.xml.XMLReaderTool.checkAttributes(anAttributes, FILEDELETING_REQUIRED_ATTRIBUTES, FILEDELETING_OPTIONAL_ATTRIBUTES);
+      XMLReaderTool.checkAttributes(anAttributes, FILEDELETING_REQUIRED_ATTRIBUTES, FILEDELETING_OPTIONAL_ATTRIBUTES);
 
       fileNameKey = (String) anAttributes.get(FILEDELETING_FILE_ATTRIBUTE);
     };
@@ -693,30 +744,36 @@ public class DefaultProducerNodeBuilders {
 
 ////////////////////////////////////////////////////////////////////////////////
 
-  public static class ScriptCallingProducerNodeBuilder extends AbstractProducerNodeBuilder {
-    private final static String   SCRIPT_COMMAND_ATTRIBUTE = "command";
-    private final static String   SCRIPT_TIME_ATTRIBUTE = "time";
-    private final static String[] SCRIPT_REQUIRED_ATTRIBUTES = { SCRIPT_COMMAND_ATTRIBUTE };
-    private final static String[] SCRIPT_OPTIONAL_ATTRIBUTES = {};
-    private final static String[] SCRIPT_SUBNODES = {};
+  public static class ExecuteProgramProducerNodeBuilder extends AbstractProducerNodeBuilder {
+    private final static String   EXECUTEPROGRAM_COMMAND_ATTRIBUTE = "command";
+    private final static String   EXECUTEPROGRAM_MAXTIME_ATTRIBUTE = "maxduration";
+    private final static String   EXECUTEPROGRAM_RESULTVAR_ATTRIBUTE = "resultvar";
+    private final static String   EXECUTEPROGRAM_RETURNVALUE_ATTRIBUTE = "returnvaluevar";
+    private final static String[] EXECUTEPROGRAM_REQUIRED_ATTRIBUTES = { EXECUTEPROGRAM_COMMAND_ATTRIBUTE };
+    private final static String[] EXECUTEPROGRAM_OPTIONAL_ATTRIBUTES = { EXECUTEPROGRAM_MAXTIME_ATTRIBUTE, EXECUTEPROGRAM_RESULTVAR_ATTRIBUTE };
+    private final static String[] EXECUTEPROGRAM_SUBNODES = {};
 
     private String command;
     private String time;
+    private String resultvar;
+    private String returnValueVar;
 
-    public ScriptCallingProducerNodeBuilder() {
-      super(SCRIPT_SUBNODES);
+    public ExecuteProgramProducerNodeBuilder() {
+      super(EXECUTEPROGRAM_SUBNODES);
     }
 
     public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLParserExc {
-      mir.util.xml.XMLReaderTool.checkAttributes(anAttributes, SCRIPT_REQUIRED_ATTRIBUTES, SCRIPT_OPTIONAL_ATTRIBUTES);
+      XMLReaderTool.checkAttributes(anAttributes, EXECUTEPROGRAM_REQUIRED_ATTRIBUTES, EXECUTEPROGRAM_OPTIONAL_ATTRIBUTES);
 
-      command = (String) anAttributes.get(SCRIPT_COMMAND_ATTRIBUTE);
-      time = mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, SCRIPT_TIME_ATTRIBUTE, "0");
+      command = (String) anAttributes.get(EXECUTEPROGRAM_COMMAND_ATTRIBUTE);
+      time = XMLReaderTool.getStringAttributeWithDefault(anAttributes, EXECUTEPROGRAM_MAXTIME_ATTRIBUTE, null);
+      resultvar = XMLReaderTool.getStringAttributeWithDefault(anAttributes, EXECUTEPROGRAM_RESULTVAR_ATTRIBUTE, null);
+      returnValueVar = XMLReaderTool.getStringAttributeWithDefault(anAttributes, EXECUTEPROGRAM_RETURNVALUE_ATTRIBUTE, null);
     };
 
     public ProducerNode constructNode() {
       return new
-          ScriptCallingProducerNode(command, time);
+          ExecuteProgramProducerNode(command, time, resultvar, returnValueVar);
     };
   }
 
@@ -731,10 +788,10 @@ public class DefaultProducerNodeBuilders {
   public static class DirCopyProducerNodeBuilder extends AbstractProducerNodeBuilder {
     private String source;
     private String destination;
-    private String sourceBasePath;
-    private String destinationBasePath;
+    private File sourceBasePath;
+    private File destinationBasePath;
 
-    public DirCopyProducerNodeBuilder(String aSourceBasePath, String aDestinationBasePath) {
+    public DirCopyProducerNodeBuilder(File aSourceBasePath, File aDestinationBasePath) {
       super(DIRCOPY_SUBNODES);
 
       sourceBasePath = aSourceBasePath;
@@ -742,7 +799,7 @@ public class DefaultProducerNodeBuilders {
     }
 
     public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLParserExc {
-      mir.util.xml.XMLReaderTool.checkAttributes(anAttributes, DIRCOPY_REQUIRED_ATTRIBUTES, DIRCOPY_OPTIONAL_ATTRIBUTES);
+      XMLReaderTool.checkAttributes(anAttributes, DIRCOPY_REQUIRED_ATTRIBUTES, DIRCOPY_OPTIONAL_ATTRIBUTES);
 
       source = (String) anAttributes.get(DIRCOPY_SOURCE_ATTRIBUTE);
       destination = (String) anAttributes.get(DIRCOPY_DESTINATION_ATTRIBUTE);
@@ -753,10 +810,10 @@ public class DefaultProducerNodeBuilders {
     };
 
     public static class factory implements ProducerNodeBuilderFactory {
-      private String sourceBasePath;
-      private String destinationBasePath;
+      private File sourceBasePath;
+      private File destinationBasePath;
 
-      public factory(String aSourceBasePath, String aDestinationBasePath) {
+      public factory(File aSourceBasePath, File aDestinationBasePath) {
         sourceBasePath = aSourceBasePath;
         destinationBasePath = aDestinationBasePath;
       }
@@ -780,10 +837,10 @@ public class DefaultProducerNodeBuilders {
     private String generator;
     private String destination;
     private String parameters;
-    private Generator.GeneratorLibrary generatorLibrary;
+    private Generator.Library generatorLibrary;
     private WriterEngine writerEngine;
 
-    public GeneratingProducerNodeBuilder(Generator.GeneratorLibrary aGeneratorLibrary, WriterEngine aWriterEngine) {
+    public GeneratingProducerNodeBuilder(Generator.Library aGeneratorLibrary, WriterEngine aWriterEngine) {
       super(GENERATION_SUBNODES);
 
       writerEngine = aWriterEngine;
@@ -791,11 +848,11 @@ public class DefaultProducerNodeBuilders {
     }
 
     public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLParserExc {
-      mir.util.xml.XMLReaderTool.checkAttributes(anAttributes, GENERATION_REQUIRED_ATTRIBUTES, GENERATION_OPTIONAL_ATTRIBUTES);
+      XMLReaderTool.checkAttributes(anAttributes, GENERATION_REQUIRED_ATTRIBUTES, GENERATION_OPTIONAL_ATTRIBUTES);
 
       generator = (String) anAttributes.get(GENERATION_GENERATOR_ATTRIBUTE);
       destination = (String) anAttributes.get(GENERATION_DESTINATION_ATTRIBUTE);
-      parameters = mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, GENERATION_PARAMETERS_ATTRIBUTE, "" );
+      parameters = XMLReaderTool.getStringAttributeWithDefault(anAttributes, GENERATION_PARAMETERS_ATTRIBUTE, "" );
     };
 
     public ProducerNode constructNode() {
@@ -803,10 +860,10 @@ public class DefaultProducerNodeBuilders {
     };
 
     public static class factory implements ProducerNodeBuilderFactory {
-      private Generator.GeneratorLibrary generatorLibrary;
+      private Generator.Library generatorLibrary;
       private WriterEngine writerEngine;
 
-      public factory(Generator.GeneratorLibrary aGeneratorLibrary, WriterEngine aWriterEngine) {
+      public factory(Generator.Library aGeneratorLibrary, WriterEngine aWriterEngine) {
         writerEngine = aWriterEngine;
         generatorLibrary = aGeneratorLibrary;
       }
@@ -832,7 +889,7 @@ public class DefaultProducerNodeBuilders {
     private final static String   BATCHER_SKIP_ATTRIBUTE = SKIP_ATTRIBUTE;
 
     private final static String   BATCHER_PROCESS_ATTRIBUTE = "process";
-    private final static String   BATCHER_EXTRATABLES_ATTRIBUTE = "extratables";
+    private final static String   BATCHER_EXTRATABLES_ATTRIBUTE = EXTRA_TABLES_ATTRIBUTE;
 
     private final static String   BATCHER_BATCH_SUBNODE = "batches";
     private final static String   BATCHER_BATCHLIST_SUBNODE = "batchlist";
@@ -844,7 +901,7 @@ public class DefaultProducerNodeBuilders {
     private String batchDataKey;
     private String batchInfoKey;
     private String mainTablePrefix;
-    private List extraTables;
+    private String extraTables;
     private String definition;
     private String selection;
     private String order;
@@ -860,22 +917,24 @@ public class DefaultProducerNodeBuilders {
     }
 
     public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLParserExc {
-      mir.util.xml.XMLReaderTool.checkAttributes(anAttributes, BATCHER_REQUIRED_ATTRIBUTES, BATCHER_OPTIONAL_ATTRIBUTES);
-
-      batchDataKey = mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_DATAKEY_ATTRIBUTE, "data" );
-      batchInfoKey = mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_INFOKEY_ATTRIBUTE, "info" );
-      definition = mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_DEFINITION_ATTRIBUTE, "" );
-      selection = mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_SELECTION_ATTRIBUTE, "" );
-      order = mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_ORDER_ATTRIBUTE, "" );
-
-      batchSize = mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_BATCHSIZE_ATTRIBUTE, "20" );
-      minBatchSize = mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_MINBATCHSIZE_ATTRIBUTE, "0" );
-      skip = mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_SKIP_ATTRIBUTE, "0" );
-      process = mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_PROCESS_ATTRIBUTE, "-1" );
-      extraTables = StringRoutines.splitString(mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_EXTRATABLES_ATTRIBUTE,"").trim(), ",");
-      List parts = StringRoutines.splitString(definition.trim()," ");
-      if (parts.size()>0) definition=(String)parts.get(0);
-      if (parts.size()>1) mainTablePrefix=(String)parts.get(1);
+      XMLReaderTool.checkAttributes(anAttributes, BATCHER_REQUIRED_ATTRIBUTES, BATCHER_OPTIONAL_ATTRIBUTES);
+
+      batchDataKey = XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_DATAKEY_ATTRIBUTE, "data" );
+      batchInfoKey = XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_INFOKEY_ATTRIBUTE, "info" );
+      definition = XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_DEFINITION_ATTRIBUTE, "" );
+      selection = XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_SELECTION_ATTRIBUTE, "" );
+      order = XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_ORDER_ATTRIBUTE, "" );
+
+      batchSize = XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_BATCHSIZE_ATTRIBUTE, "20" );
+      minBatchSize = XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_MINBATCHSIZE_ATTRIBUTE, "0" );
+      skip = XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_SKIP_ATTRIBUTE, "0" );
+      process = XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_PROCESS_ATTRIBUTE, "-1" );
+
+      extraTables = XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_EXTRATABLES_ATTRIBUTE, "");
+
+      List parts = StringRoutines.splitString(definition.trim(), " ");
+      if (parts.size()>0) definition = (String) parts.get(0);
+      if (parts.size()>1) mainTablePrefix = (String) parts.get(1);
     };
 
     public ProducerNode constructNode() {
@@ -928,7 +987,7 @@ public class DefaultProducerNodeBuilders {
     }
 
     public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLParserExc {
-      mir.util.xml.XMLReaderTool.checkAttributes(anAttributes, IF_REQUIRED_ATTRIBUTES, IF_OPTIONAL_ATTRIBUTES);
+      XMLReaderTool.checkAttributes(anAttributes, IF_REQUIRED_ATTRIBUTES, IF_OPTIONAL_ATTRIBUTES);
 
       condition = (String) anAttributes.get( IF_CONDITION_ATTRIBUTE );
     };
@@ -948,30 +1007,33 @@ public class DefaultProducerNodeBuilders {
   public static class RSSProducerNodeBuilder extends AbstractProducerNodeBuilder {
     private final static String   RSS_KEY_ATTRIBUTE = KEY_ATTRIBUTE;
     private final static String   RSS_URL_ATTRIBUTE = URL_ATTRIBUTE;
+    private final static String   RSS_ENCODING_ATTRIBUTE = "encoding";
     private final static String   RSS_VERSION_ATTRIBUTE = "version";
 
     private final static String[] RSS_REQUIRED_ATTRIBUTES = { RSS_KEY_ATTRIBUTE, RSS_URL_ATTRIBUTE };
-    private final static String[] RSS_OPTIONAL_ATTRIBUTES = { RSS_VERSION_ATTRIBUTE };
+    private final static String[] RSS_OPTIONAL_ATTRIBUTES = { RSS_VERSION_ATTRIBUTE, RSS_ENCODING_ATTRIBUTE };
     private final static String[] RSS_SUBNODES = {  };
 
     private String key;
     private String url;
     private String version;
+    private String encoding;
 
     public RSSProducerNodeBuilder() {
       super(RSS_SUBNODES);
     }
 
     public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLParserExc {
-      mir.util.xml.XMLReaderTool.checkAttributes(anAttributes, RSS_REQUIRED_ATTRIBUTES, RSS_OPTIONAL_ATTRIBUTES);
+      XMLReaderTool.checkAttributes(anAttributes, RSS_REQUIRED_ATTRIBUTES, RSS_OPTIONAL_ATTRIBUTES);
 
       key = (String) anAttributes.get( RSS_KEY_ATTRIBUTE );
       url = (String) anAttributes.get( RSS_URL_ATTRIBUTE );
-      version = mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, RSS_VERSION_ATTRIBUTE, "1.0");
+      version = XMLReaderTool.getStringAttributeWithDefault(anAttributes, RSS_VERSION_ATTRIBUTE, "1.0");
+      encoding = XMLReaderTool.getStringAttributeWithDefault(anAttributes, RSS_ENCODING_ATTRIBUTE, null);
     };
 
     public ProducerNode constructNode() {
-      return new RSSProducerNode(key, url, version);
+      return new RSSProducerNode(key, url, version, encoding);
     };
   }
 
@@ -997,12 +1059,12 @@ public class DefaultProducerNodeBuilders {
     }
 
     public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLParserExc {
-      mir.util.xml.XMLReaderTool.checkAttributes(anAttributes, RDF_AGGREGATOR_REQUIRED_ATTRIBUTES, RDF_AGGREGATOR_OPTIONAL_ATTRIBUTES);
+      XMLReaderTool.checkAttributes(anAttributes, RDF_AGGREGATOR_REQUIRED_ATTRIBUTES, RDF_AGGREGATOR_OPTIONAL_ATTRIBUTES);
 
       key = (String) anAttributes.get( RDF_AGGREGATOR_KEY_ATTRIBUTE );
       source = (String) anAttributes.get( RDF_AGGREGATOR_SOURCE_ATTRIBUTE );
-      order = mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, RDF_AGGREGATOR_SOURCE_ATTRIBUTE, "");
-      filter = mir.util.xml.XMLReaderTool.getStringAttributeWithDefault(anAttributes, RDF_AGGREGATOR_FILTER_ATTRIBUTE, "");
+      order = XMLReaderTool.getStringAttributeWithDefault(anAttributes, RDF_AGGREGATOR_SOURCE_ATTRIBUTE, "");
+      filter = XMLReaderTool.getStringAttributeWithDefault(anAttributes, RDF_AGGREGATOR_FILTER_ATTRIBUTE, "");
     };
 
     public ProducerNode constructNode() {
@@ -1067,7 +1129,7 @@ public class DefaultProducerNodeBuilders {
     };
 
     public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLParserExc {
-      mir.util.xml.XMLReaderTool.checkAttributeSet(anAttributes.keySet(), definition.getRequiredAttributes(), definition.getOptionalAttributes());
+      XMLReaderTool.checkAttributeSet(anAttributes.keySet(), definition.getRequiredAttributes(), definition.getOptionalAttributes());
 
       Iterator i = anAttributes.entrySet().iterator();
       while (i.hasNext()) {