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

Reply via email to