Index: src/main/java/org/apache/jackrabbit/core/ItemManager.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/ItemManager.java (revision 800266) +++ src/main/java/org/apache/jackrabbit/core/ItemManager.java (working copy) @@ -125,13 +125,35 @@ // setup item cache with weak references to items itemCache = new ReferenceMap(ReferenceMap.HARD, ReferenceMap.WEAK); - itemStateProvider.addListener(this); // setup shareable nodes cache shareableNodesCache = new ShareableNodesCache(); } /** + * Creates a new per-session instance ItemManager instance. + * + * @param itemStateProvider the item state provider associated with + * the new instance + * @param hierMgr the hierarchy manager + * @param session the session associated with the new instance + * @param rootNodeDef the definition of the root node + * @param rootNodeId the id of the root node + * @return the item manager instance. + */ + public static ItemManager createInstance( + SessionItemStateManager itemStateProvider, + HierarchyManager hierMgr, + SessionImpl session, + NodeDefinition rootNodeDef, + NodeId rootNodeId) { + ItemManager mgr = new ItemManager(itemStateProvider, hierMgr, + session, rootNodeDef, rootNodeId); + itemStateProvider.addListener(mgr); + return mgr; + } + + /** * Disposes this ItemManager and frees resources. */ void dispose() { Index: src/main/java/org/apache/jackrabbit/core/SessionImpl.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/SessionImpl.java (revision 800266) +++ src/main/java/org/apache/jackrabbit/core/SessionImpl.java (working copy) @@ -307,7 +307,7 @@ * @return session item state manager */ protected SessionItemStateManager createSessionItemStateManager(LocalItemStateManager manager) { - return new SessionItemStateManager( + return SessionItemStateManager.createInstance( rep.getRootNodeId(), manager, rep.getNodeTypeRegistry()); } @@ -334,7 +334,7 @@ */ protected ItemManager createItemManager(SessionItemStateManager itemStateMgr, HierarchyManager hierMgr) { - return new ItemManager(itemStateMgr, hierMgr, this, + return ItemManager.createInstance(itemStateMgr, hierMgr, this, ntMgr.getRootNodeDefinition(), rep.getRootNodeId()); } Index: src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java (revision 800266) +++ src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java (working copy) @@ -93,14 +93,13 @@ * @param stateMgr the local item state manager * @param ntReg node type registry */ - public SessionItemStateManager(NodeId rootNodeId, + protected SessionItemStateManager(NodeId rootNodeId, LocalItemStateManager stateMgr, NodeTypeRegistry ntReg) { transientStore = new ItemStateMap(); atticStore = new ItemStateMap(); this.stateMgr = stateMgr; - stateMgr.addListener(this); // create hierarchy manager that uses both transient and persistent state hierMgr = new CachingHierarchyManager(rootNodeId, this); @@ -110,6 +109,24 @@ } /** + * Creates a new SessionItemStateManager instance. + * + * @param rootNodeId the root node id + * @param stateMgr the local item state manager + * @param ntReg node type registry + * @return the session item state manager. + */ + public static SessionItemStateManager createInstance( + NodeId rootNodeId, + LocalItemStateManager stateMgr, + NodeTypeRegistry ntReg) { + SessionItemStateManager mgr = new SessionItemStateManager( + rootNodeId, stateMgr, ntReg); + stateMgr.addListener(mgr); + return mgr; + } + + /** * Returns the hierarchy manager * * @return the hierarchy manager