diff --git a/modules/library/main/src/main/java/org/geotools/filter/FunctionImpl.java b/modules/library/main/src/main/java/org/geotools/filter/FunctionImpl.java index cdceb5d..d6166cb 100644 --- a/modules/library/main/src/main/java/org/geotools/filter/FunctionImpl.java +++ b/modules/library/main/src/main/java/org/geotools/filter/FunctionImpl.java @@ -131,9 +131,38 @@ public class FunctionImpl extends ExpressionAbstract implements Function { } /** - * Gathers up and groups the parameters to the function based on the declared parameters. + * Validates the structure of arguments, basically enforcing java conventions for variable + * level arguments. */ - protected LinkedHashMap prepArguments(Object obj) { + private void validateArguments() { + List> args = getFunctionName().getArguments(); + + for (int i = 0; i < args.size(); i++) { + Parameter arg = args.get(i); + if (arg.getMaxOccurs() == 0) { + throw new IllegalArgumentException(String.format("Argument %s has zero max")); + } + if (arg.getMinOccurs() != 1 || arg.getMaxOccurs() != 1) { + //this can only happen for the last argument + if (i != args.size()-1) { + throw new IllegalArgumentException(String.format("Argument %s(%d,%d) invalid." + + " Variable arguments must be the last argument of function.", + arg.getName(), arg.getMinOccurs(), arg.getMaxOccurs())); + } + } + } + } + + /** + * Gathers up and groups the parameters to the function based on the declared parameters. + *

+ * This method calls {@link #validateArguments()} which enforces java style argument conventions + * for multi valued parameters. Basically enforcing that only teh last argument in a function + * can be variable. + *

+ * + */ + protected LinkedHashMap dispatchArguments(Object obj) { LinkedHashMap prepped = new LinkedHashMap(); List> args = getFunctionName().getArguments(); diff --git a/modules/library/main/src/main/java/org/geotools/filter/capability/FunctionNameImpl.java b/modules/library/main/src/main/java/org/geotools/filter/capability/FunctionNameImpl.java index 8138547..a481f29 100644 --- a/modules/library/main/src/main/java/org/geotools/filter/capability/FunctionNameImpl.java +++ b/modules/library/main/src/main/java/org/geotools/filter/capability/FunctionNameImpl.java @@ -69,7 +69,6 @@ public class FunctionNameImpl extends OperatorImpl implements FunctionName { super( copy ); this.ret = copy.getReturn(); this.args = copy.getArguments(); - validate(); } public FunctionNameImpl( String name, Parameter retern, Parameter... arguments) { @@ -80,7 +79,6 @@ public class FunctionNameImpl extends OperatorImpl implements FunctionName { super(name); this.ret = retern; this.args = arguments; - validate(); } public int getArgumentCount() { @@ -133,27 +131,6 @@ public class FunctionNameImpl extends OperatorImpl implements FunctionName { return names; } - - /** - * Validates the structure of arguments, basically enforcing java conventions for variable - * level arguments. - */ - private void validate() { - for (int i = 0; i < args.size(); i++) { - Parameter arg = args.get(i); - if (arg.getMaxOccurs() == 0) { - throw new IllegalArgumentException(String.format("Argument %s has zero max")); - } - if (arg.getMinOccurs() != 1 || arg.getMaxOccurs() != 1) { - //this can only happen for the last argument - if (i != args.size()-1) { - throw new IllegalArgumentException(String.format("Argument %s(%d,%d) invalid." + - " Variable arguments must be the last argument of function.", - arg.getName(), arg.getMinOccurs(), arg.getMaxOccurs())); - } - } - } - } private static Parameter generateReturn() { return parameter("return", Object.class); diff --git a/modules/library/main/src/main/java/org/geotools/filter/function/string/StringInFunction.java b/modules/library/main/src/main/java/org/geotools/filter/function/string/StringInFunction.java index fd127f2..f3a5a6c 100644 --- a/modules/library/main/src/main/java/org/geotools/filter/function/string/StringInFunction.java +++ b/modules/library/main/src/main/java/org/geotools/filter/function/string/StringInFunction.java @@ -35,7 +35,7 @@ public class StringInFunction extends FunctionImpl { @Override public Object evaluate(Object object) { - LinkedHashMap args = prepArguments(object); + LinkedHashMap args = dispatchArguments(object); String str = (String) args.get("string"); Boolean matchCase = (Boolean) args.get("matchCase");