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

Reply via email to