You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2017/01/19 11:09:24 UTC

[18/24] isis git commit: ISIS-785: introduces ActionArgumentModel as the API between ActionParametersFormPanel and ScalarModel; introduces ActionArgumentCollectionModel as an implementation to represent collection arguments.

ISIS-785: introduces ActionArgumentModel as the API between ActionParametersFormPanel and ScalarModel; introduces ActionArgumentCollectionModel as an implementation to represent collection arguments.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/d6d0c195
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/d6d0c195
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/d6d0c195

Branch: refs/heads/maint-1.13.3
Commit: d6d0c195c2f10f67a39dee3f81eb90f035c6f112
Parents: d51d4aa
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Jan 18 14:42:01 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 14:42:01 2017 +0000

----------------------------------------------------------------------
 .../models/ActionArgumentCollectionModel.java   | 82 ++++++++++++++++++++
 .../model/models/ActionArgumentModel.java       | 33 ++++++++
 .../viewer/wicket/model/models/ActionModel.java | 39 +++++-----
 .../viewer/wicket/model/models/ScalarModel.java |  2 +-
 .../actions/ActionParametersFormPanel.java      |  9 ++-
 5 files changed, 141 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/d6d0c195/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCollectionModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCollectionModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCollectionModel.java
new file mode 100644
index 0000000..646631e
--- /dev/null
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCollectionModel.java
@@ -0,0 +1,82 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.viewer.wicket.model.models;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+
+class ActionArgumentCollectionModel extends ModelAbstract<ObjectAdapter> implements
+        ActionArgumentModel {
+
+    private final ActionParameterMemento parameterMemento;
+    private ObjectAdapterMemento adapterMemento;
+
+    public ActionArgumentCollectionModel(
+            final ObjectAdapterMemento adapterMemento,
+            final ActionParameterMemento parameterMemento) {
+        this.adapterMemento = adapterMemento;
+        this.parameterMemento = parameterMemento;
+    }
+
+    @Override
+    public ActionParameterMemento getParameterMemento() {
+        return parameterMemento;
+    }
+
+    @Override
+    protected ObjectAdapter load() {
+        final ObjectActionParameter actionParameter = parameterMemento.getActionParameter(getSpecificationLoader());
+        final ObjectSpecification specification = parameterMemento.getSpecification(getSpecificationLoader());
+
+        return adapterMemento
+                .getObjectAdapter(AdapterManager.ConcurrencyChecking.CHECK, getPersistenceSession(), getSpecificationLoader());
+    }
+
+    @Override
+    public void setObject(final ObjectAdapter adapter) {
+        super.setObject(adapter);
+        adapterMemento = ObjectAdapterMemento.createOrNull(adapter);
+    }
+
+    @Override
+    public void reset() {
+        final ObjectActionParameter actionParameter = parameterMemento.getActionParameter(
+                getSpecificationLoader());
+        final ObjectAdapter parentAdapter =
+                adapterMemento.getObjectAdapter(AdapterManager.ConcurrencyChecking.NO_CHECK,
+                        getPersistenceSession(), getSpecificationLoader());
+        final ObjectAdapter defaultAdapter = actionParameter.getDefault(parentAdapter);
+        setObject(defaultAdapter);
+    }
+
+    /**
+     * transient because only temporary hint.
+     */
+    private transient ObjectAdapter[] actionArgsHint;
+
+    @Override
+    public void setActionArgsHint(ObjectAdapter[] actionArgsHint) {
+        this.actionArgsHint = actionArgsHint;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d6d0c195/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentModel.java
new file mode 100644
index 0000000..465ad72
--- /dev/null
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentModel.java
@@ -0,0 +1,33 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.viewer.wicket.model.models;
+
+import org.apache.wicket.model.IModel;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
+
+public interface ActionArgumentModel extends IModel<ObjectAdapter> {
+
+    ActionParameterMemento getParameterMemento();
+
+    void reset();
+
+    void setActionArgsHint(ObjectAdapter[] argumentsAsArray);
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d6d0c195/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
index 420cfc9..40c9188 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
@@ -59,6 +59,7 @@ import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 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.FeatureType;
 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.services.ServicesInjector;
@@ -269,11 +270,10 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> implements Has
     private final ActionMemento actionMemento;
     private Mode actionMode;
 
-
     /**
      * Lazily populated in {@link #getArgumentModel(ActionParameterMemento)}
      */
-    private final Map<Integer, ScalarModel> arguments = Maps.newHashMap();
+    private final Map<Integer, ActionArgumentModel> arguments = Maps.newHashMap();
 
 
     private ActionModel(final PageParameters pageParameters, final SpecificationLoader specificationLoader) {
@@ -336,8 +336,8 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> implements Has
         //this.actionPrompt = actionModel.actionPrompt;
         
         primeArgumentModels();
-        final Map<Integer, ScalarModel> argumentModelByIdx = actionModel.arguments;
-        for (final Map.Entry<Integer,ScalarModel> argumentModel : argumentModelByIdx.entrySet()) {
+        final Map<Integer, ActionArgumentModel> argumentModelByIdx = actionModel.arguments;
+        for (final Map.Entry<Integer,ActionArgumentModel> argumentModel : argumentModelByIdx.entrySet()) {
             setArgument(argumentModel.getKey(), argumentModel.getValue().getObject());
         }
 
@@ -425,20 +425,23 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> implements Has
         final ObjectAction action = actionMemento.getAction(getSpecificationLoader());
         final ObjectActionParameter actionParam = action.getParameters().get(paramNum);
         final ActionParameterMemento apm = new ActionParameterMemento(actionParam);
-        final ScalarModel argumentModel = getArgumentModel(apm);
-        argumentModel.setObject(argumentAdapter);
+        final ActionArgumentModel actionArgumentModel = getArgumentModel(apm);
+        actionArgumentModel.setObject(argumentAdapter);
     }
 
 
-    public ScalarModel getArgumentModel(final ActionParameterMemento apm) {
+    public ActionArgumentModel getArgumentModel(final ActionParameterMemento apm) {
         final int i = apm.getNumber();
-		ScalarModel scalarModel = arguments.get(i);
-        if (scalarModel == null) {
-            scalarModel = new ScalarModel(targetAdapterMemento, apm);
-            final int number = scalarModel.getParameterMemento().getNumber();
-            arguments.put(number, scalarModel);
+		ActionArgumentModel actionArgumentModel = arguments.get(i);
+        if (actionArgumentModel == null) {
+            final ObjectActionParameter actionParameter = apm.getActionParameter(getSpecificationLoader());
+            actionArgumentModel = actionParameter.getFeatureType() == FeatureType.ACTION_PARAMETER_SCALAR
+                    ? new ScalarModel(targetAdapterMemento, apm)
+                    : new ActionArgumentCollectionModel(targetAdapterMemento, apm);
+            final int number = actionArgumentModel.getParameterMemento().getNumber();
+            arguments.put(number, actionArgumentModel);
         }
-        return scalarModel;
+        return actionArgumentModel;
     }
 
     public ObjectAdapter getTargetAdapter() {
@@ -523,8 +526,8 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> implements Has
         final ObjectAction objectAction = getActionMemento().getAction(getSpecificationLoader());
         final ObjectAdapter[] arguments = new ObjectAdapter[objectAction.getParameterCount()];
         for (int i = 0; i < arguments.length; i++) {
-            final ScalarModel scalarModel = this.arguments.get(i);
-            arguments[i] = scalarModel.getObject();
+            final ActionArgumentModel actionArgumentModel = this.arguments.get(i);
+            arguments[i] = actionArgumentModel.getObject();
         }
         return arguments;
     }
@@ -534,8 +537,8 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> implements Has
     }
 
     public void clearArguments() {
-        for (final ScalarModel argumentModel : arguments.values()) {
-            argumentModel.reset();
+        for (final ActionArgumentModel actionArgumentModel : arguments.values()) {
+            actionArgumentModel.reset();
         }
         this.actionMode = determineMode(actionMemento.getAction(getSpecificationLoader()));
     }
@@ -703,6 +706,4 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> implements Has
         return getIsisSessionFactory().getServicesInjector();
     }
 
-
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/d6d0c195/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index 755da1b..1f60e44 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -63,7 +63,7 @@ import org.apache.isis.viewer.wicket.model.mementos.SpecUtils;
  * Is the backing model to each of the fields that appear in forms (for entities
  * or action dialogs).
  */
-public class ScalarModel extends EntityModel implements LinksProvider,HasExecutingPanel {
+public class ScalarModel extends EntityModel implements LinksProvider,HasExecutingPanel, ActionArgumentModel {
 
     private static final long serialVersionUID = 1L;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/d6d0c195/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
index f05caa6..b9f6a4f 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
@@ -35,7 +35,7 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.viewer.wicket.model.hints.IsisActionCompletedEvent;
 import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
 import org.apache.isis.viewer.wicket.model.models.ActionModel;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.model.models.ActionArgumentModel;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.panels.PromptFormPanelAbstract;
 import org.apache.isis.viewer.wicket.ui.components.property.PropertyEditFormPanel;
@@ -97,9 +97,10 @@ public class ActionParametersFormPanel extends PromptFormPanelAbstract<ActionMod
                 final WebMarkupContainer container = new WebMarkupContainer(rv.newChildId());
                 rv.add(container);
 
-                final ScalarModel argumentModel = actionModel.getArgumentModel(apm);
-                argumentModel.setActionArgsHint(actionModel.getArgumentsAsArray());
-                final Component component = getComponentFactoryRegistry().addOrReplaceComponent(container, ComponentType.SCALAR_NAME_AND_VALUE, argumentModel);
+                final ActionArgumentModel actionArgumentModel = actionModel.getArgumentModel(apm);
+                actionArgumentModel.setActionArgsHint(actionModel.getArgumentsAsArray());
+                final Component component = getComponentFactoryRegistry().addOrReplaceComponent(container, ComponentType.SCALAR_NAME_AND_VALUE,
+                        actionArgumentModel);
                 final ScalarPanelAbstract paramPanel = component instanceof ScalarPanelAbstract ? (ScalarPanelAbstract) component : null;
                 paramPanels.add(paramPanel);
                 if(paramPanel != null) {