Update of /var/cvs/src/org/mmbase/util/functions
In directory james.mmbase.org:/tmp/cvs-serv24454

Modified Files:
        Functions.java Parameter.java Parameters.java 
Added Files:
        PatternParameter.java 
Log Message:
for component blocks we'll going to like parameters which are defined by 
patterns, because sometimes it is not entirely clear what all parameters can be


See also: http://cvs.mmbase.org/viewcvs/src/org/mmbase/util/functions


PatternParameter.java is new



Index: Functions.java
===================================================================
RCS file: /var/cvs/src/org/mmbase/util/functions/Functions.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -b -r1.17 -r1.18
--- Functions.java      25 Nov 2007 18:25:49 -0000      1.17
+++ Functions.java      20 Aug 2008 08:03:22 -0000      1.18
@@ -25,7 +25,7 @@
  * @author Pierre van Rooden
  * @author Daniel Ockeloen
  * @author Michiel Meeuwissen
- * @version $Id: Functions.java,v 1.17 2007/11/25 18:25:49 nklasens Exp $
+ * @version $Id: Functions.java,v 1.18 2008/08/20 08:03:22 michiel Exp $
  */
 public class Functions {
 
@@ -50,11 +50,16 @@
      * @return List with only simple Parameter's.
      */
     public static List<Parameter<?>> define(Parameter<?>[] def, 
List<Parameter<?>> list) {
+        boolean patterns = list.size() == 0 ? false : list.get(list.size() - 
1) instanceof PatternParameter;
         if (def == null) return list;
         for (Parameter d : def) {
             if (d instanceof Parameter.Wrapper) {
                 define(((Parameter.Wrapper) d).arguments, list);
+            } else if (d instanceof PatternParameter) {
+                list.add(d);
+                patterns = true;
             } else {
+                if (patterns) throw new 
IllegalArgumentException("PatternParameter's must be last in the definition");
                 list.add(d);
             }
         }


Index: Parameter.java
===================================================================
RCS file: /var/cvs/src/org/mmbase/util/functions/Parameter.java,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -b -r1.46 -r1.47
--- Parameter.java      25 Nov 2007 18:25:49 -0000      1.46
+++ Parameter.java      20 Aug 2008 08:03:22 -0000      1.47
@@ -27,7 +27,7 @@
  * @author Daniel Ockeloen (MMFunctionParam)
  * @author Michiel Meeuwissen
  * @since  MMBase-1.7
- * @version $Id: Parameter.java,v 1.46 2007/11/25 18:25:49 nklasens Exp $
+ * @version $Id: Parameter.java,v 1.47 2008/08/20 08:03:22 michiel Exp $
  * @see Parameters
  */
 
@@ -91,10 +91,15 @@
      */
     public static <C> Parameter<C> readFromXml(Element element) {
         String name = element.getAttribute("name");
+        String regex = element.getAttribute("regex");
+
         String type = element.getAttribute("type");
         String required = element.getAttribute("required");
         String description   = element.getAttribute("description"); // 
actually description as attribute is not very sane
-        Parameter<C> parameter = new Parameter<C>(name, (Class<C>) 
getClassForName(type));
+        Parameter<C> parameter =
+            ! "".equals(regex) ?
+            new PatternParameter<C>(java.util.regex.Pattern.compile(regex), 
(Class<C>) getClassForName(type)) :
+            new Parameter<C>(name, (Class<C>) getClassForName(type));
         if (! "".equals(description)) {
             parameter.getLocalizedDescription().set(description, null); // 
just set it for the default locale...
         }
@@ -313,6 +318,13 @@
         return dataType.cast(value, null, null);
     }
 
+    /**
+     * @since MMBase-1.9
+     */
+    public boolean matches(String key) {
+        return getName().equals(key);
+    }
+
     public int hashCode() {
         return getName().hashCode() + 13 * getDataType().hashCode();
     }


Index: Parameters.java
===================================================================
RCS file: /var/cvs/src/org/mmbase/util/functions/Parameters.java,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -b -r1.39 -r1.40
--- Parameters.java     22 Jan 2008 16:43:41 -0000      1.39
+++ Parameters.java     20 Aug 2008 08:03:22 -0000      1.40
@@ -11,6 +11,7 @@
 package org.mmbase.util.functions;
 
 import org.mmbase.util.Casting;
+import org.mmbase.util.Entry;
 import java.util.*;
 import org.mmbase.util.logging.*;
 
@@ -23,7 +24,7 @@
  *
  * @author Michiel Meeuwissen
  * @since  MMBase-1.7
- * @version $Id: Parameters.java,v 1.39 2008/01/22 16:43:41 michiel Exp $
+ * @version $Id: Parameters.java,v 1.40 2008/08/20 08:03:22 michiel Exp $
  * @see Parameter
  * @see #Parameters(Parameter[])
  */
@@ -44,6 +45,9 @@
      */
     protected final Map<String, Object> backing;
 
+    protected final List<Map.Entry<String, Object>> patternBacking;
+    protected int patternLimit = -1;
+
     /**
      * This array maps integers (position in array) to map keys, making it 
possible to implement
      * List.
@@ -78,18 +82,27 @@
      */
     public Parameters(Parameter<?>... def) {
         definition = Functions.define(def, new 
ArrayList<Parameter<?>>()).toArray(Parameter.emptyArray());
-        toIndex = definition.length;
         if (log.isDebugEnabled()) {
             log.debug("Found definition " + Arrays.asList(definition));
         }
         backing = new HashMap<String, Object>();
+        List<Map.Entry<String, Object>> pb = null;
         // fill with default values, and check for non-unique keys.
-        for (int i = fromIndex; i < toIndex; i++) {
+        int i = fromIndex;
+        for (; i < definition.length; i++) {
+
+            if (definition[i]  instanceof PatternParameter) {
+                pb = new ArrayList<Map.Entry<String, Object>>();
+                break;
+            }
             if (backing.put(definition[i].getName(), 
definition[i].getDefaultValue()) != null) {
                 throw new IllegalArgumentException("Parameter keys not 
unique");
             }
 
         }
+        patternLimit = i + (pb == null ? 1 : 0);
+        toIndex = i;
+        patternBacking = pb;
 
     }
 
@@ -119,6 +132,7 @@
         this.backing = backing;
         toIndex = backing.size() - 1;
         definition = null;
+        patternBacking = null;
     }
 
     /**
@@ -156,6 +170,7 @@
         }
         toIndex = backing.size() - 1;
         definition = null;
+        patternBacking = null;
     }
 
 
@@ -165,6 +180,7 @@
     protected Parameters(Parameters  params, int from, int to) {
         backing = params.backing;
         definition = params.definition;
+        patternBacking = params.patternBacking;
         fromIndex = from + params.fromIndex;
         toIndex   = to   + params.fromIndex;
         if (fromIndex < 0) throw new IndexOutOfBoundsException("fromIndex < 
0");
@@ -173,6 +189,13 @@
 
     }
 
+    /**
+     * @since MMBase-1.9
+     */
+    public boolean isHavingPatterns() {
+        return patternBacking != null;
+    }
+
     protected final void checkDef() {
         if (definition == null) {
             definition = new Parameter[backing.size()];
@@ -239,17 +262,29 @@
     // implementation of List
     public Object get(int i) {
         checkDef();
-        return backing.get(definition[i + fromIndex].getName());
+        int j = i + fromIndex;
+        if (j < patternLimit) {
+            return backing.get(definition[j].getName());
+        } else {
+            if (patternBacking == null) throw new IndexOutOfBoundsException();
+            return patternBacking.get(j - patternLimit).getValue();
+        }
     }
 
     // implementation of (modifiable) List
     // @throws NullPointerException if definition not set
     public Object set(int i, Object value) {
         checkDef();
-        Parameter<?> a = definition[i + fromIndex];
+        int j = i + fromIndex;
+        if (j < patternLimit) {
+            Parameter<?> a = definition[j];
         if (autoCasting) value = a.autoCast(value);
         a.checkType(value);
         return backing.put(a.getName(), value);
+        } else {
+            if (patternBacking == null) throw new IndexOutOfBoundsException();
+            return patternBacking.get(j - patternLimit).setValue(value);
+        }
     }
 
 
@@ -258,7 +293,7 @@
      */
     public void checkRequiredParameters() {
         checkDef();
-        for (int i = fromIndex; i < toIndex; i++) {
+        for (int i = fromIndex; i < toIndex && i < patternLimit; i++) {
             Parameter<?> a = definition[i];
             if (a.isRequired() && (get(a.getName()) == null)) {
                 throw new IllegalArgumentException("Required parameter '" + 
a.getName() + "' is null (of (" + toString() + ")");
@@ -268,7 +303,7 @@
 
     /**
      * Returns the position of a parameter in the parameters list, using the 
Parameter as a qualifier.
-     * you can tehn acecss that paramter with [EMAIL PROTECTED] #get(int)}.
+     * you can then acecss that paramter with [EMAIL PROTECTED] #get(int)}.
      * @param parameter the parameter
      * @return the index of the parameter, or -1 if it doesn't exist
      */
@@ -276,7 +311,7 @@
     public int indexOfParameter(Parameter<?> parameter) {
         checkDef();
         int index = -1;
-        for (int i = fromIndex; i < toIndex; i++) {
+        for (int i = fromIndex; i < toIndex && i < patternLimit; i++) {
             if (definition[i].equals(parameter)) {
                 index = i - fromIndex;
                 break;
@@ -294,14 +329,20 @@
      */
     public int indexOfParameter(String parameterName) {
         checkDef();
-        int index = -1;
-        for (int i = fromIndex; i < toIndex; i++) {
+        for (int i = fromIndex; i < toIndex && i < patternLimit; i++) {
             if (definition[i].getName().equals(parameterName)) {
-                index = i - fromIndex;
-                break;
+                return i - fromIndex;
             }
         }
-        return index;
+        if (patternBacking != null) {
+            for (int i = 0; i < toIndex - patternLimit; i++) {
+                Map.Entry<String, Object> entry = patternBacking.get(i);
+                if (entry.getKey().equals(parameterName)) {
+                    return patternLimit + i - fromIndex;
+                }
+            }
+        }
+        return -1;
     }
 
 
@@ -351,6 +392,13 @@
             set(index, value);
             return this;
         } else {
+            for (int i = patternLimit; i < definition.length; i++) {
+                if (definition[i].matches(parameterName)) {
+                    patternBacking.add(new Entry<String, 
Object>(parameterName, value));
+                    toIndex++;
+                    return this;
+                }
+            }
             throw new IllegalArgumentException("The parameter '" + 
parameterName + "' is not defined (defined are " + toString() + ")");
         }
     }
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to