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 42eefe2507 ISIS-3080: fixes additional actions, that are bound to parameters 42eefe2507 is described below commit 42eefe2507800e43ee6ef8e805deb87782cfecf9 Author: Andi Huber <ahu...@apache.org> AuthorDate: Thu Jun 23 07:02:41 2022 +0200 ISIS-3080: fixes additional actions, that are bound to parameters - I believe this is only valid for scalar composite value type parameters --- .../interactions/managed/ActionInteraction.java | 11 ++++-- .../core/metamodel/spec/ObjectSpecification.java | 8 ++++ .../core/metamodel/spec/PackedManagedObject.java | 2 + .../javafx/model/action/ActionUiModelFx.java | 6 +++ .../vaadin/model/action/ActionUiModelVaa.java | 6 +++ .../common/model/action/HasActionInteraction.java | 3 +- .../common/model/action/HasManagedAction.java | 13 +++--- .../viewer/wicket/model/links/LinkAndLabel.java | 10 ++++- .../wicket/model/models/ActionModelImpl.java | 6 +++ .../interaction/act/ActionInteractionWkt.java | 4 +- .../entityactions/LinkAndLabelFactory.java | 46 ++++++++-------------- 11 files changed, 72 insertions(+), 43 deletions(-) diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java index e582096569..5eeb8a98f2 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java @@ -264,10 +264,13 @@ extends MemberInteraction<ManagedAction, ActionInteraction> { return ActionInteraction.wrap(managedAction); } } - - // fallback if not a composite value - val paramValue = parameterNegotiationModel.getParamValue(paramIndex); - return ActionInteraction.start(paramValue, memberId, where); + + //XXX[ISIS-3080] prior to this fix we returned... (which I'm not sure why - makes no sense to me) + //val paramValue = parameterNegotiationModel.getParamValue(paramIndex); + //return ActionInteraction.start(paramValue, memberId, where); + + // else if not a composite value + return ActionInteraction.start(actionOwner, memberId, where); } // -- HELPER diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java index 0a7c671487..b375fe54a0 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java @@ -364,6 +364,14 @@ extends || valueFacet().isPresent(); } + /** + * Whether objects of this type are composite values. + */ + default boolean isCompositeValue() { + return getBeanSort().isValue() + && valueFacet().map(ValueFacet::isCompositeValueType).orElse(false); + } + /** * Determines if objects of this type are parented (a parented collection, or an aggregated entity). * diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/PackedManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/PackedManagedObject.java index a64ad4baf7..8fdc758621 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/PackedManagedObject.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/PackedManagedObject.java @@ -30,8 +30,10 @@ import org.apache.isis.commons.collections.Can; import org.apache.isis.commons.internal.base._Lazy; import lombok.RequiredArgsConstructor; +import lombok.ToString; @RequiredArgsConstructor +@ToString public final class PackedManagedObject implements ManagedObject { final ObjectSpecification elementSpec; diff --git a/incubator/viewers/javafx/model/src/main/java/org/apache/isis/incubator/viewer/javafx/model/action/ActionUiModelFx.java b/incubator/viewers/javafx/model/src/main/java/org/apache/isis/incubator/viewer/javafx/model/action/ActionUiModelFx.java index f97d6b892a..95544e70de 100644 --- a/incubator/viewers/javafx/model/src/main/java/org/apache/isis/incubator/viewer/javafx/model/action/ActionUiModelFx.java +++ b/incubator/viewers/javafx/model/src/main/java/org/apache/isis/incubator/viewer/javafx/model/action/ActionUiModelFx.java @@ -19,6 +19,7 @@ package org.apache.isis.incubator.viewer.javafx.model.action; import org.apache.isis.core.metamodel.interactions.managed.ManagedAction; +import org.apache.isis.core.metamodel.spec.feature.ObjectAction; import org.apache.isis.incubator.viewer.javafx.model.context.UiContextFx; import org.apache.isis.viewer.common.model.action.ActionUiModel; @@ -39,6 +40,11 @@ implements ActionUiModel<MenuItem, Node> { @Getter private final ManagedAction managedAction; + @Override + public ObjectAction getAction() { + return managedAction.getMetaModel(); + } + @Override public MenuItem createMenuUiComponent() { val menuItem = new MenuItem(getManagedAction().getFriendlyName()); diff --git a/incubator/viewers/vaadin/model/src/main/java/org/apache/isis/incubator/viewer/vaadin/model/action/ActionUiModelVaa.java b/incubator/viewers/vaadin/model/src/main/java/org/apache/isis/incubator/viewer/vaadin/model/action/ActionUiModelVaa.java index d094876d46..7afd710547 100644 --- a/incubator/viewers/vaadin/model/src/main/java/org/apache/isis/incubator/viewer/vaadin/model/action/ActionUiModelVaa.java +++ b/incubator/viewers/vaadin/model/src/main/java/org/apache/isis/incubator/viewer/vaadin/model/action/ActionUiModelVaa.java @@ -22,6 +22,7 @@ import com.vaadin.flow.component.Component; import com.vaadin.flow.component.html.Label; import org.apache.isis.core.metamodel.interactions.managed.ManagedAction; +import org.apache.isis.core.metamodel.spec.feature.ObjectAction; import org.apache.isis.incubator.viewer.vaadin.model.decorator.Decorators; import org.apache.isis.viewer.common.model.action.ActionUiModel; @@ -35,6 +36,11 @@ public class ActionUiModelVaa implements ActionUiModel<Component, Component> { @Getter private final ManagedAction managedAction; + @Override + public ObjectAction getAction() { + return managedAction.getMetaModel(); + } + @Override public Component createMenuUiComponent() { return createRegularUiComponent(); diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/HasActionInteraction.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/HasActionInteraction.java index e70d61897c..81e063d937 100644 --- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/HasActionInteraction.java +++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/HasActionInteraction.java @@ -22,9 +22,8 @@ import org.apache.isis.core.metamodel.interactions.managed.ActionInteraction; import org.apache.isis.core.metamodel.interactions.managed.ManagedAction; /** - * Functional UI mixin for {@link ActionInteraction}. + * UI mixin for {@link ActionInteraction}. */ -@FunctionalInterface public interface HasActionInteraction extends HasManagedAction { diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/HasManagedAction.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/HasManagedAction.java index 226f27b16c..0834e852f7 100644 --- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/HasManagedAction.java +++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/HasManagedAction.java @@ -36,16 +36,19 @@ import org.apache.isis.viewer.common.model.decorators.IconDecorator.FontAwesomeD import lombok.val; /** - * Functional UI mixin for {@link ManagedAction}. + * UI mixin for {@link ManagedAction}. */ -@FunctionalInterface public interface HasManagedAction { ManagedAction getManagedAction(); - default ObjectAction getAction() { - return getManagedAction().getAction(); - } + /** + * Metamodel of the represented {@link ManagedAction}. + * @apiNote implementing classes may provide this more directly + * than having to conjure up a ManagedAction only to provide its metamodel; + * in other words: this is not strictly required but provides optimization opportunities + */ + ObjectAction getAction(); /** * Action's owner. diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java index 3e842bb57a..8452554723 100644 --- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java +++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java @@ -25,8 +25,10 @@ import java.util.function.Predicate; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.isis.applib.annotation.ActionLayout.Position; +import org.apache.isis.commons.internal.assertions._Assert; import org.apache.isis.core.metamodel.interactions.managed.ManagedAction; import org.apache.isis.core.metamodel.spec.ManagedObject; +import org.apache.isis.core.metamodel.spec.feature.ObjectAction; import org.apache.isis.viewer.common.model.action.HasManagedAction; import org.apache.isis.viewer.common.model.mixin.HasUiComponent; import org.apache.isis.viewer.wicket.model.models.ActionModel; @@ -47,6 +49,7 @@ implements public static LinkAndLabel of( final ActionModel actionModel, final ActionLinkUiComponentFactoryWkt uiComponentFactory) { + _Assert.assertNotNull(actionModel.getAction(), "LinkAndLabel requires an Action"); return new LinkAndLabel(actionModel, uiComponentFactory); } @@ -58,6 +61,11 @@ implements return actionModel.getManagedAction(); } + @Override + public ObjectAction getAction() { + return actionModel.getAction(); + } + /** * used when explicitly named (eg. menu bar layout file), otherwise {@code null} */ @@ -71,7 +79,7 @@ implements @Override public String toString() { return Optional.ofNullable(named).orElse("") + - " ~ " + actionModel.getAction().getFeatureIdentifier().getFullIdentityString(); + " ~ " + getAction().getFeatureIdentifier().getFullIdentityString(); } // -- RULE CHECKING SHORTCUTS diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModelImpl.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModelImpl.java index 7ad4d18162..8413247f3d 100644 --- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModelImpl.java +++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModelImpl.java @@ -30,6 +30,7 @@ import org.apache.isis.commons.collections.Can; import org.apache.isis.core.metamodel.interactions.managed.ActionInteraction; import org.apache.isis.core.metamodel.interactions.managed.ActionInteractionHead; import org.apache.isis.core.metamodel.spec.ManagedObject; +import org.apache.isis.core.metamodel.spec.feature.ObjectAction; import org.apache.isis.core.runtime.context.IsisAppCommonContext; import org.apache.isis.viewer.wicket.model.models.interaction.act.ActionInteractionWkt; import org.apache.isis.viewer.wicket.model.models.interaction.act.ParameterUiModelWkt; @@ -82,6 +83,11 @@ implements ActionModel { // -- + @Override + public ObjectAction getAction() { + return delegate.getMetaModel(); + } + @Override public ActionInteraction getActionInteraction() { return delegate.actionInteraction(); diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/act/ActionInteractionWkt.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/act/ActionInteractionWkt.java index b50cc35c66..9c648b3ff8 100644 --- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/act/ActionInteractionWkt.java +++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/act/ActionInteractionWkt.java @@ -136,7 +136,9 @@ extends HasBookmarkedOwnerAbstract<ActionInteraction> { } public final ObjectAction getMetaModel() { - return actionInteraction().getMetamodel().orElseThrow(); + return actionInteraction().getMetamodel() + .orElseThrow(()->_Exceptions + .noSuchElement("could not resolve action by memberId '%s'", memberId)); } public Optional<ScalarPropertyModel> associatedWithProperty() { diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/LinkAndLabelFactory.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/LinkAndLabelFactory.java index 430ac92d7c..c9312fadf6 100644 --- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/LinkAndLabelFactory.java +++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/LinkAndLabelFactory.java @@ -45,45 +45,37 @@ extends Function<ObjectAction, LinkAndLabel> { public static LinkAndLabelFactory forMenu( final EntityModel serviceModel) { - - val linkFactory = new MenuLinkFactory(); - return action -> LinkAndLabel.of( ActionModelImpl.forEntity( serviceModel, action.getFeatureIdentifier(), Where.ANYWHERE, null, null, null), - linkFactory); + new MenuLinkFactory()); } public static LinkAndLabelFactory forEntity( final EntityModel parentEntityModel) { - guardAgainstNotBookmarkable(parentEntityModel.getBookmarkedOwner()); - val linkFactory = new AdditionalLinkFactory(); - return action -> LinkAndLabel.of( ActionModelImpl.forEntity( parentEntityModel, action.getFeatureIdentifier(), Where.OBJECT_FORMS, null, null, null), - linkFactory); + new AdditionalLinkFactory()); } public static LinkAndLabelFactory forCollection( final EntityCollectionModelParented collectionModel) { - val linkFactory = new AdditionalLinkFactory(); - return action -> LinkAndLabel.of( ActionModelImpl.forEntity( collectionModel.getEntityModel(), action.getFeatureIdentifier(), Where.OBJECT_FORMS, null, null, collectionModel), - linkFactory); + new AdditionalLinkFactory()); } public static LinkAndLabelFactory forPropertyOrParameter( @@ -95,36 +87,30 @@ extends Function<ObjectAction, LinkAndLabel> { public static LinkAndLabelFactory forProperty( final ScalarPropertyModel propertyModel) { - - val linkFactory = new AdditionalLinkFactory(); - return action -> LinkAndLabel.of( ActionModelImpl.forEntity( propertyModel.getParentUiModel(), action.getFeatureIdentifier(), Where.OBJECT_FORMS, propertyModel, null, null), - linkFactory); + new AdditionalLinkFactory()); } public static LinkAndLabelFactory forParameter( final ScalarParameterModel parameterModel) { - - // only supported, when parameter type is scalar and also is a value-type - if(!parameterModel.getMetaModel().isScalar() - ||!parameterModel.getMetaModel().getElementType().isValue()) { - return action -> null; + //XXX[ISIS-3080] only supported, when parameter type is a scalar composite value-type + val param = parameterModel.getMetaModel(); + if(param.isScalar() + && param.getElementType().isCompositeValue()) { + return action -> LinkAndLabel.of( + ActionModelImpl.forEntity( + parameterModel.getParentUiModel(), + action.getFeatureIdentifier(), + Where.OBJECT_FORMS, + null, parameterModel, null), + new AdditionalLinkFactory()); } - - val linkFactory = new AdditionalLinkFactory(); - - return action -> LinkAndLabel.of( - ActionModelImpl.forEntity( - parameterModel.getParentUiModel(), - action.getFeatureIdentifier(), - Where.OBJECT_FORMS, - null, parameterModel, null), - linkFactory); + return action -> null; } // -- HELPER