You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2011/01/17 09:48:56 UTC

svn commit: r1059813 [7/10] - in /incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets: ./ actcoll/typeof/ actions/ actions/choices/ actions/debug/ actions/debug/annotation/ actions/defaults/ actions/describedas/ acti...

Copied: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/method/ActionChoicesFacetViaMethod.java (from r1056832, incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/choices/ActionChoicesFacetViaMethod.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/method/ActionChoicesFacetViaMethod.java?p2=incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/method/ActionChoicesFacetViaMethod.java&p1=incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/choices/ActionChoicesFacetViaMethod.java&r1=1056832&r2=1059813&rev=1059813&view=diff
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/choices/ActionChoicesFacetViaMethod.java (original)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/method/ActionChoicesFacetViaMethod.java Mon Jan 17 08:48:40 2011
@@ -17,7 +17,7 @@
  *  under the License.
  */
 
-package org.apache.isis.core.progmodel.facets.actions.choices;
+package org.apache.isis.core.progmodel.facets.param.choices.method;
 
 import java.lang.reflect.Method;
 import java.util.Collections;
@@ -32,7 +32,8 @@ import org.apache.isis.core.metamodel.fa
 import org.apache.isis.core.metamodel.spec.DomainModelException;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLookup;
-import org.apache.isis.core.progmodel.facets.ArrayUtil;
+import org.apache.isis.core.progmodel.facets.param.choices.ActionChoicesFacetAbstract;
+import org.apache.isis.core.progmodel.util.ArrayUtil;
 
 public class ActionChoicesFacetViaMethod extends ActionChoicesFacetAbstract implements ImperativeFacet {
 

Added: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetFactory.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetFactory.java?rev=1059813&view=auto
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetFactory.java (added)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetFactory.java Mon Jan 17 08:48:40 2011
@@ -0,0 +1,133 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.progmodel.facets.param.choices.methodnum;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.apache.isis.core.commons.lang.NameUtils;
+import org.apache.isis.core.metamodel.adapter.map.AdapterMap;
+import org.apache.isis.core.metamodel.adapter.map.AdapterMapAware;
+import org.apache.isis.core.metamodel.exceptions.MetaModelException;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
+import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
+import org.apache.isis.core.metamodel.facets.actions.choices.ActionChoicesFacet;
+import org.apache.isis.core.metamodel.methodutils.MethodScope;
+import org.apache.isis.core.progmodel.facets.MethodFinderUtils;
+import org.apache.isis.core.progmodel.facets.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.isis.core.progmodel.facets.MethodPrefixConstants;
+
+/**
+ * Sets up all the {@link Facet}s for an action in a single shot.
+ */
+public class ActionParameterChoicesFacetFactory extends MethodPrefixBasedFacetFactoryAbstract implements AdapterMapAware {
+
+
+    private static final String[] PREFIXES = {  };
+
+    private AdapterMap adapterMap;
+
+    /**
+     * Note that the {@link Facet}s registered are the generic ones from noa-architecture (where they exist)
+     */
+    public ActionParameterChoicesFacetFactory() {
+        super(FeatureType.ACTIONS_ONLY, PREFIXES);
+    }
+
+    // ///////////////////////////////////////////////////////
+    // Actions
+    // ///////////////////////////////////////////////////////
+
+    @Override
+    public void process(ProcessMethodContext processMethodContext) {
+
+        final FacetedMethod facetedMethod = processMethodContext.getFacetHolder();
+        final List<FacetedMethodParameter> holderList = facetedMethod.getParameters();
+
+        attachChoicesFacetForParametersIfChoicesNumMethodIsFound(processMethodContext, holderList);
+
+    }
+
+    private void attachChoicesFacetForParametersIfChoicesNumMethodIsFound(
+        final ProcessMethodContext processMethodContext, final List<FacetedMethodParameter> parameters) {
+
+        if (parameters.isEmpty()) {
+            return;
+        }
+
+        final Method actionMethod = processMethodContext.getMethod();
+        final Class<?>[] params = actionMethod.getParameterTypes();
+
+        for (int i = 0; i < params.length; i++) {
+            
+            final Class<?> arrayOfParamType = (Array.newInstance(params[i], 0)).getClass();
+
+            Method choicesMethod = findChoicesNumMethodReturning(processMethodContext, i, arrayOfParamType);
+            if (choicesMethod == null) {
+                choicesMethod = findChoicesNumMethodReturning(processMethodContext, i, List.class);
+            }
+            if (choicesMethod == null) {
+                continue;
+            }
+            processMethodContext.removeMethod(choicesMethod);
+
+            final FacetedMethod facetedMethod = processMethodContext.getFacetHolder();
+            if (facetedMethod.containsDoOpFacet(ActionChoicesFacet.class)) {
+                Class<?> cls = processMethodContext.getCls();
+                throw new MetaModelException(cls
+                    + " uses both old and new choices syntax - must use one or other");
+            }
+
+            // add facets directly to parameters, not to actions
+            final FacetedMethodParameter paramAsHolder = parameters.get(i);
+            FacetUtil.addFacet(new ActionParameterChoicesFacetViaMethod(choicesMethod, arrayOfParamType, paramAsHolder,
+                getSpecificationLookup(), getAdapterMap()));
+        }
+    }
+
+    private Method findChoicesNumMethodReturning(final ProcessMethodContext processMethodContext, int i,
+        final Class<?> arrayOfParamType) {
+        
+        Class<?> cls = processMethodContext.getCls();
+        final Method actionMethod = processMethodContext.getMethod();
+        final String capitalizedName = NameUtils.capitalizeName(actionMethod.getName());
+        String name = MethodPrefixConstants.CHOICES_PREFIX + i + capitalizedName;
+        return MethodFinderUtils.findMethod(cls, MethodScope.OBJECT, name, arrayOfParamType, new Class[0]);
+    }
+
+
+    // ///////////////////////////////////////////////////////////////
+    // Dependencies
+    // ///////////////////////////////////////////////////////////////
+
+    @Override
+    public void setAdapterMap(AdapterMap adapterMap) {
+        this.adapterMap = adapterMap;
+    }
+
+    private AdapterMap getAdapterMap() {
+        return adapterMap;
+    }
+
+}

Copied: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java (from r1056832, incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/choices/ActionParameterChoicesFacetViaMethod.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java?p2=incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java&p1=incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/choices/ActionParameterChoicesFacetViaMethod.java&r1=1056832&r2=1059813&rev=1059813&view=diff
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/choices/ActionParameterChoicesFacetViaMethod.java (original)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java Mon Jan 17 08:48:40 2011
@@ -18,7 +18,7 @@
  */
 
 
-package org.apache.isis.core.progmodel.facets.actions.choices;
+package org.apache.isis.core.progmodel.facets.param.choices.methodnum;
 
 import java.lang.reflect.Method;
 import java.util.Collections;
@@ -32,7 +32,8 @@ import org.apache.isis.core.metamodel.fa
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLookup;
-import org.apache.isis.core.progmodel.facets.ArrayUtil;
+import org.apache.isis.core.progmodel.facets.param.choices.ActionParameterChoicesFacetAbstract;
+import org.apache.isis.core.progmodel.util.ArrayUtil;
 
 
 

Copied: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/ActionDefaultsFacetAbstract.java (from r1056813, incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/ActionDefaultsFacetAbstract.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/ActionDefaultsFacetAbstract.java?p2=incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/ActionDefaultsFacetAbstract.java&p1=incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/ActionDefaultsFacetAbstract.java&r1=1056813&r2=1059813&rev=1059813&view=diff
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/ActionDefaultsFacetAbstract.java (original)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/ActionDefaultsFacetAbstract.java Mon Jan 17 08:48:40 2011
@@ -18,7 +18,7 @@
  */
 
 
-package org.apache.isis.core.progmodel.facets.actions.defaults;
+package org.apache.isis.core.progmodel.facets.param.defaults;
 
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;

Copied: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/ActionDefaultsFacetNone.java (from r1056813, incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/ActionDefaultsFacetNone.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/ActionDefaultsFacetNone.java?p2=incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/ActionDefaultsFacetNone.java&p1=incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/ActionDefaultsFacetNone.java&r1=1056813&r2=1059813&rev=1059813&view=diff
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/ActionDefaultsFacetNone.java (original)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/ActionDefaultsFacetNone.java Mon Jan 17 08:48:40 2011
@@ -18,7 +18,7 @@
  */
 
 
-package org.apache.isis.core.progmodel.facets.actions.defaults;
+package org.apache.isis.core.progmodel.facets.param.defaults;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;

Copied: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/ActionParameterDefaultsFacetAbstract.java (from r1056813, incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/ActionParameterDefaultsFacetAbstract.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/ActionParameterDefaultsFacetAbstract.java?p2=incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/ActionParameterDefaultsFacetAbstract.java&p1=incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/ActionParameterDefaultsFacetAbstract.java&r1=1056813&r2=1059813&rev=1059813&view=diff
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/ActionParameterDefaultsFacetAbstract.java (original)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/ActionParameterDefaultsFacetAbstract.java Mon Jan 17 08:48:40 2011
@@ -18,7 +18,7 @@
  */
 
 
-package org.apache.isis.core.progmodel.facets.actions.defaults;
+package org.apache.isis.core.progmodel.facets.param.defaults;
 
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;

Copied: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/ActionParameterDefaultsFacetNone.java (from r1056813, incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/ActionParameterDefaultsFacetNone.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/ActionParameterDefaultsFacetNone.java?p2=incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/ActionParameterDefaultsFacetNone.java&p1=incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/ActionParameterDefaultsFacetNone.java&r1=1056813&r2=1059813&rev=1059813&view=diff
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/ActionParameterDefaultsFacetNone.java (original)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/ActionParameterDefaultsFacetNone.java Mon Jan 17 08:48:40 2011
@@ -18,7 +18,7 @@
  */
 
 
-package org.apache.isis.core.progmodel.facets.actions.defaults;
+package org.apache.isis.core.progmodel.facets.param.defaults;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;

Added: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/method/ActionDefaultsFacetFactory.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/method/ActionDefaultsFacetFactory.java?rev=1059813&view=auto
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/method/ActionDefaultsFacetFactory.java (added)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/method/ActionDefaultsFacetFactory.java Mon Jan 17 08:48:40 2011
@@ -0,0 +1,108 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.progmodel.facets.param.defaults.method;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.apache.isis.core.commons.lang.NameUtils;
+import org.apache.isis.core.metamodel.adapter.map.AdapterMap;
+import org.apache.isis.core.metamodel.adapter.map.AdapterMapAware;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.methodutils.MethodScope;
+import org.apache.isis.core.progmodel.facets.MethodFinderUtils;
+import org.apache.isis.core.progmodel.facets.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.isis.core.progmodel.facets.MethodPrefixConstants;
+
+/**
+ * Sets up all the {@link Facet}s for an action in a single shot.
+ */
+public class ActionDefaultsFacetFactory extends MethodPrefixBasedFacetFactoryAbstract implements AdapterMapAware {
+
+
+    private static final String[] PREFIXES = { MethodPrefixConstants.DEFAULT_PREFIX };
+
+    private AdapterMap adapterMap;
+
+    /**
+     * Note that the {@link Facet}s registered are the generic ones from noa-architecture (where they exist)
+     */
+    public ActionDefaultsFacetFactory() {
+        super(FeatureType.ACTIONS_ONLY, PREFIXES);
+    }
+
+    // ///////////////////////////////////////////////////////
+    // Actions
+    // ///////////////////////////////////////////////////////
+
+    @Override
+    public void process(ProcessMethodContext processMethodContext) {
+
+        attachActionDefaultsFacetIfParameterDefaultsMethodIsFound(processMethodContext);
+    }
+
+
+    private static void attachActionDefaultsFacetIfParameterDefaultsMethodIsFound(
+        final ProcessMethodContext processMethodContext) {
+
+        Method defaultsMethod =
+                findDefaultsMethodReturning(processMethodContext, Object[].class);
+        if (defaultsMethod == null) {
+            defaultsMethod =
+                findDefaultsMethodReturning(processMethodContext, List.class);
+        }
+        if (defaultsMethod == null) {
+            return;
+        }
+        
+        processMethodContext.removeMethod(defaultsMethod);
+
+        final FacetHolder facetedMethod = processMethodContext.getFacetHolder();
+        final ActionDefaultsFacetViaMethod facet = new ActionDefaultsFacetViaMethod(defaultsMethod, facetedMethod);
+        FacetUtil.addFacet(facet);
+    }
+
+    private static Method findDefaultsMethodReturning(final ProcessMethodContext processMethodContext, final Class<?> returnType) {
+
+        final Method actionMethod = processMethodContext.getMethod();
+        final String capitalizedName = NameUtils.capitalizeName(actionMethod.getName());
+        String name = MethodPrefixConstants.DEFAULT_PREFIX + capitalizedName;
+
+        Class<?> cls = processMethodContext.getCls();
+        return MethodFinderUtils.findMethod(cls, MethodScope.OBJECT, name, returnType, new Class[0]);
+    }
+
+    // ///////////////////////////////////////////////////////////////
+    // Dependencies
+    // ///////////////////////////////////////////////////////////////
+
+    @Override
+    public void setAdapterMap(AdapterMap adapterMap) {
+        this.adapterMap = adapterMap;
+    }
+
+    private AdapterMap getAdapterMap() {
+        return adapterMap;
+    }
+
+}

Copied: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/method/ActionDefaultsFacetViaMethod.java (from r1056813, incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/ActionDefaultsFacetViaMethod.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/method/ActionDefaultsFacetViaMethod.java?p2=incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/method/ActionDefaultsFacetViaMethod.java&p1=incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/ActionDefaultsFacetViaMethod.java&r1=1056813&r2=1059813&rev=1059813&view=diff
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/ActionDefaultsFacetViaMethod.java (original)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/method/ActionDefaultsFacetViaMethod.java Mon Jan 17 08:48:40 2011
@@ -18,7 +18,7 @@
  */
 
 
-package org.apache.isis.core.progmodel.facets.actions.defaults;
+package org.apache.isis.core.progmodel.facets.param.defaults.method;
 
 import java.lang.reflect.Method;
 import java.util.Collections;
@@ -31,6 +31,7 @@ import org.apache.isis.core.metamodel.fa
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.actions.invoke.ActionInvocationFacet;
 import org.apache.isis.core.progmodel.facets.actions.invoke.ActionInvocationFacetViaMethod;
+import org.apache.isis.core.progmodel.facets.param.defaults.ActionDefaultsFacetAbstract;
 
 
 public class ActionDefaultsFacetViaMethod extends ActionDefaultsFacetAbstract implements ImperativeFacet {
@@ -57,34 +58,25 @@ public class ActionDefaultsFacetViaMetho
     /**
      * Returns a singleton list of the {@link Method} provided in the constructor. 
      */
+    @Override
     public List<Method> getMethods() {
     	return Collections.singletonList(method);
     }
 
+    @Override
     public boolean impliesResolve() {
     	return true;
     }
     
+    @Override
     public boolean impliesObjectChanged() {
     	return false;
     }
     
 
+    @Override
     public Object[] getDefaults(final ObjectAdapter owningAdapter) {
-        final Object[] defaults = (Object[]) AdapterInvokeUtils.invoke(method, owningAdapter);
-        return defaults;
-
-        // TODO fix the setting up actionMethod so that we can check the types.
-
-        /*
-         * ObjectAdapter[] array = new ObjectAdapter[defaults.length]; // if (actionMethod != null) {
-         * ObjectReflector reflector = IsisContext.getReflector(); // Class[] parameterTypes =
-         * actionMethod.getParameterTypes(); for (int i = 0; i < array.length; i++) { // Class parameterType =
-         * parameterTypes[i]; // ObjectSpecification paramSpecification =
-         * reflector.loadSpecification(parameterType); // if (paramSpecification.isObject()) { array[i] =
-         * PersistorUtil.createAdapter(defaults[i]); / } else { throw new
-         * UnknownTypeException(paramSpecification.getFullName()); } / } //} return (ObjectAdapter[]) array;
-         */
+        return (Object[]) AdapterInvokeUtils.invoke(method, owningAdapter);
     }
 
     @Override

Added: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetFactory.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetFactory.java?rev=1059813&view=auto
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetFactory.java (added)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetFactory.java Mon Jan 17 08:48:40 2011
@@ -0,0 +1,120 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.progmodel.facets.param.defaults.methodnum;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.apache.isis.core.commons.lang.NameUtils;
+import org.apache.isis.core.metamodel.adapter.map.AdapterMap;
+import org.apache.isis.core.metamodel.adapter.map.AdapterMapAware;
+import org.apache.isis.core.metamodel.exceptions.MetaModelException;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
+import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
+import org.apache.isis.core.metamodel.facets.actions.defaults.ActionDefaultsFacet;
+import org.apache.isis.core.metamodel.methodutils.MethodScope;
+import org.apache.isis.core.progmodel.facets.MethodFinderUtils;
+import org.apache.isis.core.progmodel.facets.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.isis.core.progmodel.facets.MethodPrefixConstants;
+
+/**
+ * Sets up all the {@link Facet}s for an action in a single shot.
+ */
+public class ActionParameterDefaultsFacetFactory extends MethodPrefixBasedFacetFactoryAbstract implements AdapterMapAware {
+
+
+    private static final String[] PREFIXES = {  };
+
+    private AdapterMap adapterMap;
+
+    /**
+     * Note that the {@link Facet}s registered are the generic ones from noa-architecture (where they exist)
+     */
+    public ActionParameterDefaultsFacetFactory() {
+        super(FeatureType.ACTIONS_ONLY, PREFIXES);
+    }
+
+    // ///////////////////////////////////////////////////////
+    // Actions
+    // ///////////////////////////////////////////////////////
+
+    @Override
+    public void process(ProcessMethodContext processMethodContext) {
+
+        final FacetedMethod facetedMethod = processMethodContext.getFacetHolder();
+        final List<FacetedMethodParameter> holderList = facetedMethod.getParameters();
+
+        attachDefaultFacetForParametersIfDefaultsNumMethodIsFound(processMethodContext, holderList);
+    }
+
+    private static void attachDefaultFacetForParametersIfDefaultsNumMethodIsFound(
+        final ProcessMethodContext processMethodContext, final List<FacetedMethodParameter> parameters) {
+
+        if (parameters.isEmpty()) {
+            return;
+        }
+
+        final Class<?> cls = processMethodContext.getCls();
+        final Method actionMethod = processMethodContext.getMethod();
+
+        final Class<?>[] paramTypes = actionMethod.getParameterTypes();
+        final String capitalizedName = NameUtils.capitalizeName(actionMethod.getName());
+
+        for (int i = 0; i < paramTypes.length; i++) {
+
+            final Method defaultMethod =
+                MethodFinderUtils.findMethod(cls, MethodScope.OBJECT, MethodPrefixConstants.DEFAULT_PREFIX + i
+                    + capitalizedName, paramTypes[i], new Class[0]);
+
+            if (defaultMethod == null) {
+                continue;
+            }
+            processMethodContext.removeMethod(defaultMethod);
+
+            final FacetedMethod facetedMethod = processMethodContext.getFacetHolder();
+            if (facetedMethod.containsDoOpFacet(ActionDefaultsFacet.class)) {
+                throw new MetaModelException(cls
+                    + " uses both old and new default syntax for " + actionMethod.getName() + "(...) - must use one or other");
+            }
+
+            // add facets directly to parameters, not to actions
+            final FacetedMethodParameter paramAsHolder = parameters.get(i);
+            FacetUtil.addFacet(new ActionParameterDefaultsFacetViaMethod(defaultMethod, paramAsHolder));
+        }
+    }
+
+
+    // ///////////////////////////////////////////////////////////////
+    // Dependencies
+    // ///////////////////////////////////////////////////////////////
+
+    @Override
+    public void setAdapterMap(AdapterMap adapterMap) {
+        this.adapterMap = adapterMap;
+    }
+
+    private AdapterMap getAdapterMap() {
+        return adapterMap;
+    }
+
+}

Copied: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java (from r1056813, incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/ActionParameterDefaultsFacetViaMethod.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java?p2=incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java&p1=incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/ActionParameterDefaultsFacetViaMethod.java&r1=1056813&r2=1059813&rev=1059813&view=diff
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/defaults/ActionParameterDefaultsFacetViaMethod.java (original)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java Mon Jan 17 08:48:40 2011
@@ -18,7 +18,7 @@
  */
 
 
-package org.apache.isis.core.progmodel.facets.actions.defaults;
+package org.apache.isis.core.progmodel.facets.param.defaults.methodnum;
 
 import java.lang.reflect.Method;
 import java.util.Collections;
@@ -28,6 +28,7 @@ import org.apache.isis.core.metamodel.ad
 import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.progmodel.facets.param.defaults.ActionParameterDefaultsFacetAbstract;
 
 
 public class ActionParameterDefaultsFacetViaMethod extends ActionParameterDefaultsFacetAbstract implements ImperativeFacet {

Added: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/describedas/staticmethod/ActionParameterDescriptionsMethodFacetFactory.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/describedas/staticmethod/ActionParameterDescriptionsMethodFacetFactory.java?rev=1059813&view=auto
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/describedas/staticmethod/ActionParameterDescriptionsMethodFacetFactory.java (added)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/describedas/staticmethod/ActionParameterDescriptionsMethodFacetFactory.java Mon Jan 17 08:48:40 2011
@@ -0,0 +1,122 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.progmodel.facets.param.describedas.staticmethod;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.apache.isis.core.commons.lang.NameUtils;
+import org.apache.isis.core.metamodel.adapter.map.AdapterMap;
+import org.apache.isis.core.metamodel.adapter.map.AdapterMapAware;
+import org.apache.isis.core.metamodel.adapter.util.InvokeUtils;
+import org.apache.isis.core.metamodel.exceptions.MetaModelException;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
+import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
+import org.apache.isis.core.metamodel.methodutils.MethodScope;
+import org.apache.isis.core.progmodel.facets.MethodFinderUtils;
+import org.apache.isis.core.progmodel.facets.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.isis.core.progmodel.facets.MethodPrefixConstants;
+import org.apache.isis.core.progmodel.facets.members.describedas.staticmethod.DescribedAsFacetViaMethod;
+
+public class ActionParameterDescriptionsMethodFacetFactory extends MethodPrefixBasedFacetFactoryAbstract implements AdapterMapAware {
+
+    private static final String[] PREFIXES = { MethodPrefixConstants.DESCRIPTION_PREFIX };
+
+    private AdapterMap adapterMap;
+
+    /**
+     * Note that the {@link Facet}s registered are the generic ones from noa-architecture (where they exist)
+     */
+    public ActionParameterDescriptionsMethodFacetFactory() {
+        super(FeatureType.ACTIONS_ONLY, PREFIXES);
+    }
+
+    // ///////////////////////////////////////////////////////
+    // Actions
+    // ///////////////////////////////////////////////////////
+
+    @Override
+    public void process(ProcessMethodContext processMethodContext) {
+
+        final FacetedMethod facetedMethod = processMethodContext.getFacetHolder();
+        final List<FacetedMethodParameter> holderList = facetedMethod.getParameters();
+
+        attachDescribedAsFacetForParametersIfParameterDescriptionsMethodIsFound(processMethodContext, holderList);
+    }
+
+    private static void attachDescribedAsFacetForParametersIfParameterDescriptionsMethodIsFound(
+        final ProcessMethodContext processMethodContext, final List<FacetedMethodParameter> parameters) {
+
+        if (parameters.isEmpty()) {
+            return;
+        }
+
+        final Method actionMethod = processMethodContext.getMethod();
+
+        final String capitalizedName = NameUtils.capitalizeName(actionMethod.getName());
+
+        Class<?> cls = processMethodContext.getCls();
+        final Method descriptionMethod =
+            MethodFinderUtils.findMethod(cls, MethodScope.CLASS, MethodPrefixConstants.DESCRIPTION_PREFIX
+                + capitalizedName, String[].class, new Class[0]);
+        if (descriptionMethod == null) {
+            return;
+        }
+        processMethodContext.removeMethod(descriptionMethod);
+
+        String[] descriptions = invokeDescriptionsMethod(descriptionMethod, parameters.size());
+        for (int i = 0; i < descriptions.length; i++) {
+            // add facets directly to parameters, not to actions
+            FacetUtil.addFacet(new DescribedAsFacetViaMethod(descriptions[i], descriptionMethod, parameters.get(i)));
+        }
+    }
+
+    private static String[] invokeDescriptionsMethod(final Method descriptionMethod, final int numElementsRequired) {
+        String[] descriptions = null;
+        try {
+            descriptions = (String[]) InvokeUtils.invokeStatic(descriptionMethod, new Object[0]);
+        } catch(ClassCastException ex) {
+            // ignore
+        }
+        if(descriptions==null || descriptions.length != numElementsRequired) {
+            throw new MetaModelException(descriptionMethod + " must return an String[] array of same size as number of parameters of action");
+        }
+        return descriptions;
+    }
+
+
+
+    // ///////////////////////////////////////////////////////////////
+    // Dependencies
+    // ///////////////////////////////////////////////////////////////
+
+    @Override
+    public void setAdapterMap(AdapterMap adapterMap) {
+        this.adapterMap = adapterMap;
+    }
+
+    private AdapterMap getAdapterMap() {
+        return adapterMap;
+    }
+
+}

Copied: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/mandatory/staticmethod/MandatoryFacetOverriddenByMethod.java (from r1056813, incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/MandatoryFacetOverriddenByMethod.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/mandatory/staticmethod/MandatoryFacetOverriddenByMethod.java?p2=incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/mandatory/staticmethod/MandatoryFacetOverriddenByMethod.java&p1=incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/MandatoryFacetOverriddenByMethod.java&r1=1056813&r2=1059813&rev=1059813&view=diff
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/actions/MandatoryFacetOverriddenByMethod.java (original)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/mandatory/staticmethod/MandatoryFacetOverriddenByMethod.java Mon Jan 17 08:48:40 2011
@@ -18,7 +18,7 @@
  */
 
 
-package org.apache.isis.core.progmodel.facets.actions;
+package org.apache.isis.core.progmodel.facets.param.mandatory.staticmethod;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;

Added: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/named/staticmethod/ActionParameterNamesMethodFacetFactory.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/named/staticmethod/ActionParameterNamesMethodFacetFactory.java?rev=1059813&view=auto
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/named/staticmethod/ActionParameterNamesMethodFacetFactory.java (added)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/param/named/staticmethod/ActionParameterNamesMethodFacetFactory.java Mon Jan 17 08:48:40 2011
@@ -0,0 +1,126 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.progmodel.facets.param.named.staticmethod;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.apache.isis.core.commons.lang.NameUtils;
+import org.apache.isis.core.metamodel.adapter.map.AdapterMap;
+import org.apache.isis.core.metamodel.adapter.map.AdapterMapAware;
+import org.apache.isis.core.metamodel.adapter.util.InvokeUtils;
+import org.apache.isis.core.metamodel.exceptions.MetaModelException;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
+import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
+import org.apache.isis.core.metamodel.methodutils.MethodScope;
+import org.apache.isis.core.progmodel.facets.MethodFinderUtils;
+import org.apache.isis.core.progmodel.facets.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.isis.core.progmodel.facets.MethodPrefixConstants;
+import org.apache.isis.core.progmodel.facets.members.name.staticmethod.NamedFacetViaMethod;
+
+/**
+ * Sets up all the {@link Facet}s for an action in a single shot.
+ */
+public class ActionParameterNamesMethodFacetFactory extends MethodPrefixBasedFacetFactoryAbstract implements AdapterMapAware {
+
+    private static final String[] PREFIXES = { MethodPrefixConstants.NAME_PREFIX };
+
+    private AdapterMap adapterMap;
+
+    /**
+     * Note that the {@link Facet}s registered are the generic ones from noa-architecture (where they exist)
+     */
+    public ActionParameterNamesMethodFacetFactory() {
+        super(FeatureType.ACTIONS_ONLY, PREFIXES);
+    }
+
+    // ///////////////////////////////////////////////////////
+    // Actions
+    // ///////////////////////////////////////////////////////
+
+    @Override
+    public void process(ProcessMethodContext processMethodContext) {
+
+        final FacetedMethod facetedMethod = processMethodContext.getFacetHolder();
+        final List<FacetedMethodParameter> holderList = facetedMethod.getParameters();
+
+        attachNamedFacetForParametersIfParameterNamesMethodIsFound(processMethodContext, holderList);
+    }
+
+    private static void attachNamedFacetForParametersIfParameterNamesMethodIsFound(
+        final ProcessMethodContext processMethodContext, final List<FacetedMethodParameter> parameters) {
+
+        if (parameters.isEmpty()) {
+            return;
+        }
+
+        final Method actionMethod = processMethodContext.getMethod();
+        final String capitalizedName = NameUtils.capitalizeName(actionMethod.getName());
+
+        Class<?> cls = processMethodContext.getCls();
+        Method namesMethod =
+            MethodFinderUtils.findMethod(cls, MethodScope.CLASS, MethodPrefixConstants.NAME_PREFIX + capitalizedName,
+                String[].class, new Class[0]);
+        if (namesMethod == null) {
+            return;
+        }
+        try {
+            String[] names = invokeNamesMethod(namesMethod, parameters.size());
+            for (int i = 0; i < names.length; i++) {
+                // add facets directly to parameters, not to actions
+                FacetUtil.addFacet(new NamedFacetViaMethod(names[i], namesMethod, parameters.get(i)));
+            }
+        } finally {
+            processMethodContext.removeMethod(namesMethod);
+        }
+    }
+
+    private static String[] invokeNamesMethod(Method namesMethod, final int numElementsRequired) {
+        String[] names = null;
+        try {
+            names = (String[]) InvokeUtils.invokeStatic(namesMethod, new Object[0]);
+        } catch(ClassCastException ex) {
+            // ignore
+        }
+        if(names==null || names.length != numElementsRequired) {
+            throw new MetaModelException(namesMethod + " must return an String[] array of same size as number of parameters of action");
+        }
+        return names;
+    }
+
+
+
+    // ///////////////////////////////////////////////////////////////
+    // Dependencies
+    // ///////////////////////////////////////////////////////////////
+
+    @Override
+    public void setAdapterMap(AdapterMap adapterMap) {
+        this.adapterMap = adapterMap;
+    }
+
+    private AdapterMap getAdapterMap() {
+        return adapterMap;
+    }
+
+}

Modified: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/propcoll/notpersisted/NotPersistedAnnotationFacetFactory.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/propcoll/notpersisted/NotPersistedAnnotationFacetFactory.java?rev=1059813&r1=1059812&r2=1059813&view=diff
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/propcoll/notpersisted/NotPersistedAnnotationFacetFactory.java (original)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/propcoll/notpersisted/NotPersistedAnnotationFacetFactory.java Mon Jan 17 08:48:40 2011
@@ -20,13 +20,11 @@
 
 package org.apache.isis.core.progmodel.facets.propcoll.notpersisted;
 
-import java.lang.reflect.Method;
 
 import org.apache.isis.applib.annotation.NotPersisted;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facetapi.MethodRemover;
 import org.apache.isis.core.metamodel.facets.AnnotationBasedFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.propcoll.notpersisted.NotPersistedFacet;
 
@@ -38,9 +36,9 @@ public class NotPersistedAnnotationFacet
     }
 
     @Override
-    public boolean process(Class<?> cls, final Method method, final MethodRemover methodRemover, final FacetHolder holder) {
-        final NotPersisted annotation = getAnnotation(method, NotPersisted.class);
-        return FacetUtil.addFacet(create(annotation, holder));
+    public void process(ProcessMethodContext processMethodContext) {
+        final NotPersisted annotation = getAnnotation(processMethodContext.getMethod(), NotPersisted.class);
+        FacetUtil.addFacet(create(annotation, processMethodContext.getFacetHolder()));
     }
 
     private NotPersistedFacet create(final NotPersisted annotation, final FacetHolder holder) {

Added: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/accessor/PropertyAccessorFacetFactory.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/accessor/PropertyAccessorFacetFactory.java?rev=1059813&view=auto
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/accessor/PropertyAccessorFacetFactory.java (added)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/accessor/PropertyAccessorFacetFactory.java Mon Jan 17 08:48:40 2011
@@ -0,0 +1,113 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+
+package org.apache.isis.core.progmodel.facets.properties.accessor;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facetapi.MethodRemover;
+import org.apache.isis.core.metamodel.methodutils.MethodScope;
+import org.apache.isis.core.progmodel.facets.MethodPrefixConstants;
+import org.apache.isis.core.progmodel.facets.PropertyOrCollectionIdentifyingFacetFactoryAbstract;
+
+
+public class PropertyAccessorFacetFactory extends PropertyOrCollectionIdentifyingFacetFactoryAbstract {
+
+    private static final String[] PREFIXES = { MethodPrefixConstants.GET_PREFIX, MethodPrefixConstants.IS_PREFIX };
+
+    public PropertyAccessorFacetFactory() {
+        super(FeatureType.PROPERTIES_ONLY, PREFIXES);
+    }
+
+    @Override
+    public void process(ProcessMethodContext processMethodContext) {
+        attachPropertyAccessFacetForAccessorMethod(processMethodContext);
+    }
+
+    private static void attachPropertyAccessFacetForAccessorMethod(ProcessMethodContext processMethodContext) {
+        
+        final Method accessorMethod = processMethodContext.getMethod();
+        
+        processMethodContext.removeMethod(accessorMethod);
+        
+        final FacetHolder property = processMethodContext.getFacetHolder();
+        FacetUtil.addFacet(new PropertyOrCollectionAccessorFacetViaAccessor(accessorMethod, property));
+    }
+
+
+    /////////////////////////////////////////////////////////
+    // PropertyOrCollectionIdentifying
+    /////////////////////////////////////////////////////////
+
+    @Override
+    public boolean isPropertyOrCollectionAccessorCandidate(final Method method) {
+        final String methodName = method.getName();
+        if (methodName.startsWith(MethodPrefixConstants.GET_PREFIX)) {
+            return true;
+        }
+        if (methodName.startsWith(MethodPrefixConstants.IS_PREFIX) && method.getReturnType() == boolean.class) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * The method way well represent a collection, but this facet factory does not have any opinion on the
+     * matter.
+     */
+    @Override
+    public boolean isCollectionAccessor(final Method method) {
+        return false;
+    }
+
+    @Override
+    public boolean isPropertyAccessor(final Method method) {
+        if (!isPropertyOrCollectionAccessorCandidate(method)) {
+            return false;
+        }
+        final Class<?> methodReturnType = method.getReturnType();
+        return isCollectionOrArray(methodReturnType);
+    }
+
+    @Override
+    public void findAndRemovePropertyAccessors(final MethodRemover methodRemover, final List<Method> methodListToAppendTo) {
+        appendMatchingMethods(methodRemover, MethodPrefixConstants.IS_PREFIX, boolean.class, methodListToAppendTo);
+        appendMatchingMethods(methodRemover, MethodPrefixConstants.GET_PREFIX, Object.class, methodListToAppendTo);
+    }
+
+    private static void appendMatchingMethods(final MethodRemover methodRemover, final String prefix,
+        final Class<?> returnType, final List<Method> methodListToAppendTo) {
+        methodListToAppendTo.addAll(methodRemover.removeMethods(MethodScope.OBJECT, prefix, returnType, false, 0));
+    }
+
+    @Override
+    public void findAndRemoveCollectionAccessors(
+    		final MethodRemover methodRemover, 
+    		final List<Method> methodListToAppendTo) {
+        // does nothing
+    }
+
+
+
+}

Copied: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/accessor/PropertyOrCollectionAccessorFacetAbstract.java (from r1056813, incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/propcoll/access/PropertyAccessorFacetAbstract.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/accessor/PropertyOrCollectionAccessorFacetAbstract.java?p2=incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/accessor/PropertyOrCollectionAccessorFacetAbstract.java&p1=incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/propcoll/access/PropertyAccessorFacetAbstract.java&r1=1056813&r2=1059813&rev=1059813&view=diff
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/propcoll/access/PropertyAccessorFacetAbstract.java (original)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/accessor/PropertyOrCollectionAccessorFacetAbstract.java Mon Jan 17 08:48:40 2011
@@ -18,22 +18,22 @@
  */
 
 
-package org.apache.isis.core.progmodel.facets.propcoll.access;
+package org.apache.isis.core.progmodel.facets.properties.accessor;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.propcoll.access.PropertyAccessorFacet;
+import org.apache.isis.core.metamodel.facets.propcoll.access.PropertyOrCollectionAccessorFacet;
 
 
-public abstract class PropertyAccessorFacetAbstract extends FacetAbstract implements PropertyAccessorFacet {
+public abstract class PropertyOrCollectionAccessorFacetAbstract extends FacetAbstract implements PropertyOrCollectionAccessorFacet {
 
     public static Class<? extends Facet> type() {
-        return PropertyAccessorFacet.class;
+        return PropertyOrCollectionAccessorFacet.class;
     }
 
-    public PropertyAccessorFacetAbstract(final FacetHolder holder) {
+    public PropertyOrCollectionAccessorFacetAbstract(final FacetHolder holder) {
         super(type(), holder, false);
     }
 

Copied: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/accessor/PropertyOrCollectionAccessorFacetViaAccessor.java (from r1056813, incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/propcoll/access/PropertyAccessorFacetViaAccessor.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/accessor/PropertyOrCollectionAccessorFacetViaAccessor.java?p2=incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/accessor/PropertyOrCollectionAccessorFacetViaAccessor.java&p1=incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/propcoll/access/PropertyAccessorFacetViaAccessor.java&r1=1056813&r2=1059813&rev=1059813&view=diff
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/propcoll/access/PropertyAccessorFacetViaAccessor.java (original)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/accessor/PropertyOrCollectionAccessorFacetViaAccessor.java Mon Jan 17 08:48:40 2011
@@ -18,7 +18,7 @@
  */
 
 
-package org.apache.isis.core.progmodel.facets.propcoll.access;
+package org.apache.isis.core.progmodel.facets.properties.accessor;
 
 import java.lang.reflect.Method;
 import java.util.Collections;
@@ -31,11 +31,11 @@ import org.apache.isis.core.metamodel.fa
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 
 
-public class PropertyAccessorFacetViaAccessor extends PropertyAccessorFacetAbstract implements ImperativeFacet {
+public class PropertyOrCollectionAccessorFacetViaAccessor extends PropertyOrCollectionAccessorFacetAbstract implements ImperativeFacet {
 
     private final Method method;
 
-    public PropertyAccessorFacetViaAccessor(
+    public PropertyOrCollectionAccessorFacetViaAccessor(
     		final Method method, 
     		final FacetHolder holder) {
         super(holder);

Added: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/choices/PropertyChoicesFacetFactory.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/choices/PropertyChoicesFacetFactory.java?rev=1059813&view=auto
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/choices/PropertyChoicesFacetFactory.java (added)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/choices/PropertyChoicesFacetFactory.java Mon Jan 17 08:48:40 2011
@@ -0,0 +1,84 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+
+package org.apache.isis.core.progmodel.facets.properties.choices;
+
+import java.lang.reflect.Method;
+
+import org.apache.isis.core.commons.lang.NameUtils;
+import org.apache.isis.core.metamodel.adapter.map.AdapterMap;
+import org.apache.isis.core.metamodel.adapter.map.AdapterMapAware;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.methodutils.MethodScope;
+import org.apache.isis.core.progmodel.facets.MethodFinderUtils;
+import org.apache.isis.core.progmodel.facets.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.isis.core.progmodel.facets.MethodPrefixConstants;
+
+
+public class PropertyChoicesFacetFactory extends MethodPrefixBasedFacetFactoryAbstract implements AdapterMapAware {
+
+    private static final String[] PREFIXES = { MethodPrefixConstants.CHOICES_PREFIX };
+
+    private AdapterMap adapterMap;
+
+    public PropertyChoicesFacetFactory() {
+        super(FeatureType.PROPERTIES_ONLY, PREFIXES);
+    }
+
+    @Override
+    public void process(ProcessMethodContext processMethodContext) {
+
+        attachPropertyChoicesFacetIfChoicesMethodIsFound(processMethodContext);
+    }
+
+    private void attachPropertyChoicesFacetIfChoicesMethodIsFound(ProcessMethodContext processMethodContext) {
+        
+        final Method getMethod = processMethodContext.getMethod();
+        final String capitalizedName = NameUtils.javaBaseName(getMethod.getName());
+        
+        Class<?> cls = processMethodContext.getCls();
+        final Class<?> returnType = getMethod.getReturnType();
+        final Method choicesMethod = MethodFinderUtils.findMethod(cls, MethodScope.OBJECT, MethodPrefixConstants.CHOICES_PREFIX + capitalizedName, null, NO_PARAMETERS_TYPES);
+        if (choicesMethod == null) {
+            return;
+        } 
+        processMethodContext.removeMethod(choicesMethod);
+        
+        final FacetHolder property = processMethodContext.getFacetHolder();
+        FacetUtil.addFacet(new PropertyChoicesFacetViaMethod(choicesMethod, returnType, property, getSpecificationLookup(), getAdapterMap()));
+    }
+
+
+    /////////////////////////////////////////////////////////
+    // Dependencies (injected)
+    /////////////////////////////////////////////////////////
+    
+    @Override
+    public void setAdapterMap(AdapterMap adapterManager) {
+        this.adapterMap = adapterManager;
+    }
+
+    protected AdapterMap getAdapterMap() {
+        return adapterMap;
+    }
+
+}

Modified: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/choices/PropertyChoicesFacetViaMethod.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/choices/PropertyChoicesFacetViaMethod.java?rev=1059813&r1=1059812&r2=1059813&view=diff
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/choices/PropertyChoicesFacetViaMethod.java (original)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/choices/PropertyChoicesFacetViaMethod.java Mon Jan 17 08:48:40 2011
@@ -32,7 +32,7 @@ import org.apache.isis.core.metamodel.fa
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLookup;
-import org.apache.isis.core.progmodel.facets.ArrayUtil;
+import org.apache.isis.core.progmodel.util.ArrayUtil;
 
 
 public class PropertyChoicesFacetViaMethod extends PropertyChoicesFacetAbstract implements ImperativeFacet {

Added: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/defaults/PropertyDefaultFacetFactory.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/defaults/PropertyDefaultFacetFactory.java?rev=1059813&view=auto
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/defaults/PropertyDefaultFacetFactory.java (added)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/defaults/PropertyDefaultFacetFactory.java Mon Jan 17 08:48:40 2011
@@ -0,0 +1,83 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+
+package org.apache.isis.core.progmodel.facets.properties.defaults;
+
+import java.lang.reflect.Method;
+
+import org.apache.isis.core.commons.lang.NameUtils;
+import org.apache.isis.core.metamodel.adapter.map.AdapterMap;
+import org.apache.isis.core.metamodel.adapter.map.AdapterMapAware;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.methodutils.MethodScope;
+import org.apache.isis.core.progmodel.facets.MethodFinderUtils;
+import org.apache.isis.core.progmodel.facets.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.isis.core.progmodel.facets.MethodPrefixConstants;
+
+
+public class PropertyDefaultFacetFactory extends MethodPrefixBasedFacetFactoryAbstract implements AdapterMapAware {
+
+    private static final String[] PREFIXES = { MethodPrefixConstants.DEFAULT_PREFIX };
+
+    private AdapterMap adapterMap;
+
+    public PropertyDefaultFacetFactory() {
+        super(FeatureType.PROPERTIES_ONLY, PREFIXES);
+    }
+
+    @Override
+    public void process(ProcessMethodContext processMethodContext) {
+
+        attachPropertyDefaultFacetIfDefaultMethodIsFound(processMethodContext);
+    }
+
+    private void attachPropertyDefaultFacetIfDefaultMethodIsFound(ProcessMethodContext processMethodContext) {
+        
+        final Method getMethod = processMethodContext.getMethod();
+        final String capitalizedName = NameUtils.javaBaseName(getMethod.getName());
+        
+        Class<?> cls = processMethodContext.getCls();
+        final Class<?> returnType = getMethod.getReturnType();
+        final Method method = MethodFinderUtils.findMethod(cls, MethodScope.OBJECT, MethodPrefixConstants.DEFAULT_PREFIX + capitalizedName, returnType, NO_PARAMETERS_TYPES);
+        if (method == null) {
+            return;
+        } 
+        processMethodContext.removeMethod(method);
+        
+        final FacetHolder property = processMethodContext.getFacetHolder();
+        FacetUtil.addFacet(new PropertyDefaultFacetViaMethod(method, property, getSpecificationLookup(), getAdapterMap()));
+    }
+
+    /////////////////////////////////////////////////////////
+    // Dependencies (injected)
+    /////////////////////////////////////////////////////////
+    
+    @Override
+    public void setAdapterMap(AdapterMap adapterManager) {
+        this.adapterMap = adapterManager;
+    }
+
+    protected AdapterMap getAdapterMap() {
+        return adapterMap;
+    }
+
+}

Added: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/mandatory/PropertyOptionalFacetFactory.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/mandatory/PropertyOptionalFacetFactory.java?rev=1059813&view=auto
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/mandatory/PropertyOptionalFacetFactory.java (added)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/mandatory/PropertyOptionalFacetFactory.java Mon Jan 17 08:48:40 2011
@@ -0,0 +1,90 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+
+package org.apache.isis.core.progmodel.facets.properties.mandatory;
+
+import java.lang.reflect.Method;
+
+import org.apache.isis.core.commons.lang.NameUtils;
+import org.apache.isis.core.metamodel.adapter.util.InvokeUtils;
+import org.apache.isis.core.metamodel.exceptions.MetaModelException;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.methodutils.MethodScope;
+import org.apache.isis.core.progmodel.facets.MethodFinderUtils;
+import org.apache.isis.core.progmodel.facets.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.isis.core.progmodel.facets.MethodPrefixConstants;
+import org.apache.isis.core.progmodel.facets.param.mandatory.staticmethod.MandatoryFacetOverriddenByMethod;
+
+
+public class PropertyOptionalFacetFactory extends MethodPrefixBasedFacetFactoryAbstract {
+
+    private static final String[] PREFIXES = { MethodPrefixConstants.OPTIONAL_PREFIX };
+
+    public PropertyOptionalFacetFactory() {
+        super(FeatureType.PROPERTIES_ONLY, PREFIXES);
+    }
+
+    @Override
+    public void process(ProcessMethodContext processMethodContext) {
+
+        attachMandatoryFacetIfOptionalMethodIsFound(processMethodContext);
+    }
+
+    private static void attachMandatoryFacetIfOptionalMethodIsFound(ProcessMethodContext processMethodContext) {
+        final Method method = processMethodContext.getMethod();
+        
+        final String capitalizedName = NameUtils.javaBaseName(method.getName());
+        final Class<?> returnType = method.getReturnType();
+        
+        Class<?> cls = processMethodContext.getCls();
+        final Method optionalMethod = MethodFinderUtils.findMethod(cls, MethodScope.CLASS, MethodPrefixConstants.OPTIONAL_PREFIX + capitalizedName, boolean.class, NO_PARAMETERS_TYPES);
+        processMethodContext.removeMethod(optionalMethod);
+        
+        if (!indicatesOptional(optionalMethod)) {
+            return;
+        } 
+        if (returnType.isPrimitive()) {
+            throw new MetaModelException(
+                cls.getName() + "#" + capitalizedName + " cannot be an optional property as it is of a primitive type");
+        } 
+        final FacetHolder property = processMethodContext.getFacetHolder();
+        FacetUtil.addFacet(new MandatoryFacetOverriddenByMethod(property));
+    }
+
+    private static boolean indicatesOptional(final Method method) {
+        if (method != null) {
+            Boolean optionalMethodReturnValue = null;
+            try {
+                optionalMethodReturnValue = (Boolean) InvokeUtils.invoke(method, new Object[0]);
+            } catch (ClassCastException ex) {
+                // ignore
+            }
+            if(optionalMethodReturnValue==null) {
+                throw new MetaModelException("method " + method + " should return a boolean" );
+            }
+            return optionalMethodReturnValue.booleanValue();
+        }
+        return false;
+    }
+
+
+}
\ No newline at end of file

Modified: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyClearFacetViaClearMethod.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyClearFacetViaClearMethod.java?rev=1059813&r1=1059812&r2=1059813&view=diff
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyClearFacetViaClearMethod.java (original)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyClearFacetViaClearMethod.java Mon Jan 17 08:48:40 2011
@@ -28,6 +28,7 @@ import org.apache.isis.core.metamodel.ad
 import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.properties.modify.PropertyClearFacetAbstract;
 
 
 public class PropertyClearFacetViaClearMethod extends PropertyClearFacetAbstract implements ImperativeFacet {

Modified: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyClearFacetViaSetterMethod.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyClearFacetViaSetterMethod.java?rev=1059813&r1=1059812&r2=1059813&view=diff
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyClearFacetViaSetterMethod.java (original)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyClearFacetViaSetterMethod.java Mon Jan 17 08:48:40 2011
@@ -28,6 +28,7 @@ import org.apache.isis.core.metamodel.ad
 import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.properties.modify.PropertyClearFacetAbstract;
 
 
 public class PropertyClearFacetViaSetterMethod extends PropertyClearFacetAbstract implements ImperativeFacet {

Added: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyModifyFacetFactory.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyModifyFacetFactory.java?rev=1059813&view=auto
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyModifyFacetFactory.java (added)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertyModifyFacetFactory.java Mon Jan 17 08:48:40 2011
@@ -0,0 +1,69 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+
+package org.apache.isis.core.progmodel.facets.properties.modify;
+
+import java.lang.reflect.Method;
+
+import org.apache.isis.core.commons.lang.NameUtils;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.methodutils.MethodScope;
+import org.apache.isis.core.progmodel.facets.MethodFinderUtils;
+import org.apache.isis.core.progmodel.facets.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.isis.core.progmodel.facets.MethodPrefixConstants;
+
+
+public class PropertyModifyFacetFactory extends MethodPrefixBasedFacetFactoryAbstract {
+
+    private static final String[] PREFIXES = { MethodPrefixConstants.MODIFY_PREFIX };
+
+    public PropertyModifyFacetFactory() {
+        super(FeatureType.PROPERTIES_ONLY, PREFIXES);
+    }
+
+    @Override
+    public void process(ProcessMethodContext processMethodContext) {
+
+        attachPropertyModifyFacetIfModifyMethodIsFound(processMethodContext);
+    }
+
+    private void attachPropertyModifyFacetIfModifyMethodIsFound(ProcessMethodContext processMethodContext) {
+        
+        final Method getMethod = processMethodContext.getMethod();
+        final String capitalizedName = NameUtils.javaBaseName(getMethod.getName());
+        
+        final Class<?> returnType = getMethod.getReturnType();
+        final Class<?>[] paramTypes = new Class[] { returnType };
+        
+        Class<?> cls = processMethodContext.getCls();
+        final Method modifyMethod = MethodFinderUtils.findMethod(cls, MethodScope.OBJECT, MethodPrefixConstants.MODIFY_PREFIX + capitalizedName, void.class, paramTypes);
+        
+        if (modifyMethod == null) {
+            return;
+        } 
+        processMethodContext.removeMethod(modifyMethod);
+        
+        final FacetHolder property = processMethodContext.getFacetHolder();
+        FacetUtil.addFacet(new PropertySetterFacetViaModifyMethod(modifyMethod, property));
+    }
+
+}

Added: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertySetAndClearFacetFactory.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertySetAndClearFacetFactory.java?rev=1059813&view=auto
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertySetAndClearFacetFactory.java (added)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertySetAndClearFacetFactory.java Mon Jan 17 08:48:40 2011
@@ -0,0 +1,115 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+
+package org.apache.isis.core.progmodel.facets.properties.modify;
+
+import java.lang.reflect.Method;
+
+import org.apache.isis.core.commons.lang.NameUtils;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.methodutils.MethodScope;
+import org.apache.isis.core.progmodel.facets.MethodFinderUtils;
+import org.apache.isis.core.progmodel.facets.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.isis.core.progmodel.facets.MethodPrefixConstants;
+import org.apache.isis.core.progmodel.facets.members.disable.DisabledFacet;
+import org.apache.isis.core.progmodel.facets.members.disable.staticmethod.DisabledFacetAlways;
+import org.apache.isis.core.progmodel.facets.propcoll.derived.DerivedFacetInferred;
+
+
+public class PropertySetAndClearFacetFactory extends MethodPrefixBasedFacetFactoryAbstract {
+
+    private static final String[] PREFIXES = { MethodPrefixConstants.SET_PREFIX, MethodPrefixConstants.CLEAR_PREFIX };
+
+    public PropertySetAndClearFacetFactory() {
+        super(FeatureType.PROPERTIES_ONLY, PREFIXES);
+    }
+
+    @Override
+    public void process(ProcessMethodContext processMethodContext) {
+
+        Method setMethod = attachPropertyModifyFacetIfSetterIsFound(processMethodContext);
+        Method clearMethod = attachPropertyClearFacetIfClearMethodIsFound(processMethodContext);
+
+        attachPropertyClearFacetUsingSetterIfRequired(processMethodContext, setMethod, clearMethod);
+    }
+
+    /**
+     * Sets up the {@link PropertySetterFacetViaSetterMethod} to invoke the property's setter if available,
+     * but if none then marks the property as {@link DerivedFacet derived} and {@link DisabledFacet disabled}
+     * otherwise.
+     */
+    private static Method attachPropertyModifyFacetIfSetterIsFound(ProcessMethodContext processMethodContext) {
+        
+        final Method getMethod = processMethodContext.getMethod();
+        final String capitalizedName = NameUtils.javaBaseName(getMethod.getName());
+        
+        Class<?> cls = processMethodContext.getCls();
+        final Class<?> returnType = getMethod.getReturnType();
+        final Class<?>[] paramTypes = new Class[] { returnType };
+        Method setMethod = MethodFinderUtils.findMethod(cls, MethodScope.OBJECT, MethodPrefixConstants.SET_PREFIX + capitalizedName, void.class, paramTypes);
+        processMethodContext.removeMethod(setMethod);
+        
+        final FacetHolder property = processMethodContext.getFacetHolder();
+        if (setMethod != null) {
+            FacetUtil.addFacet(new PropertySetterFacetViaSetterMethod(setMethod, property));
+            FacetUtil.addFacet(new PropertyInitializationFacetViaSetterMethod(setMethod, property));
+        } else {
+            FacetUtil.addFacet(new DerivedFacetInferred(property));
+            FacetUtil.addFacet(new DisabledFacetAlways(property));
+        }
+        
+        return setMethod;
+    }
+
+    private Method attachPropertyClearFacetIfClearMethodIsFound(ProcessMethodContext processMethodContext) {
+        Class<?> cls = processMethodContext.getCls();
+        final Method getMethod = processMethodContext.getMethod();
+        final FacetHolder property = processMethodContext.getFacetHolder();
+
+        final String capitalizedName = NameUtils.javaBaseName(getMethod.getName());
+        final Method clearMethod = MethodFinderUtils.findMethod(cls, MethodScope.OBJECT, MethodPrefixConstants.CLEAR_PREFIX + capitalizedName, void.class, NO_PARAMETERS_TYPES);
+        
+        if (clearMethod == null) {
+            return null;
+        } 
+        processMethodContext.removeMethod(clearMethod);
+        
+        FacetUtil.addFacet(new PropertyClearFacetViaClearMethod(clearMethod, property));
+        
+        return clearMethod;
+    }
+
+    private static void attachPropertyClearFacetUsingSetterIfRequired(ProcessMethodContext processMethodContext, Method setMethod,
+        Method clearMethod) {
+        
+        if (clearMethod != null) {
+            return;
+        }
+        if (setMethod == null) {
+            return;
+        } 
+        final FacetHolder property = processMethodContext.getFacetHolder();
+        FacetUtil.addFacet(new PropertyClearFacetViaSetterMethod(setMethod, property));
+    }
+
+
+}

Modified: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertySetterFacetViaModifyMethod.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertySetterFacetViaModifyMethod.java?rev=1059813&r1=1059812&r2=1059813&view=diff
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertySetterFacetViaModifyMethod.java (original)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertySetterFacetViaModifyMethod.java Mon Jan 17 08:48:40 2011
@@ -28,6 +28,7 @@ import org.apache.isis.core.metamodel.ad
 import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.properties.modify.PropertySetterFacetAbstract;
 
 
 public class PropertySetterFacetViaModifyMethod extends PropertySetterFacetAbstract implements ImperativeFacet {

Modified: incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertySetterFacetViaSetterMethod.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertySetterFacetViaSetterMethod.java?rev=1059813&r1=1059812&r2=1059813&view=diff
==============================================================================
--- incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertySetterFacetViaSetterMethod.java (original)
+++ incubator/isis/trunk/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/properties/modify/PropertySetterFacetViaSetterMethod.java Mon Jan 17 08:48:40 2011
@@ -28,6 +28,7 @@ import org.apache.isis.core.metamodel.ad
 import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.properties.modify.PropertySetterFacetAbstract;
 
 
 public class PropertySetterFacetViaSetterMethod extends PropertySetterFacetAbstract implements ImperativeFacet {