// $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;
+ }
}
+