Class InternalVersionManagerImpl
- java.lang.Object
-
- org.apache.jackrabbit.core.version.InternalVersionManagerImpl
-
- All Implemented Interfaces:
UpdateEventListener,ItemStateListener,InternalVersionManager
public class InternalVersionManagerImpl extends Object implements ItemStateListener, UpdateEventListener
This Class implements a VersionManager.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classInternalVersionManagerImpl.DynamicESCFactory
-
Field Summary
Fields Modifier and Type Field Description protected NodeIdactivitiesIdprotected NodeIdhistoriesIdprotected NodeTypeRegistryntRegNode type registry.protected LocalItemStateManagerstateMgrState manager for the version storage.
-
Constructor Summary
Constructors Constructor Description InternalVersionManagerImpl(PersistenceManager pMgr, FileSystem fs, NodeTypeRegistry ntReg, DelegatingObservationDispatcher obsMgr, NodeId systemId, NodeId historiesId, NodeId activitiesId, ItemStateCacheFactory cacheFactory, ISMLocking ismLocking, NodeIdFactory nodeIdFactory)Creates a new internal version manager
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description VersioningLock.ReadLockacquireReadLock()acquires the read lock on this version manager.protected VersioningLock.WriteLockacquireWriteLock()Acquires the write lock on this version manager.protected StringcalculateCheckinVersionName(org.apache.jackrabbit.core.version.InternalVersionHistoryImpl history, NodeStateEx node, boolean simple)Calculates the name of the new version that will be created by a checkin call.NodeIdcanCheckout(NodeStateEx state, NodeId activityId)invokes the checkout() on the persistent version manager.InternalVersioncheckin(Session session, NodeStateEx node, Calendar created)invokes the checkin() on the persistent version manager and remaps the newly created version objects.protected InternalVersioncheckin(NodeStateEx node, Calendar created)Creates a new version of the given node using the given version creation time.voidclose()Close this version manager.NodeIdcreateActivity(Session session, String title)Creates a new activityprotected InternalVersionItemcreateInternalVersionItem(NodeId id)protected VersionItemStateManagercreateItemStateManager(PersistenceManager pMgr, NodeId rootId, NodeTypeRegistry ntReg, ItemStateCacheFactory cacheFactory, ISMLocking ismLocking, NodeIdFactory nodeIdFactory)Creates aVersionItemStateManageror derivative.protected VersionHistoryInfocreateVersionHistory(Session session, NodeState node, NodeId copiedFrom)Creates a new version history.voidexternalUpdate(ChangeLog changes, List<EventState> events, long timestamp, String userData)Handle an external update.protected NodeStateExgetActivitiesRoot()returns the activities root nodeInternalActivitygetActivity(NodeId id)Returns the activity with the given idInternalBaselinegetBaseline(NodeId id)Returns the baseline with the given idInternalVersionManagerImpl.DynamicESCFactorygetEscFactory()Returns the event state collection factory.InternalVersiongetHeadVersionOfNode(NodeId id)Returns the head version of the node with the given id.protected NodeStateExgetHistoryRoot()returns the version history root nodeprotected InternalVersionItemgetItem(NodeId id)Returns the item with the given persistent id.protected static NamegetName(String name)Utility method that returns the given string as a name in the default namespace.NodeIdFactorygetNodeIdFactory()protected NodeStateExgetNodeStateEx(NodeId parentNodeId)Returns the node with the given persistent id.protected static NodeStateExgetParentNode(NodeStateEx parent, String uuid, Name interNT)Utility method that returns the parent node under which the version history of the identified versionable node is or will be stored.PersistenceManagergetPersistenceManager()Return the persistence manager.protected SharedItemStateManagergetSharedStateMgr()Returns the shared item state manager.InternalVersiongetVersion(NodeId id)Returns the version with the given idVersionHistoryInfogetVersionHistory(Session session, NodeState node, NodeId copiedFrom)Returns information about the version history of the specified node.InternalVersionHistorygetVersionHistory(NodeId id)Returns the version history with the given idVersionHistoryInfogetVersionHistoryInfoForNode(NodeState node)Returns information about the version history of the specified node ornullwhen unavailable.InternalVersionHistorygetVersionHistoryOfNode(NodeId id)Returns the version history for the versionable node with the given id.VirtualItemStateProvidergetVirtualItemStateProvider()returns the virtual item state provider that exposes the internal versions as items.booleanhasItem(NodeId id)Return a flag indicating if the item specified exists.protected booleanhasItemReferences(NodeId id)Checks if there are item references (from outside the version storage) that reference the given node.protected InternalVersioninternalCheckin(org.apache.jackrabbit.core.version.InternalVersionHistoryImpl history, NodeStateEx node, boolean simple, Calendar created)Checks in a nodeprotected voidinternalRemoveActivity(org.apache.jackrabbit.core.version.InternalActivityImpl activity)Removes the specified activityprotected voidinternalRemoveVersion(org.apache.jackrabbit.core.version.InternalVersionHistoryImpl history, Name name)Removes the specified version from the historyvoidinternalRemoveVersionHistory(org.apache.jackrabbit.core.version.InternalVersionHistoryImpl history)Removes the specified history from the storageprotected voiditemDiscarded(InternalVersionItem item)Invoked by the internal version item itself, when it's underlying persistence state was discarded.voiditemsUpdated(Collection<InternalVersionItem> items)Invoked by some external source to indicate that some items in the versions tree were updated.voidremoveActivity(Session session, NodeId nodeId)Removes an activity and allvoidremoveVersion(Session session, InternalVersionHistory history, Name name)Removes the specified version from the given version history.voidremoveVersionHistory(Session session, InternalVersionHistory history)Removes the specified version history from storage.voidsetEventChannel(UpdateEventChannel eventChannel)Set an event channel to inform about updates.InternalVersionsetVersionLabel(Session session, InternalVersionHistory history, Name version, Name label, boolean move)Sets the versionlabelto the givenversion.protected InternalVersionsetVersionLabel(org.apache.jackrabbit.core.version.InternalVersionHistoryImpl history, Name version, Name label, boolean move)Set version label on the specified version.voidstateCreated(ItemState created)Called when anItemStatehas successfully been created (i.e.voidstateDestroyed(ItemState destroyed)Called when anItemStatehas successfully been removed (i.e.voidstateDiscarded(ItemState discarded)Called when anItemStatehas been discarded (i.e.voidstateModified(ItemState modified)Called when anItemStatehas successfully been modified (i.e.protected voidversionCreated(InternalVersion version)Invoked when a new internal item has been created.protected voidversionDestroyed(InternalVersion version)Invoked when a new internal item has been destroyed.
-
-
-
Field Detail
-
stateMgr
protected LocalItemStateManager stateMgr
State manager for the version storage.
-
ntReg
protected final NodeTypeRegistry ntReg
Node type registry.
-
historiesId
protected final NodeId historiesId
-
activitiesId
protected final NodeId activitiesId
-
-
Constructor Detail
-
InternalVersionManagerImpl
public InternalVersionManagerImpl(PersistenceManager pMgr, FileSystem fs, NodeTypeRegistry ntReg, DelegatingObservationDispatcher obsMgr, NodeId systemId, NodeId historiesId, NodeId activitiesId, ItemStateCacheFactory cacheFactory, ISMLocking ismLocking, NodeIdFactory nodeIdFactory) throws RepositoryException
Creates a new internal version manager- Parameters:
pMgr- underlying persistence managerfs- workspace file systemntReg- node type registryobsMgr- observation managersystemId- node id of the version storage parent (i.e. jcr:system)historiesId- node id of the version storage (i.e. jcr:versionStorage)activitiesId- node id of the activities storage (i.e. jcr:activities)cacheFactory- item state cache factoryismLocking- workspace item state locking- Throws:
RepositoryException- if an error occurs
-
-
Method Detail
-
getVirtualItemStateProvider
public VirtualItemStateProvider getVirtualItemStateProvider()
returns the virtual item state provider that exposes the internal versions as items.- Specified by:
getVirtualItemStateProviderin interfaceInternalVersionManager- Returns:
- the virtual item state provider.
-
getPersistenceManager
public PersistenceManager getPersistenceManager()
Return the persistence manager.- Returns:
- the persistence manager
-
close
public void close() throws ExceptionClose this version manager. After having closed a persistence manager, further operations on this object are treated as illegal and throw- Specified by:
closein interfaceInternalVersionManager- Throws:
Exception- if an error occurs
-
getEscFactory
public InternalVersionManagerImpl.DynamicESCFactory getEscFactory()
Returns the event state collection factory.- Returns:
- the event state collection factory.
-
createVersionHistory
protected VersionHistoryInfo createVersionHistory(Session session, NodeState node, NodeId copiedFrom) throws RepositoryException
Creates a new version history. This action is needed either when creating a new 'mix:versionable' node or when adding the 'mix:versionable' mixin to a node.This method must not be synchronized since it could cause deadlocks with item-reading listeners in the observation thread.
- Parameters:
session- repository sessionnode- versionable node statecopiedFrom- node id for the jcr:copiedFrom property- Returns:
- identifier of the new version history node
- Throws:
RepositoryException- if an error occurs- See Also:
InternalVersionManager.getVersionHistory(Session, NodeState, NodeId)
-
createActivity
public NodeId createActivity(Session session, String title) throws RepositoryException
Creates a new activityThis method must not be synchronized since it could cause deadlocks with item-reading listeners in the observation thread.
- Specified by:
createActivityin interfaceInternalVersionManager- Parameters:
session- the current sessiontitle- title of the new activity- Returns:
- the nodeid of the new activity
- Throws:
RepositoryException- if an error occurs
-
removeActivity
public void removeActivity(Session session, NodeId nodeId) throws RepositoryException
Removes an activity and allThis method must not be synchronized since it could cause deadlocks with item-reading listeners in the observation thread.
- Specified by:
removeActivityin interfaceInternalVersionManager- Parameters:
session- the current sessionnodeId- id of the activity to remove- Throws:
RepositoryException- if an error occurs
-
hasItem
public boolean hasItem(NodeId id)
Return a flag indicating if the item specified exists. Subclass responsibility.- Parameters:
id- the id of the item- Returns:
trueif the item exists;falseotherwise
-
getItem
protected InternalVersionItem getItem(NodeId id) throws RepositoryException
Returns the item with the given persistent id. Subclass responsibility.Please note, that the overridden method must acquire the readlock before reading the state manager.
- Parameters:
id- the id of the item- Returns:
- version item
- Throws:
RepositoryException- if an error occurs
-
canCheckout
public NodeId canCheckout(NodeStateEx state, NodeId activityId) throws RepositoryException
invokes the checkout() on the persistent version manager. this method currently does no modifications to the persistence and just checks if the checkout is valid in respect to a possible activity set on the session- Specified by:
canCheckoutin interfaceInternalVersionManager- Parameters:
state- node to checkoutactivityId- node id if the current activity- Returns:
- the base version id
- Throws:
RepositoryException- if an error occurs
-
checkin
public InternalVersion checkin(Session session, NodeStateEx node, Calendar created) throws RepositoryException
invokes the checkin() on the persistent version manager and remaps the newly created version objects.This method must not be synchronized since it could cause deadlocks with item-reading listeners in the observation thread.
- Specified by:
checkinin interfaceInternalVersionManager- Parameters:
session- session that invokes the checkinnode- node to checkincreated- create time of the new version, ornullfor the current time- Returns:
- the newly created version
- Throws:
RepositoryException- if an error occurs
-
removeVersion
public void removeVersion(Session session, InternalVersionHistory history, Name name) throws VersionException, RepositoryException
Removes the specified version from the given version history.This method must not be synchronized since it could cause deadlocks with item-reading listeners in the observation thread.
- Specified by:
removeVersionin interfaceInternalVersionManager- Parameters:
session- the session that performs the removehistory- version history to remove the version fromname- name of the version- Throws:
RepositoryException- if an error occursVersionException
-
removeVersionHistory
public void removeVersionHistory(Session session, InternalVersionHistory history) throws RepositoryException
Removes the specified version history from storage.This method must not be synchronized since it could cause deadlocks with item-reading listeners in the observation thread.
- Specified by:
removeVersionHistoryin interfaceInternalVersionManager- Parameters:
session- the session that performs the removehistory- the version history to remove- Throws:
RepositoryException- if an error occurs
-
setVersionLabel
public InternalVersion setVersionLabel(Session session, InternalVersionHistory history, Name version, Name label, boolean move) throws RepositoryException
Sets the versionlabelto the givenversion. If the label is already assigned to another version, a VersionException is thrown unlessmoveistrue. Ifversionisnull, the label is removed from the respective version. In either case, the version the label was previously assigned is returned, ornullof the label was not moved.This method must not be synchronized since it could cause deadlocks with item-reading listeners in the observation thread.
- Specified by:
setVersionLabelin interfaceInternalVersionManager- Parameters:
session- the session that performs the operationhistory- version historyversion- name of the versionlabel- new labelmove- iftruelabel will be moved- Returns:
- the version that had the label or
null - Throws:
RepositoryException- if an error occurs
-
itemsUpdated
public void itemsUpdated(Collection<InternalVersionItem> items)
Invoked by some external source to indicate that some items in the versions tree were updated. Version histories are reloaded if possible. Matching items are removed from the cache.- Parameters:
items- items updated
-
setEventChannel
public void setEventChannel(UpdateEventChannel eventChannel)
Set an event channel to inform about updates.- Parameters:
eventChannel- event channel
-
itemDiscarded
protected void itemDiscarded(InternalVersionItem item)
Invoked by the internal version item itself, when it's underlying persistence state was discarded.- Parameters:
item- item that was discarded
-
hasItemReferences
protected boolean hasItemReferences(NodeId id) throws RepositoryException
Checks if there are item references (from outside the version storage) that reference the given node. Subclass responsibility.Please note, that the overridden method must acquire the readlock before reading the state manager.
- Parameters:
id- the id of the node- Returns:
trueif there are item references from outside the version storage;falseotherwise.- Throws:
RepositoryException- if an error occurs while reading from the repository.
-
getNodeStateEx
protected NodeStateEx getNodeStateEx(NodeId parentNodeId) throws RepositoryException
Returns the node with the given persistent id. Subclass responsibility.Please note, that the overridden method must acquire the readlock before reading the state manager.
- Parameters:
parentNodeId- the id of the node- Returns:
- the nodestate for the given id.
- Throws:
RepositoryException- if an error occurs while reading from the repository.
-
getHistoryRoot
protected NodeStateEx getHistoryRoot()
returns the version history root node- Returns:
- the version history root node
-
getActivitiesRoot
protected NodeStateEx getActivitiesRoot()
returns the activities root node- Returns:
- the activities root node
-
getSharedStateMgr
protected SharedItemStateManager getSharedStateMgr()
Returns the shared item state manager.- Returns:
- the shared item state manager.
-
createItemStateManager
protected VersionItemStateManager createItemStateManager(PersistenceManager pMgr, NodeId rootId, NodeTypeRegistry ntReg, ItemStateCacheFactory cacheFactory, ISMLocking ismLocking, NodeIdFactory nodeIdFactory) throws ItemStateException
Creates aVersionItemStateManageror derivative.- Parameters:
pMgr- persistence managerrootId- root node idntReg- node type registrycacheFactory- cache factoryismLocking- the ISM locking implementation- Returns:
- item state manager
- Throws:
ItemStateException- if an error occurs
-
stateCreated
public void stateCreated(ItemState created)
Called when anItemStatehas successfully been created (i.e. its underlying persistent state was created).Not used.
- Specified by:
stateCreatedin interfaceItemStateListener- Parameters:
created- theItemStatethat has been 'created'
-
stateModified
public void stateModified(ItemState modified)
Called when anItemStatehas successfully been modified (i.e. its underlying persistent state has changed).Not used.
- Specified by:
stateModifiedin interfaceItemStateListener- Parameters:
modified- theItemStatethat has been 'modified'
-
stateDestroyed
public void stateDestroyed(ItemState destroyed)
Called when anItemStatehas successfully been removed (i.e. its underlying persistent state has been destroyed).Remove item from cache on removal.
- Specified by:
stateDestroyedin interfaceItemStateListener- Parameters:
destroyed- theItemStatethat has been 'destroyed'
-
stateDiscarded
public void stateDiscarded(ItemState discarded)
Called when anItemStatehas been discarded (i.e. it has been rendered 'invalid').Not used.
- Specified by:
stateDiscardedin interfaceItemStateListener- Parameters:
discarded- theItemStatethat has been discarded- See Also:
ItemState.discard()
-
externalUpdate
public void externalUpdate(ChangeLog changes, List<EventState> events, long timestamp, String userData) throws RepositoryException
Handle an external update.- Specified by:
externalUpdatein interfaceUpdateEventListener- Parameters:
changes- external changes containing only node and property ids.events- events to delivertimestamp- when the change occurred.userData- the user data associated with this update.- Throws:
RepositoryException- if the update cannot be processed
-
getVersion
public InternalVersion getVersion(NodeId id) throws RepositoryException
Returns the version with the given id- Specified by:
getVersionin interfaceInternalVersionManager- Parameters:
id- id of the version to retrieve- Returns:
- the version or
null - Throws:
RepositoryException- if an error occurs
-
getBaseline
public InternalBaseline getBaseline(NodeId id) throws RepositoryException
Returns the baseline with the given id- Specified by:
getBaselinein interfaceInternalVersionManager- Parameters:
id- id of the baseline version to retrieve- Returns:
- the baseline or
nullif not found - Throws:
RepositoryException- if an error occurs
-
getActivity
public InternalActivity getActivity(NodeId id) throws RepositoryException
Returns the activity with the given id- Specified by:
getActivityin interfaceInternalVersionManager- Parameters:
id- id of the activity to retrieve- Returns:
- the activity.
- Throws:
RepositoryException- if an error occurs
-
getVersionHistory
public InternalVersionHistory getVersionHistory(NodeId id) throws RepositoryException
Returns the version history with the given id- Specified by:
getVersionHistoryin interfaceInternalVersionManager- Parameters:
id- id of the version history- Returns:
- the version history.
- Throws:
RepositoryException- if an error occurs
-
getVersionHistoryOfNode
public InternalVersionHistory getVersionHistoryOfNode(NodeId id) throws RepositoryException
Returns the version history for the versionable node with the given id.- Specified by:
getVersionHistoryOfNodein interfaceInternalVersionManager- Parameters:
id- id of the node to retrieve the version history for- Returns:
- the version history
- Throws:
RepositoryException- if an error occurs or the history does not exit
-
getHeadVersionOfNode
public InternalVersion getHeadVersionOfNode(NodeId id) throws RepositoryException
Returns the head version of the node with the given id. this is always the last of all versions. this only works correctly for liner version graphs (i.e. simple versioning) Assumes that all versions are stored chronologically below the version history and just returns the last one. i.e. currently only works for simple versioning.- Specified by:
getHeadVersionOfNodein interfaceInternalVersionManager- Parameters:
id- id of the node to retrieve the version for- Returns:
- the version.
- Throws:
RepositoryException- if an error occurs
-
acquireWriteLock
protected VersioningLock.WriteLock acquireWriteLock()
Acquires the write lock on this version manager.- Returns:
- returns the write lock
-
acquireReadLock
public VersioningLock.ReadLock acquireReadLock()
acquires the read lock on this version manager.- Returns:
- returns the read lock
-
getVersionHistoryInfoForNode
public VersionHistoryInfo getVersionHistoryInfoForNode(NodeState node) throws RepositoryException
Returns information about the version history of the specified node ornullwhen unavailable.- Parameters:
node- node whose version history should be returned- Returns:
- identifiers of the version history and root version nodes
- Throws:
RepositoryException- if an error occurs
-
getVersionHistory
public VersionHistoryInfo getVersionHistory(Session session, NodeState node, NodeId copiedFrom) throws RepositoryException
Returns information about the version history of the specified node. If the given node does not already have an associated version history, then an empty history is automatically created. This method should only be called by code that already knows that the specified node is versionable.- Specified by:
getVersionHistoryin interfaceInternalVersionManager- Parameters:
session- workspace sessionnode- node whose version history should be returnedcopiedFrom- the node id for the jcr:copiedFrom property use for copied nodes- Returns:
- identifiers of the version history and root version nodes
- Throws:
RepositoryException- if an error occurs
-
internalRemoveActivity
protected void internalRemoveActivity(org.apache.jackrabbit.core.version.InternalActivityImpl activity) throws RepositoryExceptionRemoves the specified activity- Parameters:
activity- the activity to remove- Throws:
RepositoryException- if any other error occurs.
-
getName
protected static Name getName(String name)
Utility method that returns the given string as a name in the default namespace.- Parameters:
name- string name- Returns:
- A
Nameobject.
-
getParentNode
protected static NodeStateEx getParentNode(NodeStateEx parent, String uuid, Name interNT) throws RepositoryException
Utility method that returns the parent node under which the version history of the identified versionable node is or will be stored. If theinterNTis notnullthen the returned parent node and any ancestor nodes are automatically created if they do not already exist. Otherwisenullis returned if the parent node does not exist.- Parameters:
parent- the parent nodeuuid- UUID of a versionable nodeinterNT- intermediate nodetype.- Returns:
- parent node of the version history, or
null - Throws:
RepositoryException- if an error occurs
-
checkin
protected InternalVersion checkin(NodeStateEx node, Calendar created) throws RepositoryException
Creates a new version of the given node using the given version creation time.- Parameters:
node- the node to be checked increated- version creation time- Returns:
- the new version
- Throws:
RepositoryException- if an error occurs
-
internalCheckin
protected InternalVersion internalCheckin(org.apache.jackrabbit.core.version.InternalVersionHistoryImpl history, NodeStateEx node, boolean simple, Calendar created) throws RepositoryException
Checks in a node- Parameters:
history- the version historynode- node to checkinsimple- flag indicates simple versioningcreated- optional created date.- Returns:
- internal version
- Throws:
RepositoryException- if an error occurs- See Also:
Node.checkin()
-
calculateCheckinVersionName
protected String calculateCheckinVersionName(org.apache.jackrabbit.core.version.InternalVersionHistoryImpl history, NodeStateEx node, boolean simple) throws RepositoryException
Calculates the name of the new version that will be created by a checkin call. The name is determined as follows:- first the predecessor version with the shortest name is searched.
- if that predecessor version is the root version, the new version gets the name "{number of successors}+1" + ".0"
- if that predecessor version has no successor, the last digit of it's version number is incremented.
- if that predecessor version has successors but the incremented name does not exist, that name is used.
- otherwise a ".0" is added to the name until a non conflicting name is found.
jcr:rootVersion | | 1.0 2.0 | 1.1 | 1.2 ---\ ------\ | \ \ 1.3 1.2.0 1.2.0.0 | | 1.4 1.2.1 ----\ | | \ 1.5 1.2.2 1.2.1.0 | | | 1.6 | 1.2.1.1 |-----/ 1.7
- Parameters:
history- the version historynode- the node to checkinsimple- iftrueindicates simple versioning- Returns:
- the new version name
- Throws:
RepositoryException- if an error occurs.
-
internalRemoveVersion
protected void internalRemoveVersion(org.apache.jackrabbit.core.version.InternalVersionHistoryImpl history, Name name) throws VersionException, RepositoryExceptionRemoves the specified version from the history- Parameters:
history- the version history from where to remove the version.name- the name of the version to remove.- Throws:
VersionException- if the versionhistorydoes not have a version withname.RepositoryException- if any other error occurs.
-
internalRemoveVersionHistory
public void internalRemoveVersionHistory(org.apache.jackrabbit.core.version.InternalVersionHistoryImpl history) throws VersionException, RepositoryExceptionRemoves the specified history from the storage- Parameters:
history- the version history to remove- Throws:
VersionExceptionRepositoryException
-
setVersionLabel
protected InternalVersion setVersionLabel(org.apache.jackrabbit.core.version.InternalVersionHistoryImpl history, Name version, Name label, boolean move) throws RepositoryException
Set version label on the specified version.- Parameters:
history- version historyversion- version namelabel- version labelmove-trueto move from existing version;falseotherwise.- Returns:
- The internal version.
- Throws:
RepositoryException- if an error occurs
-
versionCreated
protected void versionCreated(InternalVersion version)
Invoked when a new internal item has been created.- Parameters:
version- internal version item
-
versionDestroyed
protected void versionDestroyed(InternalVersion version)
Invoked when a new internal item has been destroyed.- Parameters:
version- internal version item
-
createInternalVersionItem
protected InternalVersionItem createInternalVersionItem(NodeId id) throws RepositoryException
- Parameters:
id- the node id of the version item.- Returns:
- the version item or
nullif there is no node state with the givenid. - Throws:
RepositoryException- if an error occurs while reading from the version storage.
-
getNodeIdFactory
public NodeIdFactory getNodeIdFactory()
-
-