CdmRemoteCacheManager : added cache getter methods
[taxeditor.git] / eu.etaxonomy.taxeditor.cdmlib / src / main / java / eu / etaxonomy / taxeditor / session / CdmEntitySession.java
index 2124dde071eaebb53dc73f866ac920d5db2b5f98..09443e3e862fc85af4b1dbf783af3e100f593793 100644 (file)
@@ -1,22 +1,33 @@
 // $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;
 
 
 /**
@@ -31,73 +42,246 @@ import eu.etaxonomy.taxeditor.remoting.cache.CdmTransientEntityCacher;
 
 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();
-       }