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.