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/05/07 10:21:55 UTC

[isis] 06/06: ISIS-2340: further simplify the ActionModel

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 ffa030cf351da6438c3f52da1ea491e6376b71eb
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu May 7 12:21:35 2020 +0200

    ISIS-2340: further simplify the ActionModel
---
 .../viewer/wicket/model/models/ActionModel.java    | 162 +++------------------
 .../wicket/model/models/PageParameterUtil.java     | 160 ++++++++++++++++++--
 .../linkandlabel/LinkAndLabelFactoryAbstract.java  |   2 +-
 .../ui/pages/actionprompt/ActionPromptPage.java    |   5 +-
 4 files changed, 171 insertions(+), 158 deletions(-)

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 aec362e..6ebc06d 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
@@ -22,7 +22,6 @@ package org.apache.isis.viewer.wicket.model.models;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.List;
 import java.util.Objects;
 import java.util.stream.Stream;
 
@@ -46,18 +45,13 @@ import org.apache.isis.applib.value.LocalResourcePath;
 import org.apache.isis.applib.value.NamedWithMimeType;
 import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.commons.internal.base._NullSafe;
-import org.apache.isis.core.metamodel.adapter.oid.Oid;
-import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolicyFacet;
-import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacet;
-import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
-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.spec.feature.ObjectActionParameter;
@@ -65,7 +59,6 @@ import org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModel;
 import org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModelHead;
 import org.apache.isis.core.webapp.context.IsisWebAppCommonContext;
 import org.apache.isis.viewer.wicket.model.mementos.ActionMemento;
-import org.apache.isis.viewer.wicket.model.mementos.PageParameterNames;
 
 import lombok.Value;
 import lombok.val;
@@ -76,34 +69,25 @@ implements FormExecutorContext {
 
     private static final long serialVersionUID = 1L;
 
-    private static final String NULL_ARG = "$nullArg$";
-
     public ActionModel copy() {
         return new ActionModel(this);
     }
 
     // -- FACTORY METHODS
 
-    /**
-     * @param entityModel
-     * @param action
-     * @return
-     */
-    public static ActionModel create(EntityModel entityModel, ObjectAction action) {
-        val actionModel = new ActionModel(entityModel, new ActionMemento(action));
-        return actionModel;
+    public static ActionModel of(EntityModel actionOwner, ObjectAction action) {
+        return of(actionOwner, new ActionMemento(action));
+    }
+    
+    public static ActionModel of(EntityModel actionOwner, ActionMemento actionMemento) {
+        return new ActionModel(actionOwner, actionMemento);
     }
 
-    public static ActionModel createForPersistent(
+    public static ActionModel ofPageParameters(
             IsisWebAppCommonContext commonContext, 
             PageParameters pageParameters) {
-
-        val entityModel = newEntityModelFrom(commonContext, pageParameters);
-        val actionMemento = newActionMementoFrom(commonContext, pageParameters);
-        val actionModel = new ActionModel(entityModel, actionMemento);
-        actionModel.setArgumentsIfPossible(pageParameters);
-        actionModel.setContextArgumentIfPossible(pageParameters);
-        return actionModel;
+        
+        return PageParameterUtil.actionModelFor(commonContext, pageParameters);
     }
   
 
@@ -115,14 +99,7 @@ implements FormExecutorContext {
     public PageParameters getPageParametersWithoutUiHints() {
         val adapter = getTargetAdapter();
         val objectAction = getAction();
-        val pageParameters = PageParameterUtil.createPageParameters(adapter, objectAction);
-
-        // capture argument values
-        for(val argumentAdapter: argCache().snapshot()) {
-            val encodedArg = encodeArg(argumentAdapter);
-            PageParameterNames.ACTION_ARGS.addStringTo(pageParameters, encodedArg);
-        }
-        return pageParameters;
+        return PageParameterUtil.createPageParameters(adapter, objectAction, argCache().snapshot());
     }
 
     @Override
@@ -152,10 +129,7 @@ implements FormExecutorContext {
         return true;
     }
 
-    //////////////////////////////////////////////////
-    // helpers
-    //////////////////////////////////////////////////
-
+    // -- HELPERS
 
     private static String titleOf(ManagedObject argumentAdapter) {
         return argumentAdapter!=null?argumentAdapter.titleString(null):"";
@@ -179,35 +153,9 @@ implements FormExecutorContext {
         return new ActionArgumentCache(
                 entityModel, 
                 actionMemento, 
-                getActionMemento().getAction(getSpecificationLoader()));
+                getAction());
     }
 
-    private static ActionMemento newActionMementoFrom(
-            IsisWebAppCommonContext commonContext,
-            PageParameters pageParameters) {
-
-        final ObjectSpecId owningSpec = ObjectSpecId.of(PageParameterNames.ACTION_OWNING_SPEC.getStringFrom(pageParameters));
-        final ActionType actionType = PageParameterNames.ACTION_TYPE.getEnumFrom(pageParameters, ActionType.class);
-        final String actionNameParms = PageParameterNames.ACTION_ID.getStringFrom(pageParameters);
-        return new ActionMemento(owningSpec, actionType, actionNameParms, commonContext.getSpecificationLoader());
-    }
-
-
-    private static EntityModel newEntityModelFrom(
-            IsisWebAppCommonContext commonContext,
-            PageParameters pageParameters) {
-
-        val rootOid = oidFor(pageParameters);
-        val memento = commonContext.mementoFor(rootOid);
-        return EntityModel.ofMemento(commonContext, memento);
-    }
-
-    private static RootOid oidFor(final PageParameters pageParameters) {
-        final String oidStr = PageParameterNames.OBJECT_OID.getStringFrom(pageParameters);
-        return Oid.unmarshaller().unmarshal(oidStr, RootOid.class);
-    }
-
-
     private ActionModel(EntityModel entityModel, ActionMemento actionMemento) {
         super(entityModel.getCommonContext());
         this.entityModel = entityModel;
@@ -229,95 +177,22 @@ implements FormExecutorContext {
         this.argCache = actionModel.argCache().copy(); 
     }
 
-    private void setArgumentsIfPossible(final PageParameters pageParameters) {
-
-        final List<String> argsAsEncodedOidStrings = PageParameterNames.ACTION_ARGS.getListFrom(pageParameters);
-
-        val action = actionMemento.getAction(getSpecificationLoader());
-        val parameters = action.getParameters();
-
-        for (int paramNum = 0; paramNum < argsAsEncodedOidStrings.size(); paramNum++) {
-            val oidStrEncoded = argsAsEncodedOidStrings.get(paramNum);
-            parameters.get(paramNum)
-            .ifPresent(param->decodeAndSetArgument(param, oidStrEncoded));
-        }
-    }
-
+    private transient ObjectAction objectAction;
     public ObjectAction getAction() {
-        return getActionMemento().getAction(getSpecificationLoader());
+        if(objectAction==null) {
+            objectAction = actionMemento.getAction(getSpecificationLoader()); 
+        }
+        return objectAction;
     }
 
-
     public boolean hasParameters() {
         return getAction().getParameterCount() > 0;
     }
 
-    private boolean setContextArgumentIfPossible(final PageParameters pageParameters) {
-        
-        val paramNumAndOidString = PageParameterUtil.parseParamContext(pageParameters)
-                .orElse(null);
-        if(paramNumAndOidString==null) {
-            return false;
-        }
-        
-        val action = actionMemento.getAction(getSpecificationLoader());
-        val actionParamIfAny = action.getParameters().get(paramNumAndOidString.getParamNum());
-        if(!actionParamIfAny.isPresent()) {
-            return false;
-        }
-        val actionParam = actionParamIfAny.get();
-
-        val oidStrEncoded = paramNumAndOidString.getOidString();
-        decodeAndSetArgument(actionParam, oidStrEncoded);
-        return true;
-    }
-
-    private void decodeAndSetArgument(ObjectActionParameter actionParam, String oidStrEncoded) {
-        val paramValue = decodeArg(actionParam.getSpecification(), oidStrEncoded);
-        argCache().setParameterValue(actionParam, paramValue);
-    }
-
-    private String encodeArg(ManagedObject adapter) {
-        if(adapter == null) {
-            return NULL_ARG;
-        }
-
-        final ObjectSpecification objSpec = adapter.getSpecification();
-        if(objSpec.isEncodeable()) {
-            final EncodableFacet encodeable = objSpec.getFacet(EncodableFacet.class);
-            return encodeable.toEncodedString(adapter);
-        }
-
-        return ManagedObject.stringify(adapter).orElse(null);
-    }
-
-    private ManagedObject decodeArg(final ObjectSpecification objSpec, final String encoded) {
-        if(NULL_ARG.equals(encoded)) {
-            return null;
-        }
-
-        if(objSpec.isEncodeable()) {
-            final EncodableFacet encodeable = objSpec.getFacet(EncodableFacet.class);
-            return encodeable.fromEncodedString(encoded);
-        }
-
-        try {
-            val rootOid = RootOid.deStringEncoded(encoded);
-            return ManagedObject._adapterOfRootOid(super.getSpecificationLoader(), rootOid);
-        } catch (final Exception e) {
-            return null;
-        }
-    }
-
-
     public ManagedObject getTargetAdapter() {
         return entityModel.load();
     }
 
-    private ActionMemento getActionMemento() {
-        return actionMemento;
-    }
-
     @Override
     protected ManagedObject load() {
 
@@ -594,8 +469,7 @@ implements FormExecutorContext {
 
         val specificationLoader = getSpecificationLoader();
         val targetAdapter = this.getTargetAdapter();
-        val realTargetAdapter = this.getActionMemento()
-                .getAction(specificationLoader)
+        val realTargetAdapter = this.getAction()
                 .realTargetAdapter(targetAdapter);
         val pendingArgs = getArgumentsAsParamModel();
         val pendingArgValues = pendingArgs.getParamValues();
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 85bbc65..ca9861f 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
@@ -18,16 +18,28 @@
  */
 package org.apache.isis.viewer.wicket.model.models;
 
+import java.util.List;
 import java.util.Optional;
 import java.util.regex.Pattern;
 
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 
 import org.apache.isis.applib.Identifier;
+import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.commons.internal.primitives._Ints;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
+import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+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.spec.feature.ObjectActionParameter;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.webapp.context.IsisWebAppCommonContext;
 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;
@@ -35,21 +47,43 @@ import lombok.val;
 import lombok.experimental.UtilityClass;
 
 @UtilityClass
-
-
 class PageParameterUtil {
     
-    /**
-     * Factory method for creating {@link PageParameters}.
-     */
-    public static PageParameters createPageParameters(ManagedObject adapter, ObjectAction objectAction) {
+    public static ActionModel actionModelFor(IsisWebAppCommonContext commonContext, PageParameters pageParameters) {
+        val entityModel = newEntityModelFrom(commonContext, pageParameters);
+        val actionMemento = newActionMementoFrom(commonContext, pageParameters);
+        val actionModel = ActionModel.of(entityModel, actionMemento);
+        val specLoader = commonContext.getSpecificationLoader();
+        setArgumentsIfPossible(specLoader, actionModel, pageParameters);
+        setContextArgumentIfPossible(specLoader, actionModel, pageParameters);
+        return actionModel;
+    }
+    
+    public static PageParameters createPageParameters(
+            ManagedObject adapter, 
+            ObjectAction objectAction,
+            Can<ManagedObject> paramValues) {
+        
+        val pageParameters = createPageParameters(adapter, objectAction);
+        
+        // capture argument values
+        for(val argumentAdapter: paramValues) {
+            val encodedArg = encodeArg(argumentAdapter);
+            PageParameterNames.ACTION_ARGS.addStringTo(pageParameters, encodedArg);
+        }
+        
+        return pageParameters;
+    }
+    
+    // -- HELPERS
+    
+    private static PageParameters createPageParameters(ManagedObject adapter, ObjectAction objectAction) {
 
         val pageParameters = PageParametersUtils.newPageParameters();
 
         ManagedObject.stringify(adapter)
         .ifPresent(oidStr->
-        PageParameterNames.OBJECT_OID.addStringTo(pageParameters, oidStr)
-                );
+            PageParameterNames.OBJECT_OID.addStringTo(pageParameters, oidStr));
 
         val actionType = objectAction.getType();
         PageParameterNames.ACTION_TYPE.addEnumTo(pageParameters, actionType);
@@ -71,13 +105,23 @@ class PageParameterUtil {
         String oidString;
     }
 
-    public static Optional<ParamNumAndOidString> parseParamContext(PageParameters pageParameters) {
+    private static Optional<ParamNumAndOidString> parseParamContext(PageParameters pageParameters) {
         final String paramContext = PageParameterNames.ACTION_PARAM_CONTEXT.getStringFrom(pageParameters);
         if (paramContext == null) {
             return Optional.empty();
         }
         return parseParamContext(paramContext);
     }
+
+    private static ActionMemento newActionMementoFrom(
+            IsisWebAppCommonContext commonContext,
+            PageParameters pageParameters) {
+
+        final ObjectSpecId owningSpec = ObjectSpecId.of(PageParameterNames.ACTION_OWNING_SPEC.getStringFrom(pageParameters));
+        final ActionType actionType = PageParameterNames.ACTION_TYPE.getEnumFrom(pageParameters, ActionType.class);
+        final String actionNameParms = PageParameterNames.ACTION_ID.getStringFrom(pageParameters);
+        return new ActionMemento(owningSpec, actionType, actionNameParms, commonContext.getSpecificationLoader());
+    }
     
     private static final Pattern KEY_VALUE_PATTERN = Pattern.compile("([^=]+)=(.+)");
     
@@ -114,6 +158,104 @@ class PageParameterUtil {
         // fallback (used for action sets)
         return objectAction.getId();
     }
+    
+    private static EntityModel newEntityModelFrom(
+            IsisWebAppCommonContext commonContext,
+            PageParameters pageParameters) {
+
+        val rootOid = oidFor(pageParameters);
+        val memento = commonContext.mementoFor(rootOid);
+        return EntityModel.ofMemento(commonContext, memento);
+    }
+
+    private static RootOid oidFor(final PageParameters pageParameters) {
+        final String oidStr = PageParameterNames.OBJECT_OID.getStringFrom(pageParameters);
+        return Oid.unmarshaller().unmarshal(oidStr, RootOid.class);
+    }
+
+    private static final String NULL_ARG = "$nullArg$";
+    private String encodeArg(ManagedObject adapter) {
+        if(adapter == null) {
+            return NULL_ARG;
+        }
+
+        final ObjectSpecification objSpec = adapter.getSpecification();
+        if(objSpec.isEncodeable()) {
+            final EncodableFacet encodeable = objSpec.getFacet(EncodableFacet.class);
+            return encodeable.toEncodedString(adapter);
+        }
+
+        return ManagedObject.stringify(adapter).orElse(null);
+    }
+    
+    private ManagedObject decodeArg(
+            final SpecificationLoader specificationLoader,
+            final ObjectSpecification objSpec, 
+            final String encoded) {
+        if(NULL_ARG.equals(encoded)) {
+            return null;
+        }
+
+        if(objSpec.isEncodeable()) {
+            final EncodableFacet encodeable = objSpec.getFacet(EncodableFacet.class);
+            return encodeable.fromEncodedString(encoded);
+        }
+
+        try {
+            val rootOid = RootOid.deStringEncoded(encoded);
+            return ManagedObject._adapterOfRootOid(specificationLoader, rootOid);
+        } catch (final Exception e) {
+            return null;
+        }
+    }
+    
+    private static void setArgumentsIfPossible(
+            final SpecificationLoader specLoader, 
+            final ActionModel actionModel,
+            final PageParameters pageParameters) {
+
+        final List<String> argsAsEncodedOidStrings = PageParameterNames.ACTION_ARGS.getListFrom(pageParameters);
+
+        val action = actionModel.getAction();
+        val parameters = action.getParameters();
+
+        for (int paramNum = 0; paramNum < argsAsEncodedOidStrings.size(); paramNum++) {
+            val oidStrEncoded = argsAsEncodedOidStrings.get(paramNum);
+            parameters.get(paramNum)
+            .ifPresent(param->decodeAndSetArgument(specLoader, actionModel, param, oidStrEncoded));
+        }
+    }
+    
+    private static boolean setContextArgumentIfPossible(
+            final SpecificationLoader specLoader, 
+            final ActionModel actionModel, 
+            final PageParameters pageParameters) {
+        
+        val paramNumAndOidString = parseParamContext(pageParameters)
+                .orElse(null);
+        if(paramNumAndOidString==null) {
+            return false;
+        }
+        
+        val action = actionModel.getAction();
+        val actionParamIfAny = action.getParameters().get(paramNumAndOidString.getParamNum());
+        if(!actionParamIfAny.isPresent()) {
+            return false;
+        }
+        val actionParam = actionParamIfAny.get();
 
+        val oidStrEncoded = paramNumAndOidString.getOidString();
+        decodeAndSetArgument(specLoader, actionModel, actionParam, oidStrEncoded);
+        return true;
+    }
+    
+    private static void decodeAndSetArgument(
+            final SpecificationLoader specLoader, 
+            final ActionModel actionModel, 
+            final ObjectActionParameter actionParam, 
+            final String oidStrEncoded) {
+        val paramValue = decodeArg(specLoader, actionParam.getSpecification(), oidStrEncoded);
+        actionModel.setParameterValue(actionParam, paramValue);
+    }
     
 }
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 543864f..e6379c8 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
@@ -95,7 +95,7 @@ implements Serializable {
             final ObjectAction action,
             final ToggledMementosProvider toggledMementosProviderIfAny) {
 
-        val actionModel = ActionModel.create(this.targetEntityModel, action);
+        val actionModel = ActionModel.of(this.targetEntityModel, action);
         val commonContext = actionModel.getCommonContext();
 
         final ActionLink link = new ActionLink(commonContext, linkId, actionModel, action) {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java
index 029fcf6..8fae257 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java
@@ -27,8 +27,6 @@ import org.apache.isis.viewer.wicket.model.models.ActionModel;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.pages.PageAbstract;
 
-import lombok.val;
-
 /**
  * Web page representing an action invocation.
  */
@@ -74,7 +72,6 @@ public class ActionPromptPage extends PageAbstract {
             IsisWebAppCommonContext commonContext,
             PageParameters pageParameters) {
         
-        val actionModel = ActionModel.createForPersistent(commonContext, pageParameters);
-        return actionModel;
+        return ActionModel.ofPageParameters(commonContext, pageParameters);
     }
 }