Class SharedItemStateManager

  • All Implemented Interfaces:
    ItemStateListener, ItemStateManager
    Direct Known Subclasses:
    VersionItemStateManager

    public class SharedItemStateManager
    extends Object
    implements ItemStateManager, ItemStateListener
    Shared ItemStateManager (SISM). Caches objects returned from a PersistenceManager. Objects returned by this item state manager are shared among all sessions.

    A shared item state manager operates on a PersistenceManager (PM) that is used to load and store the item states. Additionally, a SISM can have VirtualItemStateProviders (VISP) that are used to provide additional, non-persistent, read-only states. Examples of VISP are the content representation of the NodeTypes (/jcr:system/jcr:nodeTypes) and the version store (/jcr:system/jcr:versionStore). those 2 VISP are added to the SISM during initialization of a workspace. i.e. they are 'mounted' to all workspaces. we assume, that VISP cannot be added dynamically, neither during runtime nor by configuration.

    The states from the VISP are read-only. by the exception for node references. remember that the referrers are stored in a NodeReferences state, having the ID of the target state.

    there are 5 types of referential relations to be distinguished:

    1. normal --> normal (references from 'normal' states to 'normal' states) this is the normal case and will be handled by the SISM.
    2. normal --> virtual (references from 'normal' states to 'virtual' states) those references should be handled by the VISP rather by the SISM.
    3. virtual --> normal (references from 'virtual' states to 'normal' states) such references are not supported. eg. references of versioned nodes do not impose any constraints on the referenced nodes.
    4. virtual --> virtual (references from 'virtual' states to 'virtual' states of the same VISP). intra-virtual references are handled by the item state manager of the VISP.
    5. virtual --> virtual' (references from 'virtual' states to 'virtual' states of different VISP). those do currently not occur and are therefore not supported.

    if VISP are not dynamic, there is not risk that NV-type references can dangle (since a VISP cannot be 'unmounted', leaving eventual references dangling). although multi-workspace-referrers are not explicitly supported, the architecture of NodeReferences support multiple referrers with the same PropertyId. So the number of references can be tracked (an example of multi-workspace-referrers is a version referenced by the jcr:baseVersion of several (corresponding) nodes in multiple workspaces).

    As mentioned, VN-type references should not impose any constraints on the referrers (e.g. a normal node referenced by a versioned reference property). In case of the version store, the VN-type references are not stored at all, but reinforced as NN-type references in the normal states in case of a checkout operation.

    VV-type references should be handled by the respective VISP. they look as NN-type references in the scope if the VISP anyway...so no special treatment should be necessary.

    VV'-type references are currently not possible, since the version store and virtual node type representation don't allow such references.

    • Method Detail

      • setCheckReferences

        public void setCheckReferences​(boolean checkReferences)
        Enables or disables the referential integrity checking, this should be used very carefully by experienced developers only.
        Parameters:
        checkReferences - whether to do referential integrity checks
        See Also:
        "https://issues.apache.org/jira/browse/JCR-954"
      • setEventChannel

        public void setEventChannel​(UpdateEventChannel eventChannel)
        Set an update event channel
        Parameters:
        eventChannel - update event channel
      • setISMLocking

        public void setISMLocking​(ISMLocking ismLocking)
        Sets a new locking strategy.
        Parameters:
        ismLocking - the locking strategy for this item state manager.
      • hasItemState

        public boolean hasItemState​(ItemId id)
        Return a flag indicating whether an item state for a given item id exists.
        Specified by:
        hasItemState in interface ItemStateManager
        Parameters:
        id - item id
        Returns:
        true if an item state exists, otherwise false
      • hasNodeReferences

        public boolean hasNodeReferences​(NodeId id)
        Return a flag indicating whether a node references object for a given target id exists.
        Specified by:
        hasNodeReferences in interface ItemStateManager
        Parameters:
        id - target id
        Returns:
        true if a node reference object exists for the given id, otherwise false.
      • stateCreated

        public void stateCreated​(ItemState created)
        Called when an ItemState has successfully been created (i.e. its underlying persistent state was created).

        Notifications are received for items that this manager created itself or items that are managed by one of the virtual providers.

        Specified by:
        stateCreated in interface ItemStateListener
        Parameters:
        created - the ItemState that has been 'created'
      • stateModified

        public void stateModified​(ItemState modified)
        Called when an ItemState has successfully been modified (i.e. its underlying persistent state has changed).

        Notifications are received for items that this manager created itself or items that are managed by one of the virtual providers.

        Specified by:
        stateModified in interface ItemStateListener
        Parameters:
        modified - the ItemState that has been 'modified'
      • stateDestroyed

        public void stateDestroyed​(ItemState destroyed)
        Called when an ItemState has successfully been removed (i.e. its underlying persistent state has been destroyed).

        Notifications are received for items that this manager created itself or items that are managed by one of the virtual providers.

        Specified by:
        stateDestroyed in interface ItemStateListener
        Parameters:
        destroyed - the ItemState that has been 'destroyed'
      • stateDiscarded

        public void stateDiscarded​(ItemState discarded)
        Called when an ItemState has been discarded (i.e. it has been rendered 'invalid').

        Notifications are received for items that this manager created itself or items that are managed by one of the virtual providers.

        Specified by:
        stateDiscarded in interface ItemStateListener
        Parameters:
        discarded - the ItemState that has been discarded
        See Also:
        ItemState.discard()
      • dispose

        public void dispose()
        Disposes this SharedItemStateManager and frees resources.
      • addVirtualItemStateProvider

        public void addVirtualItemStateProvider​(VirtualItemStateProvider prov)
        Adds a new virtual item state provider.

        NOTE: This method is not synchronized, because it is called right after creation only by the same thread and therefore concurrency issues do not occur. Should this ever change, the synchronization status has to be re-examined.

        Parameters:
        prov -
      • externalUpdate

        public void externalUpdate​(ChangeLog external,
                                   EventStateCollection events)
        Handle an external update.
        Parameters:
        external - external change containing only node and property ids.
        events - events to deliver
      • doExternalUpdate

        protected void doExternalUpdate​(ChangeLog external)
        Perform the external update. While executing this method, the writeLock on this manager is held.
        Parameters:
        external - external change containing only node and property ids.
      • addListener

        public void addListener​(ItemStateListener listener)
        Add an ItemStateListener
        Parameters:
        listener - the new listener to be informed on modifications
      • removeListener

        public void removeListener​(ItemStateListener listener)
        Remove an ItemStateListener
        Parameters:
        listener - an existing listener
      • hasNonVirtualItemState

        protected boolean hasNonVirtualItemState​(ItemId id)
        Checks if this item state manager has the given item state without considering the virtual item state managers.