- general maintenance
authorzapata <zapata>
Sat, 5 Oct 2002 01:45:15 +0000 (01:45 +0000)
committerzapata <zapata>
Sat, 5 Oct 2002 01:45:15 +0000 (01:45 +0000)
- added a Loop ProducerNode for loop constructions
- added a routine to work with sublists in producers

17 files changed:
source/config.properties-dist
source/mir/producer/EvaluatedAssignmentProducerNode.java
source/mir/producer/ExpandedAssignmentProducerNode.java
source/mir/producer/LoopProducerNode.java [new file with mode: 0755]
source/mir/producer/reader/DefaultProducerNodeBuilders.java
source/mir/producer/reader/ProducerConfigReader.java
source/mir/producer/reader/ScriptedProducerNode.java
source/mir/producer/reader/ScriptedProducerNodeDefinition.java
source/mir/producer/reader/ScriptedProducerNodeTool.java
source/mir/util/GeneratorListFunctions.java [new file with mode: 0755]
source/mir/util/GeneratorStringFunctions.java
source/mir/util/ParameterExpander.java
source/mir/util/SimpleParser.java
source/mir/util/StringRoutines.java
source/mir/util/SubsetIterator.java [new file with mode: 0755]
source/mircoders/localizer/basic/MirBasicProducerAssistantLocalizer.java
source/mircoders/localizer/basic/MirBasicProducerLocalizer.java

index 8f6bdae..e69e653 100755 (executable)
@@ -355,3 +355,17 @@ ServletModule.Language.Logfile=log/mir.log
 ServletModule.Language.ConfirmTemplate=admin/confirm.template
 ServletModule.Language.ObjektTemplate=admin/language.template
 ServletModule.Language.ListTemplate=admin/languagelist.template
+
+#
+# producer-related configs below
+#
+
+Producer.ExtLinkName=extlink.gif
+Producer.IntLinkName=intlink.gif
+Producer.MailLinkName=maillink.gif
+Producer.Logfile=log/producer.log
+
+Producer.Content.Template=producer/content.template
+Producer.Content.Batchsize=10
+
+
index 3d0c8d5..a9fb388 100755 (executable)
@@ -49,7 +49,7 @@ public class EvaluatedAssignmentProducerNode implements ProducerNode {
     try {
       ParameterExpander.setValueForKey(
          aValueMap,
-         key,
+         ParameterExpander.expandExpression( aValueMap, key ),
          ParameterExpander.evaluateExpression( aValueMap, value ));
 
     }
index dc3e112..fee5b00 100755 (executable)
@@ -49,7 +49,7 @@ public class ExpandedAssignmentProducerNode implements ProducerNode {
     try {
       ParameterExpander.setValueForKey(
          aValueMap,
-         key,
+         ParameterExpander.expandExpression( aValueMap, key ),
          ParameterExpander.expandExpression( aValueMap, value ));
 
     }
diff --git a/source/mir/producer/LoopProducerNode.java b/source/mir/producer/LoopProducerNode.java
new file mode 100755 (executable)
index 0000000..2e40b89
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2001, 2002  The Mir-coders group
+ *
+ * This file is part of Mir.
+ *
+ * Mir is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Mir is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mir; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * In addition, as a special exception, The Mir-coders gives permission to link
+ * the code of this program with the com.oreilly.servlet library, any library
+ * licensed under the Apache Software License, The Sun (tm) Java Advanced
+ * Imaging library (JAI), The Sun JIMI library (or with modified versions of
+ * the above that use the same license as the above), and distribute linked
+ * combinations including the two.  You must obey the GNU General Public
+ * License in all respects for all of the code used other than the above
+ * mentioned libraries.  If you modify this file, you may extend this exception
+ * to your version of the file, but you are not obligated to do so.  If you do
+ * not wish to do so, delete this exception statement from your version.
+ */
+
+package mir.producer;
+
+import java.util.*;
+import java.io.*;
+import mir.util.*;
+
+
+public class LoopProducerNode extends ProducerNodeDecorator {
+  private String condition;
+  private String limit;
+
+   public LoopProducerNode(
+                String aCondition,
+                String aLimit,
+                ProducerNode aSubNode) {
+    super(aSubNode);
+
+    limit = aLimit;
+    condition = aCondition;
+  }
+
+  public void produce(Map aValueMap, String aVerb, PrintWriter aLogger) throws ProducerFailure {
+    int loopNr;
+    int maxNrLoops;
+
+    try {
+      loopNr = 0;
+      maxNrLoops = ParameterExpander.evaluateIntegerExpressionWithDefault(aValueMap, limit, 1000);
+      while (ParameterExpander.evaluateBooleanExpression(aValueMap, condition) && (loopNr<maxNrLoops)) {
+        super.produce(aValueMap, aVerb, aLogger);
+        loopNr++;
+      }
+    }
+    catch (Throwable t) {
+      throw new ProducerFailure(t.getMessage(), t);
+    }
+  };
+}
\ No newline at end of file
index f73b4d8..ff726cb 100755 (executable)
@@ -52,6 +52,7 @@ public class DefaultProducerNodeBuilders {
     aBuilderLibrary.registerBuilder("DeleteFile", FileDeletingProducerNodeBuilder.class);
     aBuilderLibrary.registerBuilder("SetFileDate", FileDateSettingProducerNodeBuilder.class);
     aBuilderLibrary.registerBuilder("If", ConditionalProducerNodeBuilder.class);
+    aBuilderLibrary.registerBuilder("While", LoopProducerNodeBuilder.class);
 
 
     aBuilderLibrary.registerFactory("Enumerate", new EnumeratingProducerNodeBuilder.factory(aModel));
@@ -212,6 +213,35 @@ public class DefaultProducerNodeBuilders {
 
 ////////////////////////////////////////////////////////////////////////////////
 
+  public static class LoopProducerNodeBuilder extends AbstractProducerNodeBuilder {
+    private final static String   LOOP_CONDITION_ATTRIBUTE = "condition";
+    private final static String   LOOP_LIMIT_ATTRIBUTE = LIMIT_ATTRIBUTE;
+    private final static String   LOOP_DEFAULT_SUBNODE = "default";
+    private final static String[] LOOP_REQUIRED_ATTRIBUTES = { LOOP_CONDITION_ATTRIBUTE };
+    private final static String[] LOOP_OPTIONAL_ATTRIBUTES = { LOOP_LIMIT_ATTRIBUTE };
+    private final static String[] LOOP_SUBNODES = {LOOP_DEFAULT_SUBNODE};
+
+    private String condition;
+    private String limit;
+
+    public LoopProducerNodeBuilder() {
+      super(LOOP_SUBNODES);
+    }
+
+    public void setAttributes(Map anAttributes) throws ProducerConfigExc  {
+      ReaderTool.checkAttributes(anAttributes, LOOP_REQUIRED_ATTRIBUTES, LOOP_OPTIONAL_ATTRIBUTES);
+
+      condition = (String) anAttributes.get(LOOP_CONDITION_ATTRIBUTE);
+      limit = (String) ReaderTool.getStringAttributeWithDefault(anAttributes, LOOP_LIMIT_ATTRIBUTE, "");
+    };
+
+    public ProducerNode constructNode() {
+      return new LoopProducerNode(condition, limit, getSubNode( LOOP_DEFAULT_SUBNODE ));
+    };
+  }
+
+////////////////////////////////////////////////////////////////////////////////
+
   public static class ListProducerNodeBuilder extends AbstractProducerNodeBuilder {
     private final static String   LIST_KEY_ATTRIBUTE = KEY_ATTRIBUTE;
     private final static String   LIST_DEFINITION_ATTRIBUTE = DEFINITION_ATTRIBUTE;
@@ -603,13 +633,17 @@ public class DefaultProducerNodeBuilders {
   public static class ScriptedProducerNodeBuilder implements ProducerNodeBuilder {
     private ScriptedProducerNodeDefinition definition;
     private Map nodeParameterValues;
-    private Map parameterValues;
+    private Map integerParameterValues;
+    private Map stringParameterValues;
 
     public ScriptedProducerNodeBuilder(ScriptedProducerNodeDefinition aDefinition) {
       definition = aDefinition;
 
-      parameterValues = new HashMap();
-      parameterValues.putAll(definition.getParameters());
+      stringParameterValues = new HashMap();
+      stringParameterValues.putAll(definition.getStringParameters());
+
+      integerParameterValues = new HashMap();
+      integerParameterValues.putAll(definition.getIntegerParameters());
 
       nodeParameterValues = new HashMap();
     }
@@ -624,10 +658,20 @@ public class DefaultProducerNodeBuilders {
 
     public void setAttributes(Map anAttributes) throws ProducerConfigExc {
       ReaderTool.checkAttributeSet(anAttributes.keySet(), definition.getRequiredAttributes(), definition.getOptionalAttributes());
+
+      Iterator i = anAttributes.entrySet().iterator();
+      while (i.hasNext()) {
+        Map.Entry entry = (Map.Entry) i.next();
+
+        if (definition.getIntegerParameters().keySet().contains(entry.getKey()))
+            integerParameterValues.put(entry.getKey(), entry.getValue());
+        else
+            stringParameterValues.put(entry.getKey(), entry.getValue());
+      }
     };
 
     public ProducerNode constructNode() {
-      return new ScriptedProducerNode(definition, parameterValues, nodeParameterValues);
+      return new ScriptedProducerNode(definition, stringParameterValues, integerParameterValues, nodeParameterValues);
     };
 
     public static class factory implements ProducerNodeBuilderFactory {
index 7c87289..b6219e5 100755 (executable)
@@ -598,6 +598,7 @@ public class ProducerConfigReader {
     private ScriptedProducerNodeDefinition nodeDefinition;
     private ProducerNode body;
     private Map stringParameters;
+    private Map integerParameters;
     private Map nodeParameters;
     private String name;
 
@@ -605,6 +606,7 @@ public class ProducerConfigReader {
       body = null;
       nodeParameters = null;
       stringParameters = null;
+      integerParameters = null;
       name = aName;
     }
 
@@ -631,6 +633,7 @@ public class ProducerConfigReader {
     public void endElement(SectionHandler aHandler) {
       if (aHandler instanceof NodeDefinitionParametersSectionHandler) {
         stringParameters = ((NodeDefinitionParametersSectionHandler) aHandler).getStringParameters();
+        integerParameters = ((NodeDefinitionParametersSectionHandler) aHandler).getIntegerParameters();
         nodeParameters = ((NodeDefinitionParametersSectionHandler) aHandler).getNodeParameters();
       }
       else if (aHandler instanceof ProducerNodeSectionHandler) {
@@ -655,7 +658,13 @@ public class ProducerConfigReader {
       i = stringParameters.entrySet().iterator();
       while (i.hasNext()) {
         Map.Entry entry = (Map.Entry) i.next();
-        nodeDefinition.addParameter((String) entry.getKey(), (String) entry.getValue());
+        nodeDefinition.addStringParameter((String) entry.getKey(), (String) entry.getValue());
+      }
+
+      i = integerParameters.entrySet().iterator();
+      while (i.hasNext()) {
+        Map.Entry entry = (Map.Entry) i.next();
+        nodeDefinition.addIntegerParameter((String) entry.getKey(), (String) entry.getValue());
       }
     }
 
@@ -673,10 +682,12 @@ public class ProducerConfigReader {
   public class NodeDefinitionParametersSectionHandler extends SectionHandler {
     private Map nodeParameters;
     private Map stringParameters;
+    private Map integerParameters;
 
     public NodeDefinitionParametersSectionHandler() {
       nodeParameters = new HashMap();
       stringParameters = new HashMap();
+      integerParameters = new HashMap();
     }
 
     public SectionHandler startElement(String aTag, Map anAttributes) throws ProducerConfigExc {
@@ -696,22 +707,25 @@ public class ProducerConfigReader {
 
         return new EmptySectionHandler();
       }
-      else if (aTag.equals("string")) {
+      else if (aTag.equals("string") || aTag.equals("integer")) {
         ReaderTool.checkAttributes(anAttributes, NODE_DEFINITION_PARAMETER_REQUIRED_ATTRIBUTES, NODE_DEFINITION_PARAMETER_OPTIONAL_ATTRIBUTES);
         parameterName = (String) anAttributes.get( NODE_DEFINITION_PARAMETER_NAME_ATTRIBUTE );
 
-        if (stringParameters.containsKey(parameterName))
+        if (stringParameters.containsKey(parameterName) || integerParameters.containsKey(parameterName))
           throw new ProducerConfigExc("Duplicate parameter name: '" + parameterName + "'");
 
         ReaderTool.checkValidIdentifier( parameterName );
 
         defaultValue = (String) anAttributes.get( NODE_DEFINITION_PARAMETER_DEFAULTVALUE_ATTRIBUTE );
 
-        stringParameters.put(parameterName, defaultValue);
+        if (aTag.equals("string"))
+          stringParameters.put(parameterName, defaultValue);
+        else
+          integerParameters.put(parameterName, defaultValue);
 
         return new EmptySectionHandler();
       }
-      else throw new ProducerConfigExc("Only 'string' and 'node' tags allowed here, '" + aTag + "' encountered.");
+      else throw new ProducerConfigExc("Only 'string', 'integer' and 'node' tags allowed here, '" + aTag + "' encountered.");
 
     }
 
@@ -728,6 +742,10 @@ public class ProducerConfigReader {
     public Map getStringParameters() {
       return stringParameters;
     }
+
+    public Map getIntegerParameters() {
+      return integerParameters;
+    }
   }
 }
 
index 3306149..324b12e 100755 (executable)
@@ -38,13 +38,16 @@ import mir.util.*;
 
 public class ScriptedProducerNode implements ProducerNode {
   private ScriptedProducerNodeDefinition definition;
-  private Map parameterValues;
+  private Map integerParameterValues;
+  private Map stringParameterValues;
   private Map nodeParameterValues;
 
-  public ScriptedProducerNode(ScriptedProducerNodeDefinition aDefinition, Map aParameterValues, Map aNodeParameterValues) {
+  public ScriptedProducerNode(ScriptedProducerNodeDefinition aDefinition, Map aStringParameterValues, Map anIntegerParameterValues, Map aNodeParameterValues) {
     definition = aDefinition;
-    parameterValues = new HashMap();
-    parameterValues.putAll(aParameterValues);
+    stringParameterValues = new HashMap();
+    stringParameterValues.putAll(aStringParameterValues);
+    integerParameterValues = new HashMap();
+    integerParameterValues.putAll(anIntegerParameterValues);
     nodeParameterValues = new HashMap();
     nodeParameterValues.putAll(aNodeParameterValues);
   }
@@ -55,9 +58,11 @@ public class ScriptedProducerNode implements ProducerNode {
 
   public void produce(Map aValues, String aVerb, PrintWriter aLogger) throws ProducerFailure, ProducerExc {
     try {
-      Map oldValues = ScriptedProducerNodeTool.saveMapValues(aValues, definition.getParameters().keySet());
+      Map oldValues = new HashMap();
+      ScriptedProducerNodeTool.saveMapValues(oldValues, aValues, definition.getStringParameters().keySet());
+      ScriptedProducerNodeTool.saveMapValues(oldValues, aValues, definition.getIntegerParameters().keySet());
       try {
-        Iterator i = parameterValues.entrySet().iterator();
+        Iterator i = stringParameterValues.entrySet().iterator();
 
         while (i.hasNext()) {
           Map.Entry entry = (Map.Entry) i.next();
@@ -67,6 +72,16 @@ public class ScriptedProducerNode implements ProducerNode {
           }
         }
 
+        i = integerParameterValues.entrySet().iterator();
+
+        while (i.hasNext()) {
+          Map.Entry entry = (Map.Entry) i.next();
+
+          if (entry.getValue() instanceof String) {
+            aValues.put(entry.getKey(), ParameterExpander.evaluateExpression(aValues, (String) entry.getValue()));
+          }
+        }
+
         ScriptedProducerNodeTool.pushNodeParameterValues(aValues, definition.getName(), nodeParameterValues);
         try {
           definition.getBody().produce(aValues, aVerb, aLogger);
@@ -76,7 +91,8 @@ public class ScriptedProducerNode implements ProducerNode {
         }
       }
       finally {
-        ScriptedProducerNodeTool.restoreMapValues(aValues, definition.getParameters().keySet(), oldValues);
+        ScriptedProducerNodeTool.restoreMapValues(aValues, definition.getIntegerParameters().keySet(), oldValues);
+        ScriptedProducerNodeTool.restoreMapValues(aValues, definition.getStringParameters().keySet(), oldValues);
       }
     }
     catch (Exception e) {
index d65060f..6420bc8 100755 (executable)
@@ -36,7 +36,8 @@ import java.io.*;
 import mir.producer.*;
 
 public class ScriptedProducerNodeDefinition {
-  private Map parameters;               // name -> default value
+  private Map integerParameters;               // name -> default value
+  private Map stringParameters;               // name -> default value
   private Set nodeParameters;
   private ProducerNode body;
   private String name;
@@ -46,13 +47,18 @@ public class ScriptedProducerNodeDefinition {
 
   public ScriptedProducerNodeDefinition(String aName) {
     name = aName;
-    parameters = new HashMap();
+    integerParameters = new HashMap();
+    stringParameters = new HashMap();
     nodeParameters = new HashSet();
     body = new CompositeProducerNode();
   }
 
-  public void addParameter(String aName, String aDefaultValue) {
-    parameters.put(aName, aDefaultValue);
+  public void addStringParameter(String aName, String aDefaultValue) {
+    stringParameters.put(aName, aDefaultValue);
+  }
+
+  public void addIntegerParameter(String aName, String aDefaultValue) {
+    integerParameters.put(aName, aDefaultValue);
   }
 
   public void addNodeParameter(String aName) {
@@ -63,8 +69,12 @@ public class ScriptedProducerNodeDefinition {
     body = aBody;
   }
 
-  protected Map getParameters() {
-    return parameters;
+  protected Map getStringParameters() {
+    return stringParameters;
+  }
+
+  protected Map getIntegerParameters() {
+    return integerParameters;
   }
 
   protected Set getNodeParameters() {
@@ -89,7 +99,17 @@ public class ScriptedProducerNodeDefinition {
 
   public Set getAttributesSelection(boolean aRequired) {
     Set result = new HashSet();
-    Iterator i = parameters.entrySet().iterator();
+    Iterator i = stringParameters.entrySet().iterator();
+
+    while (i.hasNext()) {
+      Map.Entry entry = (Map.Entry) i.next();
+
+      if ((entry.getValue() == null) == aRequired ) {
+        result.add(entry.getKey());
+      }
+    }
+
+    i = integerParameters.entrySet().iterator();
 
     while (i.hasNext()) {
       Map.Entry entry = (Map.Entry) i.next();
index 56710b4..e8a2251 100755 (executable)
@@ -60,17 +60,14 @@ public class ScriptedProducerNodeTool {
     runtimeStack.pop();
   }
 
-  public static Map saveMapValues(Map aMap, Set aKeys) {
-    Map result = new HashMap();
+  public static void saveMapValues(Map aDestination, Map aSource, Set aKeys) {
     Iterator i = aKeys.iterator();
 
     while (i.hasNext()) {
       Object key = i.next();
-      if (aMap.containsKey(key))
-        result.put(key, aMap.get(key));
+      if (aSource.containsKey(key))
+        aDestination.put(key, aSource.get(key));
     }
-
-    return result;
   }
 
   public static void restoreMapValues(Map aMap, Set aKeys, Map aSavedValues) {
diff --git a/source/mir/util/GeneratorListFunctions.java b/source/mir/util/GeneratorListFunctions.java
new file mode 100755 (executable)
index 0000000..1972615
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2001, 2002  The Mir-coders group
+ *
+ * This file is part of Mir.
+ *
+ * Mir is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Mir is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mir; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * In addition, as a special exception, The Mir-coders gives permission to link
+ * the code of this program with the com.oreilly.servlet library, any library
+ * licensed under the Apache Software License, The Sun (tm) Java Advanced
+ * Imaging library (JAI), The Sun JIMI library (or with modified versions of
+ * the above that use the same license as the above), and distribute linked
+ * combinations including the two.  You must obey the GNU General Public
+ * License in all respects for all of the code used other than the above
+ * mentioned libraries.  If you modify this file, you may extend this exception
+ * to your version of the file, but you are not obligated to do so.  If you do
+ * not wish to do so, delete this exception statement from your version.
+ */
+
+package mir.util;
+
+import java.util.*;
+import java.net.*;
+
+//import mir.misc.*;
+import mir.generator.*;
+
+public class GeneratorListFunctions {
+  private GeneratorListFunctions() {}
+
+  public static class subListFunction implements Generator.GeneratorFunction {
+    public Object perform(List aParameters) throws GeneratorExc, GeneratorFailure {
+      try {
+        int skip;
+        int maxSize;
+
+        if (aParameters.size()>3 || aParameters.size()<2)
+          throw new GeneratorExc("iteratorSubsetFunction: 2 or 3 parameters expected");
+        if (aParameters.get(0)==null)
+          return "";
+
+        if (!(aParameters.get(0) instanceof RewindableIterator) && !(aParameters.get(0) instanceof List))
+          throw new GeneratorExc("iteratorSubsetFunction: first parameter must be a RewindableIterator (not a "+aParameters.get(0).getClass().getName()+")");
+
+        skip = StringRoutines.interpretAsInteger(aParameters.get(1));
+        if (aParameters.size()>=2)
+          maxSize = StringRoutines.interpretAsInteger(aParameters.get(2));
+        else
+          maxSize = -1;
+
+
+        if ((aParameters.get(0) instanceof RewindableIterator))
+          return new SubsetIterator((RewindableIterator) aParameters.get(0), skip, maxSize);
+        else {
+          List list = (List) aParameters.get(0);
+
+          if (skip>=list.size())
+            return new Vector();
+          if (maxSize<0 || (skip+maxSize)>=list.size())
+            return list.subList(skip, list.size());
+          else
+            return list.subList(skip, skip+maxSize);
+        }
+      }
+      catch (GeneratorExc e) {
+        throw e;
+      }
+      catch (GeneratorFailure e) {
+        throw e;
+      }
+      catch (Throwable e) {
+        throw new GeneratorFailure(e);
+      }
+    };
+  }
+}
index 9aed006..66f7533 100755 (executable)
@@ -38,21 +38,6 @@ public class GeneratorStringFunctions {
 
   private GeneratorStringFunctions() {}
 
-  public static int interpretAsInteger(Object aValue) throws GeneratorExc {
-    if (aValue instanceof Integer)
-      return ((Integer) aValue).intValue();
-
-    if (aValue instanceof String)
-      try {
-        return Integer.parseInt((String) aValue);
-      }
-      catch (Throwable t) {
-        throw new GeneratorExc("Integer expected, "+aValue+" found");
-      }
-
-    throw new GeneratorExc("Integer expected, "+aValue+" found");
-  }
-
   public static String interpretAsString(Object aValue) throws GeneratorExc {
     if (aValue instanceof String)
       return (String) aValue;
@@ -74,12 +59,12 @@ public class GeneratorStringFunctions {
 
         if (aParameters.size()==3) {
           return interpretAsString(aParameters.get(0)).substring(
-              interpretAsInteger(aParameters.get(1)),
-              interpretAsInteger(aParameters.get(2)));
+              StringRoutines.interpretAsInteger(aParameters.get(1)),
+              StringRoutines.interpretAsInteger(aParameters.get(2)));
         }
         else {
           return interpretAsString(aParameters.get(0)).substring(
-              interpretAsInteger(aParameters.get(1)));
+              StringRoutines.interpretAsInteger(aParameters.get(1)));
         }
       }
       catch (GeneratorExc e) {
index 5a752d2..be7367b 100755 (executable)
@@ -580,8 +580,10 @@ public class ParameterExpander {
       List parameters;
 
       do {
-        token = scanner.scan();
+        token = scanner.peek();
+
         if (token instanceof LeftSquareBraceToken) {
+          scanner.scan();
           qualifier = parseUntil(MAX_OPERATOR_LEVEL);
           token = scanner.scan();
           if (!(token instanceof RightSquareBraceToken))
@@ -595,6 +597,7 @@ public class ParameterExpander {
           }
         }
         else if (token instanceof IdentifierToken) {
+          scanner.scan();
           qualifier = ((IdentifierToken) token).getName();
 
           if (currentValue instanceof Map) {
@@ -653,7 +656,7 @@ public class ParameterExpander {
         value = parseUntil(unaryOperatorLevel(token));
         value = expandOperatorExpression(token, value);
       }
-      else if (token instanceof IdentifierToken) {
+      else if (token instanceof IdentifierToken || token instanceof LeftSquareBraceToken) {
         value = parseVariable();
       }
       else if (token instanceof LiteralToken) {
index 8c4a5cb..f8160f1 100755 (executable)
@@ -43,8 +43,6 @@ public class SimpleParser {
   public SimpleParser(String aData) {
     data=aData;
     position=0;
-
-    System.out.println("Will parse: "+aData);
   }
 
   public boolean parses(RE aRegularExpression) throws SimpleParserExc {
@@ -107,8 +105,6 @@ public class SimpleParser {
 
   public String parse(String anExpression, String aMessage) throws SimpleParserExc, SimpleParserFailure {
     try {
-      System.out.println("Expression: "+anExpression);
-
       return parse(new RE(anExpression), aMessage);
     }
     catch (SimpleParserExc e) {
index 7907ac2..0edc27f 100755 (executable)
@@ -55,6 +55,21 @@ public class StringRoutines {
     return result;
   }
 
+  public static int interpretAsInteger(Object aValue) throws Exception {
+    if (aValue instanceof Integer)
+      return ((Integer) aValue).intValue();
+
+    if (aValue instanceof String)
+      try {
+        return Integer.parseInt((String) aValue);
+      }
+      catch (Throwable t) {
+        throw new Exception("Integer expected, "+aValue+" found");
+      }
+
+    throw new Exception("Integer expected, "+aValue+" found");
+  }
+
   public static String performRegularExpressionReplacement(String aSource,
       String aSearchExpression, String aReplacement) throws Exception {
 
diff --git a/source/mir/util/SubsetIterator.java b/source/mir/util/SubsetIterator.java
new file mode 100755 (executable)
index 0000000..b1204af
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2001, 2002  The Mir-coders group
+ *
+ * This file is part of Mir.
+ *
+ * Mir is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Mir is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mir; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * In addition, as a special exception, The Mir-coders gives permission to link
+ * the code of this program with the com.oreilly.servlet library, any library
+ * licensed under the Apache Software License, The Sun (tm) Java Advanced
+ * Imaging library (JAI), The Sun JIMI library (or with modified versions of
+ * the above that use the same license as the above), and distribute linked
+ * combinations including the two.  You must obey the GNU General Public
+ * License in all respects for all of the code used other than the above
+ * mentioned libraries.  If you modify this file, you may extend this exception
+ * to your version of the file, but you are not obligated to do so.  If you do
+ * not wish to do so, delete this exception statement from your version.
+ */
+
+package mir.util;
+
+import java.util.*;
+
+import java.util.*;
+import mir.storage.*;
+import mir.util.*;
+import mir.entity.*;
+
+public class SubsetIterator implements RewindableIterator {
+  private RewindableIterator master;
+  private List cachedItems;
+  private int position;
+  private int skip;
+  private int maxLength;
+
+  public SubsetIterator(RewindableIterator anIterator, int aSkip, int aMaxLength) {
+    master = anIterator;
+    position = 0;
+    skip = aSkip;
+    maxLength = aMaxLength;
+  }
+
+  public boolean hasNext() {
+    while (position<skip && master.hasNext()) {
+      getNext();
+    }
+
+    return ((maxLength==-1) || (position<skip+maxLength)) && master.hasNext();
+  }
+
+  public Object getNext() {
+    position++;
+    return master.next();
+  }
+
+  public Object next() {
+    if (hasNext())
+      return getNext();
+    else
+      throw new NoSuchElementException();
+  }
+
+  public void remove() {
+    throw new UnsupportedOperationException();
+  }
+
+  public void rewind() {
+    position=0;
+    master.rewind();
+  };
+}
\ No newline at end of file
index d3b843a..431c666 100755 (executable)
@@ -74,6 +74,8 @@ public class MirBasicProducerAssistantLocalizer implements MirProducerAssistantL
     utilityMap.put("encodeHTML", new GeneratorHTMLFunctions.encodeHTMLGeneratorFunction());
     utilityMap.put("encodeURI", new GeneratorHTMLFunctions.encodeURIGeneratorFunction());
     utilityMap.put("subString", new GeneratorStringFunctions.subStringFunction());
+    utilityMap.put("subList", new GeneratorListFunctions.subListFunction());
+
 
     aValueSet.put("config", configMap);
     aValueSet.put("utility", utilityMap);
index 19ad8b9..fda014c 100755 (executable)
@@ -77,6 +77,7 @@ public class MirBasicProducerLocalizer implements MirProducerLocalizer {
 
         producerFactories = newProducers;
         fileMonitor = newFileMonitor;
+        logger.printError("MirBasicProducerLocalizer.factories(): successfully setup factories");
       }
       catch (Throwable t) {
         logger.printError("MirBasicProducerLocalizer.factories(): Unable to setup factories: "+t.getMessage());