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);
}
}