Merge branch 'release/4.0.0'
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / persistence / hibernate / PostMergeEntityListener.java
index 347c1101b19f358f0ac4697914f2ff928d5172c4..b90542889be78c400075efbda12760275991fe25 100644 (file)
@@ -9,10 +9,14 @@
  */
 package eu.etaxonomy.cdm.persistence.hibernate;
 
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.hibernate.Hibernate;
 import org.hibernate.HibernateException;
+import org.hibernate.Session;
 import org.hibernate.event.spi.MergeEvent;
 import org.hibernate.event.spi.MergeEventListener;
 
@@ -24,9 +28,22 @@ import eu.etaxonomy.cdm.model.common.CdmBase;
  *
  */
 public class PostMergeEntityListener implements MergeEventListener {
-
     private static final long serialVersionUID = 1565797119368313987L;
 
+    private static Map<Session, Set<CdmBase>> newEntitiesMap = new ConcurrentHashMap<Session, Set<CdmBase>>();
+
+    public static void addSession(Session session) {
+        newEntitiesMap.put(session, new HashSet<CdmBase>());
+    }
+
+    public static void removeSession(Session session) {
+        newEntitiesMap.remove(session);
+    }
+
+    public static Set<CdmBase> getNewEntities(Session session) {
+        return newEntitiesMap.get(session);
+    }
+
     @Override
     public void onMerge(MergeEvent event) throws HibernateException {
 
@@ -34,20 +51,23 @@ public class PostMergeEntityListener implements MergeEventListener {
 
     @Override
     public void onMerge(MergeEvent event, Map copiedAlready) throws HibernateException {
-        // at this point the original entity to merge has already been copied to the result
-        // => the result is an exact copy of the original EXCEPT or the the id which is set by hibernate
-        // the following code sets the id in the original entity so that it can be used as a return value
-        // for the CdmEntityDaoBase.merge(T transientObject, boolean returnTransientEntity) call
+        // any new entities are added to a map which is retrieved at the end of the
+        // CdmEntityDaoBase.merge(T transientObject, boolean returnTransientEntity) call
         if(event.getOriginal() != null && CdmBase.class.isAssignableFrom(event.getOriginal().getClass()) &&
                 event.getResult() != null && CdmBase.class.isAssignableFrom(event.getResult().getClass())) {
             CdmBase original = (CdmBase) event.getOriginal();
             CdmBase result = (CdmBase) event.getResult();
             if(original != null && Hibernate.isInitialized(original) && original.getId() == 0 &&
-                    result != null && Hibernate.isInitialized(result)) {
+                    result != null && Hibernate.isInitialized(result) && result.getId() > 0) {
                 original.setId(result.getId());
-
+                Set<CdmBase> newEntities = newEntitiesMap.get(event.getSession());
+                if(newEntities != null) {
+                    newEntities.add(result);
+                }
             }
         }
+
+
     }
 
 }