Author: michiel Date: 2009-08-10 18:21:19 +0200 (Mon, 10 Aug 2009) New Revision: 37649
Added: mmbase/trunk/core/src/main/java/org/mmbase/util/functions/FunctionParameters.java Modified: mmbase/trunk/core/src/main/java/org/mmbase/util/functions/BeanFunction.java mmbase/trunk/core/src/main/java/org/mmbase/util/functions/Name.java Log: made @Name annotation useable on bean setters too, added 'FunctionParameters' annotation to limit the setters useable as function parameters Modified: mmbase/trunk/core/src/main/java/org/mmbase/util/functions/BeanFunction.java =================================================================== --- mmbase/trunk/core/src/main/java/org/mmbase/util/functions/BeanFunction.java 2009-08-10 14:40:57 UTC (rev 37648) +++ mmbase/trunk/core/src/main/java/org/mmbase/util/functions/BeanFunction.java 2009-08-10 16:21:19 UTC (rev 37649) @@ -156,7 +156,22 @@ * @since MMBase-1.9.2 */ public static Parameter<?>[] getParameterDefinition(Object sampleInstance, List<Method> setMethods) throws IllegalAccessException, InvocationTargetException, DependencyException { - Class claz = sampleInstance.getClass(); + Class<?> claz = sampleInstance.getClass(); + + boolean mustBeAnnotated = false; + List<String> setters; + { + FunctionParameters fp = claz.getAnnotation(FunctionParameters.class); + if (fp != null) { + mustBeAnnotated = fp.annotated(); + setters = Arrays.asList(fp.value()); + if (setters.size() == 1 && setters.get(0).length() == 0) { + setters = null; + } + } else { + setters = null; + } + } List<Parameter> parameters = new ArrayList<Parameter>(); Method nodeParameter = null; for (Method m : claz.getMethods()) { @@ -164,12 +179,14 @@ Class[] parameterTypes = m.getParameterTypes(); if (parameterTypes.length == 1 && methodName.startsWith("set")) { String parameterName = methodName.substring(3); + if (setters != null && ! setters.contains(parameterName)) continue; final org.mmbase.datatypes.DataType dataType; Type annotatedDataType = m.getAnnotation(Type.class); if (annotatedDataType != null) { dataType = getDataType(annotatedDataType.value(), org.mmbase.datatypes.DataTypes.createDataType(parameterName, parameterTypes[0])); } else { + if (mustBeAnnotated) continue; dataType = org.mmbase.datatypes.DataTypes.createDataType(parameterName, parameterTypes[0]); } { @@ -202,6 +219,9 @@ if (parameterName.equals("node") && org.mmbase.bridge.Node.class.isAssignableFrom(parameterTypes[0])) { nodeParameter = m; } else { + if (m.getAnnotation(Name.class) != null) { + parameterName = m.getAnnotation(Name.class).value(); + } parameters.add(new Parameter<Object>(parameterName, dataType)); if (setMethods != null) { setMethods.add(m); @@ -266,13 +286,18 @@ * @since MMBase-1.9.2 */ public static org.mmbase.datatypes.DataType getDataType(String value, org.mmbase.datatypes.BasicDataType base) throws org.mmbase.datatypes.util.xml.DependencyException { + org.mmbase.datatypes.DataType dt; if (NCName.matcher(value).matches()) { - return org.mmbase.datatypes.DataTypes.getDataType(value); + dt = org.mmbase.datatypes.DataTypes.getDataType(value); } else { DocumentReader reader = new DocumentReader(new InputSource(new java.io.StringReader(value)), true, org.mmbase.datatypes.util.xml.DataTypeReader.class); - return org.mmbase.datatypes.util.xml.DataTypeReader.readDataType(reader.getDocument().getDocumentElement(), base, null).dataType; - + dt = org.mmbase.datatypes.util.xml.DataTypeReader.readDataType(reader.getDocument().getDocumentElement(), base, null).dataType; } + if (dt == null) { + log.warn("Could not parse '" + value + " taking " + base, new Exception()); + dt = base; + } + return dt; } Added: mmbase/trunk/core/src/main/java/org/mmbase/util/functions/FunctionParameters.java =================================================================== --- mmbase/trunk/core/src/main/java/org/mmbase/util/functions/FunctionParameters.java (rev 0) +++ mmbase/trunk/core/src/main/java/org/mmbase/util/functions/FunctionParameters.java 2009-08-10 16:21:19 UTC (rev 37649) @@ -0,0 +1,37 @@ +/* + +This software is OSI Certified Open Source Software. +OSI Certified is a certification mark of the Open Source Initiative. + +The license (Mozilla version 1.0) can be read at the MMBase site. +See http://www.MMBase.org/license + +*/ +package org.mmbase.util.functions; +import java.lang.annotation.*; + +/** + * This annotation can be used on a Bean which is to be wrapped in a {...@link BeanFunction} to + * explicitely defined which setters must be interpreted as function parameters. Sometimes the class + * as more general use, and not all setter methods must be exposed. + * + * You can explicitely state all parameter names, or say that only the with {...@link Type} annotated setters must be considered (or both). + * + * + * @author Michiel Meeuwissen + * @version $Id: Required.java 34900 2009-05-01 16:29:42Z michiel $ + * @since MMBase-1.9.2 + */ +...@retention(RetentionPolicy.RUNTIME) +...@target({ElementType.TYPE}) +public @interface FunctionParameters { + + + String[] value() default {""}; + + /** + * If set to true, only setters annotated with {...@link #Type} are considered function parameters + */ + boolean annotated() default false; + +} Modified: mmbase/trunk/core/src/main/java/org/mmbase/util/functions/Name.java =================================================================== --- mmbase/trunk/core/src/main/java/org/mmbase/util/functions/Name.java 2009-08-10 14:40:57 UTC (rev 37648) +++ mmbase/trunk/core/src/main/java/org/mmbase/util/functions/Name.java 2009-08-10 16:21:19 UTC (rev 37649) @@ -19,7 +19,7 @@ * @since MMBase-1.9 */ @Retention(RetentionPolicy.RUNTIME) -...@target(ElementType.PARAMETER) +...@target({ElementType.PARAMETER, ElementType.METHOD}) public @interface Name { String value(); _______________________________________________ Cvs mailing list Cvs@lists.mmbase.org http://lists.mmbase.org/mailman/listinfo/cvs