You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2018/02/28 11:22:11 UTC

[isis] branch maint-1.16.2 updated: ISIS-1884: restricts contribution of choices and default only if @Action(associatedWith) is used...

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

danhaywood pushed a commit to branch maint-1.16.2
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/maint-1.16.2 by this push:
     new b2d720f  ISIS-1884: restricts contribution of choices and default only if @Action(associatedWith) is used...
b2d720f is described below

commit b2d720f0210813912fedc85a72414c4a9db14eb6
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Feb 28 10:09:58 2018 +0000

    ISIS-1884: restricts contribution of choices and default only if @Action(associatedWith) is used...
    
    ... not for @MemberOrder etc.  Does this by introducing a new internal facet type (AssociatedWithFacet and changing the predicate that looks for associated actions of a collection to use that new facet rather than MemberOrderFacet).
---
 .../action/ActionAnnotationFacetFactory.java       |  9 +++--
 .../action/associateWith/AssociatedWithFacet.java  | 30 +++++++++++++++
 .../associateWith/AssociatedWithFacetAbstract.java | 45 ++++++++++++++++++++++
 .../AssociatedWithFacetForActionAnnotation.java    | 32 +++++++++++++++
 ...onParameterDefaultsAndChoicesPostProcessor.java | 39 ++++++++++---------
 ...eterDefaultsFacetFromAssociatedCollection.java} |  4 +-
 .../core/metamodel/spec/feature/ObjectAction.java  | 11 +++---
 .../linkandlabel/ActionLinkFactoryAbstract.java    |  6 +--
 8 files changed, 144 insertions(+), 32 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
index b58ff4a..b26586d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
@@ -48,6 +48,7 @@ import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
+import org.apache.isis.core.metamodel.facets.actions.action.associateWith.AssociatedWithFacetForActionAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.bulk.BulkFacetForActionAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.bulk.BulkFacetForBulkAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.bulk.BulkFacetObjectOnly;
@@ -83,7 +84,6 @@ import org.apache.isis.core.metamodel.facets.actions.publish.PublishedActionFace
 import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
 import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacet;
-import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
 import org.apache.isis.core.metamodel.facets.members.order.annotprop.MemberOrderFacetForActionAnnotation;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -464,18 +464,19 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract
         final FacetedMethod holder = processMethodContext.getFacetHolder();
 
         // check for @Action(associateWith=...)
-        MemberOrderFacet memberOrderFacet = null;
 
         final Action action = Annotations.getAnnotation(method, Action.class);
         if (action != null) {
             final String associateWith = action.associateWith();
             if(!Strings.isNullOrEmpty(associateWith)) {
                 final String associateWithSequence = action.associateWithSequence();
-                memberOrderFacet = new MemberOrderFacetForActionAnnotation(associateWith, associateWithSequence, holder);
+                FacetUtil.addFacet(
+                        new MemberOrderFacetForActionAnnotation(associateWith, associateWithSequence, holder));
+                FacetUtil.addFacet(
+                        new AssociatedWithFacetForActionAnnotation(associateWith, holder));
             }
         }
 
-        FacetUtil.addFacet(memberOrderFacet);
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/associateWith/AssociatedWithFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/associateWith/AssociatedWithFacet.java
new file mode 100644
index 0000000..bdaffec
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/associateWith/AssociatedWithFacet.java
@@ -0,0 +1,30 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.actions.action.associateWith;
+
+import org.apache.isis.core.metamodel.facets.SingleStringValueFacet;
+
+/**
+ * Associates an action with a collection, for the purpose of defaulting
+ * choices and defaults of parameters of the same type.
+ */
+public interface AssociatedWithFacet extends SingleStringValueFacet {
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/associateWith/AssociatedWithFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/associateWith/AssociatedWithFacetAbstract.java
new file mode 100644
index 0000000..44c850a
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/associateWith/AssociatedWithFacetAbstract.java
@@ -0,0 +1,45 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.actions.action.associateWith;
+
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.SingleStringValueFacetAbstract;
+
+/**
+ * Associates an action with a collection, for the purpose of defaulting
+ * choices and defaults of parameters of the same type.
+ */
+public abstract class AssociatedWithFacetAbstract
+        extends SingleStringValueFacetAbstract
+        implements AssociatedWithFacet {
+
+    public static Class<? extends Facet> type() {
+        return AssociatedWithFacet.class;
+    }
+
+
+    public AssociatedWithFacetAbstract(
+            final String value,
+            final FacetHolder holder) {
+        super(type(), holder, value);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/associateWith/AssociatedWithFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/associateWith/AssociatedWithFacetForActionAnnotation.java
new file mode 100644
index 0000000..e7c7eb1
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/associateWith/AssociatedWithFacetForActionAnnotation.java
@@ -0,0 +1,32 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.actions.action.associateWith;
+
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+
+public class AssociatedWithFacetForActionAnnotation extends AssociatedWithFacetAbstract {
+
+    public AssociatedWithFacetForActionAnnotation(
+            final String value,
+            final FacetHolder holder) {
+        super(value, holder);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ActionCollectionParameterDefaultsAndChoicesPostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ActionCollectionParameterDefaultsAndChoicesPostProcessor.java
index 97b6c0f..7a39344 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ActionCollectionParameterDefaultsAndChoicesPostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ActionCollectionParameterDefaultsAndChoicesPostProcessor.java
@@ -65,19 +65,16 @@ public class ActionCollectionParameterDefaultsAndChoicesPostProcessor implements
         List<ObjectAction> objectActions = objectSpecification.getObjectActions(actionTypes, Contributed.INCLUDED, Filters.<ObjectAction>any());
 
         // and all the collections of this type
-        final List<OneToManyAssociation> oneToManyAssociations =
-                objectSpecification.getCollections(Contributed.INCLUDED);
+        final List<OneToManyAssociation> collections = objectSpecification.getCollections(Contributed.INCLUDED);
 
         // for each collection, ...
-        for (final OneToManyAssociation otma : oneToManyAssociations) {
-
-            final String collectionId = otma.getId();
+        for (final OneToManyAssociation collection : collections) {
 
             // ... see if any of its actions has a collection parameter of the same type
             //
             // eg Order#getItems() and Order#removeItems(List<OrderItem>)
             //
-            final ObjectSpecification specification = otma.getSpecification();
+            final ObjectSpecification specification = collection.getSpecification();
 
             final ObjectActionParameter.Predicates.CollectionParameter whetherCollectionParamOfType =
                     new ObjectActionParameter.Predicates.CollectionParameter(specification);
@@ -85,11 +82,11 @@ public class ActionCollectionParameterDefaultsAndChoicesPostProcessor implements
             final ObjectActionParameter.Predicates.ScalarParameter whetherScalarParamOfType =
                     new ObjectActionParameter.Predicates.ScalarParameter(specification);
 
-            final ImmutableList<ObjectAction> actions = FluentIterable.from(objectActions)
-                    .filter(ObjectAction.Predicates.associatedWith(otma))
+            final ImmutableList<ObjectAction> actionsAssociatedWithCollection = FluentIterable.from(objectActions)
+                    .filter(ObjectAction.Predicates.associatedWith(collection))
                     .toList();
 
-            for (final ObjectAction action : actions) {
+            for (final ObjectAction action : actionsAssociatedWithCollection) {
 
                 final List<ObjectActionParameter> parameters = action.getParameters();
 
@@ -103,37 +100,43 @@ public class ActionCollectionParameterDefaultsAndChoicesPostProcessor implements
                 // this will cause the UI to render the collection with toggleboxes
                 // with a thread-local used to provide the selected objects
                 for (final ObjectActionParameter collectionParam : compatibleCollectionParams) {
-                    final ActionParameterDefaultsFacet defaultsFacet = collectionParam
-                            .getFacet(ActionParameterDefaultsFacet.class);
-                    if (existsAndNotDerived(defaultsFacet)) {
-                        // don't overwrite existing facet
-                    } else {
-                        FacetUtil.addFacet(new ActionParameterDefaultsFacetFromParentedCollection(collectionParam));
-                    }
+                    addDefaultsFacetIfNoneAlready(collectionParam);
                 }
 
                 // for compatible collection parameters, install a choices facet (if there isn't one already)
                 // using the associated collection for its values
                 for (final ObjectActionParameter collectionParam : compatibleCollectionParams) {
-                    addChoicesFacetIfNoneAlready(otma, collectionParam);
+                    addChoicesFacetIfNoneAlready(collection, collectionParam);
                 }
 
                 // similarly for compatible scalar parameters, install a choices facet (if there isn't one already)
                 // using the associated collection for its values.
                 for (final ObjectActionParameter scalarParam : compatibleScalarParams) {
-                    addChoicesFacetIfNoneAlready(otma, scalarParam);
+                    addChoicesFacetIfNoneAlready(collection, scalarParam);
                 }
             }
         }
     }
 
+    private void addDefaultsFacetIfNoneAlready(final ObjectActionParameter collectionParam) {
+        final ActionParameterDefaultsFacet defaultsFacet =
+                collectionParam.getFacet(ActionParameterDefaultsFacet.class);
+        if (existsAndNotDerived(defaultsFacet)) {
+            // don't overwrite existing facet
+        } else {
+            FacetUtil.addFacet(new ActionParameterDefaultsFacetFromAssociatedCollection(collectionParam));
+        }
+    }
+
     private void addChoicesFacetIfNoneAlready(
             final OneToManyAssociation otma,
             final ObjectActionParameter scalarOrCollectionParam) {
+
         final ActionParameterChoicesFacet choicesFacet = scalarOrCollectionParam
                 .getFacet(ActionParameterChoicesFacet.class);
         final ActionParameterAutoCompleteFacet autoCompleteFacet = scalarOrCollectionParam
                 .getFacet(ActionParameterAutoCompleteFacet.class);
+
         if (existsAndNotDerived(choicesFacet) || existsAndNotDerived(autoCompleteFacet)) {
             // don't overwrite existing choices or autoComplete facet
         } else {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ActionParameterDefaultsFacetFromParentedCollection.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ActionParameterDefaultsFacetFromAssociatedCollection.java
similarity index 91%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ActionParameterDefaultsFacetFromParentedCollection.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ActionParameterDefaultsFacetFromAssociatedCollection.java
index 3093c83..a6a2163 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ActionParameterDefaultsFacetFromParentedCollection.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ActionParameterDefaultsFacetFromAssociatedCollection.java
@@ -29,7 +29,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.param.defaults.ActionParameterDefaultsFacetAbstract;
 
-public class ActionParameterDefaultsFacetFromParentedCollection extends ActionParameterDefaultsFacetAbstract {
+public class ActionParameterDefaultsFacetFromAssociatedCollection extends ActionParameterDefaultsFacetAbstract {
 
     private static ThreadLocal<List<Object>> selectedPojos = new ThreadLocal<List<Object>>() {
         @Override protected List<Object> initialValue() {
@@ -50,7 +50,7 @@ public class ActionParameterDefaultsFacetFromParentedCollection extends ActionPa
         }
     }
 
-    public ActionParameterDefaultsFacetFromParentedCollection(final FacetHolder holder) {
+    public ActionParameterDefaultsFacetFromAssociatedCollection(final FacetHolder holder) {
         super(holder);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
index acdc126..82d6de2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
@@ -46,6 +46,7 @@ import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetFilters;
+import org.apache.isis.core.metamodel.facets.actions.action.associateWith.AssociatedWithFacet;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet;
 import org.apache.isis.core.metamodel.facets.actions.bulk.BulkFacet;
 import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFacet;
@@ -446,15 +447,15 @@ public interface ObjectAction extends ObjectMember {
 
             @Override
             public boolean apply(final ObjectAction objectAction) {
-                final MemberOrderFacet memberOrderFacet = objectAction.getFacet(MemberOrderFacet.class);
-                if(memberOrderFacet == null) {
+                final AssociatedWithFacet associatedWithFacet = objectAction.getFacet(AssociatedWithFacet.class);
+                if(associatedWithFacet == null) {
                     return false;
                 }
-                final String memberOrderName = memberOrderFacet.untranslatedName();
-                if (memberOrderName == null) {
+                final String associatedMemberName = associatedWithFacet.value();
+                if (associatedMemberName == null) {
                     return false;
                 }
-                final String memberOrderNameLowerCase = memberOrderName.toLowerCase();
+                final String memberOrderNameLowerCase = associatedMemberName.toLowerCase();
                 return memberName != null && Objects.equal(memberName.toLowerCase(), memberOrderNameLowerCase) ||
                        memberId   != null && Objects.equal(memberId.toLowerCase(), memberOrderNameLowerCase);
             }
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
index 5b37e9e..e90474b 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
@@ -37,7 +37,7 @@ import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.postprocessors.param.ActionParameterDefaultsFacetFromParentedCollection;
+import org.apache.isis.core.metamodel.postprocessors.param.ActionParameterDefaultsFacetFromAssociatedCollection;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.system.context.IsisContext;
@@ -121,9 +121,9 @@ public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
                                     .filter(Predicates.notNull())
                                     .toList();
 
-                            final ActionPrompt actionPrompt = ActionParameterDefaultsFacetFromParentedCollection.withSelected(
+                            final ActionPrompt actionPrompt = ActionParameterDefaultsFacetFromAssociatedCollection.withSelected(
                                     selectedPojos,
-                                    new ActionParameterDefaultsFacetFromParentedCollection.SerializableRunnable<ActionPrompt>() {
+                                    new ActionParameterDefaultsFacetFromAssociatedCollection.SerializableRunnable<ActionPrompt>() {
                                         public ActionPrompt call() {
                                             return performOnClick(target);
                                         }

-- 
To stop receiving notification emails like this one, please contact
danhaywood@apache.org.