cleanup
[cdm-vaadin.git] / src / main / java / eu / etaxonomy / cdm / service / CdmStore.java
index 3bbbf796898243aa6d8bd679e9eb8e40a600f728..06e2e2cc896ddbdd07dece5758e2afcfda37fbb4 100644 (file)
@@ -8,7 +8,8 @@
 */
 package eu.etaxonomy.cdm.service;
 
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.hibernate.Session;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -46,50 +47,12 @@ import eu.etaxonomy.vaadin.mvp.AbstractView;
 @ViewScope
 public class CdmStore {
 
-    private static final Logger logger = Logger.getLogger(CdmStore.class);
+    private static final Logger logger = LogManager.getLogger();
 
     @Autowired
     @Qualifier("cdmRepository")
     private CdmRepository repo;
 
-
-    /**
-     * If the bean is contained in the session it is being updated by doing an
-     * evict and merge. The fieldGroup is updated with the merged bean.
-     *
-     *
-     * @param bean
-     * @return The bean merged to the session or original bean in case a merge
-     *         was not necessary.
-     */
-    public <T extends CdmBase> T mergedBean(T bean) throws IllegalStateException {
-
-        try{
-            TransactionStatus txStatus = repo.startTransaction();
-            Session session = repo.getSession();
-            try {
-                if (session.contains(bean)) {
-                    // evict bean before merge to avoid duplicate beans in same session
-                    logger.trace(this._toString() + ".mergedBean() - evict " + bean.toString());
-                    session.evict(bean);
-                }
-                logger.trace(this._toString() + ".mergedBean() - doing merge of" + bean.toString());
-                @SuppressWarnings("unchecked")
-                T mergedBean = (T) session.merge(bean);
-                session.flush();
-                repo.commitTransaction(txStatus);
-                logger.trace(this._toString() + ".mergedBean() - bean after merge " + bean.toString());
-                return mergedBean;
-            } catch(Exception e){
-                repo.getTransactionManager().rollback(txStatus);
-                throw e;
-            }
-        } finally {
-            repo.clearSession(); // #7559
-        }
-    }
-
-
     protected String _toString() {
         return this.getClass().getSimpleName() + "@" + this.hashCode();
     }
@@ -109,19 +72,25 @@ public class CdmStore {
         } else {
             changeEventType = Type.CREATED;
         }
-        
+
         try{
             TransactionStatus txStatus = repo.startTransaction();
             Session session = repo.getSession();
             try {
                 logger.trace(this._toString() + ".onEditorSaveEvent - merging bean into session");
                 // merge the changes into the session, ...
-                T mergedBean = mergedBean(bean);
-                session.flush();
+                if (session.contains(bean)) {
+                    // evict bean before merge to avoid duplicate beans in same session
+                    logger.trace(this._toString() + ".mergedBean() - evict " + bean.toString());
+                    session.evict(bean);
+                }
+                logger.trace(this._toString() + ".mergedBean() - doing merge of" + bean.toString());
+                @SuppressWarnings("unchecked")
+                T mergedBean = (T) session.merge(bean);
                 repo.commitTransaction(txStatus);
                 return new EntityChangeEvent(mergedBean, changeEventType, view);
             } catch(Exception e){
-                repo.getTransactionManager().rollback(txStatus);
+                transactionRollbackIfNotCompleted(txStatus);
                 throw e;
             }
         } finally {
@@ -130,6 +99,16 @@ public class CdmStore {
 
     }
 
+
+    /**
+     * @param txStatus
+     */
+    public void transactionRollbackIfNotCompleted(TransactionStatus txStatus) {
+        if(!txStatus.isCompleted()){
+            repo.getTransactionManager().rollback(txStatus);
+        }
+    }
+
     /**
      *
      * @param bean
@@ -140,11 +119,9 @@ public class CdmStore {
         IService<T> typeSpecificService = serviceFor(bean);
 
         try{
-            Session session = repo.getSession();     
             logger.trace(this._toString() + ".deleteBean - deleting" + bean.toString());
             DeleteResult result = typeSpecificService.delete(bean);
             if (result.isOk()) {
-                session.flush();
                 return new EntityChangeEvent(bean, Type.REMOVED, view);
             } else {
                 handleDeleteresultInError(result);