org.granite.client.tide.data.impl
Class EntityManagerImpl

java.lang.Object
  extended by org.granite.client.tide.data.impl.EntityManagerImpl
All Implemented Interfaces:
EntityManager

public class EntityManagerImpl
extends Object
implements EntityManager

Author:
William DRAI

Nested Class Summary
 class EntityManagerImpl.DefaultTrackingHandler
           
 
Nested classes/interfaces inherited from interface org.granite.client.tide.data.EntityManager
EntityManager.Function, EntityManager.Propagation, EntityManager.PropagationPolicy, EntityManager.Update, EntityManager.UpdateKind
 
Constructor Summary
EntityManagerImpl(String id, DataManager dataManager, TrackingContext trackingContext, ExpressionEvaluator expressionEvaluator)
           
 
Method Summary
 void acceptConflict(Conflict conflict, boolean client)
          
 void addListener(DataConflictListener listener)
           
 void addReference(Object obj, Object parent, String propName, org.granite.tide.Expression res)
          Registers a reference to the provided object with either a parent or res
 void attachEntity(Identifiable entity)
           
 void attachEntity(Identifiable entity, boolean putInCache)
           
 void clear()
          Clear the current context Destroys all components/context variables
 void clearCache()
          Clears entity cache
 void defaultMerge(MergeContext mergeContext, Object obj, Object dest, org.granite.tide.Expression expr, Object parent, String propertyName)
          Default implementation of entity merge for simple ActionScript beans with public properties Can be used to implement Tide managed entities with simple objects
 void detach(Object object, IdentityHashMap<Object,Object> cache, boolean forceRemove)
           
 void detachEntity(Identifiable entity, boolean removeFromCache, boolean forceRemove)
           
 Object getCachedObject(Object object, boolean nullIfAbsent)
           
 DataManager getDataManager()
           
 Object getEntityProperty(Identifiable entity, String propName, Object value)
          Intercept a property getter
 String getId()
          Return the entity manager id
 List<Object[]> getOwnerEntities(Object object)
           
 Object[] getOwnerEntity(Object object)
           
 org.granite.tide.Expression getReference(Object obj, boolean recurse, Set<Object> cache)
          
 Map<String,Object> getSavedProperties(Object entity)
          Current map of saved properties for the specified entity
 void handleMergeConflicts(MergeContext mergeContext)
          Dispatch an event when last merge generated conflicts
 void handleRemovalsAndPersists(MergeContext mergeContext, List<Object> removals, List<Object> persists)
          Remove elements from cache and managed collections
 void handleUpdates(MergeContext mergeContext, String sourceSessionId, List<EntityManager.Update> updates)
           
 boolean initializeObject(ServerSession serverSession, Object object)
          
 MergeContext initMerge()
           
 Object internalMergeExternalData(MergeContext mergeContext, Object obj, Object prev, List<Object> removals, List<Object> persists)
           
 boolean isActive()
          
 boolean isDeepDirtyEntity(Object entity)
          Entity is deep dirty when any element in its object graph has been modified
 boolean isDirty()
          Entity manager is dirty when any entity/collection/map has been modified
 boolean isEntityChanged(Identifiable entity)
           
 boolean isEntityDeepChanged(Identifiable entity)
           
 boolean isSaved(Identifiable entity)
          
 boolean isSaved(Object entity)
          Indicates if the entity is persisted on the server (id/version not null/NaN)
 boolean isUninitializeAllowed()
           
 Object mergeExternal(MergeContext mergeContext, Object obj, Object previous, org.granite.tide.Expression expr, Object parent, String propertyName, String setter, boolean forceUpdate)
          Merge an object coming from the server in the context
 Object mergeExternalData(Object obj)
          Merge an object coming from a remote location (in general from a service) in the local context
 Object mergeExternalData(Object obj, Object prev, String externalDataSessionId, List<Object> removals, List<Object> persists)
          Merge an object coming from a remote location (in general from a service) in the local context
 Object mergeExternalData(ServerSession serverSession, Object obj)
          Merge an object coming from a remote location (in general from a service) in the local context
 Object mergeExternalData(ServerSession serverSession, Object obj, Object prev, String externalDataSessionId, List<Object> removals, List<Object> persists)
          Merge an object coming from a remote location (in general from a service) in the local context
 Object mergeFromEntityManager(EntityManager sourceEntityManager, Object obj, String externalDataSessionId, boolean uninitializing)
           
 void mergeInEntityManager(EntityManager entityManager)
          Merge conversation entity manager context variables in global entity manager Only applicable to conversation contexts
protected  Object mergePersistentCollection(MergeContext mergeContext, LazyableCollection coll, Object previous, org.granite.tide.Expression expr, Identifiable parent, String propertyName)
           
 EntityManager newTemporaryEntityManager()
          Create a new temporary entity manager
 void raiseUpdateEvents(Context context, List<EntityManager.Update> updates)
           
 void removeListener(DataConflictListener listener)
           
 boolean removeReference(Object obj, Object parent, String propName, org.granite.tide.Expression res)
          Removes a reference on the provided object
 void resetAllEntities()
          Discard changes of all cached entities from last version received from the server
 void resetEntity(Identifiable entity)
          Discard changes of entity from last version received from the server
 void resolveMergeConflicts(MergeContext mergeContext, Object modifiedEntity, Object localEntity, boolean resolving)
          Resolve merge conflicts
 void setActive(boolean active)
          Setter for active flag When EntityManager is not active, dirty checking is disabled
 void setCustomMergers(DataMerger[] customMergers)
          Setter for the array of custom mergers
 void setDirtyCheckContext(DirtyCheckContext dirtyCheckContext)
          Setter for dirty check context implementation
 void setEntityManagerPropagation(EntityManager.Propagation propagation)
          Setter for the propagation manager
 void setEntityProperty(Identifiable entity, String propName, Object oldValue, Object newValue)
          Intercept a property setter
 void setRemoteInitializer(RemoteInitializer remoteInitializer)
          Setter for the remote initializer implementation
 void setRemoteValidator(RemoteValidator remoteValidator)
          Setter for the remote validator implementation
 void setUninitializeAllowed(boolean uninitializeAllowed)
          Allow uninitialize of persistent collections
 boolean validateObject(Object object, String property, Object value)
          Trigger remote validation of objects
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

EntityManagerImpl

public EntityManagerImpl(String id,
                         DataManager dataManager,
                         TrackingContext trackingContext,
                         ExpressionEvaluator expressionEvaluator)
Method Detail

getId

public String getId()
Return the entity manager id

Specified by:
getId in interface EntityManager
Returns:
the entity manager id

isActive

public boolean isActive()

Specified by:
isActive in interface EntityManager
Returns:
the entity manager state

clear

public void clear()
Clear the current context Destroys all components/context variables

Specified by:
clear in interface EntityManager

clearCache

public void clearCache()
Clears entity cache

Specified by:
clearCache in interface EntityManager

getDataManager

public DataManager getDataManager()
Specified by:
getDataManager in interface EntityManager

setCustomMergers

public void setCustomMergers(DataMerger[] customMergers)
Setter for the array of custom mergers

Parameters:
customMergers - array of mergers

setUninitializeAllowed

public void setUninitializeAllowed(boolean uninitializeAllowed)
Description copied from interface: EntityManager
Allow uninitialize of persistent collections

Specified by:
setUninitializeAllowed in interface EntityManager
Parameters:
uninitializeAllowed - allow uninitialize of collections

isUninitializeAllowed

public boolean isUninitializeAllowed()
Specified by:
isUninitializeAllowed in interface EntityManager
Returns:
allow uninitialize of collections

setEntityManagerPropagation

public void setEntityManagerPropagation(EntityManager.Propagation propagation)
Setter for the propagation manager

Specified by:
setEntityManagerPropagation in interface EntityManager
Parameters:
propagation - propagation function that will visit child entity managers

setActive

public void setActive(boolean active)
Setter for active flag When EntityManager is not active, dirty checking is disabled

Parameters:
active - state

setDirtyCheckContext

public void setDirtyCheckContext(DirtyCheckContext dirtyCheckContext)
Setter for dirty check context implementation

Parameters:
dirtyCheckContext - dirty check context implementation

newTemporaryEntityManager

public EntityManager newTemporaryEntityManager()
Create a new temporary entity manager

Specified by:
newTemporaryEntityManager in interface EntityManager
Returns:
a temporary entity manager

attachEntity

public void attachEntity(Identifiable entity)
Parameters:
entity - an entity

attachEntity

public void attachEntity(Identifiable entity,
                         boolean putInCache)
Parameters:
entity - an entity
putInCache - put entity in cache

detachEntity

public void detachEntity(Identifiable entity,
                         boolean removeFromCache,
                         boolean forceRemove)
Parameters:
entity - an entity
removeFromCache - remove entity from cache

isSaved

public boolean isSaved(Identifiable entity)


detach

public void detach(Object object,
                   IdentityHashMap<Object,Object> cache,
                   boolean forceRemove)
Parameters:
object - object
cache - internal cache to avoid graph loops

getCachedObject

public Object getCachedObject(Object object,
                              boolean nullIfAbsent)
Specified by:
getCachedObject in interface EntityManager
Parameters:
object - an entity
nullIfAbsent - return null if entity not cached in context

getOwnerEntity

public Object[] getOwnerEntity(Object object)
Specified by:
getOwnerEntity in interface EntityManager
Parameters:
object - an entity

getOwnerEntities

public List<Object[]> getOwnerEntities(Object object)
Parameters:
object - an entity

getReference

public org.granite.tide.Expression getReference(Object obj,
                                                boolean recurse,
                                                Set<Object> cache)

Specified by:
getReference in interface EntityManager
recurse - should recurse until 'real' context path, otherwise object reference can be returned
cache - graph visitor cache
Returns:
the path from the entity context (or null is no path found)

addReference

public void addReference(Object obj,
                         Object parent,
                         String propName,
                         org.granite.tide.Expression res)
Registers a reference to the provided object with either a parent or res

Specified by:
addReference in interface EntityManager
Parameters:
obj - an entity
parent - the parent entity
propName - name of the parent entity property that references the entity
res - the context expression

removeReference

public boolean removeReference(Object obj,
                               Object parent,
                               String propName,
                               org.granite.tide.Expression res)
Removes a reference on the provided object

Specified by:
removeReference in interface EntityManager
Parameters:
obj - an entity
parent - the parent entity to dereference
propName - name of the parent entity property that references the entity
res - expression to remove

initMerge

public MergeContext initMerge()
Specified by:
initMerge in interface EntityManager

mergeExternal

public Object mergeExternal(MergeContext mergeContext,
                            Object obj,
                            Object previous,
                            org.granite.tide.Expression expr,
                            Object parent,
                            String propertyName,
                            String setter,
                            boolean forceUpdate)
Merge an object coming from the server in the context

Specified by:
mergeExternal in interface EntityManager
Parameters:
obj - external object
previous - previously existing object in the context (null if no existing object)
expr - current path from the context
parent - parent object for collections
propertyName - property name of the current object in the parent object
setter - setter function to update the private property
forceUpdate - force update of property (used for externalized properties)
Returns:
merged object (should === previous when previous not null)

mergePersistentCollection

protected Object mergePersistentCollection(MergeContext mergeContext,
                                           LazyableCollection coll,
                                           Object previous,
                                           org.granite.tide.Expression expr,
                                           Identifiable parent,
                                           String propertyName)
Parameters:
coll - the collection to wrap
previous - the previous existing collection
expr - the path expression from the context
parent - the owner object
propertyName - owner property
Returns:
the wrapped persistent collection

mergeFromEntityManager

public Object mergeFromEntityManager(EntityManager sourceEntityManager,
                                     Object obj,
                                     String externalDataSessionId,
                                     boolean uninitializing)
Specified by:
mergeFromEntityManager in interface EntityManager
Parameters:
sourceEntityManager - source context of incoming data
obj - external object
externalDataSessionId - is merge from external data
uninitializing - true to force folding of loaded lazy associations
Returns:
merged object

mergeExternalData

public Object mergeExternalData(Object obj)
Description copied from interface: EntityManager
Merge an object coming from a remote location (in general from a service) in the local context

Specified by:
mergeExternalData in interface EntityManager
Parameters:
obj - external object
Returns:
merged object (should === previous when previous not null)

mergeExternalData

public Object mergeExternalData(ServerSession serverSession,
                                Object obj)
Description copied from interface: EntityManager
Merge an object coming from a remote location (in general from a service) in the local context

Specified by:
mergeExternalData in interface EntityManager
obj - external object
Returns:
merged object

mergeExternalData

public Object mergeExternalData(Object obj,
                                Object prev,
                                String externalDataSessionId,
                                List<Object> removals,
                                List<Object> persists)
Description copied from interface: EntityManager
Merge an object coming from a remote location (in general from a service) in the local context

Specified by:
mergeExternalData in interface EntityManager
Parameters:
obj - external object
prev - existing local object to merge with
externalDataSessionId - sessionId from which the data is coming (other user/server), null if local or current user session
removals - array of entities to remove from the entity manager cache
Returns:
merged object (should === previous when previous not null)

mergeExternalData

public Object mergeExternalData(ServerSession serverSession,
                                Object obj,
                                Object prev,
                                String externalDataSessionId,
                                List<Object> removals,
                                List<Object> persists)
Description copied from interface: EntityManager
Merge an object coming from a remote location (in general from a service) in the local context

Specified by:
mergeExternalData in interface EntityManager
Parameters:
obj - external object
prev - existing local object to merge with
externalDataSessionId - sessionId from which the data is coming (other user/server), null if local or current user session
removals - array of entities to remove from the entity manager cache
Returns:
merged object (should === previous when previous not null)

internalMergeExternalData

public Object internalMergeExternalData(MergeContext mergeContext,
                                        Object obj,
                                        Object prev,
                                        List<Object> removals,
                                        List<Object> persists)
Parameters:
obj - external object
prev - existing local object to merge with
externalDataSessionId - sessionId from which the data is coming (other user/server), null if local or current user session
removals - array of entities to remove from the entity manager cache
Returns:
merged object (should === previous when previous not null)

mergeInEntityManager

public void mergeInEntityManager(EntityManager entityManager)
Merge conversation entity manager context variables in global entity manager Only applicable to conversation contexts

Specified by:
mergeInEntityManager in interface EntityManager
Parameters:
entityManager - conversation entity manager

isDirty

public boolean isDirty()
Description copied from interface: EntityManager
Entity manager is dirty when any entity/collection/map has been modified

Specified by:
isDirty in interface EntityManager
Returns:
is dirty

isDeepDirtyEntity

public boolean isDeepDirtyEntity(Object entity)
Description copied from interface: EntityManager
Entity is deep dirty when any element in its object graph has been modified

Specified by:
isDeepDirtyEntity in interface EntityManager
Parameters:
entity - root of the entity graph
Returns:
is dirty

isSaved

public boolean isSaved(Object entity)
Description copied from interface: EntityManager
Indicates if the entity is persisted on the server (id/version not null/NaN)

Specified by:
isSaved in interface EntityManager
Parameters:
entity - an entity
Returns:
true if saved

handleRemovalsAndPersists

public void handleRemovalsAndPersists(MergeContext mergeContext,
                                      List<Object> removals,
                                      List<Object> persists)
Remove elements from cache and managed collections

Parameters:
removals - array of entity instances to remove from the entity manager cache

addListener

public void addListener(DataConflictListener listener)
Specified by:
addListener in interface EntityManager

removeListener

public void removeListener(DataConflictListener listener)
Specified by:
removeListener in interface EntityManager

handleMergeConflicts

public void handleMergeConflicts(MergeContext mergeContext)
Dispatch an event when last merge generated conflicts


resolveMergeConflicts

public void resolveMergeConflicts(MergeContext mergeContext,
                                  Object modifiedEntity,
                                  Object localEntity,
                                  boolean resolving)
Resolve merge conflicts

Parameters:
modifiedEntity - the received entity
localEntity - the locally cached entity
resolving - true to keep client state

getSavedProperties

public Map<String,Object> getSavedProperties(Object entity)
Current map of saved properties for the specified entity

Specified by:
getSavedProperties in interface EntityManager
Parameters:
entity - an entity
Returns:
saved properties for this entity

defaultMerge

public void defaultMerge(MergeContext mergeContext,
                         Object obj,
                         Object dest,
                         org.granite.tide.Expression expr,
                         Object parent,
                         String propertyName)
Default implementation of entity merge for simple ActionScript beans with public properties Can be used to implement Tide managed entities with simple objects

Parameters:
em - the context
obj - source object
dest - destination object
expr - current path of the entity in the context (mostly for internal use)
parent - owning object
propertyName - property name of the owning object

isEntityChanged

public boolean isEntityChanged(Identifiable entity)

isEntityDeepChanged

public boolean isEntityDeepChanged(Identifiable entity)

resetEntity

public void resetEntity(Identifiable entity)
Discard changes of entity from last version received from the server

Specified by:
resetEntity in interface EntityManager
Parameters:
entity - entity to restore

resetAllEntities

public void resetAllEntities()
Discard changes of all cached entities from last version received from the server

Specified by:
resetAllEntities in interface EntityManager
Parameters:
cache - reset cache

acceptConflict

public void acceptConflict(Conflict conflict,
                           boolean client)

Specified by:
acceptConflict in interface EntityManager
Parameters:
conflict - conflict
client - true: keep client changes, false: override with server changes

setRemoteInitializer

public void setRemoteInitializer(RemoteInitializer remoteInitializer)
Description copied from interface: EntityManager
Setter for the remote initializer implementation

Specified by:
setRemoteInitializer in interface EntityManager
Parameters:
remoteInitializer - instance of IRemoteInitializer

initializeObject

public boolean initializeObject(ServerSession serverSession,
                                Object object)

Specified by:
initializeObject in interface EntityManager
object - a lazy-loaded object
Returns:
true if initialization triggered

setEntityProperty

public void setEntityProperty(Identifiable entity,
                              String propName,
                              Object oldValue,
                              Object newValue)
Description copied from interface: EntityManager
Intercept a property setter

Specified by:
setEntityProperty in interface EntityManager
Parameters:
entity - entity to intercept
propName - property name
oldValue - old value
newValue - new value

getEntityProperty

public Object getEntityProperty(Identifiable entity,
                                String propName,
                                Object value)
Description copied from interface: EntityManager
Intercept a property getter

Specified by:
getEntityProperty in interface EntityManager
Parameters:
entity - entity to intercept
propName - property name
value - value
Returns:
value

handleUpdates

public void handleUpdates(MergeContext mergeContext,
                          String sourceSessionId,
                          List<EntityManager.Update> updates)
Specified by:
handleUpdates in interface EntityManager
Parameters:
sourceSessionId - sessionId from which data updates come (null when from current session)
updates - list of data updates

raiseUpdateEvents

public void raiseUpdateEvents(Context context,
                              List<EntityManager.Update> updates)
Specified by:
raiseUpdateEvents in interface EntityManager

setRemoteValidator

public void setRemoteValidator(RemoteValidator remoteValidator)
Description copied from interface: EntityManager
Setter for the remote validator implementation

Specified by:
setRemoteValidator in interface EntityManager
Parameters:
remoteValidator - instance of IRemoteValidator

validateObject

public boolean validateObject(Object object,
                              String property,
                              Object value)
Description copied from interface: EntityManager
Trigger remote validation of objects

Specified by:
validateObject in interface EntityManager
Parameters:
object - a lazy-loaded object
Returns:
true if validation triggered