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 2013/10/16 09:32:49 UTC

[2/2] git commit: ISIS-401: show concurrency ex. if object changed while action prompt is displayed

ISIS-401: show concurrency ex. if object changed while action prompt is displayed

In fact, was displaying already for some actions (eg ToDoItem#updateCost).  However,
for ToDoItem#updateCategories(...) it was not, because the loading of the
object adapters to compute the choices was causing the adapter to be
silently resynced.

This is now captured and we forward onto the entity page, as per normal.


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

Branch: refs/heads/master
Commit: f328529bd51f4a65a5fa3a6080450845b744bcef
Parents: 0476cc5
Author: Dan Haywood <da...@apache.org>
Authored: Wed Oct 16 08:32:27 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Wed Oct 16 08:32:27 2013 +0100

----------------------------------------------------------------------
 .../viewer/wicket/model/models/ScalarModel.java |  2 +-
 .../actions/ActionParametersFormPanel.java      | 39 +++++++++++++++-----
 .../adaptermanager/AdapterManagerDefault.java   | 10 ++++-
 3 files changed, 40 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/f328529b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index 262fe55..b226b53 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -301,7 +301,7 @@ public class ScalarModel extends EntityModel implements LinksProvider {
             public List<ObjectAdapter> getChoices(final ScalarModel scalarModel, final ObjectAdapter[] argumentsIfAvailable) {
                 final ActionParameterMemento parameterMemento = scalarModel.getParameterMemento();
                 final ObjectActionParameter actionParameter = parameterMemento.getActionParameter();
-                final ObjectAdapter[] choices = actionParameter.getChoices(scalarModel.parentObjectAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK), argumentsIfAvailable);
+                final ObjectAdapter[] choices = actionParameter.getChoices(scalarModel.parentObjectAdapterMemento.getObjectAdapter(ConcurrencyChecking.CHECK), argumentsIfAvailable);
                 return choicesAsList(choices);
             }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f328529b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
index e04e4cf..f935810 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
@@ -30,6 +30,7 @@ import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 
 import org.apache.wicket.Component;
+import org.apache.wicket.RestartResponseAtInterceptPageException;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.Button;
@@ -41,6 +42,7 @@ import org.apache.isis.core.commons.ensure.Ensure;
 import org.apache.isis.core.commons.lang.ObjectExtensions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
@@ -50,10 +52,12 @@ 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.util.MementoFunctions;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel.ResultType;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarModelSubscriber;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
 import org.apache.isis.viewer.wicket.ui.components.scalars.TextFieldValueModel.ScalarModelProvider;
 import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.FormFeedbackPanel;
+import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
@@ -173,16 +177,33 @@ public class ActionParametersFormPanel extends PanelAbstract<ActionModel> {
             final ActionModel actionModel = getActionModel();
             
             final ObjectAdapter[] pendingArguments = actionModel.getArgumentsAsArray();
-            System.out.println(pendingArguments);
-
-            final ObjectAction action = actionModel.getActionMemento().getAction();
-            final int numParams = action.getParameterCount();
-            for (int i = 0; i < numParams; i++) {
-                final ScalarPanelAbstract paramPanel = paramPanels.get(i);
-                if(paramPanel != null) {
-                    paramPanel.updateChoices(pendingArguments);
-                    target.add(paramPanel);
+            
+            try {
+                final ObjectAction action = actionModel.getActionMemento().getAction();
+                final int numParams = action.getParameterCount();
+                for (int i = 0; i < numParams; i++) {
+                    final ScalarPanelAbstract paramPanel = paramPanels.get(i);
+                    if(paramPanel != null) {
+                        // this could throw a ConcurrencyException as we may have to reload the 
+                        // object adapter of the action in order to compute the choices
+                        // (and that object adapter might have changed)
+                        paramPanel.updateChoices(pendingArguments);
+                        target.add(paramPanel);
+                    }
                 }
+            } catch(ConcurrencyException ex) {
+                
+                // second attempt should succeed, because the Oid would have
+                // been updated in the attempt
+                ObjectAdapter targetAdapter = getActionModel().getTargetAdapter();
+
+                // forward onto the target page with the concurrency exception
+                final EntityPage entityPage = new EntityPage(targetAdapter, ex);
+                
+                ActionParametersFormPanel.this.setResponsePage(entityPage);
+                
+                getAuthenticationSession().getMessageBroker().addWarning(ex.getMessage());
+                return;
             }
             
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/f328529b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/AdapterManagerDefault.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/AdapterManagerDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/AdapterManagerDefault.java
index 74a98a7..5ceb378 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/AdapterManagerDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/AdapterManagerDefault.java
@@ -335,8 +335,16 @@ public class AdapterManagerDefault implements AdapterManagerSpi {
                     }
                 }
             } finally {
+                
+                final Version originalVersion = originalOid.getVersion();
                 final Version recreatedVersion = recreatedOid.getVersion();
-                originalOid.setVersion(recreatedVersion);
+                if(recreatedVersion != null && (
+                        originalVersion == null || 
+                        recreatedVersion.different(originalVersion))
+                    ) {
+                   LOG.info("updating version in oid, on " + originalOid + " (" + originalVersion + ") to (" + recreatedVersion +")");
+                   originalOid.setVersion(recreatedVersion);
+                }
             }
         }