testing extension xml parser for producer.xml
[mir.git] / source / mir / producer / reader / DefaultProducerNodeBuilders.java
index a7005c6..f7fe8a3 100755 (executable)
@@ -33,6 +33,7 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -43,19 +44,25 @@ import mir.log.LoggerWrapper;
 import mir.producer.ConditionalProducerNode;
 import mir.producer.DirCopyingProducerNode;
 import mir.producer.EntityBatchingProducerNode;
+import mir.producer.EntityDeletingProducerNode;
 import mir.producer.EntityEnumeratingProducerNode;
 import mir.producer.EntityListProducerNode;
+import mir.producer.EntityModifyingProducerNode;
 import mir.producer.EvaluatedAssignmentProducerNode;
-import mir.producer.*;
+import mir.producer.ExpandedAssignmentProducerNode;
 import mir.producer.FileDateSettingProducerNode;
 import mir.producer.FileDeletingProducerNode;
+import mir.producer.FreeQueryProducerNode;
 import mir.producer.GeneratingProducerNode;
+import mir.producer.ListEnumeratingProducerNode;
 import mir.producer.LoggingProducerNode;
 import mir.producer.LoopProducerNode;
 import mir.producer.ProducerNode;
-import mir.producer.*;
+import mir.producer.RDFAggregatorProducerNode;
+import mir.producer.RSSProducerNode;
 import mir.producer.ResourceBundleProducerNode;
 import mir.producer.ScriptCallingProducerNode;
+import mir.util.StringRoutines;
 import mir.util.XMLReader;
 import mir.util.XMLReaderTool;
 
@@ -88,6 +95,7 @@ public class DefaultProducerNodeBuilders {
 
     aBuilderLibrary.registerFactory("UpdateEntity", new UpdateEntityProducerNodeBuilder.factory(aModel));
     aBuilderLibrary.registerFactory("CreateEntity", new CreateEntityProducerNodeBuilder.factory(aModel));
+    aBuilderLibrary.registerFactory("DeleteEntity", new DeleteEntityProducerNodeBuilder.factory(aModel));
 
     aBuilderLibrary.registerFactory("Generate",
         new GeneratingProducerNodeBuilder.factory(aGeneratorLibrary, aWriterEngine));
@@ -193,14 +201,17 @@ 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_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 };
-    private final static String[] ENUMERATION_QUERY_OPTIONAL_ATTRIBUTES = { ENUMERATION_SELECTION_ATTRIBUTE, ENUMERATION_ORDER_ATTRIBUTE, ENUMERATION_LIMIT_ATTRIBUTE, ENUMERATION_SKIP_ATTRIBUTE};
+    private final static String[] ENUMERATION_QUERY_OPTIONAL_ATTRIBUTES = { ENUMERATION_SELECTION_ATTRIBUTE, ENUMERATION_ORDER_ATTRIBUTE, ENUMERATION_LIMIT_ATTRIBUTE, ENUMERATION_SKIP_ATTRIBUTE,ENUMERATION_EXTRATABLES_ATTRIBUTE};
     private final static String[] ENUMERATION_SUBNODES = {ENUMERATION_DEFAULT_SUBNODE};
 
     private String key;
     private String definition;
+    private String mainTablePrefix;
+    private List   extraTables;
     private String list;
     private String selection;
     private String order;
@@ -233,11 +244,15 @@ public class DefaultProducerNodeBuilders {
       order = (String) XMLReaderTool.getStringAttributeWithDefault(anAttributes, ENUMERATION_ORDER_ATTRIBUTE, "");
       limit = (String) anAttributes.get(ENUMERATION_LIMIT_ATTRIBUTE);
       skip = (String) anAttributes.get(ENUMERATION_SKIP_ATTRIBUTE);
+      extraTables = StringRoutines.splitString(XMLReaderTool.getStringAttributeWithDefault(anAttributes, ENUMERATION_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);
     };
 
     public ProducerNode constructNode() {
       if (definition!=null)
-        return new EntityEnumeratingProducerNode(key, model, definition, selection, order, limit, skip, getSubNode(ENUMERATION_DEFAULT_SUBNODE ));
+        return new EntityEnumeratingProducerNode(key, model, mainTablePrefix, extraTables, definition, selection, order, limit, skip, getSubNode(ENUMERATION_DEFAULT_SUBNODE ));
       else
         return new ListEnumeratingProducerNode(key, list, getSubNode(ENUMERATION_DEFAULT_SUBNODE ));
     };
@@ -326,12 +341,12 @@ public class DefaultProducerNodeBuilders {
 
     public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLReader.XMLReaderExc  {
       key = (String) anAttributes.get(CREATEENTITY_KEY_ATTRIBUTE);
+      definition = (String) anAttributes.get(CREATEENTITY_DEFINITION_ATTRIBUTE);
 
       if (key == null)
         throw new XMLReader.XMLReaderExc("missing required attribute '" + CREATEENTITY_KEY_ATTRIBUTE + "'" );
       if (definition == null)
         throw new XMLReader.XMLReaderExc("missing required attribute '" + CREATEENTITY_DEFINITION_ATTRIBUTE + "'" );
-      definition = (String) anAttributes.get(CREATEENTITY_DEFINITION_ATTRIBUTE);
 
       fieldValues.putAll(anAttributes);
       fieldValues.remove(CREATEENTITY_KEY_ATTRIBUTE);
@@ -390,16 +405,19 @@ 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_ORDER_ATTRIBUTE = ORDER_ATTRIBUTE;
     private final static String   LIST_DEFAULT_SUBNODE = "default";
     private final static String   LIST_LIMIT_ATTRIBUTE = LIMIT_ATTRIBUTE;
     private final static String   LIST_SKIP_ATTRIBUTE = SKIP_ATTRIBUTE;
     private final static String[] LIST_REQUIRED_ATTRIBUTES = { LIST_KEY_ATTRIBUTE, LIST_DEFINITION_ATTRIBUTE };
-    private final static String[] LIST_OPTIONAL_ATTRIBUTES = { LIST_SELECTION_ATTRIBUTE, LIST_ORDER_ATTRIBUTE, LIST_SKIP_ATTRIBUTE, LIST_LIMIT_ATTRIBUTE};
+    private final static String[] LIST_OPTIONAL_ATTRIBUTES = { LIST_SELECTION_ATTRIBUTE, LIST_ORDER_ATTRIBUTE, LIST_SKIP_ATTRIBUTE, LIST_LIMIT_ATTRIBUTE,LIST_EXTRATABLES_ATTRIBUTE};
     private final static String[] LIST_SUBNODES = {};
 
     private String key;
     private String definition;
+    private String mainTablePrefix;
+    private List   extraTables;
     private String selection;
     private String order;
     private String limit;
@@ -421,10 +439,15 @@ public class DefaultProducerNodeBuilders {
       order = (String) XMLReaderTool.getStringAttributeWithDefault(anAttributes, LIST_ORDER_ATTRIBUTE, "");
       limit = (String) anAttributes.get(LIST_LIMIT_ATTRIBUTE);
       skip = (String) anAttributes.get(LIST_SKIP_ATTRIBUTE);
+      extraTables = StringRoutines.splitString(XMLReaderTool.getStringAttributeWithDefault(anAttributes, LIST_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);
+               
     };
 
     public ProducerNode constructNode() {
-      return new EntityListProducerNode(key, model, definition, selection, order, limit, skip, null );
+      return new EntityListProducerNode(key, model, mainTablePrefix, extraTables, definition, selection, order, limit, skip, null );
     };
 
     public static class factory implements ProducerNodeBuilderFactory {
@@ -442,6 +465,50 @@ public class DefaultProducerNodeBuilders {
 
 ////////////////////////////////////////////////////////////////////////////////
 
+  public static class DeleteEntityProducerNodeBuilder extends AbstractProducerNodeBuilder {
+    private final static String   DELETEENTITY_DEFINITION_ATTRIBUTE = DEFINITION_ATTRIBUTE;
+    private final static String   DELETEENTITY_SELECTION_ATTRIBUTE = SELECTION_ATTRIBUTE;
+    private final static String[] DELETEENTITY_REQUIRED_ATTRIBUTES = { DELETEENTITY_SELECTION_ATTRIBUTE, DELETEENTITY_DEFINITION_ATTRIBUTE };
+    private final static String[] DELETEENTITY_OPTIONAL_ATTRIBUTES = { };
+    private final static String[] DELETEENTITY_SUBNODES = {};
+
+    private String definition;
+    private String selection;
+
+    private EntityAdapterModel model;
+
+    public DeleteEntityProducerNodeBuilder(EntityAdapterModel aModel) {
+      super(DELETEENTITY_SUBNODES);
+
+      model = aModel;
+    }
+
+    public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLReader.XMLReaderExc {
+      XMLReaderTool.checkAttributes(anAttributes, DELETEENTITY_REQUIRED_ATTRIBUTES, DELETEENTITY_OPTIONAL_ATTRIBUTES);
+
+      definition = (String) anAttributes.get(DELETEENTITY_DEFINITION_ATTRIBUTE);
+      selection = (String) XMLReaderTool.getStringAttributeWithDefault(anAttributes, DELETEENTITY_SELECTION_ATTRIBUTE, "");
+    };
+
+    public ProducerNode constructNode() {
+      return new EntityDeletingProducerNode(model, definition, selection);
+    };
+
+    public static class factory implements ProducerNodeBuilderFactory {
+      private EntityAdapterModel model;
+
+      public factory(EntityAdapterModel aModel) {
+        model = aModel;
+      }
+
+      public ProducerNodeBuilder makeBuilder() {
+        return new DeleteEntityProducerNodeBuilder(model);
+      }
+    }
+  }
+
+////////////////////////////////////////////////////////////////////////////////
+
   public static class LoggingProducerNodeBuilder extends AbstractProducerNodeBuilder {
     private final static String   LOG_MESSAGE_ATTRIBUTE = "message";
     private final static String   LOG_TYPE_ATTRIBUTE = "type";
@@ -525,6 +592,8 @@ public class DefaultProducerNodeBuilders {
           type = FreeQueryProducerNode.QUERY_TYPE_ROW;
         else if (typeString.toLowerCase().equals("value"))
           type = FreeQueryProducerNode.QUERY_TYPE_VALUE;
+        else if (typeString.toLowerCase().equals("update"))
+          type = FreeQueryProducerNode.QUERY_TYPE_UPDATE;
         else
           throw new ProducerConfigExc("unknown query type: " + typeString + " (allowed are set, row and value)");
       }
@@ -759,18 +828,19 @@ 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_BATCH_SUBNODE = "batches";
     private final static String   BATCHER_BATCHLIST_SUBNODE = "batchlist";
     private final static String[] BATCHER_REQUIRED_ATTRIBUTES = { BATCHER_DATAKEY_ATTRIBUTE, BATCHER_INFOKEY_ATTRIBUTE, BATCHER_DEFINITION_ATTRIBUTE, BATCHER_BATCHSIZE_ATTRIBUTE };
-    private final static String[] BATCHER_OPTIONAL_ATTRIBUTES = { BATCHER_SELECTION_ATTRIBUTE, BATCHER_ORDER_ATTRIBUTE, BATCHER_MINBATCHSIZE_ATTRIBUTE, BATCHER_SKIP_ATTRIBUTE, BATCHER_PROCESS_ATTRIBUTE };
+    private final static String[] BATCHER_OPTIONAL_ATTRIBUTES = { BATCHER_SELECTION_ATTRIBUTE, BATCHER_ORDER_ATTRIBUTE, BATCHER_MINBATCHSIZE_ATTRIBUTE, BATCHER_SKIP_ATTRIBUTE, BATCHER_PROCESS_ATTRIBUTE, BATCHER_EXTRATABLES_ATTRIBUTE };
     private final static String[] BATCHER_SUBNODES = { BATCHER_BATCH_SUBNODE, BATCHER_BATCHLIST_SUBNODE };
 
-    // ML: batchSize, minBatchSize, skip should be expressions!
-
     private EntityAdapterModel model;
     private String batchDataKey;
     private String batchInfoKey;
+    private String mainTablePrefix;
+    private List extraTables;
     private String definition;
     private String selection;
     private String order;
@@ -797,7 +867,11 @@ public class DefaultProducerNodeBuilders {
       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" );
+      process = XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_PROCESS_ATTRIBUTE, "-1" );    
+      extraTables = StringRoutines.splitString(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);
     };
 
     public ProducerNode constructNode() {
@@ -805,6 +879,8 @@ public class DefaultProducerNodeBuilders {
           batchDataKey,
           batchInfoKey,
           model,
+          mainTablePrefix,
+          extraTables,
           definition,
           selection,
           order,
@@ -868,13 +944,15 @@ 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_VERSION_ATTRIBUTE = "version";
 
     private final static String[] RSS_REQUIRED_ATTRIBUTES = { RSS_KEY_ATTRIBUTE, RSS_URL_ATTRIBUTE };
-    private final static String[] RSS_OPTIONAL_ATTRIBUTES = {  };
+    private final static String[] RSS_OPTIONAL_ATTRIBUTES = { RSS_VERSION_ATTRIBUTE };
     private final static String[] RSS_SUBNODES = {  };
 
     private String key;
     private String url;
+    private String version;
 
     public RSSProducerNodeBuilder() {
       super(RSS_SUBNODES);
@@ -885,10 +963,11 @@ public class DefaultProducerNodeBuilders {
 
       key = (String) anAttributes.get( RSS_KEY_ATTRIBUTE );
       url = (String) anAttributes.get( RSS_URL_ATTRIBUTE );
+      version = XMLReaderTool.getStringAttributeWithDefault(anAttributes, RSS_VERSION_ATTRIBUTE, "1.0");
     };
 
     public ProducerNode constructNode() {
-      return new RSSProducerNode(key, url);
+      return new RSSProducerNode(key, url, version);
     };
   }