From 82b825e0717ede4d09a55fe6056ad1127f776d75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Mon, 9 May 2011 15:58:27 +0200 Subject: [PATCH] Add mechanism for handling OptimisticLockingFailureException on random objects It uses a transparent proxy. FEA: ItEr74S04BugFixing --- .../ConcurrentModificationHandling.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/concurrentdetection/ConcurrentModificationHandling.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/concurrentdetection/ConcurrentModificationHandling.java index 0e38d20e1..305c74bd1 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/concurrentdetection/ConcurrentModificationHandling.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/concurrentdetection/ConcurrentModificationHandling.java @@ -21,6 +21,11 @@ package org.navalplanner.web.common.concurrentdetection; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; @@ -37,6 +42,36 @@ import org.springframework.dao.OptimisticLockingFailureException; @Order(0) public class ConcurrentModificationHandling { + public static T addHandling(final String goToPage, + Class interfaceKlass, T toBeWraped) { + Class[] classesToProxy = { interfaceKlass }; + Object result = Proxy.newProxyInstance(interfaceKlass.getClassLoader(), + classesToProxy, handler(toBeWraped, goToPage)); + return interfaceKlass.cast(result); + } + + private static InvocationHandler handler(final Object toBeWraped, + final String goToPage) { + return new InvocationHandler() { + + @Override + public Object invoke(Object proxy, Method method, + Object[] args) throws Throwable { + try { + return method.invoke(toBeWraped, args); + } catch (InvocationTargetException e) { + Throwable cause = e.getCause(); + if (cause instanceof OptimisticLockingFailureException) { + OptimisticLockingFailureException optimisticLockingFailureException = (OptimisticLockingFailureException) cause; + ConcurrentModificationController.showException( + optimisticLockingFailureException, goToPage); + } + throw e; + } + } + }; + } + public ConcurrentModificationHandling() { }