From 2452550e1a85580673704ee5a5bb62dedb1dac6c Mon Sep 17 00:00:00 2001
From: cramakri <cramakri>
Date: Tue, 5 Mar 2013 19:54:44 +0000
Subject: [PATCH] BIS-317 SP-481 : Retry optimistic locking failures on the GUI
 API.

SVN: 28532
---
 .../generic/server/OptimisticLockingRetryAdvisor.java    | 9 ++++++++-
 openbis/source/java/genericApplicationContext.xml        | 5 +++++
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/OptimisticLockingRetryAdvisor.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/OptimisticLockingRetryAdvisor.java
index e311879dab5..f4508118728 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/OptimisticLockingRetryAdvisor.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/OptimisticLockingRetryAdvisor.java
@@ -22,6 +22,7 @@ import org.apache.log4j.Logger;
 import org.springframework.aop.ClassFilter;
 import org.springframework.aop.MethodMatcher;
 import org.springframework.aop.Pointcut;
+import org.springframework.aop.framework.ReflectiveMethodInvocation;
 import org.springframework.aop.support.DefaultPointcutAdvisor;
 import org.springframework.aop.support.RootClassFilter;
 import org.springframework.core.Ordered;
@@ -81,7 +82,13 @@ public class OptimisticLockingRetryAdvisor extends DefaultPointcutAdvisor
                 {
                     // System.out.println("try " + (i + 1) + ". time: "
                     // + invocation.getMethod().getName() + "@" + invocation.getThis());
-                    return invocation.proceed();
+                    if (invocation instanceof ReflectiveMethodInvocation)
+                    {
+                        return ((ReflectiveMethodInvocation) invocation).invocableClone().proceed();
+                    } else
+                    {
+                        return invocation.proceed();
+                    }
                 } catch (Exception ex)
                 {
                     latestException = ex;
diff --git a/openbis/source/java/genericApplicationContext.xml b/openbis/source/java/genericApplicationContext.xml
index 23dd4244bb6..6e258a94261 100644
--- a/openbis/source/java/genericApplicationContext.xml
+++ b/openbis/source/java/genericApplicationContext.xml
@@ -308,6 +308,11 @@
 
     <bean class="ch.systemsx.cisd.openbis.common.spring.LogAdvisor" />
     <bean class="ch.systemsx.cisd.openbis.common.spring.MarkerLogApplicationListener"/>
+    
+    <!--
+    	// Optimistic Lock Failure Retrying
+    -->
+    <bean class="ch.systemsx.cisd.openbis.generic.server.OptimisticLockingRetryAdvisor" />
 
         
     <!--
-- 
GitLab