http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclassfa/annotation/CssClassFaFacetOnTypeAnnotationFactory.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclassfa/annotation/CssClassFaFacetOnTypeAnnotationFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclassfa/annotation/CssClassFaFacetOnTypeAnnotationFactory.java
index 4ed7218..549b8e3 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclassfa/annotation/CssClassFaFacetOnTypeAnnotationFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/cssclassfa/annotation/CssClassFaFacetOnTypeAnnotationFactory.java
@@ -42,7 +42,7 @@ public class CssClassFaFacetOnTypeAnnotationFactory extends 
FacetFactoryAbstract
     @Override
     public void process(final ProcessClassContext processClassContext) {
         final CssClassFa annotation = 
Annotations.getAnnotation(processClassContext.getCls(), CssClassFa.class);
-        validator.addFacet(create(annotation, 
processClassContext.getFacetHolder()));
+        validator.addFacetFlagIfPresent(create(annotation, 
processClassContext.getFacetHolder()));
     }
 
     private static CssClassFaFacet create(final CssClassFa annotation, final 
FacetHolder holder) {

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/describedas/annotation/DescribedAsFacetOnTypeAnnotationFactory.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/describedas/annotation/DescribedAsFacetOnTypeAnnotationFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/describedas/annotation/DescribedAsFacetOnTypeAnnotationFactory.java
index f85c3bc..9d8bee8 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/describedas/annotation/DescribedAsFacetOnTypeAnnotationFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/describedas/annotation/DescribedAsFacetOnTypeAnnotationFactory.java
@@ -42,7 +42,7 @@ public class DescribedAsFacetOnTypeAnnotationFactory extends 
FacetFactoryAbstrac
     @Override
     public void process(final ProcessClassContext processClassContaxt) {
         final DescribedAs annotation = 
Annotations.getAnnotation(processClassContaxt.getCls(), DescribedAs.class);
-        validator.addFacet(create(annotation, 
processClassContaxt.getFacetHolder()));
+        validator.addFacetFlagIfPresent(create(annotation, 
processClassContaxt.getFacetHolder()));
     }
 
     private DescribedAsFacet create(final DescribedAs annotation, final 
FacetHolder holder) {

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/fieldorder/annotation/FieldOrderFacetAnnotationFactory.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/fieldorder/annotation/FieldOrderFacetAnnotationFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/fieldorder/annotation/FieldOrderFacetAnnotationFactory.java
index 28bf9e5..db905a2 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/fieldorder/annotation/FieldOrderFacetAnnotationFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/fieldorder/annotation/FieldOrderFacetAnnotationFactory.java
@@ -23,7 +23,6 @@ import org.apache.isis.applib.annotation.FieldOrder;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.config.IsisConfigurationAware;
 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.MetaModelValidatorRefiner;
 import org.apache.isis.core.metamodel.facets.Annotations;
@@ -43,7 +42,7 @@ public class FieldOrderFacetAnnotationFactory extends 
FacetFactoryAbstract imple
     @Override
     public void process(final ProcessClassContext processClassContaxt) {
         final FieldOrder annotation = 
Annotations.getAnnotation(processClassContaxt.getCls(), FieldOrder.class);
-        validator.addFacet(create(annotation, 
processClassContaxt.getFacetHolder()));
+        validator.addFacetFlagIfPresent(create(annotation, 
processClassContaxt.getFacetHolder()));
     }
 
     private FieldOrderFacet create(final FieldOrder annotation, final 
FacetHolder holder) {

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/hidden/annotation/HiddenFacetOnTypeAnnotationFactory.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/hidden/annotation/HiddenFacetOnTypeAnnotationFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/hidden/annotation/HiddenFacetOnTypeAnnotationFactory.java
index 262c40c..9b949df 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/hidden/annotation/HiddenFacetOnTypeAnnotationFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/hidden/annotation/HiddenFacetOnTypeAnnotationFactory.java
@@ -23,7 +23,6 @@ import org.apache.isis.applib.annotation.Hidden;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.config.IsisConfigurationAware;
 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.MetaModelValidatorRefiner;
 import org.apache.isis.core.metamodel.facets.Annotations;
@@ -43,7 +42,7 @@ public class HiddenFacetOnTypeAnnotationFactory extends 
FacetFactoryAbstract imp
     @Override
     public void process(final ProcessClassContext processClassContext) {
         final Hidden annotation = 
Annotations.getAnnotation(processClassContext.getCls(), Hidden.class);
-        validator.addFacet(create(annotation, 
processClassContext.getFacetHolder()));
+        validator.addFacetFlagIfPresent(create(annotation, 
processClassContext.getFacetHolder()));
     }
 
     private static HiddenFacet create(final Hidden annotation, final 
FacetHolder holder) {

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mask/annotation/MaskFacetOnTypeAnnotationFactory.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mask/annotation/MaskFacetOnTypeAnnotationFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mask/annotation/MaskFacetOnTypeAnnotationFactory.java
index e7ebc42..ac1a23f 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mask/annotation/MaskFacetOnTypeAnnotationFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mask/annotation/MaskFacetOnTypeAnnotationFactory.java
@@ -46,7 +46,7 @@ public class MaskFacetOnTypeAnnotationFactory extends 
FacetFactoryAbstract imple
     @Override
     public void process(final ProcessClassContext processClassContaxt) {
         final Mask annotation = 
Annotations.getAnnotation(processClassContaxt.getCls(), Mask.class);
-        validator.addFacet(createMaskFacet(annotation, 
processClassContaxt.getFacetHolder()));
+        validator.addFacetFlagIfPresent(createMaskFacet(annotation, 
processClassContaxt.getFacetHolder()));
     }
 
     private MaskFacet createMaskFacet(final Mask annotation, final FacetHolder 
holder) {

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/maxlen/annotation/MaxLengthFacetOnTypeAnnotationFactory.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/maxlen/annotation/MaxLengthFacetOnTypeAnnotationFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/maxlen/annotation/MaxLengthFacetOnTypeAnnotationFactory.java
index 0ad616f..14dea94 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/maxlen/annotation/MaxLengthFacetOnTypeAnnotationFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/maxlen/annotation/MaxLengthFacetOnTypeAnnotationFactory.java
@@ -45,7 +45,7 @@ public class MaxLengthFacetOnTypeAnnotationFactory extends 
FacetFactoryAbstract
     @Override
     public void process(final ProcessClassContext processClassContaxt) {
         final MaxLength annotation = 
Annotations.getAnnotation(processClassContaxt.getCls(), MaxLength.class);
-        validator.addFacet(create(annotation, 
processClassContaxt.getFacetHolder()));
+        validator.addFacetFlagIfPresent(create(annotation, 
processClassContaxt.getFacetHolder()));
     }
 
     private MaxLengthFacet create(final MaxLength annotation, final 
FacetHolder holder) {

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/multiline/annotation/MultiLineFacetOnTypeAnnotationFactory.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/multiline/annotation/MultiLineFacetOnTypeAnnotationFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/multiline/annotation/MultiLineFacetOnTypeAnnotationFactory.java
index 2480c6f..7912c48 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/multiline/annotation/MultiLineFacetOnTypeAnnotationFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/multiline/annotation/MultiLineFacetOnTypeAnnotationFactory.java
@@ -46,7 +46,7 @@ public class MultiLineFacetOnTypeAnnotationFactory extends 
FacetFactoryAbstract
     @Override
     public void process(final ProcessClassContext processClassContaxt) {
         final MultiLine annotation = 
Annotations.getAnnotation(processClassContaxt.getCls(), MultiLine.class);
-        validator.addFacet(create(annotation, 
processClassContaxt.getFacetHolder()));
+        validator.addFacetFlagIfPresent(create(annotation, 
processClassContaxt.getFacetHolder()));
     }
 
     private MultiLineFacet create(final MultiLine annotation, final 
FacetHolder holder) {

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/named/annotation/NamedFacetOnTypeAnnotationFactory.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/named/annotation/NamedFacetOnTypeAnnotationFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/named/annotation/NamedFacetOnTypeAnnotationFactory.java
index e06a702..3d6a9cb 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/named/annotation/NamedFacetOnTypeAnnotationFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/named/annotation/NamedFacetOnTypeAnnotationFactory.java
@@ -44,7 +44,7 @@ public class NamedFacetOnTypeAnnotationFactory extends 
FacetFactoryAbstract impl
     @Override
     public void process(final ProcessClassContext processClassContaxt) {
         final Named annotation = 
Annotations.getAnnotation(processClassContaxt.getCls(), Named.class);
-        validator.addFacet(create(annotation, 
processClassContaxt.getFacetHolder()));
+        validator.addFacetFlagIfPresent(create(annotation, 
processClassContaxt.getFacetHolder()));
     }
 
     private NamedFacet create(final Named annotation, final FacetHolder 
holder) {

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/named/staticmethod/NamedFacetStaticMethodFactory.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/named/staticmethod/NamedFacetStaticMethodFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/named/staticmethod/NamedFacetStaticMethodFactory.java
index a91ae5e..d96ee48 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/named/staticmethod/NamedFacetStaticMethodFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/named/staticmethod/NamedFacetStaticMethodFactory.java
@@ -52,7 +52,7 @@ public class NamedFacetStaticMethodFactory extends 
MethodPrefixBasedFacetFactory
         if (method != null) {
             final String name = (String) MethodExtensions.invokeStatic(method);
             processClassContext.removeMethod(method);
-            validator.addFacet(new NamedFacetStaticMethod(name, facetHolder));
+            validator.addFacetFlagIfPresent(new NamedFacetStaticMethod(name, 
facetHolder));
         }
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/paged/annotation/PagedFacetOnTypeAnnotationFactory.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/paged/annotation/PagedFacetOnTypeAnnotationFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/paged/annotation/PagedFacetOnTypeAnnotationFactory.java
index 980878b..75311c3 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/paged/annotation/PagedFacetOnTypeAnnotationFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/paged/annotation/PagedFacetOnTypeAnnotationFactory.java
@@ -48,7 +48,7 @@ public class PagedFacetOnTypeAnnotationFactory extends 
FacetFactoryAbstract impl
     @Override
     public void process(final ProcessClassContext processClassContext) {
         final Paged annotation = 
Annotations.getAnnotation(processClassContext.getCls(), Paged.class);
-        validator.addFacet(create(annotation, 
processClassContext.getFacetHolder()));
+        validator.addFacetFlagIfPresent(create(annotation, 
processClassContext.getFacetHolder()));
     }
 
     private static PagedFacet create(final Paged annotation, final FacetHolder 
holder) {

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/plural/annotation/PluralAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/plural/annotation/PluralAnnotationFacetFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/plural/annotation/PluralAnnotationFacetFactory.java
index dfdd76e..86a41db 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/plural/annotation/PluralAnnotationFacetFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/plural/annotation/PluralAnnotationFacetFactory.java
@@ -42,7 +42,7 @@ public class PluralAnnotationFacetFactory extends 
FacetFactoryAbstract implement
     @Override
     public void process(final ProcessClassContext processClassContaxt) {
         final Plural annotation = 
Annotations.getAnnotation(processClassContaxt.getCls(), Plural.class);
-        validator.addFacet(create(annotation, 
processClassContaxt.getFacetHolder()));
+        validator.addFacetFlagIfPresent(create(annotation, 
processClassContaxt.getFacetHolder()));
     }
 
     private PluralFacet create(final Plural annotation, final FacetHolder 
holder) {

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/plural/staticmethod/PluralFacetStaticMethodFactory.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/plural/staticmethod/PluralFacetStaticMethodFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/plural/staticmethod/PluralFacetStaticMethodFactory.java
index 1d053ff..10ad2ac 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/plural/staticmethod/PluralFacetStaticMethodFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/plural/staticmethod/PluralFacetStaticMethodFactory.java
@@ -53,7 +53,7 @@ public class PluralFacetStaticMethodFactory extends 
MethodPrefixBasedFacetFactor
         if (method != null) {
             final String name = (String) MethodExtensions.invokeStatic(method);
             processClassContext.removeMethod(method);
-            validator.addFacet(new PluralFacetMethod(name, facetHolder));
+            validator.addFacetFlagIfPresent(new PluralFacetMethod(name, 
facetHolder));
         }
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/regex/annotation/RegExFacetOnTypeAnnotationFactory.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/regex/annotation/RegExFacetOnTypeAnnotationFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/regex/annotation/RegExFacetOnTypeAnnotationFactory.java
index 10d2673..541efb5 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/regex/annotation/RegExFacetOnTypeAnnotationFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/regex/annotation/RegExFacetOnTypeAnnotationFactory.java
@@ -42,7 +42,7 @@ public class RegExFacetOnTypeAnnotationFactory extends 
FacetFactoryAbstract impl
     @Override
     public void process(final ProcessClassContext processClassContaxt) {
         final RegEx annotation = 
Annotations.getAnnotation(processClassContaxt.getCls(), RegEx.class);
-        validator.addFacet(createRegexFacet(annotation, 
processClassContaxt.getFacetHolder()));
+        validator.addFacetFlagIfPresent(createRegexFacet(annotation, 
processClassContaxt.getFacetHolder()));
     }
 
     private RegExFacet createRegexFacet(final RegEx annotation, final 
FacetHolder holder) {

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/typicallen/annotation/TypicalLengthFacetOnTypeAnnotationFactory.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/typicallen/annotation/TypicalLengthFacetOnTypeAnnotationFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/typicallen/annotation/TypicalLengthFacetOnTypeAnnotationFactory.java
index 501c29f..4771821 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/typicallen/annotation/TypicalLengthFacetOnTypeAnnotationFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/typicallen/annotation/TypicalLengthFacetOnTypeAnnotationFactory.java
@@ -42,7 +42,7 @@ public class TypicalLengthFacetOnTypeAnnotationFactory 
extends FacetFactoryAbstr
     @Override
     public void process(final ProcessClassContext processClassContaxt) {
         final TypicalLength annotation = 
Annotations.getAnnotation(processClassContaxt.getCls(), TypicalLength.class);
-        validator.addFacet(create(annotation, 
processClassContaxt.getFacetHolder()));
+        validator.addFacetFlagIfPresent(create(annotation, 
processClassContaxt.getFacetHolder()));
     }
 
     private TypicalLengthFacet create(final TypicalLength annotation, final 
FacetHolder holder) {

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/mustsatisfyspec/MustSatisfySpecificationOnTypeFacetFactory.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/mustsatisfyspec/MustSatisfySpecificationOnTypeFacetFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/mustsatisfyspec/MustSatisfySpecificationOnTypeFacetFactory.java
index 6fa3037..b84f730 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/mustsatisfyspec/MustSatisfySpecificationOnTypeFacetFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/validating/mustsatisfyspec/MustSatisfySpecificationOnTypeFacetFactory.java
@@ -44,7 +44,7 @@ public class MustSatisfySpecificationOnTypeFacetFactory 
extends FacetFactoryAbst
 
     @Override
     public void process(final ProcessClassContext processClassContaxt) {
-        validator.addFacet(create(processClassContaxt.getCls(), 
processClassContaxt.getFacetHolder()));
+        validator.addFacetFlagIfPresent(create(processClassContaxt.getCls(), 
processClassContaxt.getFacetHolder()));
     }
 
     private Facet create(final Class<?> clazz, final FacetHolder holder) {

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/mandatory/annotation/MandatoryFacetOnParameterInvertedByOptionalAnnotation.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/mandatory/annotation/MandatoryFacetOnParameterInvertedByOptionalAnnotation.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/mandatory/annotation/MandatoryFacetOnParameterInvertedByOptionalAnnotation.java
deleted file mode 100644
index 0bdc9d3..0000000
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/mandatory/annotation/MandatoryFacetOnParameterInvertedByOptionalAnnotation.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  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.param.mandatory.annotation;
-
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import 
org.apache.isis.core.metamodel.facets.propparam.mandatory.MandatoryFacetAbstract;
-
-/**
- * Derived by presence of an <tt>@Optional</tt> method.
- * 
- * <p>
- * This implementation indicates that the {@link FacetHolder} is <i>not</i>
- * mandatory, as per {@link #isInvertedSemantics()}.
- */
-public class MandatoryFacetOnParameterInvertedByOptionalAnnotation extends 
MandatoryFacetAbstract {
-
-    public MandatoryFacetOnParameterInvertedByOptionalAnnotation(final 
FacetHolder holder) {
-        super(holder, Semantics.OPTIONAL);
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/mandatory/annotation/MandatoryFacetOnParameterInvertedByOptionalAnnotationFactory.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/mandatory/annotation/MandatoryFacetOnParameterInvertedByOptionalAnnotationFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/mandatory/annotation/MandatoryFacetOnParameterInvertedByOptionalAnnotationFactory.java
deleted file mode 100644
index 61138b7..0000000
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/mandatory/annotation/MandatoryFacetOnParameterInvertedByOptionalAnnotationFactory.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *  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.param.mandatory.annotation;
-
-import java.lang.annotation.Annotation;
-import org.apache.isis.applib.annotation.Optional;
-import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.config.IsisConfigurationAware;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facetapi.MetaModelValidatorRefiner;
-import org.apache.isis.core.metamodel.facets.Annotations;
-import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import 
org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite;
-import 
org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorForDeprecatedAnnotation;
-
-public class MandatoryFacetOnParameterInvertedByOptionalAnnotationFactory 
extends FacetFactoryAbstract implements MetaModelValidatorRefiner, 
IsisConfigurationAware {
-
-    private final MetaModelValidatorForDeprecatedAnnotation validator = new 
MetaModelValidatorForDeprecatedAnnotation(Optional.class);
-
-    public MandatoryFacetOnParameterInvertedByOptionalAnnotationFactory() {
-        super(FeatureType.PARAMETERS_ONLY);
-    }
-
-    @Override
-    public void processParams(final ProcessParameterContext 
processParameterContext) {
-        final Class<?>[] parameterTypes = 
processParameterContext.getMethod().getParameterTypes();
-        if (processParameterContext.getParamNum() >= parameterTypes.length) {
-            // ignore
-            return;
-        }
-        if 
(parameterTypes[processParameterContext.getParamNum()].isPrimitive()) {
-            return;
-        }
-        final Annotation[] parameterAnnotations = 
Annotations.getParameterAnnotations(processParameterContext.getMethod())[processParameterContext.getParamNum()];
-        for (final Annotation parameterAnnotation : parameterAnnotations) {
-            if (parameterAnnotation instanceof Optional) {
-                validator.addFacet(new 
MandatoryFacetOnParameterInvertedByOptionalAnnotation(processParameterContext.getFacetHolder()));
-                return;
-            }
-        }
-    }
-
-    @Override
-    public void refineMetaModelValidator(final MetaModelValidatorComposite 
metaModelValidator, final IsisConfiguration configuration) {
-        metaModelValidator.add(validator);
-    }
-
-    @Override
-    public void setConfiguration(final IsisConfiguration configuration) {
-        validator.setConfiguration(configuration);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/named/annotation/NamedFacetOnParameterAnnotationFactory.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/named/annotation/NamedFacetOnParameterAnnotationFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/named/annotation/NamedFacetOnParameterAnnotationFactory.java
index 58697f0..6c70316 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/named/annotation/NamedFacetOnParameterAnnotationFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/named/annotation/NamedFacetOnParameterAnnotationFactory.java
@@ -47,7 +47,7 @@ public class NamedFacetOnParameterAnnotationFactory extends 
FacetFactoryAbstract
         for (final Annotation parameterAnnotation : parameterAnnotations) {
             if (parameterAnnotation instanceof Named) {
                 final Named annotation = (Named) parameterAnnotation;
-                validator.addFacet(create(annotation, 
processParameterContext.getFacetHolder()));
+                validator.addFacetFlagIfPresent(create(annotation, 
processParameterContext.getFacetHolder()));
                 return;
             }
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/MandatoryFacetForParameterAnnotation.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/MandatoryFacetForParameterAnnotation.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/MandatoryFacetForParameterAnnotation.java
deleted file mode 100644
index f6cc6b9..0000000
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/MandatoryFacetForParameterAnnotation.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  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.param.parameter;
-
-import org.apache.isis.applib.annotation.Optionality;
-import org.apache.isis.applib.annotation.Parameter;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import 
org.apache.isis.core.metamodel.facets.propparam.mandatory.MandatoryFacet;
-import 
org.apache.isis.core.metamodel.facets.propparam.mandatory.MandatoryFacetAbstract;
-
-public abstract class MandatoryFacetForParameterAnnotation extends 
MandatoryFacetAbstract {
-
-    public MandatoryFacetForParameterAnnotation(final FacetHolder holder, 
final Semantics semantics) {
-        super(holder, semantics);
-    }
-
-    static MandatoryFacet create(
-            final Parameter parameter,
-            final Class<?> parameterType,
-            final FacetHolder holder) {
-
-        if (parameter == null) {
-            return null;
-        }
-
-        if (parameterType.isPrimitive()) {
-            return new MandatoryFacetForParameterAnnotation.Primitive(holder);
-        }
-
-        final Optionality optionality = parameter.optional();
-        switch (optionality) {
-            case DEFAULT:
-                // do nothing here; instead will rely on 
MandatoryFromJdoColumnAnnotationFacetFactory to perform
-                // the remaining processing
-                return null;
-            case FALSE:
-                return new 
MandatoryFacetForParameterAnnotation.Required(holder);
-            case TRUE:
-                return new 
MandatoryFacetForParameterAnnotation.Optional(holder);
-        }
-        return null;
-    }
-
-    public static class Primitive extends MandatoryFacetForParameterAnnotation 
{
-        public Primitive(final FacetHolder holder) {
-            super(holder, Semantics.REQUIRED);
-        }
-    }
-
-    public static class Required extends MandatoryFacetForParameterAnnotation {
-        public Required(final FacetHolder holder) {
-            super(holder, Semantics.REQUIRED);
-        }
-    }
-
-    public static class Optional extends MandatoryFacetForParameterAnnotation {
-        public Optional(final FacetHolder holder) {
-            super(holder, Semantics.OPTIONAL);
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/MaxLengthFacetForParameterAnnotation.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/MaxLengthFacetForParameterAnnotation.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/MaxLengthFacetForParameterAnnotation.java
deleted file mode 100644
index b065684..0000000
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/MaxLengthFacetForParameterAnnotation.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  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.param.parameter;
-
-import org.apache.isis.applib.annotation.Parameter;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.propparam.maxlen.MaxLengthFacet;
-import 
org.apache.isis.core.metamodel.facets.propparam.maxlen.MaxLengthFacetAbstract;
-
-public class MaxLengthFacetForParameterAnnotation extends 
MaxLengthFacetAbstract {
-
-    public static MaxLengthFacet create(
-            final Parameter parameter,
-            final FacetHolder holder) {
-
-        if (parameter == null) {
-            return null;
-        }
-
-        final int maxLength = parameter.maxLength();
-        return maxLength != -1
-                ? new MaxLengthFacetForParameterAnnotation(maxLength, holder)
-                : null;
-    }
-
-    private MaxLengthFacetForParameterAnnotation(final int value, final 
FacetHolder holder) {
-        super(value, holder);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/MustSatisfySpecificationFacetForParameterAnnotation.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/MustSatisfySpecificationFacetForParameterAnnotation.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/MustSatisfySpecificationFacetForParameterAnnotation.java
deleted file mode 100644
index 25beaf3..0000000
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/MustSatisfySpecificationFacetForParameterAnnotation.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  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.param.parameter;
-
-import java.util.List;
-import com.google.common.collect.Lists;
-import org.apache.isis.applib.annotation.Parameter;
-import org.apache.isis.applib.spec.Specification;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import 
org.apache.isis.core.metamodel.facets.propparam.mustsatisfyspec.MustSatisfySpecificationFacetAbstract;
-
-public class MustSatisfySpecificationFacetForParameterAnnotation extends 
MustSatisfySpecificationFacetAbstract {
-
-    static Facet create(final Parameter parameter, final FacetHolder holder) {
-
-        if (parameter == null) {
-            return null;
-        }
-
-        final Class<?>[] values = parameter.mustSatisfy();
-        final List<Specification> specifications = Lists.newArrayList();
-        for (final Class<?> value : values) {
-            final Specification specification = 
newSpecificationElseNull(value);
-            if (specification != null) {
-                specifications.add(specification);
-            }
-        }
-        return specifications.size() > 0 ? new 
MustSatisfySpecificationFacetForParameterAnnotation(specifications, holder) : 
null;
-    }
-
-
-    private MustSatisfySpecificationFacetForParameterAnnotation(final 
List<Specification> specifications, final FacetHolder holder) {
-        super(specifications, holder);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/ParameterAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/ParameterAnnotationFacetFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/ParameterAnnotationFacetFactory.java
index 3b7c9cc..1b48bd5 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/ParameterAnnotationFacetFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/ParameterAnnotationFacetFactory.java
@@ -21,14 +21,38 @@ package 
org.apache.isis.core.metamodel.facets.param.parameter;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
+import org.apache.isis.applib.annotation.MaxLength;
+import org.apache.isis.applib.annotation.MustSatisfy;
+import org.apache.isis.applib.annotation.Optional;
 import org.apache.isis.applib.annotation.Parameter;
+import org.apache.isis.applib.annotation.RegEx;
+import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.commons.config.IsisConfigurationAware;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facetapi.MetaModelValidatorRefiner;
 import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
+import org.apache.isis.core.metamodel.facets.object.regex.RegExFacet;
+import 
org.apache.isis.core.metamodel.facets.object.regex.TitleFacetFormattedByRegex;
+import 
org.apache.isis.core.metamodel.facets.param.parameter.mandatory.MandatoryFacetForParameterAnnotation;
+import 
org.apache.isis.core.metamodel.facets.param.parameter.mandatory.MandatoryFacetInvertedByOptionalAnnotationOnParameter;
+import 
org.apache.isis.core.metamodel.facets.param.parameter.maxlen.MaxLengthFacetForParameterAnnotation;
+import 
org.apache.isis.core.metamodel.facets.param.parameter.maxlen.MaxLengthFacetOnParamForMaxLengthAnnotation;
+import 
org.apache.isis.core.metamodel.facets.param.parameter.mustsatisfy.MustSatisfySpecificationFacetForMustSatisfyAnnotationOnParameter;
+import 
org.apache.isis.core.metamodel.facets.param.parameter.mustsatisfy.MustSatisfySpecificationFacetForParameterAnnotation;
+import 
org.apache.isis.core.metamodel.facets.param.parameter.regex.RegExFacetForParameterAnnotation;
+import 
org.apache.isis.core.metamodel.facets.param.parameter.regex.RegExFacetFromRegExAnnotationOnParameter;
+import 
org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite;
+import 
org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorForDeprecatedAnnotation;
 
-public class ParameterAnnotationFacetFactory extends FacetFactoryAbstract {
+public class ParameterAnnotationFacetFactory extends FacetFactoryAbstract 
implements MetaModelValidatorRefiner, IsisConfigurationAware {
+
+    private final MetaModelValidatorForDeprecatedAnnotation maxLengthValidator 
= new MetaModelValidatorForDeprecatedAnnotation(MaxLength.class);
+    private final MetaModelValidatorForDeprecatedAnnotation 
mustSatisfyValidator = new 
MetaModelValidatorForDeprecatedAnnotation(MustSatisfy.class);
+    private final MetaModelValidatorForDeprecatedAnnotation regexValidator = 
new MetaModelValidatorForDeprecatedAnnotation(RegEx.class);
+    private final MetaModelValidatorForDeprecatedAnnotation optionalValidator 
= new MetaModelValidatorForDeprecatedAnnotation(Optional.class);
 
     public ParameterAnnotationFacetFactory() {
         super(FeatureType.PARAMETERS_ONLY);
@@ -39,36 +63,146 @@ public class ParameterAnnotationFacetFactory extends 
FacetFactoryAbstract {
 
         final Method method = processParameterContext.getMethod();
         final int paramNum = processParameterContext.getParamNum();
-        final FacetedMethodParameter holder = 
processParameterContext.getFacetHolder();
 
         final Class<?>[] parameterTypes = method.getParameterTypes();
         if (paramNum >= parameterTypes.length) {
             return; // ignore
         }
 
+        processParamsMaxLength(processParameterContext);
+        processParamsMustSatisfy(processParameterContext);
+        processParamsRegEx(processParameterContext);
+        processParamsOptional(processParameterContext);
+
+    }
+
+    void processParamsMaxLength(final ProcessParameterContext 
processParameterContext) {
+
+        final Method method = processParameterContext.getMethod();
+        final int paramNum = processParameterContext.getParamNum();
+        final FacetedMethodParameter holder = 
processParameterContext.getFacetHolder();
         final Annotation[] parameterAnnotations = 
Annotations.getParameterAnnotations(method)[paramNum];
+
+        for (final Annotation parameterAnnotation : parameterAnnotations) {
+            if (parameterAnnotation instanceof MaxLength) {
+                final MaxLength annotation = (MaxLength) parameterAnnotation;
+                
maxLengthValidator.addFacetFlagIfPresent(MaxLengthFacetOnParamForMaxLengthAnnotation.create(annotation,
 processParameterContext.getFacetHolder()));
+                return;
+            }
+        }
+
         for (final Annotation parameterAnnotation : parameterAnnotations) {
             if (parameterAnnotation instanceof Parameter) {
                 final Parameter parameter = (Parameter) parameterAnnotation;
-                Class<?> parameterType = parameterTypes[paramNum];
-
                 FacetUtil.addFacet(
                         MaxLengthFacetForParameterAnnotation.create(parameter, 
holder));
+                return;
+            }
+        }
+    }
+
+    void processParamsMustSatisfy(final ProcessParameterContext 
processParameterContext) {
 
+        final Method method = processParameterContext.getMethod();
+        final int paramNum = processParameterContext.getParamNum();
+        final FacetedMethodParameter holder = 
processParameterContext.getFacetHolder();
+        final Class<?>[] parameterTypes = method.getParameterTypes();
+        final Annotation[] parameterAnnotations = 
Annotations.getParameterAnnotations(method)[paramNum];
+
+        boolean mustSatisfyAnnotationFound = false;
+        for (final Annotation parameterAnnotation : parameterAnnotations) {
+            if (parameterAnnotation instanceof MustSatisfy) {
+                final MustSatisfy annotation = (MustSatisfy) 
parameterAnnotation;
+                
mustSatisfyValidator.addFacetFlagIfPresent(MustSatisfySpecificationFacetForMustSatisfyAnnotationOnParameter.create(annotation,
 processParameterContext.getFacetHolder()));
+                return;
+            }
+        }
+
+        for (final Annotation parameterAnnotation : parameterAnnotations) {
+            if (parameterAnnotation instanceof Parameter) {
+                final Parameter parameter = (Parameter) parameterAnnotation;
                 FacetUtil.addFacet(
                         
MustSatisfySpecificationFacetForParameterAnnotation.create(parameter, holder));
+                return;
+            }
+        }
+    }
 
-                FacetUtil.addFacet(
-                        MandatoryFacetForParameterAnnotation.create(parameter, 
parameterType, holder));
+    void processParamsRegEx(final ProcessParameterContext 
processParameterContext) {
+
+        final Method method = processParameterContext.getMethod();
+        final int paramNum = processParameterContext.getParamNum();
+        final FacetedMethodParameter holder = 
processParameterContext.getFacetHolder();
+        final Class<?>[] parameterTypes = method.getParameterTypes();
+        final Annotation[] parameterAnnotations = 
Annotations.getParameterAnnotations(method)[paramNum];
 
-                if (Annotations.isString(parameterType)) {
-                    FacetUtil.addFacet(
-                            RegExFacetForParameterAnnotation.create(parameter, 
holder));
+        for (final Annotation parameterAnnotation : parameterAnnotations) {
+            final Class<?> parameterType = parameterTypes[paramNum];
+            if (parameterAnnotation instanceof RegEx) {
+                final RegEx annotation = (RegEx) parameterAnnotation;
+                final RegExFacet regExFacet = 
regexValidator.addFacetFlagIfPresent(RegExFacetFromRegExAnnotationOnParameter.create(annotation,
 parameterType, holder));
+
+                // regex also adds a title facet
+                if(regExFacet != null) {
+                    FacetUtil.addFacet(new 
TitleFacetFormattedByRegex(regExFacet));
                 }
+                return;
+            }
+        }
+
+        for (final Annotation parameterAnnotation : parameterAnnotations) {
+            if (parameterAnnotation instanceof Parameter) {
+                final Parameter parameter = (Parameter) parameterAnnotation;
+                final Class<?> parameterType = parameterTypes[paramNum];
+                FacetUtil.addFacet(
+                        RegExFacetForParameterAnnotation.create(parameter, 
parameterType, holder));
+                return;
+            }
+        }
+    }
+
+    void processParamsOptional(final ProcessParameterContext 
processParameterContext) {
+
+        final Method method = processParameterContext.getMethod();
+        final int paramNum = processParameterContext.getParamNum();
+        final FacetedMethodParameter holder = 
processParameterContext.getFacetHolder();
+        final Class<?>[] parameterTypes = method.getParameterTypes();
+        final Annotation[] parameterAnnotations = 
Annotations.getParameterAnnotations(method)[paramNum];
 
+        for (final Annotation parameterAnnotation : parameterAnnotations) {
+            final Class<?> parameterType = parameterTypes[paramNum];
+            if (parameterAnnotation instanceof Optional) {
+                final Optional annotation = (Optional) parameterAnnotation;
+                
optionalValidator.addFacetFlagIfPresent(MandatoryFacetInvertedByOptionalAnnotationOnParameter.create(annotation,
 parameterType, holder));
                 return;
             }
         }
+
+        for (final Annotation parameterAnnotation : parameterAnnotations) {
+            if (parameterAnnotation instanceof Parameter) {
+                final Parameter parameter = (Parameter) parameterAnnotation;
+                final Class<?> parameterType = parameterTypes[paramNum];
+                FacetUtil.addFacet(
+                        MandatoryFacetForParameterAnnotation.create(parameter, 
parameterType, holder));
+                return;
+            }
+        }
+    }
+
+    @Override
+    public void refineMetaModelValidator(final MetaModelValidatorComposite 
metaModelValidator, final IsisConfiguration configuration) {
+        metaModelValidator.add(maxLengthValidator);
+        metaModelValidator.add(mustSatisfyValidator);
+        metaModelValidator.add(regexValidator);
+        metaModelValidator.add(optionalValidator);
+    }
+
+    @Override
+    public void setConfiguration(final IsisConfiguration configuration) {
+        maxLengthValidator.setConfiguration(configuration);
+        mustSatisfyValidator.setConfiguration(configuration);
+        regexValidator.setConfiguration(configuration);
+        optionalValidator.setConfiguration(configuration);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/RegExFacetForParameterAnnotation.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/RegExFacetForParameterAnnotation.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/RegExFacetForParameterAnnotation.java
deleted file mode 100644
index 532972c..0000000
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/RegExFacetForParameterAnnotation.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- *  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.param.parameter;
-
-import java.util.regex.Pattern;
-import com.google.common.base.Strings;
-import org.apache.isis.applib.annotation.Parameter;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.regex.RegExFacet;
-import org.apache.isis.core.metamodel.facets.object.regex.RegExFacetAbstract;
-
-public class RegExFacetForParameterAnnotation extends RegExFacetAbstract {
-
-    private final Pattern pattern;
-
-    static RegExFacet create(
-            final Parameter parameter,
-            final FacetHolder holder) {
-
-        if (parameter == null) {
-            return null;
-        }
-
-
-        final String pattern = parameter.regexPattern();
-        if(Strings.isNullOrEmpty(pattern)) {
-            return null;
-        }
-
-        final int patternFlags = parameter.regexPatternFlags();
-
-        return new RegExFacetForParameterAnnotation(pattern, patternFlags, 
holder);
-    }
-
-    private RegExFacetForParameterAnnotation(final String pattern, final int 
patternFlags, final FacetHolder holder) {
-        super(pattern, "", false, holder);
-        this.pattern = Pattern.compile(pattern, patternFlags);
-    }
-
-    /**
-     * Unused (for the TitledFacet)
-     */
-    @Override
-    public String format(String text) {
-        return text;
-    }
-
-    @Override
-    public boolean doesNotMatch(final String text) {
-        if (text == null) {
-            return true;
-        }
-        return !pattern.matcher(text).matches();
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/mandatory/MandatoryFacetForParameterAnnotation.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/mandatory/MandatoryFacetForParameterAnnotation.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/mandatory/MandatoryFacetForParameterAnnotation.java
new file mode 100644
index 0000000..b40a260
--- /dev/null
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/mandatory/MandatoryFacetForParameterAnnotation.java
@@ -0,0 +1,79 @@
+/*
+ *  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.param.parameter.mandatory;
+
+import org.apache.isis.applib.annotation.Optionality;
+import org.apache.isis.applib.annotation.Parameter;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import 
org.apache.isis.core.metamodel.facets.propparam.mandatory.MandatoryFacet;
+import 
org.apache.isis.core.metamodel.facets.propparam.mandatory.MandatoryFacetAbstract;
+
+public abstract class MandatoryFacetForParameterAnnotation extends 
MandatoryFacetAbstract {
+
+    public MandatoryFacetForParameterAnnotation(final FacetHolder holder, 
final Semantics semantics) {
+        super(holder, semantics);
+    }
+
+    public static MandatoryFacet create(
+            final Parameter parameter,
+            final Class<?> parameterType,
+            final FacetHolder holder) {
+
+        if (parameter == null) {
+            return null;
+        }
+
+        if (parameterType.isPrimitive()) {
+            return new MandatoryFacetForParameterAnnotation.Primitive(holder);
+        }
+
+        final Optionality optionality = parameter.optional();
+        switch (optionality) {
+            case DEFAULT:
+                // do nothing here; instead will rely on 
MandatoryFromJdoColumnAnnotationFacetFactory to perform
+                // the remaining processing
+                return null;
+            case FALSE:
+                return new 
MandatoryFacetForParameterAnnotation.Required(holder);
+            case TRUE:
+                return new 
MandatoryFacetForParameterAnnotation.Optional(holder);
+        }
+        return null;
+    }
+
+    public static class Primitive extends MandatoryFacetForParameterAnnotation 
{
+        public Primitive(final FacetHolder holder) {
+            super(holder, Semantics.REQUIRED);
+        }
+    }
+
+    public static class Required extends MandatoryFacetForParameterAnnotation {
+        public Required(final FacetHolder holder) {
+            super(holder, Semantics.REQUIRED);
+        }
+    }
+
+    public static class Optional extends MandatoryFacetForParameterAnnotation {
+        public Optional(final FacetHolder holder) {
+            super(holder, Semantics.OPTIONAL);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/mandatory/MandatoryFacetInvertedByOptionalAnnotationOnParameter.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/mandatory/MandatoryFacetInvertedByOptionalAnnotationOnParameter.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/mandatory/MandatoryFacetInvertedByOptionalAnnotationOnParameter.java
new file mode 100644
index 0000000..07725ce
--- /dev/null
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/mandatory/MandatoryFacetInvertedByOptionalAnnotationOnParameter.java
@@ -0,0 +1,53 @@
+/*
+ *  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.param.parameter.mandatory;
+
+import org.apache.isis.applib.annotation.Optional;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
+import 
org.apache.isis.core.metamodel.facets.propparam.mandatory.MandatoryFacetAbstract;
+
+/**
+ * Derived by presence of an <tt>@Optional</tt> method.
+ * 
+ * <p>
+ * This implementation indicates that the {@link FacetHolder} is <i>not</i>
+ * mandatory, as per {@link #isInvertedSemantics()}.
+ */
+public class MandatoryFacetInvertedByOptionalAnnotationOnParameter extends 
MandatoryFacetAbstract {
+
+
+    public static Facet create(final Optional annotation, final Class<?> 
parameterType, final FacetedMethodParameter holder) {
+        if(annotation == null) {
+            return null;
+        }
+        if(parameterType.isPrimitive()) {
+            return null;
+        }
+        return new 
MandatoryFacetInvertedByOptionalAnnotationOnParameter(holder);
+    }
+
+    private MandatoryFacetInvertedByOptionalAnnotationOnParameter(final 
FacetHolder holder) {
+        super(holder, Semantics.OPTIONAL);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/maxlen/MaxLengthFacetForParameterAnnotation.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/maxlen/MaxLengthFacetForParameterAnnotation.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/maxlen/MaxLengthFacetForParameterAnnotation.java
new file mode 100644
index 0000000..9e6b800
--- /dev/null
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/maxlen/MaxLengthFacetForParameterAnnotation.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.param.parameter.maxlen;
+
+import org.apache.isis.applib.annotation.Parameter;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.propparam.maxlen.MaxLengthFacet;
+import 
org.apache.isis.core.metamodel.facets.propparam.maxlen.MaxLengthFacetAbstract;
+
+public class MaxLengthFacetForParameterAnnotation extends 
MaxLengthFacetAbstract {
+
+    public static MaxLengthFacet create(
+            final Parameter parameter,
+            final FacetHolder holder) {
+
+        if (parameter == null) {
+            return null;
+        }
+
+        final int maxLength = parameter.maxLength();
+        return maxLength != -1
+                ? new MaxLengthFacetForParameterAnnotation(maxLength, holder)
+                : null;
+    }
+
+    private MaxLengthFacetForParameterAnnotation(final int value, final 
FacetHolder holder) {
+        super(value, holder);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/maxlen/MaxLengthFacetOnParamForMaxLengthAnnotation.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/maxlen/MaxLengthFacetOnParamForMaxLengthAnnotation.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/maxlen/MaxLengthFacetOnParamForMaxLengthAnnotation.java
new file mode 100644
index 0000000..2409c11
--- /dev/null
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/maxlen/MaxLengthFacetOnParamForMaxLengthAnnotation.java
@@ -0,0 +1,37 @@
+/*
+ *  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.param.parameter.maxlen;
+
+import org.apache.isis.applib.annotation.MaxLength;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.propparam.maxlen.MaxLengthFacet;
+import 
org.apache.isis.core.metamodel.facets.propparam.maxlen.MaxLengthFacetAbstract;
+
+public class MaxLengthFacetOnParamForMaxLengthAnnotation extends 
MaxLengthFacetAbstract {
+
+    public static MaxLengthFacet create(final MaxLength annotation, final 
FacetHolder holder) {
+        return annotation == null ? null : new 
MaxLengthFacetOnParamForMaxLengthAnnotation(annotation.value(), holder);
+    }
+
+    private MaxLengthFacetOnParamForMaxLengthAnnotation(final int value, final 
FacetHolder holder) {
+        super(value, holder);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/mustsatisfy/MustSatisfySpecificationFacetForMustSatisfyAnnotationOnParameter.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/mustsatisfy/MustSatisfySpecificationFacetForMustSatisfyAnnotationOnParameter.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/mustsatisfy/MustSatisfySpecificationFacetForMustSatisfyAnnotationOnParameter.java
new file mode 100644
index 0000000..1d24490
--- /dev/null
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/mustsatisfy/MustSatisfySpecificationFacetForMustSatisfyAnnotationOnParameter.java
@@ -0,0 +1,52 @@
+/*
+ *  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.param.parameter.mustsatisfy;
+
+import java.util.List;
+import com.google.common.collect.Lists;
+import org.apache.isis.applib.annotation.MustSatisfy;
+import org.apache.isis.applib.spec.Specification;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import 
org.apache.isis.core.metamodel.facets.propparam.mustsatisfyspec.MustSatisfySpecificationFacetAbstract;
+
+public class MustSatisfySpecificationFacetForMustSatisfyAnnotationOnParameter 
extends MustSatisfySpecificationFacetAbstract {
+
+
+    public static Facet create(final MustSatisfy annotation, final FacetHolder 
holder) {
+        if (annotation == null) {
+            return null;
+        }
+        final Class<?>[] values = annotation.value();
+        final List<Specification> specifications = Lists.newArrayList();
+        for (final Class<?> value : values) {
+            final Specification specification = 
newSpecificationElseNull(value);
+            if (specification != null) {
+                specifications.add(specification);
+            }
+        }
+        return specifications.size() > 0 ? new 
MustSatisfySpecificationFacetForMustSatisfyAnnotationOnParameter(specifications,
 holder) : null;
+    }
+
+    private 
MustSatisfySpecificationFacetForMustSatisfyAnnotationOnParameter(final 
List<Specification> specifications, final FacetHolder holder) {
+        super(specifications, holder);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/mustsatisfy/MustSatisfySpecificationFacetForParameterAnnotation.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/mustsatisfy/MustSatisfySpecificationFacetForParameterAnnotation.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/mustsatisfy/MustSatisfySpecificationFacetForParameterAnnotation.java
new file mode 100644
index 0000000..bf08288
--- /dev/null
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/mustsatisfy/MustSatisfySpecificationFacetForParameterAnnotation.java
@@ -0,0 +1,54 @@
+/*
+ *  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.param.parameter.mustsatisfy;
+
+import java.util.List;
+import com.google.common.collect.Lists;
+import org.apache.isis.applib.annotation.Parameter;
+import org.apache.isis.applib.spec.Specification;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import 
org.apache.isis.core.metamodel.facets.propparam.mustsatisfyspec.MustSatisfySpecificationFacetAbstract;
+
+public class MustSatisfySpecificationFacetForParameterAnnotation extends 
MustSatisfySpecificationFacetAbstract {
+
+    public static Facet create(final Parameter parameter, final FacetHolder 
holder) {
+
+        if (parameter == null) {
+            return null;
+        }
+
+        final Class<?>[] values = parameter.mustSatisfy();
+        final List<Specification> specifications = Lists.newArrayList();
+        for (final Class<?> value : values) {
+            final Specification specification = 
newSpecificationElseNull(value);
+            if (specification != null) {
+                specifications.add(specification);
+            }
+        }
+        return specifications.size() > 0 ? new 
MustSatisfySpecificationFacetForParameterAnnotation(specifications, holder) : 
null;
+    }
+
+
+    private MustSatisfySpecificationFacetForParameterAnnotation(final 
List<Specification> specifications, final FacetHolder holder) {
+        super(specifications, holder);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/regex/RegExFacetForParameterAnnotation.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/regex/RegExFacetForParameterAnnotation.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/regex/RegExFacetForParameterAnnotation.java
new file mode 100644
index 0000000..97e6b71
--- /dev/null
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/regex/RegExFacetForParameterAnnotation.java
@@ -0,0 +1,78 @@
+/*
+ *  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.param.parameter.regex;
+
+import java.util.regex.Pattern;
+import com.google.common.base.Strings;
+import org.apache.isis.applib.annotation.Parameter;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.Annotations;
+import org.apache.isis.core.metamodel.facets.object.regex.RegExFacet;
+import org.apache.isis.core.metamodel.facets.object.regex.RegExFacetAbstract;
+
+public class RegExFacetForParameterAnnotation extends RegExFacetAbstract {
+
+    private final Pattern pattern;
+
+    public static RegExFacet create(
+            final Parameter parameter,
+            final Class<?> parameterType,
+            final FacetHolder holder) {
+
+        if (parameter == null) {
+            return null;
+        }
+        if(!Annotations.isString(parameterType)) {
+            return null;
+        }
+
+        final String pattern = parameter.regexPattern();
+        if(Strings.isNullOrEmpty(pattern)) {
+            return null;
+        }
+
+        final int patternFlags = parameter.regexPatternFlags();
+
+        return new RegExFacetForParameterAnnotation(pattern, patternFlags, 
holder);
+    }
+
+    private RegExFacetForParameterAnnotation(final String pattern, final int 
patternFlags, final FacetHolder holder) {
+        super(pattern, "", false, holder);
+        this.pattern = Pattern.compile(pattern, patternFlags);
+    }
+
+    /**
+     * Unused (for the TitledFacet)
+     */
+    @Override
+    public String format(String text) {
+        return text;
+    }
+
+    @Override
+    public boolean doesNotMatch(final String text) {
+        if (text == null) {
+            return true;
+        }
+        return !pattern.matcher(text).matches();
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/regex/RegExFacetFromRegExAnnotationOnParameter.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/regex/RegExFacetFromRegExAnnotationOnParameter.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/regex/RegExFacetFromRegExAnnotationOnParameter.java
new file mode 100644
index 0000000..6147239
--- /dev/null
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/parameter/regex/RegExFacetFromRegExAnnotationOnParameter.java
@@ -0,0 +1,77 @@
+/*
+ *  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.param.parameter.regex;
+
+import java.util.regex.Pattern;
+
+import org.apache.isis.applib.annotation.RegEx;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.Annotations;
+import org.apache.isis.core.metamodel.facets.object.regex.RegExFacet;
+import org.apache.isis.core.metamodel.facets.object.regex.RegExFacetAbstract;
+
+public class RegExFacetFromRegExAnnotationOnParameter extends 
RegExFacetAbstract {
+
+    private final Pattern pattern;
+
+    public static RegExFacet create(final RegEx annotation, final Class<?> 
parameterType, final FacetHolder holder) {
+        if (annotation == null) {
+            return null;
+        }
+        if(!Annotations.isString(parameterType)) {
+            return null;
+        }
+
+        final String validationExpression = annotation.validation();
+        final boolean caseSensitive = annotation.caseSensitive();
+        final String formatExpression = annotation.format();
+
+        return new 
RegExFacetFromRegExAnnotationOnParameter(validationExpression, 
formatExpression, caseSensitive, holder);
+    }
+
+    private RegExFacetFromRegExAnnotationOnParameter(final String validation, 
final String format, final boolean caseSensitive, final FacetHolder holder) {
+        super(validation, format, caseSensitive, holder);
+        pattern = Pattern.compile(validation(), patternFlags());
+    }
+
+    @Override
+    public String format(final String text) {
+        if (text == null) {
+            return "<not a string>";
+        }
+        if (format() == null || format().length() == 0) {
+            return text;
+        }
+        return pattern.matcher(text).replaceAll(format());
+    }
+
+    @Override
+    public boolean doesNotMatch(final String text) {
+        if (text == null) {
+            return true;
+        }
+        return !pattern.matcher(text).matches();
+    }
+
+    private int patternFlags() {
+        return !caseSensitive() ? Pattern.CASE_INSENSITIVE : 0;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/renderedasdaybefore/annotation/RenderedAsDayBeforeFacetOnParameterAnnotationFactory.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/renderedasdaybefore/annotation/RenderedAsDayBeforeFacetOnParameterAnnotationFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/renderedasdaybefore/annotation/RenderedAsDayBeforeFacetOnParameterAnnotationFactory.java
index 3c99fbb..f24b263 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/renderedasdaybefore/annotation/RenderedAsDayBeforeFacetOnParameterAnnotationFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/renderedasdaybefore/annotation/RenderedAsDayBeforeFacetOnParameterAnnotationFactory.java
@@ -24,7 +24,6 @@ import org.apache.isis.applib.annotation.RenderedAsDayBefore;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.config.IsisConfigurationAware;
 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.MetaModelValidatorRefiner;
 import org.apache.isis.core.metamodel.facets.Annotations;
@@ -47,7 +46,7 @@ public class 
RenderedAsDayBeforeFacetOnParameterAnnotationFactory extends FacetF
         for (final Annotation parameterAnnotation : parameterAnnotations) {
             if (parameterAnnotation instanceof RenderedAsDayBefore) {
                 final RenderedAsDayBefore annotation = (RenderedAsDayBefore) 
parameterAnnotation;
-                validator.addFacet(create(annotation, 
processParameterContext.getFacetHolder()));
+                validator.addFacetFlagIfPresent(create(annotation, 
processParameterContext.getFacetHolder()));
                 return;
             }
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/typicallen/annotation/TypicalLengthFacetOnParameterAnnotationFactory.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/typicallen/annotation/TypicalLengthFacetOnParameterAnnotationFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/typicallen/annotation/TypicalLengthFacetOnParameterAnnotationFactory.java
index d6aeea9..c1b2abe 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/typicallen/annotation/TypicalLengthFacetOnParameterAnnotationFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/typicallen/annotation/TypicalLengthFacetOnParameterAnnotationFactory.java
@@ -47,7 +47,7 @@ public class TypicalLengthFacetOnParameterAnnotationFactory 
extends FacetFactory
         for (final Annotation parameterAnnotation : parameterAnnotations) {
             if (parameterAnnotation instanceof TypicalLength) {
                 final TypicalLength annotation = (TypicalLength) 
parameterAnnotation;
-                validator.addFacet(create(annotation, 
processParameterContext.getFacetHolder()));
+                validator.addFacetFlagIfPresent(create(annotation, 
processParameterContext.getFacetHolder()));
                 return;
             }
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validating/maxlenannot/MaxLengthFacetOnParameterAnnotation.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validating/maxlenannot/MaxLengthFacetOnParameterAnnotation.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validating/maxlenannot/MaxLengthFacetOnParameterAnnotation.java
deleted file mode 100644
index 2bbee5b..0000000
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validating/maxlenannot/MaxLengthFacetOnParameterAnnotation.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  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.param.validating.maxlenannot;
-
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import 
org.apache.isis.core.metamodel.facets.propparam.maxlen.MaxLengthFacetAbstract;
-
-public class MaxLengthFacetOnParameterAnnotation extends 
MaxLengthFacetAbstract {
-
-    public MaxLengthFacetOnParameterAnnotation(final int value, final 
FacetHolder holder) {
-        super(value, holder);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/31816a69/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validating/maxlenannot/MaxLengthFacetOnParameterAnnotationFactory.java
----------------------------------------------------------------------
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validating/maxlenannot/MaxLengthFacetOnParameterAnnotationFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validating/maxlenannot/MaxLengthFacetOnParameterAnnotationFactory.java
deleted file mode 100644
index 2b03fb0..0000000
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validating/maxlenannot/MaxLengthFacetOnParameterAnnotationFactory.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  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.param.validating.maxlenannot;
-
-import java.lang.annotation.Annotation;
-import org.apache.isis.applib.annotation.MaxLength;
-import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.config.IsisConfigurationAware;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facetapi.MetaModelValidatorRefiner;
-import org.apache.isis.core.metamodel.facets.Annotations;
-import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.facets.propparam.maxlen.MaxLengthFacet;
-import 
org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite;
-import 
org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorForDeprecatedAnnotation;
-
-public class MaxLengthFacetOnParameterAnnotationFactory extends 
FacetFactoryAbstract implements MetaModelValidatorRefiner, 
IsisConfigurationAware {
-
-    private final MetaModelValidatorForDeprecatedAnnotation validator = new 
MetaModelValidatorForDeprecatedAnnotation(MaxLength.class);
-
-    public MaxLengthFacetOnParameterAnnotationFactory() {
-        super(FeatureType.PARAMETERS_ONLY);
-    }
-
-    @Override
-    public void processParams(final ProcessParameterContext 
processParameterContext) {
-        final java.lang.annotation.Annotation[] parameterAnnotations = 
Annotations.getParameterAnnotations(processParameterContext.getMethod())[processParameterContext.getParamNum()];
-
-        for (final Annotation parameterAnnotation : parameterAnnotations) {
-            if (parameterAnnotation instanceof MaxLength) {
-                final MaxLength annotation = (MaxLength) parameterAnnotation;
-                validator.addFacet(create(annotation, 
processParameterContext.getFacetHolder()));
-                return;
-            }
-        }
-    }
-
-    private MaxLengthFacet create(final MaxLength annotation, final 
FacetHolder holder) {
-        return annotation == null ? null : new 
MaxLengthFacetOnParameterAnnotation(annotation.value(), holder);
-    }
-
-    @Override
-    public void refineMetaModelValidator(final MetaModelValidatorComposite 
metaModelValidator, final IsisConfiguration configuration) {
-        metaModelValidator.add(validator);
-    }
-
-    @Override
-    public void setConfiguration(final IsisConfiguration configuration) {
-        validator.setConfiguration(configuration);
-    }
-
-
-}

Reply via email to