]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - eclipse/plugins/org.argeo.slc.client.core/src/main/java/org/argeo/slc/client/aspects/ContentProviderAspect.java
solving the hibernate transaction problem. New solution with aspects.
[gpl/argeo-slc.git] / eclipse / plugins / org.argeo.slc.client.core / src / main / java / org / argeo / slc / client / aspects / ContentProviderAspect.java
index 82290aff65a3cf8a11addd1de1a1525d7ebda004..1651efaeb579f22062594c240eb749c72d35f93b 100644 (file)
@@ -1,29 +1,45 @@
 package org.argeo.slc.client.aspects;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Aspect;
+import org.hibernate.LockMode;
+import org.hibernate.SessionFactory;
+import org.springframework.orm.hibernate3.HibernateTransactionManager;
+import org.springframework.transaction.PlatformTransactionManager;
 
 @Aspect
 public class ContentProviderAspect {
 
-       // private final static Log log = LogFactory
-       // .getLog(ContentProviderAspect.class);
+       private final static Log log = LogFactory
+                       .getLog(ContentProviderAspect.class);
+
+       private SessionFactory sessionFactory;
+       private HibernateTransactionManager transactionManager;
 
        // Advices
-       @Around("execution (* getLabel(..))")
+       @Around("execution (* org.argeo.slc.client.core.*.get*(Object, int))")
        public Object aroundGetVariable(ProceedingJoinPoint thisJoinPoint)
                        throws Throwable {
-               //log.debug("***************** IN THE ASPECT. Before proceed");
+
+               // log.debug("***************** IN THE ASPECT. Before proceed");
                // log.debug("We have an open session : "
                // + sessionFactory.getCurrentSession().isOpen());
                // log.debug("Current transaction is active : "
                // + sessionFactory.getCurrentSession().getTransaction()
                // .isActive());
 
-               Object o = thisJoinPoint.proceed();
-               //log.debug("**************** IN THE ASPECT. After proceed");
-               return o;
+               Object o = thisJoinPoint.getArgs()[0];
+               sessionFactory.getCurrentSession().beginTransaction();
+               // reassociate a transient instance with a session (LockMode.NONE).
+               sessionFactory.getCurrentSession().lock(o, LockMode.NONE);
+               Object result = thisJoinPoint.proceed();
+               sessionFactory.getCurrentSession().getTransaction().commit();
+
+               // log.debug("**************** IN THE ASPECT. After proceed");
+               return result;
        }
 
        // @Before("methodeTrace()")
@@ -44,14 +60,13 @@ public class ContentProviderAspect {
        // }
 
        // IoC
-       // public void setSessionFactory(SessionFactory sessionFactory) {
-       // this.sessionFactory = sessionFactory;
-       // }
-       //
-       // public void setTransactionManager(
-       // PlatformTransactionManager transactionManager) {
-       // if (transactionManager instanceof HibernateTransactionManager)
-       // this.transactionManager = (HibernateTransactionManager)
-       // transactionManager;
-       // }
+       public void setSessionFactory(SessionFactory sessionFactory) {
+               this.sessionFactory = sessionFactory;
+       }
+
+       public void setTransactionManager(
+                       PlatformTransactionManager transactionManager) {
+               if (transactionManager instanceof HibernateTransactionManager)
+                       this.transactionManager = (HibernateTransactionManager) transactionManager;
+       }
 }