org.apache.jackrabbit.core.version
Class VersionManagerImpl

java.lang.Object
  extended by org.apache.jackrabbit.core.version.VersionManagerImpl
All Implemented Interfaces:
UpdateEventListener, ItemStateListener, VersionManager

public class VersionManagerImpl
extends Object
implements ItemStateListener, UpdateEventListener

This Class implements a VersionManager.


Nested Class Summary
static class VersionManagerImpl.DynamicESCFactory
           
 
Field Summary
protected  NodeStateEx historyRoot
          Persistent root node of the version histories.
protected  NodeTypeRegistry ntReg
          Node type registry.
protected  LocalItemStateManager stateMgr
          State manager for the version storage.
 
Constructor Summary
VersionManagerImpl(PersistenceManager pMgr, FileSystem fs, NodeTypeRegistry ntReg, DelegatingObservationDispatcher obsMgr, NodeId rootId, NodeId rootParentId, ItemStateCacheFactory cacheFactory, ISMLocking ismLocking)
          Creates a new version manager
 
Method Summary
protected  ISMLocking.ReadLock acquireReadLock()
          acquires the read lock on this version manager.
protected  ISMLocking.WriteLock acquireWriteLock()
          Acquires the write lock on this version manager.
protected  String calculateCheckinVersionName(org.apache.jackrabbit.core.version.InternalVersionHistoryImpl history, NodeImpl node, boolean simple)
          Calculates the name of the new version that will be created by a checkin call.
protected  InternalVersion checkin(org.apache.jackrabbit.core.version.InternalVersionHistoryImpl history, NodeImpl node, boolean simple, Calendar cal)
          Checks in a node
 Version checkin(NodeImpl node, Calendar cal)
          invokes the checkin() on the persistent version manager and remaps the newly created version objects.
 void close()
          Close this version manager.
protected  InternalVersionItem createInternalVersionItem(NodeId id)
          Creates an InternalVersionItem based on the NodeState identified by id.
protected  VersionItemStateManager createItemStateManager(PersistenceManager pMgr, NodeId rootId, NodeTypeRegistry ntReg, ItemStateCacheFactory cacheFactory, ISMLocking ismLocking)
          Creates a VersionItemStateManager or derivative.
protected  VersionHistoryInfo createVersionHistory(Session session, NodeState node)
          Creates a new version history.
 void externalUpdate(ChangeLog changes, List events, long timestamp, String userData)
          Handle an external update.
 VersionManagerImpl.DynamicESCFactory getEscFactory()
          Returns the event state collection factory.
 InternalVersion getHeadVersionOfNode(NodeId id)
          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)
protected  InternalVersionItem getItem(NodeId id)
          Returns the item with the given persistent id.
protected  NodeStateEx getNodeStateEx(NodeId parentNodeId)
          Returns the node with the given persistent id.
 PersistenceManager getPersistenceManager()
          Return the persistence manager.
protected  SharedItemStateManager getSharedStateMgr()
          Return the shared item state manager.
 InternalVersion getVersion(NodeId id)
          Returns the version with the given id
 InternalVersionHistory getVersionHistory(NodeId id)
          Returns the version history with the given id
 VersionHistoryInfo getVersionHistory(Session session, NodeState node)
          Returns information about the version history of the specified node.
 InternalVersionHistory getVersionHistoryOfNode(NodeId id)
          Returns the version history for the versionable node with the given id.
 VirtualItemStateProvider getVirtualItemStateProvider()
          returns the virtual item state provider that exposes the internal versions as items.
 boolean hasItem(NodeId id)
          Return a flag indicating if the item specified exists.
protected  boolean hasItemReferences(NodeId id)
          Checks if there are item references (from outside the version storage) that reference the given node.
protected  void itemDiscarded(InternalVersionItem item)
          Invoked by the internal version item itself, when it's underlying persistence state was discarded.
 void itemsUpdated(Collection items)
          Invoked by some external source to indicate that some items in the versions tree were updated.
protected  void removeVersion(org.apache.jackrabbit.core.version.InternalVersionHistoryImpl history, Name name)
          Removes the specified version from the history
 void removeVersion(VersionHistory history, Name name)
          Removes the specified version from the given version history.
 void setEventChannel(UpdateEventChannel eventChannel)
          Set an event channel to inform about updates.
protected  InternalVersion setVersionLabel(org.apache.jackrabbit.core.version.InternalVersionHistoryImpl history, Name version, Name label, boolean move)
          Set version label on the specified version.
 Version setVersionLabel(VersionHistory history, Name version, Name label, boolean move)
          Sets the version label to the given version.
 void stateCreated(ItemState created)
          Called when an ItemState has successfully been created (i.e. its underlying persistent state was created).
 void stateDestroyed(ItemState destroyed)
          Called when an ItemState has successfully been removed (i.e. its underlying persistent state has been destroyed).
 void stateDiscarded(ItemState discarded)
          Called when an ItemState has been discarded (i.e. it has been rendered 'invalid').
 void stateModified(ItemState modified)
          Called when an ItemState has successfully been modified (i.e. its underlying persistent state has changed).
protected  void versionCreated(InternalVersion version)
          Invoked when a new internal item has been created.
protected  void versionDestroyed(InternalVersion version)
          Invoked when a new internal item has been destroyed.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

stateMgr

protected LocalItemStateManager stateMgr
State manager for the version storage.


ntReg

protected final NodeTypeRegistry ntReg
Node type registry.


historyRoot

protected NodeStateEx historyRoot
Persistent root node of the version histories.

Constructor Detail

VersionManagerImpl

public VersionManagerImpl(PersistenceManager pMgr,
                          FileSystem fs,
                          NodeTypeRegistry ntReg,
                          DelegatingObservationDispatcher obsMgr,
                          NodeId rootId,
                          NodeId rootParentId,
                          ItemStateCacheFactory cacheFactory,
                          ISMLocking ismLocking)
                   throws RepositoryException
Creates a new version manager

Throws:
RepositoryException
Method Detail

getVirtualItemStateProvider

public VirtualItemStateProvider getVirtualItemStateProvider()
returns the virtual item state provider that exposes the internal versions as items.

Specified by:
getVirtualItemStateProvider in interface VersionManager
Returns:
the virtual item state provider.

getPersistenceManager

public PersistenceManager getPersistenceManager()
Return the persistence manager.

Returns:
the persistence manager

close

public void close()
           throws Exception
Close this version manager. After having closed a persistence manager, further operations on this object are treated as illegal and throw

Specified by:
close in interface VersionManager
Throws:
Exception - if an error occurs

getEscFactory

public VersionManagerImpl.DynamicESCFactory getEscFactory()
Returns the event state collection factory.

Returns:
the event state collection factory.

createVersionHistory

protected VersionHistoryInfo createVersionHistory(Session session,
                                                  NodeState node)
                                           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.

node - NodeState
Returns:
identifier of the new version history node
Throws:
RepositoryException
See Also:
getVersionHistory(Session, NodeState)

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:
true if the item exists; false otherwise

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

checkin

public Version checkin(NodeImpl node,
                       Calendar cal)
                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:
checkin in interface VersionManager
Parameters:
node - node to checkin
cal - create time of the new version, or null
Returns:
the newly created version
Throws:
RepositoryException - if an error occurs

removeVersion

public void removeVersion(VersionHistory 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:
removeVersion in interface VersionManager
Parameters:
history - version history to remove the version from
name - name of the version
Throws:
RepositoryException - if an error occurs
VersionException

setVersionLabel

public Version setVersionLabel(VersionHistory history,
                               Name version,
                               Name label,
                               boolean move)
                        throws RepositoryException
Sets the version label to the given version. If the label is already assigned to another version, a VersionException is thrown unless move is true. If version is null, the label is removed from the respective version. In either case, the version the label was previously assigned is returned, or null of 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:
setVersionLabel in interface VersionManager
Parameters:
history - version history
version - name of the version
label - new label
move - if true label will be moved
Returns:
the version that had the label or null
Throws:
RepositoryException - if an error occurs

itemsUpdated

public void itemsUpdated(Collection 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.


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:
true if there are item references from outside the version storage; false otherwise.
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
Throws:
RepositoryException - if an error occurs while reading from the repository.

getSharedStateMgr

protected SharedItemStateManager getSharedStateMgr()
Return the shared item state manager.


createItemStateManager

protected VersionItemStateManager createItemStateManager(PersistenceManager pMgr,
                                                         NodeId rootId,
                                                         NodeTypeRegistry ntReg,
                                                         ItemStateCacheFactory cacheFactory,
                                                         ISMLocking ismLocking)
                                                  throws ItemStateException
Creates a VersionItemStateManager or derivative.

Parameters:
pMgr - persistence manager
rootId - root node id
ntReg - node type registry
cacheFactory - cache factory
ismLocking - the ISM locking implementation
Returns:
item state manager
Throws:
ItemStateException - if an error occurs

stateCreated

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

Not used.

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).

Not used.

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).

Remove item from cache on removal.

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').

Not used.

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

externalUpdate

public void externalUpdate(ChangeLog changes,
                           List events,
                           long timestamp,
                           String userData)
                    throws RepositoryException
Handle an external update.

Specified by:
externalUpdate in interface UpdateEventListener
Parameters:
changes - external changes containing only node and property ids.
events - events to deliver
timestamp - when the change occured.
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:
getVersion in interface VersionManager
Parameters:
id - id of the version to retrieve
Returns:
the version.
Throws:
RepositoryException - if an error occurs

getVersionHistory

public InternalVersionHistory getVersionHistory(NodeId id)
                                         throws RepositoryException
Returns the version history with the given id

Specified by:
getVersionHistory in interface VersionManager
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:
getVersionHistoryOfNode in interface VersionManager
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:
getHeadVersionOfNode in interface VersionManager
Parameters:
id - id of the node to retrieve the version for
Returns:
the version.
Throws:
RepositoryException - if an error occurs

acquireWriteLock

protected ISMLocking.WriteLock acquireWriteLock()
Acquires the write lock on this version manager.


acquireReadLock

protected ISMLocking.ReadLock acquireReadLock()
acquires the read lock on this version manager.


getVersionHistory

public VersionHistoryInfo getVersionHistory(Session session,
                                            NodeState node)
                                     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:
getVersionHistory in interface VersionManager
Parameters:
session - workspace session
node - node whose version history should be returned
Returns:
identifiers of the version history and root version nodes
Throws:
RepositoryException - if an error occurs

checkin

protected InternalVersion checkin(org.apache.jackrabbit.core.version.InternalVersionHistoryImpl history,
                                  NodeImpl node,
                                  boolean simple,
                                  Calendar cal)
                           throws RepositoryException
Checks in a node

Parameters:
history - the version history
node - node to checkin
simple - flag indicates simple versioning
cal - create time of the new version, or null
Returns:
internal version
Throws:
RepositoryException - if an error occurs
See Also:
Node.checkin()

calculateCheckinVersionName

protected String calculateCheckinVersionName(org.apache.jackrabbit.core.version.InternalVersionHistoryImpl history,
                                             NodeImpl 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:

removeVersion

protected void removeVersion(org.apache.jackrabbit.core.version.InternalVersionHistoryImpl history,
                             Name name)
                      throws VersionException,
                             RepositoryException
Removes 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 version history does not have a version with name.
RepositoryException - if any other error occurs.

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 history
version - version name
label - version label
move - true to move from existing version; false otherwise.
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
Creates an InternalVersionItem based on the NodeState identified by id.

Parameters:
id - the node id of the version item.
Returns:
the version item or null if there is no node state with the given id.
Throws:
RepositoryException - if an error occurs while reading from the version storage.


Copyright © 2004-2009 The Apache Software Foundation. All Rights Reserved.