fixed some bugs
authorzapata <zapata>
Mon, 19 Aug 2002 18:29:13 +0000 (18:29 +0000)
committerzapata <zapata>
Mon, 19 Aug 2002 18:29:13 +0000 (18:29 +0000)
source/mir/producer/EntityEnumeratingProducerNode.java
source/mir/producer/EntityListProducerNode.java
source/mir/producer/reader/DefaultProducerNodeBuilders.java
source/mir/util/ParameterExpander.java
source/mircoders/localizer/basic/MirBasicProducerAssistantLocalizer.java

index cbf5383..1d352ef 100755 (executable)
@@ -13,12 +13,13 @@ public class EntityEnumeratingProducerNode extends ProducerNodeDecorator {
   private String key;
   private EntityAdapterModel model;
   private String definition;
+  private String skip;
+  private String limit;
 
   public EntityEnumeratingProducerNode(
                 String aKey,
                 EntityAdapterModel aModel, String aDefinition,
                 ProducerNode aSubNode) {
-
     super(aSubNode);
 
     defaultVerb = null;
@@ -33,8 +34,19 @@ public class EntityEnumeratingProducerNode extends ProducerNodeDecorator {
               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);
 
+    limit= aLimit;
+    skip = aSkip;
     defaultVerb = new EntityEnumeratingProducerNodeVerb(aDefaultWhereClause, aDefaultOrderByClause);
   }
 
@@ -54,7 +66,9 @@ public class EntityEnumeratingProducerNode extends ProducerNodeDecorator {
           ParameterExpander.expandExpression( aValueMap, verb.orderByClause ),
           100,
           model,
-          definition );
+          definition,
+          ParameterExpander.evaluateIntegerExpressionWithDefault( aValueMap, limit, -1),
+          ParameterExpander.evaluateIntegerExpressionWithDefault( aValueMap, skip, 0));
 
       while (browser.hasNext()) {
         ParameterExpander.setValueForKey( aValueMap, key, browser.next());
index 28f00b5..e036230 100755 (executable)
@@ -14,13 +14,13 @@ public class EntityListProducerNode extends ProducerNodeDecorator {
   private int batchSize;
   private EntityAdapterModel model;
   private String definition;
-  private int limit;
-  private int skip;
+  private String limitExpression;
+  private String skipExpression;
 
   public EntityListProducerNode(String aKey,
       EntityAdapterModel aModel, String aDefinition,
       String aWhereClause, String anOrderByClause,
-      int aLimit, int aSkip, ProducerNode aSubNode) {
+      String aLimitExpression, String aSkipExpression, ProducerNode aSubNode) {
     super(aSubNode);
 
     model = aModel;
@@ -28,12 +28,26 @@ public class EntityListProducerNode extends ProducerNodeDecorator {
     key = aKey;
     whereClause = aWhereClause;
     orderByClause = anOrderByClause;
-    limit = aLimit;
-    skip = aSkip;
+    limitExpression = aLimitExpression;
+    skipExpression = aSkipExpression;
+  }
+
+  public EntityListProducerNode(String aKey,
+      EntityAdapterModel aModel, String aDefinition,
+      String aWhereClause, String anOrderByClause,
+      int aLimit, int aSkip, ProducerNode aSubNode) {
+    this(aKey,  aModel, aDefinition, aWhereClause, anOrderByClause,
+         Integer.toString(aLimit), Integer.toString(aSkip), aSubNode);
   }
 
   public void produce(Map aValueMap, String aVerb, PrintWriter aLogger) throws ProducerFailure {
     try {
+      int limit = ParameterExpander.evaluateIntegerExpressionWithDefault(aValueMap, limitExpression, -1);
+      int skip = ParameterExpander.evaluateIntegerExpressionWithDefault(aValueMap, skipExpression, 0);
+
+      if (skipExpression != null && !skipExpression.trim().equals(""))
+        skip = ParameterExpander.evaluateIntegerExpression(aValueMap, skipExpression);
+
       ParameterExpander.setValueForKey(
         aValueMap,
         key,
index 3366afd..aa145cc 100755 (executable)
@@ -91,7 +91,7 @@ public class DefaultProducerNodeBuilders {
     };
 
     public ProducerNode constructNode() {
-      return new EvaluatedAssignmentProducerNode(key, value);
+      return new ExpandedAssignmentProducerNode(key, value);
     };
   }
 
@@ -126,20 +126,23 @@ public class DefaultProducerNodeBuilders {
 ////////////////////////////////////////////////////////////////////////////////
 
   public static class EnumeratingProducerNodeBuilder extends AbstractProducerNodeBuilder {
-    // ML: add limit, skip!
     private final static String   ENUMERATION_KEY_ATTRIBUTE = KEY_ATTRIBUTE;
     private final static String   ENUMERATION_DEFINITION_ATTRIBUTE = DEFINITION_ATTRIBUTE;
     private final static String   ENUMERATION_SELECTION_ATTRIBUTE = SELECTION_ATTRIBUTE;
     private final static String   ENUMERATION_ORDER_ATTRIBUTE = ORDER_ATTRIBUTE;
     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_REQUIRED_ATTRIBUTES = { ENUMERATION_KEY_ATTRIBUTE, ENUMERATION_DEFINITION_ATTRIBUTE };
-    private final static String[] ENUMERATION_OPTIONAL_ATTRIBUTES = { ENUMERATION_SELECTION_ATTRIBUTE, ENUMERATION_ORDER_ATTRIBUTE};
+    private final static String[] ENUMERATION_OPTIONAL_ATTRIBUTES = { ENUMERATION_SELECTION_ATTRIBUTE, ENUMERATION_ORDER_ATTRIBUTE, ENUMERATION_LIMIT_ATTRIBUTE, ENUMERATION_SKIP_ATTRIBUTE};
     private final static String[] ENUMERATION_SUBNODES = {ENUMERATION_DEFAULT_SUBNODE};
 
     private String key;
     private String definition;
     private String selection;
     private String order;
+    private String limit;
+    private String skip;
     private EntityAdapterModel model;
 
     public EnumeratingProducerNodeBuilder(EntityAdapterModel aModel) {
@@ -155,10 +158,12 @@ public class DefaultProducerNodeBuilders {
       definition = (String) anAttributes.get(ENUMERATION_DEFINITION_ATTRIBUTE);
       selection = (String) anAttributes.get(ENUMERATION_SELECTION_ATTRIBUTE);
       order = (String) anAttributes.get(ENUMERATION_ORDER_ATTRIBUTE);
+      limit = (String) anAttributes.get(ENUMERATION_LIMIT_ATTRIBUTE);
+      skip = (String) anAttributes.get(ENUMERATION_SKIP_ATTRIBUTE);
     };
 
     public ProducerNode constructNode() {
-      return new EntityEnumeratingProducerNode(key, model, definition, selection, order, getSubNode(ENUMERATION_DEFAULT_SUBNODE ));
+      return new EntityEnumeratingProducerNode(key, model, definition, selection, order, limit, skip, getSubNode(ENUMERATION_DEFAULT_SUBNODE ));
     };
 
     public static class factory implements ProducerNodeBuilderFactory {
@@ -192,8 +197,8 @@ public class DefaultProducerNodeBuilders {
     private String definition;
     private String selection;
     private String order;
-    private int limit;
-    private int skip;
+    private String limit;
+    private String skip;
     private EntityAdapterModel model;
 
     public ListProducerNodeBuilder(EntityAdapterModel aModel) {
@@ -203,36 +208,14 @@ public class DefaultProducerNodeBuilders {
     }
 
     public void setAttributes(Map anAttributes) throws ProducerConfigExc {
-      String limitString;
-      String skipString;
-
       ReaderTool.checkAttributes(anAttributes, LIST_REQUIRED_ATTRIBUTES, LIST_OPTIONAL_ATTRIBUTES);
 
       key = (String) anAttributes.get(LIST_KEY_ATTRIBUTE);
       definition = (String) anAttributes.get(LIST_DEFINITION_ATTRIBUTE);
       selection = (String) anAttributes.get(LIST_SELECTION_ATTRIBUTE);
       order = (String) anAttributes.get(LIST_ORDER_ATTRIBUTE);
-      skip = 0;
-      limit = -1;
-
-      limitString = (String) anAttributes.get(LIST_LIMIT_ATTRIBUTE);
-      if (limitString!=null) {
-        try {
-          limit = Integer.parseInt(limitString);
-        }
-        catch (Throwable t) {
-          throw new ProducerConfigExc("invalid value for list parameter: " + limitString);
-        }
-      }
-      skipString = (String) anAttributes.get(LIST_SKIP_ATTRIBUTE);
-      if (skipString!=null) {
-        try {
-          skip = Integer.parseInt(skipString);
-        }
-        catch (Throwable t) {
-          throw new ProducerConfigExc("invalid value for skip parameter: " + skipString);
-        }
-      }
+      limit = (String) anAttributes.get(LIST_LIMIT_ATTRIBUTE);
+      skip = (String) anAttributes.get(LIST_SKIP_ATTRIBUTE);
     };
 
     public ProducerNode constructNode() {
@@ -457,6 +440,8 @@ public class DefaultProducerNodeBuilders {
     private final static String[] BATCHER_OPTIONAL_ATTRIBUTES = { BATCHER_SELECTION_ATTRIBUTE, BATCHER_ORDER_ATTRIBUTE, BATCHER_MINBATCHSIZE_ATTRIBUTE, BATCHER_SKIP_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;
index acebf0c..a695cb3 100755 (executable)
@@ -7,6 +7,7 @@ import java.util.*;
 
 public class ParameterExpander {
   final static String NODE_SEPARATOR = ".";
+  final static char STRING_ESCAPE_CHARACTER = '\\';
 
   public static List splitString(String aString, String aSeparator) {
     List result= new Vector();
@@ -96,7 +97,7 @@ public class ParameterExpander {
   public static String expandExpression(Map aMap, String anExpression) throws Exception {
     int previousPosition = 0;
     int position;
-    int endOfNamePosition;
+    int endOfExpressionPosition;
     StringBuffer result = new StringBuffer();
 
     while ((position=anExpression.indexOf("$", previousPosition))>=0) {
@@ -109,10 +110,28 @@ public class ParameterExpander {
       else
       {
         if (anExpression.charAt(position+1) == '{') {
-          endOfNamePosition=anExpression.indexOf('}', position);
-          if (endOfNamePosition>=0) {
-            result.append(findStringForKey(aMap, anExpression.substring(position+2, endOfNamePosition)));
-            previousPosition=endOfNamePosition+1;
+          endOfExpressionPosition=position+2;
+          while (endOfExpressionPosition<anExpression.length() && anExpression.charAt(endOfExpressionPosition) != '}') {
+            if (anExpression.charAt(endOfExpressionPosition)=='\'' || anExpression.charAt(endOfExpressionPosition)=='"') {
+              char boundary = anExpression.charAt(endOfExpressionPosition);
+
+              endOfExpressionPosition++;
+              while (endOfExpressionPosition<anExpression.length() && anExpression.charAt(endOfExpressionPosition) != boundary) {
+                if (anExpression.charAt(endOfExpressionPosition) == STRING_ESCAPE_CHARACTER)
+                  endOfExpressionPosition++;
+                endOfExpressionPosition++;
+              }
+              if (endOfExpressionPosition<anExpression.length()) {
+                throw new ParameterExpanderExc("Unterminated string in {1}",new Object[]{anExpression});
+              }
+            }
+            endOfExpressionPosition++;
+          }
+          if (endOfExpressionPosition<anExpression.length()) {
+            result.append(evaluateStringExpression(aMap, anExpression.substring(position+2, endOfExpressionPosition)));
+//            findStringForKey(aMap, anExpression.substring(position+2, endOfExpressionPosition))
+//            );
+            previousPosition=endOfExpressionPosition+1;
           }
           else {
             throw new ParameterExpanderExc("Missing } in {1}",new Object[]{anExpression});
@@ -136,6 +155,25 @@ public class ParameterExpander {
     return parser.parseBoolean();
   }
 
+  public static String evaluateStringExpression(Map aMap, String anExpression) throws Exception {
+    Parser parser = new Parser(anExpression, aMap);
+
+    return parser.parseString();
+  }
+
+  public static int evaluateIntegerExpressionWithDefault(Map aMap, String anExpression, int aDefault) throws Exception {
+    if (anExpression == null || anExpression.trim().equals(""))
+      return aDefault;
+    else
+      return evaluateIntegerExpression(aMap, anExpression);
+  }
+
+  public static int evaluateIntegerExpression(Map aMap, String anExpression) throws Exception {
+    Parser parser = new Parser(anExpression, aMap);
+
+    return parser.parseInteger();
+  }
+
   public static Object evaluateExpression(Map aMap, String anExpression) throws Exception {
     Parser parser = new Parser(anExpression, aMap);
 
@@ -243,7 +281,14 @@ public class ParameterExpander {
       delimiter = reader.getNext();
 
       while (reader.hasNext() && !reader.peek().equals(delimiter)) {
-        result.append(reader.getNext());
+        if (reader.peek().charValue()==STRING_ESCAPE_CHARACTER) {
+          reader.getNext();
+          if (reader.hasNext())
+            result.append(reader.getNext());
+        }
+        else {
+          result.append(reader.getNext());
+        }
       }
 
       if (!reader.hasNext())
@@ -267,7 +312,7 @@ public class ParameterExpander {
       }
 
       try {
-        return new LiteralToken(Integer.getInteger(result.toString()));
+        return new LiteralToken(new Integer(Integer.parseInt(result.toString())));
       }
       catch (NumberFormatException e) {
         throw new RuntimeException("Invalid number: " + e.getMessage());
@@ -450,6 +495,16 @@ public class ParameterExpander {
       }
     }
 
+    public int parseInteger() {
+      try {
+        return interpretAsInteger(parseWhole());
+      }
+      catch (Throwable t) {
+        t.printStackTrace(System.out);
+        throw new RuntimeException("Parser error at position "+getLocation()+":"+t.getMessage());
+      }
+    }
+
     public String parseString() {
       try {
         return interpretAsString(parseWhole());
@@ -683,9 +738,19 @@ public class ParameterExpander {
     }
 
     private int interpretAsInteger(Object aValue) {
+      System.out.println("  interpret: " + aValue );
+
       if (aValue instanceof Integer)
         return ((Integer) aValue).intValue();
 
+      if (aValue instanceof String) {
+        try {
+          return Integer.parseInt((String) aValue);
+        }
+        catch (Throwable t) {
+        }
+      }
+
       throw new RuntimeException("Not an integer");
     }
 
index 2923ed0..344a812 100755 (executable)
@@ -33,6 +33,7 @@ public class MirBasicProducerAssistantLocalizer implements MirProducerAssistantL
     configMap.put("imagePath", MirGlobal.getConfigProperty("Producer.Image.Path"));
     configMap.put("mirVersion", MirGlobal.getConfigProperty("Mir.Version"));
     configMap.put("defEncoding", MirGlobal.getConfigProperty("Mir.DefaultEncoding"));
+    configMap.put("all", Configuration.getConfs());
 
     utilityMap.put("compressWhitespace", new freemarker.template.utility.CompressWhitespace() );
     utilityMap.put("encodeHTML", new GeneratorHTMLFunctions.encodeHTMLGeneratorFunction());
@@ -47,13 +48,13 @@ public class MirBasicProducerAssistantLocalizer implements MirProducerAssistantL
     EntityList languageList=null;
 
     try {
-      ModuleLinksImcs linksImcsModule = new ModuleLinksImcs(DatabaseLinksImcs.getInstance());
+//      ModuleLinksImcs linksImcsModule = new ModuleLinksImcs(DatabaseLinksImcs.getInstance());
       ModuleTopics topicsModule = new ModuleTopics(DatabaseTopics.getInstance());
       ModuleLanguage languageModule = new ModuleLanguage(DatabaseLanguage.getInstance());
 
       topicList = topicsModule.getTopicsList();
-      entityList = linksImcsModule.getByWhereClause("", "sortpriority, title", -1);
-      parentList = linksImcsModule.getByWhereClause("to_parent_id=NULL", "sortpriority, title", -1);
+//      entityList = linksImcsModule.getByWhereClause("", "sortpriority, title", -1);
+//      parentList = linksImcsModule.getByWhereClause("to_parent_id=NULL", "sortpriority, title", -1);
       languageList = languageModule.getByWhereClause("", "id", -1);
     }
     catch (Throwable t) {