Add load capability for MergeResult objects
[taxeditor.git] / eu.etaxonomy.taxeditor.cdmlib / src / main / java / eu / etaxonomy / taxeditor / session / CdmEntitySessionManager.java
index 5406b4ebc8f73e1379acf57e6a8cd7d437bcebcb..80bc0caba5cd87406ef1ea017d416c63eaf8142a 100644 (file)
 // $Id$
 /**
-* Copyright (C) 2014 EDIT
-* European Distributed Institute of Taxonomy
-* http://www.e-taxonomy.eu
-*
-* The contents of this file are subject to the Mozilla Public License Version 1.1
-* See LICENSE.TXT at the top of this package for the full license terms.
-*/
+ * Copyright (C) 2014 EDIT
+ * European Distributed Institute of Taxonomy
+ * http://www.e-taxonomy.eu
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * See LICENSE.TXT at the top of this package for the full license terms.
+ */
 package eu.etaxonomy.taxeditor.session;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
-import eu.etaxonomy.cdm.api.cache.CachedCommonServiceImpl;
-import eu.etaxonomy.cdm.api.cache.CdmClientCacheException;
-import eu.etaxonomy.cdm.api.cache.CdmClientCachingTest;
-import eu.etaxonomy.cdm.api.cache.CdmTransientEntityCacher;
-import eu.etaxonomy.cdm.api.service.IService;
+import eu.etaxonomy.cdm.api.service.UpdateResult;
 import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 
 /**
  * @author cmathew
  * @date 16 Oct 2014
  *
  */
-@Component("cdmEntitySessionManager")
+@Component
 public class CdmEntitySessionManager implements ICdmEntitySessionManager {
-       private static final Logger logger = Logger.getLogger(CdmEntitySessionManager.class);
-
-    private Map<ISessionEventListener, CdmEntitySession> ownerSessionMap = 
-               new HashMap<ISessionEventListener, CdmEntitySession>();
-    
-//    private HashMap<String, HashSet<CdmClientBase<T>>> entitiesMap = 
-//             new HashMap<String, HashSet<CdmClientBase<T>>>();
-    
-    private CdmTransientEntityCacher latestEntityCacher =
-               new CdmTransientEntityCacher("latestEntityCacher", this);
-    
-    private CdmEntitySession activeSession;
-    
+    private static final Logger logger = Logger.getLogger(CdmEntitySessionManager.class);
+
+    private final Map<ICdmEntitySessionEnabled, ICdmEntitySession> ownerSessionMap =
+            new HashMap<ICdmEntitySessionEnabled, ICdmEntitySession>();
+
+    private final List<ICdmEntitySessionManagerObserver> sessionObservers = new ArrayList<ICdmEntitySessionManagerObserver>();
+
+    private ICdmEntitySession activeSession;
+
+    private  NullSession nullSession;
+
+    @Override
+    public ICdmEntitySession getNullSession() {
+        return nullSession;
+    }
+
+    @Override
+    public ICdmEntitySession newSession(ICdmEntitySessionEnabled sessionOwner, boolean setAsActive) {
+        ICdmEntitySession session = ownerSessionMap.get(sessionOwner);
+        if(session == null) {
+            session = new CdmEntitySession(sessionOwner, this);
+            addToOwnerSessionMap(sessionOwner, session);
+        }
+
+        if(setAsActive) {
+            setActiveSession(session);
+        }
+
+        return session;
+    }
+
+    @Override
+    public ICdmEntitySession bindNullSession() {
+
+        if(nullSession == null) {
+            nullSession = new NullSession(null, this);
+        }
+
+        setActiveSession(nullSession);
+
+        return nullSession;
+    }
+
+    @Override
+    public ICdmEntitySession getActiveSession() {
+        return activeSession;
+    }
+
+    private void setActiveSession(ICdmEntitySession activeSession) {
+        this.activeSession = activeSession;
+        notifyObservers();
+    }
+
+
     /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#getActiveSession()
-        */
+     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#getSessions()
+     */
+    @Override
+    public Collection<ICdmEntitySession> getSessions() {
+        return ownerSessionMap.values();
+    }
+
+
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#bind(eu.etaxonomy.taxeditor.session.ISessionEventListener)
+     */
+    @Override
+    public void bind(ICdmEntitySessionEnabled sessionOwner) {
+        if(sessionOwner == null) {
+            setActiveSession(null);
+            return;
+        }
+        ICdmEntitySession session  = ownerSessionMap.get(sessionOwner);
+        if(session == null) {
+            throw new CdmClientSessionException("Trying to bind session which does not exist");
+        }
+
+        setActiveSession(session);
+
+    }
+
     @Override
-       public CdmEntitySession getActiveSession() {
-               return activeSession;
-       }
-    
+    public boolean contains(ICdmEntitySessionEnabled sessionOwner) {
+        return ownerSessionMap.containsKey(sessionOwner);
+    }
+
+
     /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#getSession(eu.etaxonomy.taxeditor.session.ISessionEventListener)
-        */
-    @Override
-       public CdmEntitySession getSession(ISessionEventListener sessionOwner) {
-       if(sessionOwner == null) {
-               return null;
-       }
-       
-               CdmEntitySession session = ownerSessionMap.get(sessionOwner);
-               if(session == null) {
-                       logger.info("No session exists for session owner with class : " + sessionOwner.getClass().getName());                   
-               }
-               return session;
-       }
-       
-       private CdmEntitySession newSession(ISessionEventListener sessionOwner, boolean setAsActive) {
-               CdmEntitySession session = ownerSessionMap.get(sessionOwner);
-               if(session == null) {           
-                       session = new CdmEntitySession(sessionOwner, this);
-                       addToOwnerSessionMap(sessionOwner, session);
-               }
-               
-               if(setAsActive) {
-                       activeSession = session;
-               }               
-               return session;
-       }
-       
-       /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#bind(eu.etaxonomy.taxeditor.session.ISessionEventListener)
-        */
-       @Override
-       public void bind(ISessionEventListener sessionOwner) {
-               CdmEntitySession session  = ownerSessionMap.get(sessionOwner);
-               if(session == null) {
-                       session = newSession(sessionOwner,true);
-               }
-               activeSession = session;
-       }
-       
-       /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(eu.etaxonomy.taxeditor.session.ISessionEventListener, T)
-        */
-       @Override
-       public <T extends Object> T load(ISessionEventListener sessionOwner, T obj) {
-               CdmEntitySession session = newSession(sessionOwner,true);
-               return (T) session.load(obj);
-       }
-       
-       /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(T)
-        */
-       @Override
-       public <T extends Object> T load(T obj) {
-               if(activeSession == null) {
-                       throw new CdmClientSessionException("No active session has been bound, cannot load cdm entity");                        
-               }
-               return (T)activeSession.load(obj);
-       }
-
-       /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(eu.etaxonomy.taxeditor.session.ISessionEventListener, T)
-        */
-       @Override
-       public <T extends CdmBase> T load(ISessionEventListener sessionOwner, T cdmBase) {
-               CdmEntitySession session = newSession(sessionOwner,true);
-               return (T)session.load(cdmBase);
-       }
-       
-       /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(T)
-        */
-       @Override
-       public <T extends CdmBase> T load(T cdmBase) {
-               if(activeSession == null) {
-                       throw new CdmClientSessionException("No active session has been bound, cannot load cdm entity");                        
-               }
-               return (T)activeSession.load(cdmBase);
-       }
-       
-
-       /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(eu.etaxonomy.taxeditor.session.ISessionEventListener, java.util.Collection)
-        */
-       @Override
-       public <T extends CdmBase> Collection<T> load(ISessionEventListener sessionOwner, Collection<T> cdmBaseList) {
-               CdmEntitySession session = newSession(sessionOwner,true);
-               return session.load(cdmBaseList);
-       }
-       
-       
-       /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(java.util.Collection)
-        */
-       @Override
-       public <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList) {
-               if(activeSession == null) {
-                       throw new CdmClientSessionException("No active session has been bound, cannot load cdm entity list");                   
-               }
-               return activeSession.load(cdmBaseList);
-       }
-       
-       /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#addRootEntity(T)
-        */
-       @Override
-       @SuppressWarnings("unchecked")
-       public <T extends CdmBase> void addRootEntity(T cdmBase) {
-               if(activeSession == null) {
-                       throw new CdmClientSessionException("No active session has been bound, cannot add root cdm entity");                    
-               }
-               activeSession.addRootEntity(cdmBase);
-       }
-       
-       /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#addRootEntities(java.util.Collection)
-        */
-       @Override
-       @SuppressWarnings("unchecked")
-       public <T extends Object> void addRootEntities(Collection<T> cdmBaseList) {
-               if(activeSession == null) {
-                       throw new CdmClientSessionException("No active session has been bound, cannot add root cdm entity");                    
-               }
-               activeSession.addRootEntities(cdmBaseList);
-       }
-
-//     /* (non-Javadoc)
-//      * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#commit()
-//      */
-//     @Override
-//     public void commit() {
-//             if(activeSession == null) {
-//                     logger.info("No active session has been bound, nothing to commit");
-//             }
-//             activeSession.commit();
-//     }
-//
-//     
-//     /* (non-Javadoc)
-//      * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#commit(eu.etaxonomy.taxeditor.session.ISessionEventListener)
-//      */
-//     @Override
-//     public void commit(ISessionEventListener sessionOwner) {
-//             if(sessionOwner == null) {
-//             return ;
-//     }
-//     
-//             CdmEntitySession session = ownerSessionMap.get(sessionOwner);
-//             if(session == null) {
-//                     logger.info("No session exists for session owner with class : " + sessionOwner.getClass().getName());                   
-//             } else {
-//                     session.commit();
-//             }               
-//     }
-               
-       
-       /* (non-Javadoc)
-        * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#dispose(eu.etaxonomy.taxeditor.session.ISessionEventListener)
-        */
-       @Override
-       public void dispose(ISessionEventListener owner) {
-               CdmEntitySession session = ownerSessionMap.get(owner);
-               if(session == null) {
-                       logger.info("No Session connected to owner, nothing to dispose");
-                       return;
-               }
-               session.dispose();      
-       }
-       
-        void addToOwnerSessionMap(ISessionEventListener owner, CdmEntitySession session) {
-               ownerSessionMap.put(owner, session);
-       }
-       
-//     void addToLinkedEntities(T cdmBase) {
-//             if(cdmBase == null) {
-//                     return;
-//             }
-//             String id = CdmTransientEntityCacher.generateId(cdmBase);
-//             HashSet<CdmClientBase<T>> linkedEntities = entitiesMap.get(id);
-//             if(linkedEntities == null) {
-//                     linkedEntities = new HashSet<CdmClientBase<T>>();                       
-//             }
-//             linkedEntities.add(cdmBase);
-//     }
-               
-
-       void setEntityAsLatest(CdmBase cdmBase) {               
-               latestEntityCacher.put(cdmBase);
-       }
-       
-       void promoteSessionEntitiesToLatest(ISessionEventListener owner) {
-               CdmEntitySession session = ownerSessionMap.get(owner);
-               if(session != null) {
-                       session.setEntitiesAsLatest();
-               }
-       }
+     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(T)
+     */
+    @Override
+    public <T extends Object> T load(T obj, boolean update) {
+        if(activeSession == null) {
+            return obj;
+        } else {
+            return activeSession.load(obj, update);
+        }
+    }
+
+
+    @Override
+    public <T extends CdmBase> void update() {
+        if(activeSession != null) {
+            activeSession.update();
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(T)
+     */
+    @Override
+    public <T extends CdmBase> T load(T cdmBase, boolean update) {
+        if(activeSession == null) {
+            return cdmBase;
+        }
+        return activeSession.load(cdmBase, update);
+    }
+
+
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(eu.etaxonomy.cdm.api.service.UpdateResult, boolean)
+     */
+    @Override
+    public UpdateResult load(UpdateResult updateResult, boolean update) {
+        if(activeSession == null) {
+            return updateResult;
+        }
+        return activeSession.load(updateResult, update);
+    }
+
+
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(eu.etaxonomy.cdm.persistence.dto.MergeResult, boolean)
+     */
+    @Override
+    public MergeResult load(MergeResult mergeResult, boolean update) {
+        if(activeSession == null) {
+            return mergeResult;
+        }
+        return activeSession.load(mergeResult, update);
+    }
+
+
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(java.util.Collection)
+     */
+    @Override
+    public <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList, boolean update) {
+        if(activeSession == null) {
+            return cdmBaseList;
+        }
+        return activeSession.load(cdmBaseList, update);
+    }
+
+
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#dispose(eu.etaxonomy.taxeditor.session.ISessionEventListener)
+     */
+    void remove(ICdmEntitySessionEnabled owner) {
+        ICdmEntitySession session = ownerSessionMap.get(owner);
+        if(session == null) {
+            logger.info("No Session connected to owner, nothing to do");
+            return;
+        }
+        if(session == activeSession) {
+            setActiveSession(null);
+        }
+        ownerSessionMap.remove(owner);
+        notifyObservers();
+
+    }
+
+    @Override
+    public void dispose(ICdmEntitySessionEnabled owner) {
+        ICdmEntitySession session = ownerSessionMap.get(owner);
+        if(session != null) {
+            session.dispose();
+        }
+        if(nullSession != null && nullSession.getOwner() == owner) {
+            nullSession = null;
+        }
+
+    }
+
+
+    @Override
+    public void disposeAll() {
+        Set<ICdmEntitySessionEnabled> owners =
+                new HashSet<ICdmEntitySessionEnabled>(ownerSessionMap.keySet());
+        for(ICdmEntitySessionEnabled owner : owners) {
+            ICdmEntitySession session = ownerSessionMap.get(owner);
+            if(session != null) {
+                session.dispose();
+            }
+        }
+
+    }
+
+    void addToOwnerSessionMap(ICdmEntitySessionEnabled owner, ICdmEntitySession session) {
+        ownerSessionMap.put(owner, session);
+        notifyObservers();
+    }
+
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#addSessionListener()
+     */
+    @Override
+    public void addSessionObserver(ICdmEntitySessionManagerObserver sessionObserver) {
+        sessionObservers.add(sessionObserver);
+    }
+
+    public void notifyObservers() {
+        for(ICdmEntitySessionManagerObserver sessionObserver : sessionObservers) {
+            sessionObserver.changed();
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#isRemoting()
+     */
+    @Override
+    public boolean isRemoting() {
+        // FIXME:Remoting stupid method to check whether we are in remoting
+        return true;
+    }
 
 }
+