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/06/24 20:17:09 UTC

[isis] 01/03: ISIS-2340: simplify ActionLinkUiModel

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

commit 5c1343be16cf06754f73b2f647400db37999b260
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Jun 24 21:26:15 2020 +0200

    ISIS-2340: simplify ActionLinkUiModel
---
 .../viewer/javafx/model/action/ActionLinkFx.java         |  5 ++---
 .../viewer/vaadin/model/action/ActionLinkFactoryVaa.java |  6 ++----
 .../model/action/ActionLinkUiComponentFactory.java       |  2 +-
 .../viewer/common/model/action/ActionLinkUiModel.java    |  2 +-
 .../viewer/common/model/action/ActionUiMetaModel.java    | 16 +++++++++++++---
 .../viewer/common}/model/mementos/ActionMemento.java     | 15 +++++++++------
 .../wicket/model/mementos/ActionParameterMemento.java    | 14 ++++++++------
 .../viewer/wicket/model/models/ActionArgumentCache.java  |  2 +-
 .../isis/viewer/wicket/model/models/ActionModel.java     |  4 ++--
 .../viewer/wicket/model/models/PageParameterUtil.java    |  2 +-
 .../viewer/wicket/model/models/ScalarParameterModel.java |  2 +-
 .../entityactions/EntityActionLinkFactory.java           |  5 ++++-
 .../actionmenu/serviceactions/MenuActionLinkFactory.java |  4 +++-
 .../actionmenu/serviceactions/ServiceActionUtil.java     | 10 +++++++---
 .../ui/components/widgets/linkandlabel/ActionLink.java   | 10 +++-------
 .../linkandlabel/LinkAndLabelFactoryAbstract.java        |  6 +++---
 16 files changed, 61 insertions(+), 44 deletions(-)

diff --git a/incubator/viewers/javafx/model/src/main/java/org/apache/isis/incubator/viewer/javafx/model/action/ActionLinkFx.java b/incubator/viewers/javafx/model/src/main/java/org/apache/isis/incubator/viewer/javafx/model/action/ActionLinkFx.java
index ad586cf..7322d45 100644
--- a/incubator/viewers/javafx/model/src/main/java/org/apache/isis/incubator/viewer/javafx/model/action/ActionLinkFx.java
+++ b/incubator/viewers/javafx/model/src/main/java/org/apache/isis/incubator/viewer/javafx/model/action/ActionLinkFx.java
@@ -23,6 +23,7 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.viewer.common.model.HasUiMenuItem;
 import org.apache.isis.viewer.common.model.action.ActionLinkUiComponentFactory;
 import org.apache.isis.viewer.common.model.action.ActionLinkUiModel;
+import org.apache.isis.viewer.common.model.action.ActionUiMetaModel;
 import org.apache.isis.viewer.common.model.object.ObjectUiModel;
 import org.apache.isis.viewer.common.model.object.SimpleObjectUiModel;
 
@@ -54,10 +55,8 @@ implements HasUiMenuItem<Menu>{
     }
 
 
-    private static Node createUiComponent(
-            final ActionLinkUiModel<Node> actionUiModel) {
+    private static Node createUiComponent(final ActionUiMetaModel actionMeta) {
         
-        val actionMeta = actionUiModel.getActionUiMetaModel();
         val uiLabel = new Label(actionMeta.getLabel());
         
         return uiLabel;
diff --git a/incubator/viewers/vaadin/model/src/main/java/org/apache/isis/incubator/viewer/vaadin/model/action/ActionLinkFactoryVaa.java b/incubator/viewers/vaadin/model/src/main/java/org/apache/isis/incubator/viewer/vaadin/model/action/ActionLinkFactoryVaa.java
index 5faba5c..659a834 100644
--- a/incubator/viewers/vaadin/model/src/main/java/org/apache/isis/incubator/viewer/vaadin/model/action/ActionLinkFactoryVaa.java
+++ b/incubator/viewers/vaadin/model/src/main/java/org/apache/isis/incubator/viewer/vaadin/model/action/ActionLinkFactoryVaa.java
@@ -25,6 +25,7 @@ import org.apache.isis.core.metamodel.interactions.managed.ManagedAction;
 import org.apache.isis.incubator.viewer.vaadin.model.decorator.Decorators;
 import org.apache.isis.viewer.common.model.action.ActionLinkUiModel;
 import org.apache.isis.viewer.common.model.action.ActionLinkUiModelFactory;
+import org.apache.isis.viewer.common.model.action.ActionUiMetaModel;
 import org.apache.isis.viewer.common.model.object.SimpleObjectUiModel;
 
 import lombok.RequiredArgsConstructor;
@@ -51,14 +52,11 @@ public class ActionLinkFactoryVaa implements ActionLinkUiModelFactory<Component>
     
     // -- HELPER
     
-    private Component createUiComponent(
-            final ActionLinkUiModel<Component> actionUiModel) {
+    private Component createUiComponent(final ActionUiMetaModel actionMeta) {
         
-        val actionMeta = actionUiModel.getActionUiMetaModel();
         val uiLabel = new Label(actionMeta.getLabel());
         
         return Decorators.getIcon().decorate(uiLabel, actionMeta.getFontAwesomeUiModel());
-                
     }
 
 
diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/ActionLinkUiComponentFactory.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/ActionLinkUiComponentFactory.java
index 7aa8777..b623b3b 100644
--- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/ActionLinkUiComponentFactory.java
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/ActionLinkUiComponentFactory.java
@@ -29,6 +29,6 @@ package org.apache.isis.viewer.common.model.action;
  */
 public interface ActionLinkUiComponentFactory<T> {
 
-    T newActionLinkUiComponent(ActionLinkUiModel<T> actionUiModel);
+    T newActionLinkUiComponent(ActionUiMetaModel actionUiMetaModel);
    
 }
diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/ActionLinkUiModel.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/ActionLinkUiModel.java
index 03de318..bb281a9 100644
--- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/ActionLinkUiModel.java
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/ActionLinkUiModel.java
@@ -63,7 +63,7 @@ public abstract class ActionLinkUiModel<T> implements HasUiComponent<T> {
     
     // implements HasUiComponent<T>
     @Getter(onMethod = @__(@Override), lazy = true) 
-    private final T uiComponent = uiComponentFactory.newActionLinkUiComponent(this);
+    private final T uiComponent = uiComponentFactory.newActionLinkUiComponent(getActionUiMetaModel());
     
     public ActionUiMetaModel getActionUiMetaModel() {
         return actionUiMetaModel.get();
diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/ActionUiMetaModel.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/ActionUiMetaModel.java
index 1b8a694..2a58cf7 100644
--- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/ActionUiMetaModel.java
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/ActionUiMetaModel.java
@@ -22,6 +22,7 @@ import java.io.Serializable;
 import java.util.Optional;
 import java.util.function.Function;
 import java.util.function.Predicate;
+import java.util.function.Supplier;
 
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.PromptStyle;
@@ -33,8 +34,10 @@ import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
 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.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.viewer.common.model.decorator.disable.DisableUiModel;
 import org.apache.isis.viewer.common.model.decorator.fa.FontAwesomeUiModel;
+import org.apache.isis.viewer.common.model.mementos.ActionMemento;
 
 import lombok.AccessLevel;
 import lombok.Getter;
@@ -43,10 +46,11 @@ import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 @RequiredArgsConstructor(access = AccessLevel.PRIVATE)
-public class ActionUiMetaModel implements Serializable {
+public final class ActionUiMetaModel implements Serializable {
 
     private static final long serialVersionUID = 1L;
     
+    @Getter private final ActionMemento actionMemento;
     @Getter private final String label;
     @Getter private final String description;
     @Getter private final boolean blobOrClob;
@@ -76,10 +80,12 @@ public class ActionUiMetaModel implements Serializable {
         return new ActionUiMetaModel(actionHolder, objectAction);
     };
     
-    protected ActionUiMetaModel(
+    private ActionUiMetaModel(
             final ManagedObject actionHolder,
             final ObjectAction objectAction) {
-        this(   ObjectAction.Util.nameFor(objectAction),
+        
+        this(   new ActionMemento(objectAction),
+                ObjectAction.Util.nameFor(objectAction),
                 getDescription(objectAction).orElse(ObjectAction.Util.descriptionOf(objectAction)),
                 ObjectAction.Util.returnsBlobOrClob(objectAction),
                 objectAction.isPrototype(),
@@ -102,6 +108,10 @@ public class ActionUiMetaModel implements Serializable {
         return x -> posAccessor.apply(x).getPosition() == position;
     }
     
+    public ObjectAction getObjectAction(Supplier<SpecificationLoader> specLoader) { 
+        return actionMemento.getAction(specLoader);
+    }
+    
     // -- PARAMETERS
     
     public enum Parameters {
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ActionMemento.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/mementos/ActionMemento.java
similarity index 88%
rename from viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ActionMemento.java
rename to viewers/common/src/main/java/org/apache/isis/viewer/common/model/mementos/ActionMemento.java
index 3b2c3c5..d5d564b 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ActionMemento.java
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/mementos/ActionMemento.java
@@ -17,16 +17,18 @@
  *  under the License.
  */
 
-package org.apache.isis.viewer.wicket.model.mementos;
+package org.apache.isis.viewer.common.model.mementos;
 
 import java.io.Serializable;
+import java.util.function.Supplier;
 
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
+import lombok.val;
+
 /**
  * {@link Serializable} represention of a {@link ObjectAction}
  */
@@ -75,9 +77,9 @@ public class ActionMemento implements Serializable {
         return nameParmsId;
     }
 
-    public ObjectAction getAction(final SpecificationLoader specificationLoader) {
+    public ObjectAction getAction(final Supplier<SpecificationLoader> specificationLoaderSupplier) {
         if (action == null) {
-            action = actionFor(owningType, actionType, nameParmsId, specificationLoader);
+            action = actionFor(owningType, actionType, nameParmsId, specificationLoaderSupplier.get());
         }
         return action;
     }
@@ -86,8 +88,9 @@ public class ActionMemento implements Serializable {
             ObjectSpecId owningType,
             ActionType actionType,
             String nameParmsId,
-            final SpecificationLoader specificationLoader) {
-        final ObjectSpecification objectSpec = specificationLoader.lookupBySpecIdElseLoad(owningType);
+            SpecificationLoader specificationLoader) {
+        
+        val objectSpec = specificationLoader.lookupBySpecIdElseLoad(owningType);
         return objectSpec.getObjectActionElseFail(actionType, nameParmsId);
     }
 
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ActionParameterMemento.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ActionParameterMemento.java
index 2ee8092..e4d8383 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ActionParameterMemento.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ActionParameterMemento.java
@@ -20,11 +20,13 @@
 package org.apache.isis.viewer.wicket.model.mementos;
 
 import java.io.Serializable;
+import java.util.function.Supplier;
 
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.viewer.common.model.mementos.ActionMemento;
 
 /**
  * {@link Serializable} representation of a {@link ObjectActionParameter parameter}
@@ -62,9 +64,9 @@ public class ActionParameterMemento implements Serializable {
         return number;
     }
 
-    public ObjectActionParameter getActionParameter(final SpecificationLoader specificationLoader) {
+    public ObjectActionParameter getActionParameter(final Supplier<SpecificationLoader> specLoader) {
         if (actionParameter == null) {
-            this.actionParameter = actionParameterFor(actionMemento, number, specificationLoader);
+            this.actionParameter = actionParameterFor(actionMemento, number, specLoader);
         }
         return actionParameter;
     }
@@ -72,8 +74,8 @@ public class ActionParameterMemento implements Serializable {
     private static ObjectActionParameter actionParameterFor(
             final ActionMemento actionMemento,
             final int paramIndex,
-            final SpecificationLoader specificationLoader) {
-        final ObjectAction action = actionMemento.getAction(specificationLoader);
+            final Supplier<SpecificationLoader> specLoader) {
+        final ObjectAction action = actionMemento.getAction(specLoader);
         return action.getParameters().getElseFail(paramIndex);
     }
 
@@ -81,8 +83,8 @@ public class ActionParameterMemento implements Serializable {
      * Convenience.
      * @param specificationLoader
      */
-    public ObjectSpecification getSpecification(final SpecificationLoader specificationLoader) {
-        return getActionParameter(specificationLoader).getSpecification();
+    public ObjectSpecification getSpecification(final Supplier<SpecificationLoader> specLoader) {
+        return getActionParameter(specLoader).getSpecification();
     }
 
     @Override
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCache.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCache.java
index aa3ce81..9708f0f 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCache.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCache.java
@@ -31,7 +31,7 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.viewer.common.model.action.form.PendingParameterManager;
 import org.apache.isis.viewer.common.model.feature.ParameterUiModel;
-import org.apache.isis.viewer.wicket.model.mementos.ActionMemento;
+import org.apache.isis.viewer.common.model.mementos.ActionMemento;
 import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
 
 import lombok.NonNull;
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
index c4b8032..a3426d6 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
@@ -60,7 +60,7 @@ import org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModel;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
 import org.apache.isis.viewer.common.model.action.form.FormPendingParamUiModel;
 import org.apache.isis.viewer.common.model.action.form.FormUiModel;
-import org.apache.isis.viewer.wicket.model.mementos.ActionMemento;
+import org.apache.isis.viewer.common.model.mementos.ActionMemento;
 
 import lombok.val;
 
@@ -112,7 +112,7 @@ implements FormUiModel, FormExecutorContext, BookmarkableModel {
     @Override
     public ObjectAction getMetaModel() {
         if(objectAction==null) {
-            objectAction = actionMemento.getAction(getSpecificationLoader()); 
+            objectAction = actionMemento.getAction(this::getSpecificationLoader); 
         }
         return objectAction;
     }
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/PageParameterUtil.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/PageParameterUtil.java
index 1cc9294..eab9395 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/PageParameterUtil.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/PageParameterUtil.java
@@ -39,8 +39,8 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
+import org.apache.isis.viewer.common.model.mementos.ActionMemento;
 import org.apache.isis.viewer.wicket.model.common.PageParametersUtils;
-import org.apache.isis.viewer.wicket.model.mementos.ActionMemento;
 import org.apache.isis.viewer.wicket.model.mementos.PageParameterNames;
 
 import lombok.Value;
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarParameterModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarParameterModel.java
index 4794e97..e7822d8 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarParameterModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarParameterModel.java
@@ -62,7 +62,7 @@ implements ParameterUiModel {
     @Override
     public ObjectActionParameter getMetaModel() {
         if(actionParameter==null) {
-            actionParameter = paramMemento.getActionParameter(getSpecificationLoader()); 
+            actionParameter = paramMemento.getActionParameter(this::getSpecificationLoader); 
         }
         return actionParameter;  
     }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java
index 4313bef..28b7691 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java
@@ -21,6 +21,7 @@ package org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions;
 
 import org.apache.isis.core.metamodel.spec.ManagedObjects;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.viewer.wicket.model.common.CommonContextUtils;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
@@ -59,7 +60,9 @@ public final class EntityActionLinkFactory extends LinkAndLabelFactoryAbstract {
         // this is now done at the point of rendering
 
         return LinkAndLabel.of(
-                model->super.newLinkComponent(model.getObjectAction(), toggledMementosProviderIfAny),
+                model->super.newLinkComponent(
+                        model.getObjectAction(()->CommonContextUtils.getCommonContext().getSpecificationLoader()), 
+                        toggledMementosProviderIfAny),
                 named, 
                 this.targetEntityModel, 
                 objectAction);
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/MenuActionLinkFactory.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/MenuActionLinkFactory.java
index 7970dc6..2573b3c 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/MenuActionLinkFactory.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/MenuActionLinkFactory.java
@@ -40,7 +40,9 @@ class MenuActionLinkFactory extends LinkAndLabelFactoryAbstract {
             final String named) {
 
         return LinkAndLabel.of(
-                model->super.newLinkComponent(model.getObjectAction(), toggledMementosProviderIfAny), 
+                model->super.newLinkComponent(
+                        model.getObjectAction(super::getSpecificationLoader), 
+                        toggledMementosProviderIfAny), 
                 named, 
                 this.targetEntityModel, 
                 objectAction);
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
index a09ff5c..bc80f9e 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
@@ -33,6 +33,7 @@ import org.apache.isis.core.metamodel.interactions.managed.ManagedAction;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
 import org.apache.isis.viewer.common.model.action.ActionLinkUiModelFactory;
 import org.apache.isis.viewer.common.model.menu.MenuUiModel;
+import org.apache.isis.viewer.wicket.model.common.CommonContextUtils;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.ui.pages.PageAbstract;
@@ -113,8 +114,8 @@ public final class ServiceActionUtil {
         
         @Override
         public LinkAndLabel newActionLink(
-                String named, 
-                ManagedAction managedAction) {
+                final String named, 
+                final ManagedAction managedAction) {
         
             val serviceModel = EntityModel.ofAdapter(commonContext, managedAction.getOwner());
             
@@ -123,7 +124,10 @@ public final class ServiceActionUtil {
                     serviceModel);
             
             return LinkAndLabel.of(
-                    model->actionLinkFactory.newActionLink(model.getObjectAction(), named).getUiComponent(),
+                    model->actionLinkFactory.newActionLink(
+                            model.getObjectAction(()->CommonContextUtils.getCommonContext().getSpecificationLoader()),
+                            named)
+                            .getUiComponent(),
                     named,
                     serviceModel,
                     managedAction.getAction());
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLink.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLink.java
index ef2a262..f3cc880 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLink.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLink.java
@@ -57,11 +57,7 @@ public abstract class ActionLink extends AjaxLink<ManagedObject> implements IAja
 
     @Getter protected final transient IsisAppCommonContext commonContext;
 
-//    public ActionLink(String id, ActionModel model) {
-//        this(id, model, null);
-//    }
-    
-    ActionLink(IsisAppCommonContext commonContext, String id, ActionModel model, ObjectAction action) {
+    ActionLink(IsisAppCommonContext commonContext, String id, ActionModel model) {
         super(id, model);
 
         this.commonContext = commonContext;
@@ -77,7 +73,7 @@ public abstract class ActionLink extends AjaxLink<ManagedObject> implements IAja
                 }
 
                 // trivial optimization; also store the objectAction if it is available (saves looking it up)
-                objectAction = action;
+                objectAction = model.getMetaModel();
 
                 // this returns non-null if the action is no-arg and returns a URL or a Blob or a Clob.
                 // Otherwise can use default handling
@@ -116,7 +112,7 @@ public abstract class ActionLink extends AjaxLink<ManagedObject> implements IAja
     public ObjectAction getObjectAction() {
         return objectAction != null
                 ? objectAction
-                        : (objectAction = getActionModel().getMetaModel());
+                : (objectAction = getActionModel().getMetaModel());
     }
 
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/LinkAndLabelFactoryAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/LinkAndLabelFactoryAbstract.java
index 6a49653..8c253d4 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/LinkAndLabelFactoryAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/LinkAndLabelFactoryAbstract.java
@@ -92,13 +92,13 @@ implements Serializable {
     public abstract LinkAndLabel newActionLink(ObjectAction action, String named);
     
     protected ActionLink newLinkComponent(
-            final ObjectAction action,
+            final ObjectAction objectAction,
             final ToggledMementosProvider toggledMementosProviderIfAny) {
 
-        val actionModel = ActionModel.of(this.targetEntityModel, action);
+        val actionModel = ActionModel.of(this.targetEntityModel, objectAction);
         val commonContext = actionModel.getCommonContext();
 
-        final ActionLink link = new ActionLink(commonContext, linkId, actionModel, action) {
+        final ActionLink link = new ActionLink(commonContext, linkId, actionModel) {
             
             private static final long serialVersionUID = 1L;