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/18 08:23:13 UTC

git commit: ISIS-401: more concurrency exception trapping on edit

Updated Branches:
  refs/heads/master fda447c81 -> 6f885839a


ISIS-401: more concurrency exception trapping on edit

when hit OK after editing an object, should trap any change to target object
and redisplay with warning.


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

Branch: refs/heads/master
Commit: 6f885839af01e0bfc13fcadd20b03c39abbc93ae
Parents: fda447c
Author: Dan Haywood <da...@apache.org>
Authored: Fri Oct 18 07:22:58 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Fri Oct 18 07:22:58 2013 +0100

----------------------------------------------------------------------
 .../entity/properties/EntityPropertiesForm.java |  2 +-
 .../entitylink/EntityLinkSelect2Panel.java      |  4 ++++
 .../viewer/wicket/ui/panels/FormAbstract.java   | 23 ++++++++++++++++++--
 .../metamodel/adapter/mgr/AdapterManager.java   | 19 +++++++++++++++-
 4 files changed, 44 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/6f885839/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
index ea55f9c..83c2e07 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
@@ -310,7 +310,7 @@ class EntityPropertiesForm extends FormAbstract<ObjectAdapter> {
                 try {
                     getEntityModel().load(ConcurrencyChecking.CHECK); // could have also just called #getObject(), since CHECK is the default
 
-                } catch(RuntimeException ex){
+                } catch(ConcurrencyException ex){
                     String recognizedErrorMessage = recognizeException(ex);
                     if(recognizedErrorMessage == null) {
                         throw ex;

http://git-wip-us.apache.org/repos/asf/isis/blob/6f885839/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
index 0ec864a..8ed6f75 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
@@ -34,8 +34,10 @@ import org.apache.wicket.model.IModel;
 
 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.facets.object.autocomplete.AutoCompleteFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.models.ActionModel;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
@@ -47,9 +49,11 @@ import org.apache.isis.viewer.wicket.model.util.MementoFunctions;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.components.actions.ActionInvokeHandler;
+import org.apache.isis.viewer.wicket.ui.components.actions.ActionParametersFormPanel;
 import org.apache.isis.viewer.wicket.ui.components.widgets.ObjectAdapterMementoProviderAbstract;
 import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.CancelHintRequired;
 import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.FormComponentPanelAbstract;
+import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
 
 /**
  * {@link FormComponentPanel} representing a reference to an entity: a link and

http://git-wip-us.apache.org/repos/asf/isis/blob/6f885839/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java
index 1c50807..71e4756 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java
@@ -20,6 +20,7 @@
 package org.apache.isis.viewer.wicket.ui.panels;
 
 import java.util.List;
+import java.util.concurrent.Callable;
 
 import javax.inject.Inject;
 
@@ -35,6 +36,9 @@ import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProviderAware;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
+import org.apache.isis.core.runtime.persistence.adaptermanager.AdapterManagerDefault;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.persistence.Persistor;
 import org.apache.isis.viewer.wicket.model.isis.PersistenceSessionProvider;
@@ -42,6 +46,7 @@ import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistry;
 import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistryAccessor;
 import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistry;
 import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistryAccessor;
+import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
 
 public abstract class FormAbstract<T> extends Form<T> implements IHeaderContributor, ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, AuthenticationSessionProvider, PersistenceSessionProvider {
 
@@ -93,18 +98,32 @@ public abstract class FormAbstract<T> extends Form<T> implements IHeaderContribu
     }
     
     @Override
-    public void process(IFormSubmitter submittingComponent) {
+    public void process(final IFormSubmitter submittingComponent) {
         try {
             
             if(submittingComponent instanceof IFormSubmitterWithPreValidateHook) {
                 IFormSubmitterWithPreValidateHook componentWithPreSubmitHook = (IFormSubmitterWithPreValidateHook) submittingComponent;
                 preValidationErrorIfAny = componentWithPreSubmitHook.preValidate();
             }
-            super.process(submittingComponent);
             
+            if(preValidationErrorIfAny != null) {
+                // an exception has already occurred, so disable for remainder of thread.
+                AdapterManager.ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(new Runnable(){
+                    @Override
+                    public void run() {
+                        FormAbstract.super.process(submittingComponent);
+                    }
+                });
+            } else {
+                super.process(submittingComponent);
+            }
+
         } finally {
             preValidationErrorIfAny = null;
         }
+        
+
+        
     }
     
 

http://git-wip-us.apache.org/repos/asf/isis/blob/6f885839/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java
index 28fc618..cabcfe6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java
@@ -110,15 +110,32 @@ public interface AdapterManager extends Injectable {
         /**
          * Allows a caller to temporarily disable concurrency checking for the current thread.
          */
-        public static <T> T executeWithConcurrencyCheckingDisabled(final Callable<T> callable) throws Exception {
+        public static <T> T executeWithConcurrencyCheckingDisabled(final Callable<T> callable) {
             final ConcurrencyChecking prior = ConcurrencyChecking.concurrencyChecking.get();
             try {
                 ConcurrencyChecking.concurrencyChecking.set(ConcurrencyChecking.NO_CHECK);
                 return callable.call();
+            } catch(Exception ex) {
+                throw new RuntimeException(ex);
             } finally {
                 ConcurrencyChecking.concurrencyChecking.set(prior);
             }
         }
+        
+        /**
+         * Allows a caller to temporarily disable concurrency checking for the current thread.
+         */
+        public static void executeWithConcurrencyCheckingDisabled(final Runnable runnable) {
+            final ConcurrencyChecking prior = ConcurrencyChecking.concurrencyChecking.get();
+            try {
+                ConcurrencyChecking.concurrencyChecking.set(ConcurrencyChecking.NO_CHECK);
+                runnable.run();
+            } finally {
+                ConcurrencyChecking.concurrencyChecking.set(prior);
+            }
+        }
+
+
     }
 
     /**