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 2015/02/19 16:57:36 UTC

isis git commit: ISIS-1024: extend programming model to allow imperative validation of individual parameters (validateNXxx(...)).

Repository: isis
Updated Branches:
  refs/heads/master cd5dfbac2 -> cb26cbe4b


ISIS-1024: extend programming model to allow imperative validation of individual parameters (validateNXxx(...)).

Also:
- invoke per-param validation for all textfield Wicket widgets (previously was done only for the String/text datatypes; but it should be safe for other data types that are rendered in text field, eg numbers).


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/cb26cbe4
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/cb26cbe4
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/cb26cbe4

Branch: refs/heads/master
Commit: cb26cbe4bc9f6cfccca4f8b06d4c24694ff8b90b
Parents: cd5dfba
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Feb 19 15:57:17 2015 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Feb 19 15:57:17 2015 +0000

----------------------------------------------------------------------
 .../viewer/wicket/model/models/ScalarModel.java | 15 ++--
 .../scalars/ScalarPanelTextFieldAbstract.java   | 30 ++++++-
 .../ScalarPanelTextFieldParseableAbstract.java  | 21 -----
 .../services/i18n/TranslatableString.java       |  3 +
 .../core/metamodel/facetapi/FeatureType.java    |  2 +
 .../core/metamodel/facets/FacetFactory.java     | 57 +++++++------
 .../ActionParameterValidationFacet.java         | 45 ++++++++++
 .../ActionParameterValidationFacetAbstract.java | 47 +++++++++++
 ...ActionParameterValidationFacetViaMethod.java | 87 ++++++++++++++++++++
 .../ActionValidationFacetViaMethodFactory.java  | 44 ++++++++--
 .../facetprocessor/FacetProcessor.java          |  9 +-
 .../specimpl/FacetedMethodsBuilder.java         |  2 +-
 .../DescribedAsAnnotationFacetFactoryTest.java  |  2 +-
 .../named/NamedAnnotationFacetFactoryTest.java  |  2 +-
 ...ForParameterLayoutAnnotationFactoryTest.java |  2 +-
 ...ForParameterLayoutAnnotationFactoryTest.java |  4 +-
 ...icationFacetFactoryProcessParameterTest.java |  4 +-
 ...alAnnotationOnParameterFacetFactoryTest.java |  4 +-
 .../ParameterAnnotationFacetFactoryTest.java    | 20 ++---
 ...ExAnnotationOnParameterFacetFactoryTest.java |  4 +-
 ...idationDigitsAnnotationFacetFactoryTest.java |  2 +-
 .../MultiLineAnnotationFacetFactoryTest.java    |  4 +-
 ...edAsDayBeforeAnnotationFacetFactoryTest.java |  2 +-
 ...TypicalLengthAnnotationFacetFactoryTest.java |  2 +-
 .../mask/MaskAnnotationFacetFactoryTest.java    |  4 +-
 25 files changed, 324 insertions(+), 94 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index ceef46b..f3d3310 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -277,10 +277,6 @@ public class ScalarModel extends EntityModel implements LinksProvider {
             @Override
             public String parseAndValidate(final ScalarModel scalarModel, final String proposedPojoAsStr) {
                 final ObjectActionParameter parameter = scalarModel.getParameterMemento().getActionParameter();
-                ParseableFacet parseableFacet = parameter.getFacet(ParseableFacet.class);
-                if (parseableFacet == null) {
-                    parseableFacet = parameter.getSpecification().getFacet(ParseableFacet.class);
-                }
                 try {
                     final ObjectAdapter parentAdapter = scalarModel.parentObjectAdapterMemento.getObjectAdapter(ConcurrencyChecking.CHECK);
                     Localization localization = IsisContext.getLocalization(); 
@@ -293,8 +289,15 @@ public class ScalarModel extends EntityModel implements LinksProvider {
 
             @Override
             public String validate(final ScalarModel scalarModel, final ObjectAdapter proposedAdapter) {
-                // TODO - not yet supported.
-                return null;
+                final ObjectActionParameter parameter = scalarModel.getParameterMemento().getActionParameter();
+                try {
+                    final ObjectAdapter parentAdapter = scalarModel.parentObjectAdapterMemento.getObjectAdapter(ConcurrencyChecking.CHECK);
+                    Localization localization = IsisContext.getLocalization();
+                    final String invalidReasonIfAny = parameter.isValid(parentAdapter, proposedAdapter.getObject(), localization);
+                    return invalidReasonIfAny;
+                } catch (final Exception ex) {
+                    return ex.getLocalizedMessage();
+                }
             }
 
             @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
index aed4a23..159c537 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
@@ -33,6 +33,10 @@ import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.markup.html.panel.Fragment;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
+import org.apache.wicket.validation.IValidatable;
+import org.apache.wicket.validation.IValidator;
+import org.apache.wicket.validation.ValidationError;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facets.SingleIntValueFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet;
@@ -165,8 +169,30 @@ public abstract class ScalarPanelTextFieldAbstract<T extends Serializable> exten
     }
 
     protected void addStandardSemantics() {
-         textField.setRequired(getModel().isRequired());
-         setTextFieldSizeAndMaxLengthIfSpecified(textField);
+        textField.setRequired(getModel().isRequired());
+        setTextFieldSizeAndMaxLengthIfSpecified(textField);
+
+        addValidator();
+    }
+
+    protected void addValidator() {
+        final ScalarModel scalarModel = getModel();
+
+        textField.add(new IValidator<T>() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public void validate(final IValidatable<T> validatable) {
+                final T proposedValue = validatable.getValue();
+                final ObjectAdapter proposedAdapter = getAdapterManager().adapterFor(proposedValue);
+                final String reasonIfAny = scalarModel.validate(proposedAdapter);
+                if (reasonIfAny != null) {
+                    final ValidationError error = new ValidationError();
+                    error.setMessage(reasonIfAny);
+                    validatable.error(error);
+                }
+            }
+        });
     }
 
     protected void setTextFieldSizeAndMaxLengthIfSpecified(AbstractTextComponent<T> textField) {

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldParseableAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldParseableAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldParseableAbstract.java
index f621679..cda2568 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldParseableAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldParseableAbstract.java
@@ -73,7 +73,6 @@ public abstract class ScalarPanelTextFieldParseableAbstract extends ScalarPanelT
         super.addStandardSemantics();
 
         addMaxLengthValidator();
-        addObjectAdapterValidator();
     }
 
     private void addMaxLengthValidator() {
@@ -88,24 +87,4 @@ public abstract class ScalarPanelTextFieldParseableAbstract extends ScalarPanelT
         }
     }
 
-    private void addObjectAdapterValidator() {
-        final ScalarModel scalarModel = getModel();
-        final AbstractTextComponent<String> textField = getTextField();
-
-        textField.add(new IValidator<String>() {
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            public void validate(final IValidatable<String> validatable) {
-                final String proposedValue = validatable.getValue();
-                final String reasonIfAny = scalarModel.parseAndValidate(proposedValue);
-                if (reasonIfAny != null) {
-                    final ValidationError error = new ValidationError();
-                    error.setMessage(reasonIfAny);
-                    validatable.error(error);
-                }
-            }
-        });
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslatableString.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslatableString.java b/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslatableString.java
index 47af1bc..ec328dd 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslatableString.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslatableString.java
@@ -38,6 +38,9 @@ public final class TranslatableString {
     public static TranslatableString tr(
             final String pattern,
             final Object... paramArgs) {
+        if(pattern == null) {
+            return null;
+        }
         return new TranslatableString(Type.TR, pattern, null, 1, asMap(paramArgs));
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java
index 825760e..8f50ccd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java
@@ -111,6 +111,8 @@ public enum FeatureType {
     public final static List<FeatureType> OBJECTS_PROPERTIES_AND_COLLECTIONS = ImmutableList.of(OBJECT, PROPERTY, COLLECTION);
     public final static List<FeatureType> OBJECTS_POST_PROCESSING_ONLY = ImmutableList.of(OBJECT_POST_PROCESSING);
 
+    public static final List<FeatureType> ACTIONS_AND_PARAMETERS = ImmutableList.of(ACTION, ACTION_PARAMETER);
+
     /**
      * Use of this is discouraged; instead use multiple {@link FacetFactory}s
      * for different features.

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
index 1a81f63..fbd03f5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
@@ -64,13 +64,15 @@ public interface FacetFactory {
         }
     }
 
-    static class AbstractProcessWithMethodContext<T extends FacetHolder> extends AbstractProcessWithClsContext<T>{
+    static class AbstractProcessWithMethodContext<T extends FacetHolder> extends AbstractProcessWithClsContext<T> implements MethodRemover{
 
         private final Method method;
+        protected final MethodRemover methodRemover;
 
-        AbstractProcessWithMethodContext(final Class<?> cls, final Method method, final T facetHolder) {
+        AbstractProcessWithMethodContext(final Class<?> cls, final Method method, final MethodRemover methodRemover, final T facetHolder) {
             super(cls, facetHolder);
             this.method = method;
+            this.methodRemover = methodRemover;
         }
 
         /**
@@ -88,6 +90,27 @@ public interface FacetFactory {
             return method;
         }
 
+
+        @Override
+        public List<Method> removeMethods(final MethodScope methodScope, final String prefix, final Class<?> returnType, final boolean canBeVoid, final int paramCount) {
+            return methodRemover.removeMethods(methodScope, prefix, returnType, canBeVoid, paramCount);
+        }
+
+        @Override
+        public void removeMethod(final MethodScope methodScope, final String methodName, final Class<?> returnType, final Class<?>[] parameterTypes) {
+            methodRemover.removeMethod(methodScope, methodName, returnType, parameterTypes);
+        }
+
+        @Override
+        public void removeMethod(final Method method) {
+            methodRemover.removeMethod(method);
+        }
+
+        @Override
+        public void removeMethods(final List<Method> methods) {
+            methodRemover.removeMethods(methods);
+        }
+
     }
 
     public interface ProcessContextWithMetadataProperties<T extends FacetHolder> {
@@ -172,10 +195,10 @@ public interface FacetFactory {
     // //////////////////////////////////////
 
 
-    public static class ProcessMethodContext extends AbstractProcessWithMethodContext<FacetedMethod> implements MethodRemover, ProcessContextWithMetadataProperties<FacetedMethod> {
+    public static class ProcessMethodContext extends AbstractProcessWithMethodContext<FacetedMethod> implements  ProcessContextWithMetadataProperties<FacetedMethod> {
         private final FeatureType featureType;
         private final Properties metadataProperties;
-        private final MethodRemover methodRemover;
+
 
         public ProcessMethodContext(
                 final Class<?> cls, 
@@ -184,36 +207,15 @@ public interface FacetFactory {
                 final Method method, 
                 final MethodRemover methodRemover, 
                 final FacetedMethod facetedMethod) {
-            super(cls, method, facetedMethod);
+            super(cls, method, methodRemover, facetedMethod);
             this.featureType = featureType;
             this.metadataProperties = metadataProperties;
-            this.methodRemover = methodRemover;
         }
 
         public FeatureType getFeatureType() {
             return featureType;
         }
 
-        @Override
-        public List<Method> removeMethods(final MethodScope methodScope, final String prefix, final Class<?> returnType, final boolean canBeVoid, final int paramCount) {
-            return methodRemover.removeMethods(methodScope, prefix, returnType, canBeVoid, paramCount);
-        }
-
-        @Override
-        public void removeMethod(final MethodScope methodScope, final String methodName, final Class<?> returnType, final Class<?>[] parameterTypes) {
-            methodRemover.removeMethod(methodScope, methodName, returnType, parameterTypes);
-        }
-
-        @Override
-        public void removeMethod(final Method method) {
-            methodRemover.removeMethod(method);
-        }
-
-        @Override
-        public void removeMethods(final List<Method> methods) {
-            methodRemover.removeMethods(methods);
-        }
-
         public Properties metadataProperties(final String subKey) {
             
             if(metadataProperties == null) {
@@ -267,8 +269,9 @@ public interface FacetFactory {
                 final Class<?> cls,
                 final Method method,
                 final int paramNum,
+                final MethodRemover methodRemover,
                 final FacetedMethodParameter facetedMethodParameter) {
-            super(cls, method, facetedMethodParameter);
+            super(cls, method, methodRemover, facetedMethodParameter);
             this.paramNum = paramNum;
         }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/ActionParameterValidationFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/ActionParameterValidationFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/ActionParameterValidationFacet.java
new file mode 100644
index 0000000..c6f4644
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/ActionParameterValidationFacet.java
@@ -0,0 +1,45 @@
+/*
+ *  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.metamodel.facets.actions.validate;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.interactions.ValidatingInteractionAdvisor;
+
+/**
+ * The mechanism by which a single parameter of the action can be validated
+ * before the action itself is invoked.
+ * 
+ * <p>
+ * In the standard Apache Isis Programming Model, corresponds to invoking the
+ * <tt>validateNXxx</tt> support method for an action.
+ * 
+ * <p>
+ * Note that the parameter may be validated independently first (eg a range check on a numeric parameter).
+ * 
+ * @see org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet
+ */
+public interface ActionParameterValidationFacet extends Facet, ValidatingInteractionAdvisor {
+
+    /**
+     * Reason why the validation has failed, or <tt>null</tt> if okay.
+     */
+    public String invalidReason(ObjectAdapter target, ObjectAdapter arguments);
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/ActionParameterValidationFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/ActionParameterValidationFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/ActionParameterValidationFacetAbstract.java
new file mode 100644
index 0000000..cafbc39
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/ActionParameterValidationFacetAbstract.java
@@ -0,0 +1,47 @@
+/*
+ *  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.metamodel.facets.actions.validate;
+
+import org.apache.isis.applib.events.ValidityEvent;
+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.interactions.ActionArgumentContext;
+import org.apache.isis.core.metamodel.interactions.ValidityContext;
+
+public abstract class ActionParameterValidationFacetAbstract extends FacetAbstract implements ActionParameterValidationFacet {
+
+    public static Class<? extends Facet> type() {
+        return ActionParameterValidationFacet.class;
+    }
+
+    public ActionParameterValidationFacetAbstract(final FacetHolder holder) {
+        super(type(), holder, Derivation.NOT_DERIVED);
+    }
+
+    @Override
+    public String invalidates(final ValidityContext<? extends ValidityEvent> context) {
+        if (!(context instanceof ActionArgumentContext)) {
+            return null;
+        }
+        final ActionArgumentContext actionArgumentContext = (ActionArgumentContext) context;
+        return invalidReason(actionArgumentContext.getTarget(), actionArgumentContext.getProposed());
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionParameterValidationFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionParameterValidationFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionParameterValidationFacetViaMethod.java
new file mode 100644
index 0000000..e073c34
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionParameterValidationFacetViaMethod.java
@@ -0,0 +1,87 @@
+/*
+ *  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.metamodel.facets.actions.validate.method;
+
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.List;
+import org.apache.isis.applib.services.i18n.TranslatableString;
+import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.actions.validate.ActionParameterValidationFacetAbstract;
+
+public class ActionParameterValidationFacetViaMethod extends ActionParameterValidationFacetAbstract implements ImperativeFacet {
+
+    private final Method method;
+    private final TranslationService translationService;
+    private final String translationContext;
+
+    public ActionParameterValidationFacetViaMethod(final Method method, final TranslationService translationService, final String translationContext, final FacetHolder holder) {
+        super(holder);
+        this.method = method;
+        this.translationService = translationService;
+        this.translationContext = translationContext;
+    }
+
+    /**
+     * Returns a singleton list of the {@link java.lang.reflect.Method} provided in the
+     * constructor.
+     */
+    @Override
+    public List<Method> getMethods() {
+        return Collections.singletonList(method);
+    }
+
+    @Override
+    public Intent getIntent(final Method method) {
+        return Intent.CHECK_IF_VALID;
+    }
+
+    @Override
+    public boolean impliesResolve() {
+        return true;
+    }
+
+    @Override
+    public boolean impliesObjectChanged() {
+        return false;
+    }
+
+    @Override
+    public String invalidReason(final ObjectAdapter owningAdapter, final ObjectAdapter proposedArgumentAdapter) {
+        final Object returnValue = ObjectAdapter.InvokeUtils.invoke(method, owningAdapter, proposedArgumentAdapter);
+        if(returnValue instanceof String) {
+            return (String) returnValue;
+        }
+        if(returnValue instanceof TranslatableString) {
+            final TranslatableString ts = (TranslatableString) returnValue;
+            return ts.translate(translationService, translationContext);
+        }
+        return null;
+    }
+
+    @Override
+    protected String toStringValues() {
+        return "method=" + method;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethodFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethodFactory.java
index 93d53b7..9f8681f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethodFactory.java
@@ -47,7 +47,7 @@ public class ActionValidationFacetViaMethodFactory extends MethodPrefixBasedFace
      * noa-architecture (where they exist)
      */
     public ActionValidationFacetViaMethodFactory() {
-        super(FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
+        super(FeatureType.ACTIONS_AND_PARAMETERS, OrphanValidation.VALIDATE, PREFIXES);
     }
 
     // ///////////////////////////////////////////////////////
@@ -56,13 +56,14 @@ public class ActionValidationFacetViaMethodFactory extends MethodPrefixBasedFace
 
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
-        attachValidatingAdvisorFacetForValidateMethodIfFound(processMethodContext);
+        handleValidateAllArgsMethod(processMethodContext);
     }
 
-    private void attachValidatingAdvisorFacetForValidateMethodIfFound(final ProcessMethodContext processMethodContext) {
+    private void handleValidateAllArgsMethod(final ProcessMethodContext processMethodContext) {
 
         final Class<?> cls = processMethodContext.getCls();
         final Method actionMethod = processMethodContext.getMethod();
+        final IdentifiedHolder facetHolder = processMethodContext.getFacetHolder();
 
         final String capitalizedName = StringExtensions.asCapitalizedName(actionMethod.getName());
         final Class<?>[] paramTypes = actionMethod.getParameterTypes();
@@ -78,14 +79,45 @@ public class ActionValidationFacetViaMethodFactory extends MethodPrefixBasedFace
         }
         processMethodContext.removeMethod(validateMethod);
 
-        final IdentifiedHolder facetedMethod = processMethodContext.getFacetHolder();
         final TranslationService translationService = servicesInjector.lookupService(TranslationService.class);
         // sadness: same as in TranslationFactory
-        final String translationContext = facetedMethod.getIdentifier().toClassAndNameIdentityString();
-        final ActionValidationFacetViaMethod facet = new ActionValidationFacetViaMethod(validateMethod, translationService, translationContext, facetedMethod);
+        final String translationContext = facetHolder.getIdentifier().toClassAndNameIdentityString();
+        final ActionValidationFacetViaMethod facet = new ActionValidationFacetViaMethod(validateMethod, translationService, translationContext, facetHolder);
         FacetUtil.addFacet(facet);
     }
 
+    @Override
+    public void processParams(final ProcessParameterContext processParameterContext) {
+
+        final Class<?> cls = processParameterContext.getCls();
+        final Method actionMethod = processParameterContext.getMethod();
+        final int param = processParameterContext.getParamNum();
+        final IdentifiedHolder facetHolder = processParameterContext.getFacetHolder();
+
+        final String capitalizedName = StringExtensions.asCapitalizedName(actionMethod.getName());
+        final Class<?>[] paramTypes = actionMethod.getParameterTypes();
+        final MethodScope onClass = MethodScope.scopeFor(actionMethod);
+
+        final String validateName = MethodPrefixConstants.VALIDATE_PREFIX + param + capitalizedName;
+        final Method validateMethod = MethodFinderUtils.findMethod(
+                cls, onClass,
+                validateName,
+                new Class<?>[]{String.class, TranslatableString.class},
+                new Class<?>[]{paramTypes[param]});
+        if (validateMethod == null) {
+            return;
+        }
+
+        processParameterContext.removeMethod(validateMethod);
+
+        final TranslationService translationService = servicesInjector.lookupService(TranslationService.class);
+        // sadness: same as in TranslationFactory
+        final String translationContext = facetHolder.getIdentifier().toFullIdentityString();
+        final Facet facet = new ActionParameterValidationFacetViaMethod(validateMethod, translationService, translationContext, facetHolder);
+        FacetUtil.addFacet(facet);
+    }
+
+
     // //////////////////////////////////////
 
     private ServicesInjector servicesInjector;

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
index d77fb72..c70a066 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
@@ -347,21 +347,24 @@ public class FacetProcessor implements RuntimeContextAware {
      * for each appropriate factory.
      * 
      * @see FacetFactory#processParams(ProcessParameterContext)
-     *@param introspectedClass
+     *
+     * @param introspectedClass
      * @param method
      *            - action method to process
      * @param paramNum
- *            - 0-based
+*            - 0-based
+     * @param methodRemover
      * @param facetedMethodParameter
      */
     public void processParams(
             final Class<?> introspectedClass,
             final Method method,
             final int paramNum,
+            final MethodRemover methodRemover,
             final FacetedMethodParameter facetedMethodParameter) {
         final List<FacetFactory> factoryList = getFactoryListByFeatureType(FeatureType.ACTION_PARAMETER);
         final ProcessParameterContext processParameterContext =
-                new ProcessParameterContext(introspectedClass, method, paramNum, facetedMethodParameter);
+                new ProcessParameterContext(introspectedClass, method, paramNum, methodRemover, facetedMethodParameter);
         for (final FacetFactory facetFactory : factoryList) {
             facetFactory.processParams(processParameterContext);
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
index c0e386c..80fa2db 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
@@ -423,7 +423,7 @@ public class FacetedMethodsBuilder {
 
         final List<FacetedMethodParameter> actionParams = action.getParameters();
         for (int j = 0; j < actionParams.size(); j++) {
-            getFacetProcessor().processParams(introspectedClass, actionMethod, j, actionParams.get(j));
+            getFacetProcessor().processParams(introspectedClass, actionMethod, j, methodRemover, actionParams.get(j));
         }
 
         return action;

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/naming/describedas/DescribedAsAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/naming/describedas/DescribedAsAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/naming/describedas/DescribedAsAnnotationFacetFactoryTest.java
index 6289d94..d89e0c4 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/naming/describedas/DescribedAsAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/naming/describedas/DescribedAsAnnotationFacetFactoryTest.java
@@ -132,7 +132,7 @@ public class DescribedAsAnnotationFacetFactoryTest extends AbstractFacetFactoryT
         }
         final Method actionMethod = findMethod(Customer.class, "someAction", new Class[] { int.class });
 
-        facetFactory.processParams(new ProcessParameterContext(Customer.class, actionMethod, 0, facetedMethodParameter));
+        facetFactory.processParams(new ProcessParameterContext(Customer.class, actionMethod, 0, null, facetedMethodParameter));
 
         final Facet facet = facetedMethodParameter.getFacet(DescribedAsFacet.class);
         assertNotNull(facet);

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/naming/named/NamedAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/naming/named/NamedAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/naming/named/NamedAnnotationFacetFactoryTest.java
index 5a30041..b2f332b 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/naming/named/NamedAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/naming/named/NamedAnnotationFacetFactoryTest.java
@@ -150,7 +150,7 @@ public class NamedAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4T
 
         expectNoMethodsRemoved();
 
-        facetFactory.processParams(new ProcessParameterContext(Customer.class, actionMethod, 0, facetedMethodParameter));
+        facetFactory.processParams(new ProcessParameterContext(Customer.class, actionMethod, 0, null, facetedMethodParameter));
 
         final Facet facet = facetedMethodParameter.getFacet(NamedFacet.class);
         assertThat(facet, is(not(nullValue())));

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/layout/annotation/LabelAtFacetForParameterLayoutAnnotationFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/layout/annotation/LabelAtFacetForParameterLayoutAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/layout/annotation/LabelAtFacetForParameterLayoutAnnotationFactoryTest.java
index 5357343..cfa06fb 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/layout/annotation/LabelAtFacetForParameterLayoutAnnotationFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/layout/annotation/LabelAtFacetForParameterLayoutAnnotationFactoryTest.java
@@ -46,7 +46,7 @@ public class LabelAtFacetForParameterLayoutAnnotationFactoryTest extends Abstrac
         }
         final Method method = findMethod(Customer.class, "someAction", new Class[] { String.class });
 
-        facetFactory.processParams(new FacetFactory.ProcessParameterContext(Customer.class, method, 0, facetedMethodParameter));
+        facetFactory.processParams(new FacetFactory.ProcessParameterContext(Customer.class, method, 0, null, facetedMethodParameter));
 
         final Facet facet = facetedMethodParameter.getFacet(LabelAtFacet.class);
         assertThat(facet, is(notNullValue()));

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/layout/annotation/NamedFacetForParameterLayoutAnnotationFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/layout/annotation/NamedFacetForParameterLayoutAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/layout/annotation/NamedFacetForParameterLayoutAnnotationFactoryTest.java
index b786814..b73cdfb 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/layout/annotation/NamedFacetForParameterLayoutAnnotationFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/layout/annotation/NamedFacetForParameterLayoutAnnotationFactoryTest.java
@@ -47,7 +47,7 @@ public class NamedFacetForParameterLayoutAnnotationFactoryTest extends AbstractF
         }
         final Method method = findMethod(Customer.class, "someAction", new Class[]{String.class});
 
-        facetFactory.processParams(new FacetFactory.ProcessParameterContext(Customer.class, method, 0, facetedMethodParameter));
+        facetFactory.processParams(new FacetFactory.ProcessParameterContext(Customer.class, method, 0, null, facetedMethodParameter));
 
         final NamedFacet facet = facetedMethodParameter.getFacet(NamedFacet.class);
         assertThat(facet, is(notNullValue()));
@@ -66,7 +66,7 @@ public class NamedFacetForParameterLayoutAnnotationFactoryTest extends AbstractF
         }
         final Method method = findMethod(Customer.class, "someAction", new Class[]{String.class});
 
-        facetFactory.processParams(new FacetFactory.ProcessParameterContext(Customer.class, method, 0, facetedMethodParameter));
+        facetFactory.processParams(new FacetFactory.ProcessParameterContext(Customer.class, method, 0, null, facetedMethodParameter));
 
         final NamedFacet facet = facetedMethodParameter.getFacet(NamedFacet.class);
         assertThat(facet, is(notNullValue()));

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/MustSatisfySpecificationFacetFactoryProcessParameterTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/MustSatisfySpecificationFacetFactoryProcessParameterTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/MustSatisfySpecificationFacetFactoryProcessParameterTest.java
index 9d29eb9..796775d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/MustSatisfySpecificationFacetFactoryProcessParameterTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/MustSatisfySpecificationFacetFactoryProcessParameterTest.java
@@ -77,7 +77,7 @@ public class MustSatisfySpecificationFacetFactoryProcessParameterTest {
                 oneOf(mockFacetedMethodParameter).addFacet(with(anInstanceOf(MustSatisfySpecificationFacetForMustSatisfyAnnotationOnParameter.class)));
             }
         });
-        facetFactory.processParamsMustSatisfy(new ProcessParameterContext(Customer.class, changeLastNameMethodWith, 0, mockFacetedMethodParameter));
+        facetFactory.processParamsMustSatisfy(new ProcessParameterContext(Customer.class, changeLastNameMethodWith, 0, null, mockFacetedMethodParameter));
     }
 
     @Test
@@ -88,7 +88,7 @@ public class MustSatisfySpecificationFacetFactoryProcessParameterTest {
                 never(mockFacetedMethodParameter).addFacet(with(anInstanceOf(MustSatisfySpecificationFacetForMustSatisfyAnnotationOnParameter.class)));
             }
         });
-        facetFactory.processParamsMustSatisfy(new ProcessParameterContext(Customer.class, changeLastNameMethodWithout, 0, mockFacetedMethodParameter));
+        facetFactory.processParamsMustSatisfy(new ProcessParameterContext(Customer.class, changeLastNameMethodWithout, 0, null, mockFacetedMethodParameter));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/OptionalAnnotationOnParameterFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/OptionalAnnotationOnParameterFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/OptionalAnnotationOnParameterFacetFactoryTest.java
index 507c76f..c83d358 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/OptionalAnnotationOnParameterFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/OptionalAnnotationOnParameterFacetFactoryTest.java
@@ -44,7 +44,7 @@ public class OptionalAnnotationOnParameterFacetFactoryTest extends AbstractFacet
         }
         final Method method = findMethod(Customer.class, "someAction", new Class[] { String.class });
 
-        facetFactory.processParamsOptional(new ProcessParameterContext(Customer.class, method, 0, facetedMethodParameter));
+        facetFactory.processParamsOptional(new ProcessParameterContext(Customer.class, method, 0, null, facetedMethodParameter));
 
         final Facet facet = facetedMethodParameter.getFacet(MandatoryFacet.class);
         assertNotNull(facet);
@@ -60,7 +60,7 @@ public class OptionalAnnotationOnParameterFacetFactoryTest extends AbstractFacet
         }
         final Method method = findMethod(Customer.class, "someAction", new Class[] { int.class });
 
-        facetFactory.processParamsOptional(new ProcessParameterContext(Customer.class, method, 0, facetedMethodParameter));
+        facetFactory.processParamsOptional(new ProcessParameterContext(Customer.class, method, 0, null, facetedMethodParameter));
 
         assertNull(facetedMethod.getFacet(MandatoryFacet.class));
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/ParameterAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/ParameterAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/ParameterAnnotationFacetFactoryTest.java
index 3b8d54e..09706b9 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/ParameterAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/ParameterAnnotationFacetFactoryTest.java
@@ -84,7 +84,7 @@ public class ParameterAnnotationFacetFactoryTest extends AbstractFacetFactoryJUn
             actionMethod = findMethod(Customer.class, "someAction", new Class[]{String.class} );
 
             // when
-            final FacetFactory.ProcessParameterContext processParameterContext = new FacetFactory.ProcessParameterContext(Customer.class, actionMethod, 0, facetedMethodParameter);
+            final FacetFactory.ProcessParameterContext processParameterContext = new FacetFactory.ProcessParameterContext(Customer.class, actionMethod, 0, null, facetedMethodParameter);
             facetFactory.processParams(processParameterContext);
 
             // then
@@ -129,7 +129,7 @@ public class ParameterAnnotationFacetFactoryTest extends AbstractFacetFactoryJUn
             actionMethod = findMethod(Customer.class, "someAction", new Class[]{String.class} );
 
             // when
-            final FacetFactory.ProcessParameterContext processParameterContext = new FacetFactory.ProcessParameterContext(Customer.class, actionMethod, 0, facetedMethodParameter);
+            final FacetFactory.ProcessParameterContext processParameterContext = new FacetFactory.ProcessParameterContext(Customer.class, actionMethod, 0, null, facetedMethodParameter);
             facetFactory.processParams(processParameterContext);
 
             // then
@@ -165,7 +165,7 @@ public class ParameterAnnotationFacetFactoryTest extends AbstractFacetFactoryJUn
             actionMethod = findMethod(Customer.class, "someAction", new Class[]{String.class} );
 
             // when
-            final FacetFactory.ProcessParameterContext processParameterContext = new FacetFactory.ProcessParameterContext(Customer.class, actionMethod, 0, facetedMethodParameter);
+            final FacetFactory.ProcessParameterContext processParameterContext = new FacetFactory.ProcessParameterContext(Customer.class, actionMethod, 0, null, facetedMethodParameter);
             facetFactory.processParams(processParameterContext);
 
             // then
@@ -191,7 +191,7 @@ public class ParameterAnnotationFacetFactoryTest extends AbstractFacetFactoryJUn
             actionMethod = findMethod(Customer.class, "someAction", new Class[]{String.class} );
 
             // when
-            final FacetFactory.ProcessParameterContext processParameterContext = new FacetFactory.ProcessParameterContext(Customer.class, actionMethod, 0, facetedMethodParameter);
+            final FacetFactory.ProcessParameterContext processParameterContext = new FacetFactory.ProcessParameterContext(Customer.class, actionMethod, 0, null, facetedMethodParameter);
             facetFactory.processParams(processParameterContext);
 
             // then
@@ -217,7 +217,7 @@ public class ParameterAnnotationFacetFactoryTest extends AbstractFacetFactoryJUn
             actionMethod = findMethod(Customer.class, "someAction", new Class[]{String.class} );
 
             // when
-            final FacetFactory.ProcessParameterContext processParameterContext = new FacetFactory.ProcessParameterContext(Customer.class, actionMethod, 0, facetedMethodParameter);
+            final FacetFactory.ProcessParameterContext processParameterContext = new FacetFactory.ProcessParameterContext(Customer.class, actionMethod, 0, null, facetedMethodParameter);
             facetFactory.processParams(processParameterContext);
 
             // then
@@ -239,7 +239,7 @@ public class ParameterAnnotationFacetFactoryTest extends AbstractFacetFactoryJUn
             actionMethod = findMethod(Customer.class, "someAction", new Class[]{String.class} );
 
             // when
-            final FacetFactory.ProcessParameterContext processParameterContext = new FacetFactory.ProcessParameterContext(Customer.class, actionMethod, 0, facetedMethodParameter);
+            final FacetFactory.ProcessParameterContext processParameterContext = new FacetFactory.ProcessParameterContext(Customer.class, actionMethod, 0, null, facetedMethodParameter);
             facetFactory.processParams(processParameterContext);
 
 
@@ -270,7 +270,7 @@ public class ParameterAnnotationFacetFactoryTest extends AbstractFacetFactoryJUn
             actionMethod = findMethod(Customer.class, "someAction", new Class[]{String.class} );
 
             // when
-            final FacetFactory.ProcessParameterContext processParameterContext = new FacetFactory.ProcessParameterContext(Customer.class, actionMethod, 0, facetedMethodParameter);
+            final FacetFactory.ProcessParameterContext processParameterContext = new FacetFactory.ProcessParameterContext(Customer.class, actionMethod, 0, null, facetedMethodParameter);
             facetFactory.processParams(processParameterContext);
 
 
@@ -298,7 +298,7 @@ public class ParameterAnnotationFacetFactoryTest extends AbstractFacetFactoryJUn
             actionMethod = findMethod(Customer.class, "someAction", new Class[]{String.class} );
 
             // when
-            final FacetFactory.ProcessParameterContext processParameterContext = new FacetFactory.ProcessParameterContext(Customer.class, actionMethod, 0, facetedMethodParameter);
+            final FacetFactory.ProcessParameterContext processParameterContext = new FacetFactory.ProcessParameterContext(Customer.class, actionMethod, 0, null, facetedMethodParameter);
             facetFactory.processParams(processParameterContext);
 
             // then
@@ -323,7 +323,7 @@ public class ParameterAnnotationFacetFactoryTest extends AbstractFacetFactoryJUn
             actionMethod = findMethod(Customer.class, "someAction", new Class[]{String.class} );
 
             // when
-            final FacetFactory.ProcessParameterContext processParameterContext = new FacetFactory.ProcessParameterContext(Customer.class, actionMethod, 0, facetedMethodParameter);
+            final FacetFactory.ProcessParameterContext processParameterContext = new FacetFactory.ProcessParameterContext(Customer.class, actionMethod, 0, null, facetedMethodParameter);
             facetFactory.processParams(processParameterContext);
 
 
@@ -349,7 +349,7 @@ public class ParameterAnnotationFacetFactoryTest extends AbstractFacetFactoryJUn
             actionMethod = findMethod(Customer.class, "someAction", new Class[]{int.class} );
 
             // when
-            final FacetFactory.ProcessParameterContext processParameterContext = new FacetFactory.ProcessParameterContext(Customer.class, actionMethod, 0, facetedMethodParameter);
+            final FacetFactory.ProcessParameterContext processParameterContext = new FacetFactory.ProcessParameterContext(Customer.class, actionMethod, 0, null, facetedMethodParameter);
             facetFactory.processParams(processParameterContext);
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/RegExAnnotationOnParameterFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/RegExAnnotationOnParameterFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/RegExAnnotationOnParameterFacetFactoryTest.java
index 31018e8..b77b3b2 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/RegExAnnotationOnParameterFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/parameter/RegExAnnotationOnParameterFacetFactoryTest.java
@@ -47,7 +47,7 @@ public class RegExAnnotationOnParameterFacetFactoryTest extends AbstractFacetFac
         }
         final Method method = findMethod(Customer.class, "someAction", new Class[] { String.class });
 
-        facetFactory.processParams(new ProcessParameterContext(Customer.class, method, 0, facetedMethodParameter));
+        facetFactory.processParams(new ProcessParameterContext(Customer.class, method, 0, null, facetedMethodParameter));
 
         final Facet facet = facetedMethodParameter.getFacet(RegExFacet.class);
         assertNotNull(facet);
@@ -66,7 +66,7 @@ public class RegExAnnotationOnParameterFacetFactoryTest extends AbstractFacetFac
         }
         final Method method = findMethod(Customer.class, "someAction", new Class[] { int.class });
 
-        facetFactory.processParams(new ProcessParameterContext(Customer.class, method, 0, facetedMethodParameter));
+        facetFactory.processParams(new ProcessParameterContext(Customer.class, method, 0, null, facetedMethodParameter));
 
         assertNull(facetedMethod.getFacet(RegExFacet.class));
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/decimal/JavaxValidationDigitsAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/decimal/JavaxValidationDigitsAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/decimal/JavaxValidationDigitsAnnotationFacetFactoryTest.java
index a3ee1ca..d482d64 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/decimal/JavaxValidationDigitsAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/decimal/JavaxValidationDigitsAnnotationFacetFactoryTest.java
@@ -68,7 +68,7 @@ public class JavaxValidationDigitsAnnotationFacetFactoryTest extends AbstractFac
         }
         final Method method = findMethod(Order.class, "updateCost", new Class[] { BigDecimal.class });
 
-        facetFactory.processParams(new ProcessParameterContext(Customer.class, method, 0, facetedMethodParameter));
+        facetFactory.processParams(new ProcessParameterContext(Customer.class, method, 0, null, facetedMethodParameter));
 
         final Facet facet = facetedMethodParameter.getFacet(BigDecimalValueFacet.class);
         assertNotNull(facet);

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/multiline/MultiLineAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/multiline/MultiLineAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/multiline/MultiLineAnnotationFacetFactoryTest.java
index 09b6791..c3d5ac9 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/multiline/MultiLineAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/multiline/MultiLineAnnotationFacetFactoryTest.java
@@ -86,7 +86,7 @@ public class MultiLineAnnotationFacetFactoryTest extends AbstractFacetFactoryTes
         }
         final Method method = findMethod(Customer.class, "someAction", new Class[] { String.class });
 
-        facetFactory.processParams(new ProcessParameterContext(Customer.class, method, 0, facetedMethodParameter));
+        facetFactory.processParams(new ProcessParameterContext(Customer.class, method, 0, null, facetedMethodParameter));
 
         final Facet facet = facetedMethodParameter.getFacet(MultiLineFacet.class);
         assertNotNull(facet);
@@ -139,7 +139,7 @@ public class MultiLineAnnotationFacetFactoryTest extends AbstractFacetFactoryTes
         }
         final Method method = findMethod(Customer.class, "someAction", new Class[] { int.class });
 
-        facetFactory.processParams(new ProcessParameterContext(Customer.class, method, 0, facetedMethodParameter));
+        facetFactory.processParams(new ProcessParameterContext(Customer.class, method, 0, null, facetedMethodParameter));
 
         assertNull(facetedMethod.getFacet(MultiLineFacet.class));
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/renderedasdaybefore/RenderedAsDayBeforeAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/renderedasdaybefore/RenderedAsDayBeforeAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/renderedasdaybefore/RenderedAsDayBeforeAnnotationFacetFactoryTest.java
index 8fed7cf..f5b1ac8 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/renderedasdaybefore/RenderedAsDayBeforeAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/renderedasdaybefore/RenderedAsDayBeforeAnnotationFacetFactoryTest.java
@@ -67,7 +67,7 @@ public class RenderedAsDayBeforeAnnotationFacetFactoryTest extends AbstractFacet
         }
         final Method method = findMethod(Customer.class, "someAction", new Class[] { LocalDate.class });
 
-        facetFactory.processParams(new ProcessParameterContext(Customer.class, method, 0, facetedMethodParameter));
+        facetFactory.processParams(new ProcessParameterContext(Customer.class, method, 0, null, facetedMethodParameter));
 
         final Facet facet = facetedMethodParameter.getFacet(RenderedAdjustedFacet.class);
         assertNotNull(facet);

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/typicallength/TypicalLengthAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/typicallength/TypicalLengthAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/typicallength/TypicalLengthAnnotationFacetFactoryTest.java
index 79a28ab..58021ba 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/typicallength/TypicalLengthAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/typicallength/TypicalLengthAnnotationFacetFactoryTest.java
@@ -65,7 +65,7 @@ public class TypicalLengthAnnotationFacetFactoryTest extends AbstractFacetFactor
         }
         final Method method = findMethod(Customer.class, "someAction", new Class[] { int.class });
 
-        facetFactory.processParams(new ProcessParameterContext(Customer.class, method, 0, facetedMethodParameter));
+        facetFactory.processParams(new ProcessParameterContext(Customer.class, method, 0, null, facetedMethodParameter));
 
         final Facet facet = facetedMethodParameter.getFacet(TypicalLengthFacet.class);
         assertNotNull(facet);

http://git-wip-us.apache.org/repos/asf/isis/blob/cb26cbe4/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/validate/mask/MaskAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/validate/mask/MaskAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/validate/mask/MaskAnnotationFacetFactoryTest.java
index 6440779..0897ce0 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/validate/mask/MaskAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/validate/mask/MaskAnnotationFacetFactoryTest.java
@@ -97,7 +97,7 @@ public class MaskAnnotationFacetFactoryTest extends AbstractFacetFactoryTest {
         }
         final Method method = findMethod(Customer.class, "someAction", new Class[] { String.class });
 
-        facetFactory.processParams(new ProcessParameterContext(Customer.class, method, 0, facetedMethodParameter));
+        facetFactory.processParams(new ProcessParameterContext(Customer.class, method, 0, null, facetedMethodParameter));
 
         final Facet facet = facetedMethodParameter.getFacet(MaskFacet.class);
         assertNotNull(facet);
@@ -135,7 +135,7 @@ public class MaskAnnotationFacetFactoryTest extends AbstractFacetFactoryTest {
         }
         final Method method = findMethod(Customer.class, "someAction", new Class[] { int.class });
 
-        facetFactory.processParams(new ProcessParameterContext(Customer.class, method, 0, facetedMethodParameter));
+        facetFactory.processParams(new ProcessParameterContext(Customer.class, method, 0, null, facetedMethodParameter));
 
         assertNotNull(facetedMethodParameter.getFacet(MaskFacet.class));
     }