boolean updatedCdmIdsIsEmpty = updatedCdmIds.isEmpty();
// if the cdm identifier set contains identifiers of objects already
- // present in the updated objects set reomve them
+ // present in the updated objects set remove them
for(CdmBase updatedObject : updatedObjects) {
if(updatedObject != null && super.exists(new CdmEntityCacheKey<>(updatedObject))) {
CdmEntityIdentifier cdmEntityIdentifier = new CdmEntityIdentifier(updatedObject.getId(), updatedObject.getClass());
// remote load cdm identifiers of objects which already exist
// in the cache
-
for(CdmEntityIdentifier cei : updatedCdmIds) {
- if(exists(new CdmEntityCacheKey<>(cei.getCdmClass(), cei.getId()))) {
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ CdmEntityCacheKey<?> cacheKey = new CdmEntityCacheKey(cei.getCdmClass(), cei.getId());
+ if(exists(cacheKey)) {
reloadedObjects.add(load(cei, update));
}
}
private void init(ICdmEntitySessionEnabled sessionOwner, CdmEntitySessionManager cdmEntitySessionManager) {
this.cdmTransientEntityCacher = new ConversationalTransientEntityCacher(sessionOwner);
-
-
this.changeObservers = new ArrayList<>();
cdmEntitySessionManager.addToOwnerSessionMap(sessionOwner, this);
}
import eu.etaxonomy.cdm.api.service.UpdateResult;
import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
import eu.etaxonomy.cdm.persistence.dto.MergeResult;
/**
+ * Implementation for {@link ICdmEntitySessionManager}
+ *
* @author cmathew
* @date 16 Oct 2014
*/
@Component
public class CdmEntitySessionManager implements ICdmEntitySessionManager {
+
private static final Logger logger = Logger.getLogger(CdmEntitySessionManager.class);
private final Map<ICdmEntitySessionEnabled, ICdmEntitySession> ownerSessionMap = new HashMap<>();
private final InheritableThreadLocal<ICdmEntitySession> tlActiveSession = new InheritableThreadLocal<>();
- private NullSession nullSession;
+ private NullSession nullSession;
@Override
public ICdmEntitySession getNullSession() {
}
@Override
- public MergeResult load(MergeResult mergeResult, boolean update) {
+ public <T extends ICdmBase> MergeResult<T> load(MergeResult<T> mergeResult, boolean update) {
if(tlActiveSession.get() == null) {
return mergeResult;
}
}
}
- void addToOwnerSessionMap(ICdmEntitySessionEnabled owner, ICdmEntitySession session) {
+ public void addToOwnerSessionMap(ICdmEntitySessionEnabled owner, ICdmEntitySession session) {
ownerSessionMap.put(owner, session);
notifyObservers();
}
+/**
+* Copyright (C) 2015 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.Collection;
import eu.etaxonomy.cdm.api.service.UpdateResult;
+import eu.etaxonomy.cdm.cache.CdmTransientEntityCacher;
import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
import eu.etaxonomy.cdm.persistence.dto.MergeResult;
+/**
+ * Manager to manage all {@link ICdmEntitySession}s.
+ * <p>
+ * It allows to create new sessions, handles binding and disposing, registering
+ * and notifying observers, thread handling and also offers
+ * convenient methods to load the active session.
+ *
+ * @author c.mathew
+ * @date 2014
+ */
public interface ICdmEntitySessionManager {
+ /**
+ * Creates a new session for the sessionOwner.
+ *
+ * @param sessionOwner the session owner
+ * @param setAsActive if
+ * @return the new session
+ */
public abstract ICdmEntitySession newSession(ICdmEntitySessionEnabled sessionOwner, boolean setAsActive);
/**
- * @param sessionOwner
- * @return
+ * Makes the {@link NullSession} the active session.
+ * @return the null session
*/
public ICdmEntitySession bindNullSession();
-
+ /**
+ * Makes the session belonging to the session owner the active session.
+ *
+ * @param sessionOwner
+ */
public abstract void bind(ICdmEntitySessionEnabled sessionOwner);
-
/**
- * @see eu.etaxonomy.cdm.cache.CdmTransientEntityCacher#load(Collection, boolean)
+ * Loads an object intto the active session and returns the cached object
+ * which is the identical (same) object if an equal object did not yet exist
+ * in the session. If an equal object existed the cached object is returned.
+ * This cached object is equal (x.equals(x')) but not identical (x != x').
+ *
+ * @param object the object to load into the cache
+ * @param update if <code>true</code>, the state of the object graph
+ * attached to the object is copied on the according objects in the cache
+ * @return the cached object
+ * @see CdmTransientEntityCacher#load(Object, boolean)
+ * @see CdmTransientEntityCacher#load(CdmBase, boolean)
*/
- public abstract <T extends Object> T load(T obj, boolean update);
+ public abstract <T extends Object> T load(T object, boolean update);
/**
- * @see eu.etaxonomy.cdm.cache.CdmTransientEntityCacher#load(Collection, boolean)
+ * Loads an {@link CdmBase} into the active session as explained in {@link #load(Object, boolean)}.
+ *
+ * @see #load(Object, boolean)
+ * @see CdmTransientEntityCacher#load(CdmBase, boolean)
*/
public abstract <T extends CdmBase> T load(T cdmBase, boolean update);
-
+ /**
+ * Loads an {@link UpdateResult} into the active session as explained in {@link #load(Object, boolean)}.
+ *
+ * @see #load(Object, boolean)
+ * @see CdmTransientEntityCacher#load(UpdateResult, boolean)
+ */
public abstract UpdateResult load(UpdateResult updateResult, boolean update);
- public abstract MergeResult load(MergeResult mergeResult, boolean update);
-
+ /**
+ * Loads an {@link MergeResult} into the active session as explained in {@link #load(Object, boolean)}.
+ *
+ * @see #load(Object, boolean)
+ * @see CdmTransientEntityCacher#load(MergeResult, boolean)
+ */
+ public abstract <T extends ICdmBase> MergeResult<T> load(MergeResult<T> mergeResult, boolean update);
+ /**
+ * Loads an {@link Collection} of {@link CdmBase} objects into the active session as
+ * explained in {@link #load(Object, boolean)}.
+ *
+ * @see #load(Object, boolean)
+ * @see CdmTransientEntityCacher#load(Collection, boolean)
+ */
public abstract <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList, boolean update);
-
/**
- * @return
+ * @return the active session
*/
public ICdmEntitySession getActiveSession();
+ /**
+ * Returns all sessions managed by this {@link ICdmEntitySessionManager session manager}
+ * @return
+ */
public Collection<ICdmEntitySession> getSessions();
public void addSessionObserver(ICdmEntitySessionManagerObserver sessionObserver);
-
-
-
public boolean isRemoting();
- /**
- * @param owner
- */
public void dispose(ICdmEntitySessionEnabled owner);
- /**
- *
- */
public void disposeAll();
-
- /**
- *
- */
public <T extends CdmBase> void update();
/**
- * @param sessionOwner
- * @return
+ * Returns <code>true</code> if there is a session managed for the given session owner.
+ * @param sessionOwner the session owner
+ * @return <code>true</code> if a session exists
*/
public boolean contains(ICdmEntitySessionEnabled sessionOwner);
/**
- * @return
+ * Returns the {@link NullSession} singleton instance (within this session manager)
+ * @return the null session
*/
public ICdmEntitySession getNullSession();
-
}
/**
* @author cmathew
* @date 16 Feb 2015
- *
*/
public interface ICdmEntitySessionManagerObserver {
/**
* @author cmathew
* @date 29 Jan 2015
- *
*/
public class MockCdmEntitySession implements ICdmEntitySession {
+/**
+* Copyright (C) 2015 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.mock;
import java.util.Collection;
import eu.etaxonomy.cdm.api.service.UpdateResult;
import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ICdmBase;
import eu.etaxonomy.cdm.persistence.dto.MergeResult;
import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager;
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManagerObserver;
-
public class MockCdmEntitySessionManager implements ICdmEntitySessionManager {
-
@Override
public void bind(ICdmEntitySessionEnabled sessionOwner) {
}
return obj;
}
-
@Override
public <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList, boolean update) {
return cdmBaseList;
}
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#newSession(eu.etaxonomy.taxeditor.session.ISessionEventListener, boolean)
- */
@Override
public ICdmEntitySession newSession(ICdmEntitySessionEnabled sessionOwner, boolean setAsActive) {
return new MockCdmEntitySession();
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#getActiveSession()
- */
@Override
public ICdmEntitySession getActiveSession() {
return new MockCdmEntitySession();
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#getSessions()
- */
@Override
public Collection<ICdmEntitySession> getSessions() {
return null;
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#addSessionObserver(eu.etaxonomy.taxeditor.session.ICdmEntitySessionManagerObserver)
- */
@Override
public void addSessionObserver(ICdmEntitySessionManagerObserver sessionObserver) {
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#isRemoting()
- */
@Override
public boolean isRemoting() {
return false;
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#dispose(eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled)
- */
@Override
public void dispose(ICdmEntitySessionEnabled owner) {
-
-
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#disposeAll()
- */
@Override
public void disposeAll() {
-
-
}
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#update()
- */
@Override
public <T extends CdmBase> void update() {
- // TODO Auto-generated method stub
-
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(eu.etaxonomy.cdm.api.service.UpdateResult, boolean)
- */
@Override
public UpdateResult load(UpdateResult updateResult, boolean update) {
return updateResult;
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#contains(eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled)
- */
@Override
public boolean contains(ICdmEntitySessionEnabled sessionOwner) {
return false;
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#bindNullSession(eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled)
- */
@Override
public ICdmEntitySession bindNullSession() {
return new MockCdmEntitySession();
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#getNullSession()
- */
@Override
public ICdmEntitySession getNullSession() {
return new MockCdmEntitySession();
}
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(eu.etaxonomy.cdm.persistence.dto.MergeResult, boolean)
- */
@Override
- public MergeResult load(MergeResult mergeResult, boolean update) {
+ public <T extends ICdmBase> MergeResult<T> load(MergeResult<T> mergeResult, boolean update) {
return mergeResult;
}
-
}
}
return cdmEntitySessionManager;
}
-
-
}
/**
* @author cmathew
* @date 5 Feb 2015
- *
*/
public abstract class CdmEntitySessionInput implements ICdmEntitySessionEnabled {
public abstract void merge();
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getPropertyPathsMap()
- */
@Override
public Map<Object, List<String>> getPropertyPathsMap() {
// TODO Auto-generated method stub
CdmStore.getService(ITermTreeService.class).saveOrUpdate(getRootEntities());
List<TermTree> rootEntities = getRootEntities();
- for (TermTree featureTree : rootEntities) {
+ for (TermTree<Character> featureTree : rootEntities) {
if(featureTree.getTermType().equals(TermType.Character)){
TermTree<Character> characterTree = featureTree;
//save characters because they can be modified in this editor