// $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.List;
+import java.util.Set;
+import java.util.UUID;
+import net.sf.ehcache.statistics.LiveCacheStatistics;
+
+import org.apache.log4j.Logger;
import org.apache.poi.ss.formula.functions.T;
+import eu.etaxonomy.cdm.api.service.IService;
import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
+import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent;
+import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType;
+import eu.etaxonomy.cdm.persistence.hibernate.CdmPostDataChangeObservableListener;
import eu.etaxonomy.taxeditor.remoting.cache.CdmTransientEntityCacher;
+import eu.etaxonomy.taxeditor.remoting.cache.EntityCacherDebugResult;
/**
public class CdmEntitySession implements ICdmEntitySession {
+ private static final Logger logger = Logger.getLogger(CdmEntitySession.class);
+
+ private final CdmEntitySessionManager cdmEntitySessionManager;
+
+ private final ICdmEntitySessionEnabled sessionOwner;
+
+ private final CdmTransientEntityCacher cdmTransientEntityCacher;
+
+ private final List<ICdmEntitySessionEnabled> changeObservers;
+
+ private final List<T> rootEntities;
+
+ public CdmEntitySession(ICdmEntitySessionEnabled sessionOwner, CdmEntitySessionManager cdmEntitySessionManager) {
+ this.sessionOwner = sessionOwner;
+ this.cdmTransientEntityCacher = new CdmTransientEntityCacher(sessionOwner, cdmEntitySessionManager);
+ this.rootEntities = new ArrayList<T>();
+ this.cdmEntitySessionManager = cdmEntitySessionManager;
+ this.changeObservers = new ArrayList<ICdmEntitySessionEnabled>();
+ cdmEntitySessionManager.addToOwnerSessionMap(sessionOwner, this);
+ }
+
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(T)
+ */
+ @Override
+ public <O extends Object> O load(O obj) {
+ return cdmTransientEntityCacher.load(obj,true);
+ }
+
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(T)
+ */
+ @Override
+ public <T extends CdmBase> T load(T cdmBase) {
+ return (T)cdmTransientEntityCacher.load(cdmBase,true);
+ }
+
+ @Override
+ public <T extends ICdmBase> void update(T cdmBase, Set<CdmBase> affectedObjects) {
+ load(cdmBase);
+ addEvent(cdmBase, affectedObjects, EventType.UPDATE);
+ }
+
+ @Override
+ public <T extends ICdmBase> void delete(T cdmBase, Set<CdmBase> affectedObjects) {
+ for(CdmBase cb : affectedObjects) {
+ load(cb);
+ }
+ addEvent(cdmBase, affectedObjects, EventType.DELETE);
+ }
+
+ @Override
+ public <T extends ICdmBase> void delete(Set<T> cdmBases, Set<CdmBase> affectedObjects) {
+ for(CdmBase cb : affectedObjects) {
+ load(cb);
+ }
+ addEvent(cdmBases, affectedObjects, EventType.DELETE);
+ }
+
+
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#debug(eu.etaxonomy.cdm.model.common.CdmBase)
+ */
+ @Override
+ public <T extends CdmBase> EntityCacherDebugResult debug(T cdmBase) {
+ EntityCacherDebugResult entityCacherDebugResult = cdmTransientEntityCacher.debug(cdmBase, true);
+ entityCacherDebugResult.print();
+ return entityCacherDebugResult;
+ }
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.Collection)
+ */
+ @Override
+ public <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList) {
+ return cdmTransientEntityCacher.load(cdmBaseList,true);
+ }
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#setEntitiesAsLatest()
+ */
+ @Override
+ public void setEntitiesAsLatest() {
+ //FIXME:Remoting need to think more about whether we really need this
+ // List<CdmBase> entities = cdmTransientEntityCacher.getAllEntities();
+ // for(CdmBase entity : entities) {
+ // cdmEntitySessionManager.setEntityAsLatest(entity);
+ // }
+ }
+
+ /**
+ * Register to get updated after any interaction with the datastore
+ */
+ @Override
+ public void registerForDataStoreChanges(ICdmEntitySessionEnabled observer) {
+ CdmPostDataChangeObservableListener.getDefault().register(observer);
+ }
+
+ /**
+ * Register to get updated after any interaction with the datastore
+ */
+ @Override
+ public void unregisterForDataStoreChanges(ICdmEntitySessionEnabled observer) {
+ CdmPostDataChangeObservableListener.getDefault().unregister(observer);
+ }
+
+
+
+ @Override
+ public void bind() {
+ logger.info("Binding session with owner " + sessionOwner.toString());
+ cdmEntitySessionManager.bind(sessionOwner);
+ cdmEntitySessionManager.notifyObservers();
+ }
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#dispose()
+ */
+ @Override
+ public void dispose() {
+ rootEntities.clear();
+ cdmTransientEntityCacher.dispose();
+ for(ICdmEntitySessionEnabled observer : changeObservers) {
+ CdmPostDataChangeObservableListener.getDefault().unregister(observer);
+ }
+ changeObservers.clear();
+ cdmEntitySessionManager.dispose(sessionOwner);
+ }
+
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
+ */
+ @Override
+ public void addEvent(ICdmBase cdmBase, Set<CdmBase> affectedObjects, EventType eventType) {
+ CdmDataChangeEvent cdce = CdmDataChangeEvent.NewInstance((CdmBase)cdmBase, affectedObjects, eventType);
+ CdmPostDataChangeObservableListener.getDefault().notifyObservers(cdce);
+ }
+
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#notify(java.util.Collection, eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType)
+ */
+ @Override
+ public <T extends ICdmBase> void addEvent(Collection <T> cdmBases, Set<CdmBase> affectedObjects, EventType eventType) {
+ for(ICdmBase cdmBase : cdmBases) {
+ CdmDataChangeEvent cdce = CdmDataChangeEvent.NewInstance((CdmBase)cdmBase, affectedObjects, eventType);
+ CdmPostDataChangeObservableListener.getDefault().notifyObservers(cdce);
+ }
+
+ }
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#commit()
+ */
+ @Override
+ public void fireNotifications() {
+ CdmPostDataChangeObservableListener.getDefault().delayedNotify();
+ }
+
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.UUID, java.lang.Class)
+ */
+ @Override
+ public <T extends CdmBase> T remoteLoad(IService<T> service, UUID uuid) {
+ T cdmBase = service.load(uuid);
+ return load(cdmBase);
+ }
+
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.api.service.IService, java.util.UUID, java.util.List)
+ */
+ @Override
+ public <T extends CdmBase> T remoteLoad(IService<T> service, UUID uuid, List<String> propertyPaths) {
+ T cdmBase = service.load(uuid, propertyPaths);
+ return load(cdmBase);
+ }
+
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#save(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
+ */
+ @Override
+ public <T extends CdmBase> UUID remoteSave(IService<T> service, T cdmBase) {
+ UUID uuid = service.save(cdmBase);
+ load(cdmBase);
+ return uuid;
+ }
+
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#update(eu.etaxonomy.cdm.api.service.IService, eu.etaxonomy.cdm.model.common.CdmBase)
+ */
+ @Override
+ public <T extends CdmBase> T remoteUpdate(IService<T> service, T cdmBase) {
+ debug(cdmBase);
+ T mergedCdmBase = service.merge(cdmBase);
+ //cdmTransientEntityCacher.clear();
+ // FIXME:Remoting not really sure if we need to reload the new
+ // merged object or can we keep using the old one
+ //return load(mergedCdmBase);
+
+ return mergedCdmBase;
+ }
+
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#isActive()
+ */
+ @Override
+ public boolean isActive() {
+ return cdmEntitySessionManager.getActiveSession() == this;
+ }
+
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getOwner()
+ */
+ @Override
+ public ICdmEntitySessionEnabled getOwner() {
+ return sessionOwner;
+ }
+
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#getNoOfObjectsInCache()
+ */
+ @Override
+ public LiveCacheStatistics getCacheStatistics() {
+ return cdmTransientEntityCacher.getCacheStatistics();
+ }
+
+
+
- private CdmEntitySessionManager cdmEntitySessionManager;
-
- private final ISessionEventListener sessionOwner;
-
- private final CdmTransientEntityCacher cdmTransientEntityCacher;
-
- private final List<T> rootEntities;
-
- CdmEntitySession(ISessionEventListener sessionOwner, CdmEntitySessionManager cdmEntitySessionManager) {
- this.sessionOwner = sessionOwner;
- this.cdmTransientEntityCacher = new CdmTransientEntityCacher(sessionOwner, cdmEntitySessionManager);
- this.rootEntities = new ArrayList<T>();
-
- cdmEntitySessionManager.addToOwnerSessionMap(sessionOwner, this);
- }
-
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(T)
- */
- @Override
- public <T extends Object> T load(T obj) {
- return cdmTransientEntityCacher.load(obj,true);
- }
-
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(T)
- */
- @Override
- public <T extends CdmBase> T load(T cdmBase) {
- return (T)cdmTransientEntityCacher.load(cdmBase,true);
- }
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(java.util.Collection)
- */
- @Override
- public <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList) {
- return cdmTransientEntityCacher.load(cdmBaseList,true);
- }
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#setEntitiesAsLatest()
- */
- @Override
- public void setEntitiesAsLatest() {
- //FIXME:Remoting need to think more about whether we really need this
-// List<CdmBase> entities = cdmTransientEntityCacher.getAllEntities();
-// for(CdmBase entity : entities) {
-// cdmEntitySessionManager.setEntityAsLatest(entity);
-// }
- }
-
-
- public void bind() {
- cdmEntitySessionManager.bind(sessionOwner);
- }
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#dispose()
- */
- @Override
- public void dispose() {
- rootEntities.clear();
- cdmTransientEntityCacher.dispose();
- }