You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2020/01/05 22:18:53 UTC

[isis] branch master updated: ISIS-2257: relaxes MM Validation when associated action parameter

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new a12f096  ISIS-2257: relaxes MM Validation when associated action parameter
a12f096 is described below

commit a12f096b70a1d49589c0904fd16179f574f58156
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Jan 5 23:18:42 2020 +0100

    ISIS-2257: relaxes MM Validation when associated action parameter
---
 ...nChoicesForCollectionParameterFacetFactory.java | 153 +++++++++++----------
 .../dom/actions/assoc/AssociatedActionDemo.java    |   7 -
 2 files changed, 80 insertions(+), 80 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/ActionChoicesForCollectionParameterFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/ActionChoicesForCollectionParameterFacetFactory.java
index a9039a7..206a6e5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/ActionChoicesForCollectionParameterFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/ActionChoicesForCollectionParameterFacetFactory.java
@@ -22,6 +22,7 @@ package org.apache.isis.metamodel.facets.actions.action;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.metamodel.facets.actions.action.associateWith.AssociatedWithFacet;
 import org.apache.isis.metamodel.facets.collparam.semantics.CollectionSemanticsFacet;
 import org.apache.isis.metamodel.facets.object.autocomplete.AutoCompleteFacet;
 import org.apache.isis.metamodel.facets.param.autocomplete.ActionParameterAutoCompleteFacet;
@@ -63,91 +64,97 @@ implements MetaModelRefiner {
             return;
         }
 
-        programmingModel.addValidator(
+        val vistingValidator = new MetaModelValidatorVisiting.Visitor() {
+            
+            @Override
+            public boolean visit(
+                    final ObjectSpecification objectSpec,
+                    final MetaModelValidator validator) {
                 
-                new MetaModelValidatorVisiting.Visitor() {
-                    @Override
-                    public boolean visit(
-                            final ObjectSpecification objectSpec,
-                            final MetaModelValidator validator) {
-                        validate(objectSpec, validator);
-                        return true;
-                    }
+                validate(objectSpec, validator);
+                return true;
+            }
 
-                    private void validate(
-                            final ObjectSpecification objectSpec,
-                            final MetaModelValidator validator) {
-                        objectSpec.streamObjectActions(Contributed.INCLUDED)
-                        .forEach(objectAction->{
-                            if(objectAction instanceof ObjectActionMixedIn || objectAction instanceof ObjectActionContributee) {
-                                // we'll report only the mixin or contributor
-                                return;
-                            }
-
-                            int paramNum = 0;
-                            for (ObjectActionParameter parameter : objectAction.getParameters()) {
-                                if(parameter.getFeatureType() == FeatureType.ACTION_PARAMETER_COLLECTION) {
-                                    validate(objectSpec, objectAction, parameter, paramNum, validator);
-                                }
-                                paramNum++;
-                            }
-                        });
+            private void validate(
+                    final ObjectSpecification objectSpec,
+                    final MetaModelValidator validator) {
+                
+                objectSpec.streamObjectActions(Contributed.INCLUDED)
+                .forEach(objectAction->{
+                    if(objectAction instanceof ObjectActionMixedIn 
+                            || objectAction instanceof ObjectActionContributee) {
+                        // we'll report only the mixin or contributor
+                        return;
                     }
 
-                    private void validate(
-                            final ObjectSpecification objectSpec,
-                            final ObjectAction objectAction,
-                            final ObjectActionParameter parameter,
-                            final int paramNum,
-                            final MetaModelValidator validator) {
-
-
-                        final CollectionSemanticsFacet collectionSemantics =
-                                parameter.getFacet(CollectionSemanticsFacet.class);
-                        if (collectionSemantics != null) {
-                            // Violation if there are action parameter types that are assignable
-                            // from java.util.Collection but are not of
-                            // exact type List, Set, SortedSet or Collection.
-                            if(!collectionSemantics.value().isSupportedInterfaceForActionParameters()) {
-                                validator.onFailure(
-                                        objectSpec,
-                                        objectSpec.getIdentifier(),
-                                        "Collection action parameter found that is not exactly one "
-                                                + "of the following supported types: "
-                                                + "List, Set, SortedSet, Collection or Array.  "
-                                                + "Class: %s action: %s parameter %d",
-                                        objectSpec.getFullIdentifier(), 
-                                        objectAction.getName(), 
-                                        paramNum);
-                                return;
-                            }
+                    int paramNum = 0;
+                    for (ObjectActionParameter parameter : objectAction.getParameters()) {
+                        if(parameter.getFeatureType() == FeatureType.ACTION_PARAMETER_COLLECTION) {
+                            validateActionParameter_whenCollection(
+                                    objectSpec, objectAction, parameter, paramNum, validator);
                         }
-
-                        final ActionParameterChoicesFacet choicesFacet =
-                                parameter.getFacet(ActionParameterChoicesFacet.class);
-                        final ActionParameterAutoCompleteFacet autoCompleteFacet =
-                                parameter.getFacet(ActionParameterAutoCompleteFacet.class);
-                        if (choicesFacet != null || autoCompleteFacet != null) {
-                            return;
-                        }
-
-                        final ObjectSpecification parameterType = parameter.getSpecification();
-                        if(parameterType.containsNonFallbackFacet(AutoCompleteFacet.class)) {
-                            return;
-                        }
-
+                        paramNum++;
+                    }
+                });
+            }
+
+            private void validateActionParameter_whenCollection(
+                    final ObjectSpecification objectSpec,
+                    final ObjectAction objectAction,
+                    final ObjectActionParameter parameter,
+                    final int paramNum,
+                    final MetaModelValidator validator) {
+
+
+                val collectionSemanticsFacet = parameter.getFacet(CollectionSemanticsFacet.class);
+                if (collectionSemanticsFacet != null) {
+                    // Violation if there are action parameter types that are assignable
+                    // from java.util.Collection but are not of
+                    // exact type List, Set, SortedSet or Collection.
+                    if(!collectionSemanticsFacet.value().isSupportedInterfaceForActionParameters()) {
                         validator.onFailure(
                                 objectSpec,
                                 objectSpec.getIdentifier(),
-                                "Collection action parameter found without supporting "
-                                        + "choices or autoComplete facet.  "
+                                "Collection action parameter found that is not exactly one "
+                                        + "of the following supported types: "
+                                        + "List, Set, SortedSet, Collection or Array.  "
                                         + "Class: %s action: %s parameter %d",
+                                        objectSpec.getFullIdentifier(), 
+                                        objectAction.getName(), 
+                                        paramNum);
+                        return;
+                    }
+                }
+
+                val actionParameterChoicesFacet = parameter.getFacet(ActionParameterChoicesFacet.class);
+                val actionParameterAutoCompleteFacet = parameter.getFacet(ActionParameterAutoCompleteFacet.class);
+                if (actionParameterChoicesFacet != null || actionParameterAutoCompleteFacet != null) {
+                    return;
+                }
+
+                val parameterSpec = parameter.getSpecification();
+                if(parameterSpec.containsNonFallbackFacet(AutoCompleteFacet.class)) {
+                    return;
+                }
+                
+                if(paramNum==0 && objectAction.containsNonFallbackFacet(AssociatedWithFacet.class)) {
+                    return; 
+                }
+
+                validator.onFailure(
+                        objectSpec,
+                        objectSpec.getIdentifier(),
+                        "Collection action parameter found without supporting "
+                                + "choices or autoComplete facet.  "
+                                + "Class: %s action: %s parameter %d",
                                 objectSpec.getFullIdentifier(), 
                                 objectAction.getName(), 
                                 paramNum);
-                    }
-                });
-        
+            }
+        };
+
+        programmingModel.addValidator(vistingValidator);
+
     }
 
 }
diff --git a/examples/demo/src/main/java/demoapp/dom/actions/assoc/AssociatedActionDemo.java b/examples/demo/src/main/java/demoapp/dom/actions/assoc/AssociatedActionDemo.java
index b1ee14a..6be9ec0 100644
--- a/examples/demo/src/main/java/demoapp/dom/actions/assoc/AssociatedActionDemo.java
+++ b/examples/demo/src/main/java/demoapp/dom/actions/assoc/AssociatedActionDemo.java
@@ -18,7 +18,6 @@
  */
 package demoapp.dom.actions.assoc;
 
-import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.Set;
 
@@ -36,7 +35,6 @@ import org.apache.isis.applib.annotation.Editing;
 import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.services.message.MessageService;
-import org.apache.isis.incubator.model.applib.annotation.Model;
 
 import lombok.Getter;
 
@@ -70,10 +68,5 @@ public class AssociatedActionDemo extends DemoStub {
         items.add(DemoItem.of("third"));
         items.add(DemoItem.of("last"));
     }
-
-    @Model //FIXME just a workaround, remove this supporting method!
-    public Set<DemoItem> choices0DoSomethingWithItems() {
-        return Collections.emptySet();
-    }
     
 }