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