You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2010/06/23 16:49:05 UTC

svn commit: r957229 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core: ./ session/ xml/

Author: jukka
Date: Wed Jun 23 14:49:04 2010
New Revision: 957229

URL: http://svn.apache.org/viewvc?rev=957229&view=rev
Log:
JCR-890: concurrent read-only access to a session

Leverage SessionContext in more places.

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemSaveOperation.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemValidator.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/WorkspaceImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/XASessionImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/XAWorkspace.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionContext.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/WorkspaceImporter.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java?rev=957229&r1=957228&r2=957229&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/BatchedItemOperations.java Wed Jun 23 14:49:04 2010
@@ -37,12 +37,11 @@ import javax.jcr.version.VersionExceptio
 import org.apache.jackrabbit.core.id.ItemId;
 import org.apache.jackrabbit.core.id.NodeId;
 import org.apache.jackrabbit.core.id.PropertyId;
-import org.apache.jackrabbit.core.lock.LockManager;
 import org.apache.jackrabbit.core.nodetype.EffectiveNodeType;
 import org.apache.jackrabbit.core.nodetype.NodeTypeConflictException;
-import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
 import org.apache.jackrabbit.core.security.AccessManager;
 import org.apache.jackrabbit.core.security.authorization.Permission;
+import org.apache.jackrabbit.core.session.SessionContext;
 import org.apache.jackrabbit.core.state.ChildNodeEntry;
 import org.apache.jackrabbit.core.state.ItemState;
 import org.apache.jackrabbit.core.state.ItemStateException;
@@ -100,15 +99,12 @@ public class BatchedItemOperations exten
      * @param hierMgr    hierarchy manager
      * @throws RepositoryException
      */
-    public BatchedItemOperations(UpdatableItemStateManager stateMgr,
-                                 NodeTypeRegistry ntReg,
-                                 LockManager lockMgr,
-                                 SessionImpl session,
-                                 HierarchyManager hierMgr) throws RepositoryException {
-        super(ntReg, hierMgr, session, lockMgr, session.getAccessManager(),
-                session.getRetentionRegistry(), session.getItemManager());
+    public BatchedItemOperations(
+            UpdatableItemStateManager stateMgr, SessionContext sessionContext)
+            throws RepositoryException {
+        super(sessionContext);
         this.stateMgr = stateMgr;
-        this.session = session;
+        this.session = sessionContext.getSessionImpl();
     }
 
     //-----------------------------------------< controlling batch operations >
@@ -326,19 +322,13 @@ public class BatchedItemOperations exten
      *                 <li><code>CLONE_REMOVE_EXISTING</code></li>
      *                 </ul>
      * @return the id of the node at its new position
-     * @throws ConstraintViolationException
-     * @throws AccessDeniedException
-     * @throws VersionException
-     * @throws PathNotFoundException
-     * @throws ItemExistsException
-     * @throws LockException
-     * @throws RepositoryException
+     * @throws RepositoryException if the copy operation fails
      */
     public NodeId copy(Path srcPath, Path destPath, int flag)
-            throws ConstraintViolationException, AccessDeniedException,
-            VersionException, PathNotFoundException, ItemExistsException,
-            LockException, RepositoryException {
-        return copy(srcPath, stateMgr, hierMgr, session.getAccessManager(), destPath, flag);
+            throws RepositoryException {
+        return copy(
+                srcPath, stateMgr, hierMgr, sessionContext.getAccessManager(),
+                destPath, flag);
     }
 
     /**
@@ -693,6 +683,7 @@ public class BatchedItemOperations exten
         // 3. access rights
 
         if ((options & CHECK_ACCESS) == CHECK_ACCESS) {
+            AccessManager accessMgr = sessionContext.getAccessManager();
             // make sure current session is granted read access on parent node
             if (!accessMgr.isGranted(parentPath, Permission.READ)) {
                 throw new ItemNotFoundException(safeGetJCRPath(parentState.getNodeId()));
@@ -713,7 +704,8 @@ public class BatchedItemOperations exten
         // 4. node type constraints
 
         if ((options & CHECK_CONSTRAINTS) == CHECK_CONSTRAINTS) {
-            QItemDefinition parentDef = itemMgr.getDefinition(parentState).unwrap();
+            QItemDefinition parentDef =
+                sessionContext.getItemManager().getDefinition(parentState).unwrap();
             // make sure parent node is not protected
             if (parentDef.isProtected()) {
                 throw new ConstraintViolationException(
@@ -744,7 +736,8 @@ public class BatchedItemOperations exten
                     log.debug(msg);
                     throw new RepositoryException(msg, ise);
                 }
-                QNodeDefinition conflictingTargetDef = itemMgr.getDefinition(conflictingState).unwrap();
+                QNodeDefinition conflictingTargetDef =
+                    sessionContext.getItemManager().getDefinition(conflictingState).unwrap();
                 // check same-name sibling setting of both target and existing node
                 if (!conflictingTargetDef.allowsSameNameSiblings()
                         || !newNodeDef.allowsSameNameSiblings()) {
@@ -867,6 +860,7 @@ public class BatchedItemOperations exten
 
         if ((options & CHECK_ACCESS) == CHECK_ACCESS) {
             try {
+                AccessManager accessMgr = sessionContext.getAccessManager();
                 // make sure current session is granted read access on parent node
                 if (!accessMgr.isGranted(targetPath, Permission.READ)) {
                     throw new PathNotFoundException(safeGetJCRPath(targetPath));
@@ -887,12 +881,14 @@ public class BatchedItemOperations exten
         // 4. node type constraints
 
         if ((options & CHECK_CONSTRAINTS) == CHECK_CONSTRAINTS) {
-            QItemDefinition parentDef = itemMgr.getDefinition(parentState).unwrap();
+            QItemDefinition parentDef =
+                sessionContext.getItemManager().getDefinition(parentState).unwrap();
             if (parentDef.isProtected()) {
                 throw new ConstraintViolationException(safeGetJCRPath(parentId)
                         + ": cannot remove child node of protected parent node");
             }
-            QItemDefinition targetDef = itemMgr.getDefinition(targetState).unwrap();
+            QItemDefinition targetDef =
+                sessionContext.getItemManager().getDefinition(targetState).unwrap();
             if (targetDef.isMandatory()) {
                 throw new ConstraintViolationException(safeGetJCRPath(targetPath)
                         + ": cannot remove mandatory node");
@@ -974,6 +970,7 @@ public class BatchedItemOperations exten
 
         // access rights
         // make sure current session is granted read access on node
+        AccessManager accessMgr = sessionContext.getAccessManager();
         if (!accessMgr.isGranted(nodePath, Permission.READ)) {
             throw new PathNotFoundException(safeGetJCRPath(node.getNodeId()));
         }
@@ -1019,6 +1016,7 @@ public class BatchedItemOperations exten
             throws PathNotFoundException, RepositoryException {
         // access rights
         // make sure current session is granted read access on node
+        AccessManager accessMgr = sessionContext.getAccessManager();
         if (!accessMgr.isGranted(nodePath, Permission.READ)) {
             throw new PathNotFoundException(safeGetJCRPath(nodePath));
         }
@@ -1427,7 +1425,7 @@ public class BatchedItemOperations exten
             throws PathNotFoundException, ConstraintViolationException,
             RepositoryException {
         NodeState node = getNodeState(nodePath);
-        if (itemMgr.getDefinition(node).isProtected()) {
+        if (sessionContext.getItemManager().getDefinition(node).isProtected()) {
             throw new ConstraintViolationException(safeGetJCRPath(nodePath)
                     + ": node is protected");
         }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java?rev=957229&r1=957228&r2=957229&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java Wed Jun 23 14:49:04 2010
@@ -181,7 +181,7 @@ public abstract class ItemImpl implement
      * @return the primary path to this <code>Item</code>
      */
     public Path getPrimaryPath() throws RepositoryException {
-        return session.getHierarchyManager().getPath(id);
+        return sessionContext.getHierarchyManager().getPath(id);
     }
 
     /**
@@ -383,7 +383,7 @@ public abstract class ItemImpl implement
             // shortcut
             return 0;
         }
-        return session.getHierarchyManager().getDepth(id);
+        return sessionContext.getHierarchyManager().getDepth(id);
     }
 
     /**

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java?rev=957229&r1=957228&r2=957229&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java Wed Jun 23 14:49:04 2010
@@ -414,12 +414,12 @@ public class ItemManager implements Dump
                 need use the path to evaluate the effective permissions.
                 */
                 return (path == null) ?
-                        session.getAccessManager().isGranted(data.getId(), AccessManager.READ) :
-                        session.getAccessManager().isGranted(path, Permission.READ);
+                        sessionContext.getAccessManager().isGranted(data.getId(), AccessManager.READ) :
+                        sessionContext.getAccessManager().isGranted(path, Permission.READ);
             }
         } else {
             /* item is not NEW -> save to call acMgr.canRead(Path,ItemId) */
-            return session.getAccessManager().canRead(path, data.getId());
+            return sessionContext.getAccessManager().canRead(path, data.getId());
         }
     }
 
@@ -432,16 +432,12 @@ public class ItemManager implements Dump
      */
     private boolean canRead(ItemData parent, ItemId childId) throws RepositoryException {
         if (parent.getStatus() == ItemState.STATUS_EXISTING) {
-            /*
-             child item is for sure not NEW (because then the parent was modified).
-             safe to use AccessManager#canRead(Path, ItemId).
-             */
-            return session.getAccessManager().canRead(null, childId);
+            // child item is for sure not NEW (because then the parent was modified).
+            // safe to use AccessManager#canRead(Path, ItemId).
+            return sessionContext.getAccessManager().canRead(null, childId);
         } else {
-            /*
-             child could be NEW -> don't use AccessManager#canRead(Path, ItemId)
-             */
-            return session.getAccessManager().isGranted(childId, AccessManager.READ);
+            // child could be NEW -> don't use AccessManager#canRead(Path, ItemId)
+            return sessionContext.getAccessManager().isGranted(childId, AccessManager.READ);
         }
     }
 

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemSaveOperation.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemSaveOperation.java?rev=957229&r1=957228&r2=957229&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemSaveOperation.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemSaveOperation.java Wed Jun 23 14:49:04 2010
@@ -442,7 +442,7 @@ class ItemSaveOperation extends SessionO
         ItemManager itemMgr = context.getItemManager();
         SessionItemStateManager stateMgr = context.getItemStateManager();
 
-        AccessManager accessMgr = session.getAccessManager();
+        AccessManager accessMgr = context.getAccessManager();
         NodeTypeManagerImpl ntMgr = session.getNodeTypeManager();
         // walk through list of dirty transient items and validate each
         for (ItemState itemState : dirty) {

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemValidator.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemValidator.java?rev=957229&r1=957228&r2=957229&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemValidator.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemValidator.java Wed Jun 23 14:49:04 2010
@@ -34,8 +34,8 @@ import org.apache.jackrabbit.core.nodety
 import org.apache.jackrabbit.core.nodetype.NodeTypeConflictException;
 import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
 import org.apache.jackrabbit.core.retention.RetentionRegistry;
-import org.apache.jackrabbit.core.security.AccessManager;
 import org.apache.jackrabbit.core.security.authorization.Permission;
+import org.apache.jackrabbit.core.session.SessionContext;
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.state.PropertyState;
 import org.apache.jackrabbit.core.value.InternalValue;
@@ -105,6 +105,11 @@ public class ItemValidator {
     private static Logger log = LoggerFactory.getLogger(ItemValidator.class);
 
     /**
+     * Component context of the associated session.
+     */
+    protected final SessionContext sessionContext;
+
+    /**
      * node type registry
      */
     protected final NodeTypeRegistry ntReg;
@@ -127,52 +132,20 @@ public class ItemValidator {
      */
     protected final LockManager lockMgr;
 
-    protected final AccessManager accessMgr;
-
     protected final RetentionRegistry retentionReg;
 
-    protected final ItemManager itemMgr;
-
     /**
      * Creates a new <code>ItemValidator</code> instance.
      *
-     * @param ntReg      node type registry
-     * @param hierMgr    hierarchy manager
-     * @param session    session
-     */
-    public ItemValidator(NodeTypeRegistry ntReg,
-                         HierarchyManager hierMgr,
-                         SessionImpl session) throws RepositoryException {
-        this(ntReg, hierMgr, session, session.getLockManager(),
-                session.getAccessManager(), session.getRetentionRegistry(),
-                session.getItemManager());
-    }
-
-    /**
-     * Creates a new <code>ItemValidator</code> instance.
-     *
-     * @param ntReg      node type registry
-     * @param hierMgr    hierarchy manager
-     * @param resolver   resolver
-     * @param lockMgr    lockMgr
-     * @param accessMgr  accessMgr
-     * @param retentionReg
-     * @param itemMgr    the item manager
-     */
-    public ItemValidator(NodeTypeRegistry ntReg,
-                         HierarchyManager hierMgr,
-                         PathResolver resolver,
-                         LockManager lockMgr,
-                         AccessManager accessMgr,
-                         RetentionRegistry retentionReg,
-                         ItemManager itemMgr) {
-        this.ntReg = ntReg;
-        this.hierMgr = hierMgr;
-        this.resolver = resolver;
-        this.lockMgr = lockMgr;
-        this.accessMgr = accessMgr;
-        this.retentionReg = retentionReg;
-        this.itemMgr = itemMgr;
+     * @param sessionContext component context of this session
+     */
+    public ItemValidator(SessionContext sessionContext) throws RepositoryException {
+        this.sessionContext = sessionContext;
+        this.ntReg = sessionContext.getRepositoryContext().getNodeTypeRegistry();
+        this.hierMgr = sessionContext.getHierarchyManager();
+        this.resolver = sessionContext.getSessionImpl();
+        this.lockMgr = sessionContext.getSessionImpl().getLockManager();
+        this.retentionReg = sessionContext.getSessionImpl().getRetentionRegistry();
     }
 
     /**
@@ -198,7 +171,8 @@ public class ItemValidator {
                 ntReg.getEffectiveNodeType(nodeState.getNodeTypeName());
         // effective node type (primary type incl. mixins)
         EffectiveNodeType entPrimaryAndMixins = getEffectiveNodeType(nodeState);
-        QNodeDefinition def = itemMgr.getDefinition(nodeState).unwrap();
+        QNodeDefinition def =
+            sessionContext.getItemManager().getDefinition(nodeState).unwrap();
 
         // check if primary type satisfies the 'required node types' constraint
         for (Name requiredPrimaryType : def.getRequiredPrimaryTypes()) {
@@ -249,7 +223,8 @@ public class ItemValidator {
      */
     public void validate(PropertyState propState)
             throws ConstraintViolationException, RepositoryException {
-        QPropertyDefinition def = itemMgr.getDefinition(propState).unwrap();
+        QPropertyDefinition def =
+            sessionContext.getItemManager().getDefinition(propState).unwrap();
         InternalValue[] values = propState.getValues();
         int type = PropertyType.UNDEFINED;
         for (InternalValue value : values) {
@@ -312,7 +287,7 @@ public class ItemValidator {
 
         if (permissions > Permission.NONE) {
             Path path = item.getPrimaryPath();
-            accessMgr.checkPermission(path, permissions);
+            sessionContext.getAccessManager().checkPermission(path, permissions);
         }
         if ((options & CHECK_HOLD) == CHECK_HOLD) {
             if (hasHold(item, isRemoval)) {
@@ -361,7 +336,7 @@ public class ItemValidator {
         }
         if (permissions > Permission.NONE) {
             Path path = item.getPrimaryPath();
-            if (!accessMgr.isGranted(path, permissions)) {
+            if (!sessionContext.getAccessManager().isGranted(path, permissions)) {
                 return false;
             }
         }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java?rev=957229&r1=957228&r2=957229&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java Wed Jun 23 14:49:04 2010
@@ -207,7 +207,7 @@ public class NodeImpl extends ItemImpl i
              */
             Path p = PathFactoryImpl.getInstance().create(
                     getPrimaryPath(), session.getQPath(relPath), true);
-            return session.getHierarchyManager().resolvePropertyPath(p);
+            return sessionContext.getHierarchyManager().resolvePropertyPath(p);
         } catch (NameException e) {
             String msg = "failed to resolve path " + relPath + " relative to " + this;
             log.debug(msg);
@@ -289,7 +289,7 @@ public class NodeImpl extends ItemImpl i
          * build and resolve absolute path
          */
         p = PathFactoryImpl.getInstance().create(getPrimaryPath(), p, true);
-        return session.getHierarchyManager().resolveNodePath(p);
+        return sessionContext.getHierarchyManager().resolveNodePath(p);
     }
 
     /**
@@ -1495,7 +1495,7 @@ public class NodeImpl extends ItemImpl i
             } else {
                 // adding a node with explicit specifying the node type name
                 // requires the editing session to have nt_management privilege.
-                session.getAccessManager().checkPermission(
+                sessionContext.getAccessManager().checkPermission(
                         nodePath, Permission.NODE_TYPE_MNGMT);
             }
         }
@@ -1622,7 +1622,7 @@ public class NodeImpl extends ItemImpl i
      * @see ItemImpl#getQName()
      */
     public Name getQName() throws RepositoryException {
-        HierarchyManager hierMgr = session.getHierarchyManager();
+        HierarchyManager hierMgr = sessionContext.getHierarchyManager();
         Name name;
 
         if (!isShareable()) {
@@ -1717,7 +1717,7 @@ public class NodeImpl extends ItemImpl i
         i.e. treating reorder similar to a move.
         TODO: properly deal with sns in which case the index would change upon reorder.
         */
-        AccessManager acMgr = session.getAccessManager();
+        AccessManager acMgr = sessionContext.getAccessManager();
         PathBuilder pb = new PathBuilder(getPrimaryPath());
         pb.addLast(srcName.getName(), srcName.getIndex());
         Path childPath = pb.getPath();
@@ -1953,9 +1953,8 @@ public class NodeImpl extends ItemImpl i
             return "";
         }
 
-        HierarchyManager hierMgr = session.getHierarchyManager();
         Name name;
-
+        HierarchyManager hierMgr = sessionContext.getHierarchyManager();
         if (!isShareable()) {
             name = hierMgr.getName(id);
         } else {
@@ -3059,7 +3058,7 @@ public class NodeImpl extends ItemImpl i
 
         // detect share cycle
         NodeId srcId = getNodeId();
-        HierarchyManager hierMgr = session.getHierarchyManager();
+        HierarchyManager hierMgr = sessionContext.getHierarchyManager();
         if (parentId.equals(srcId) || hierMgr.isAncestor(srcId, parentId)) {
             String msg = "This would create a share cycle.";
             log.debug(msg);

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java?rev=957229&r1=957228&r2=957229&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java Wed Jun 23 14:49:04 2010
@@ -161,11 +161,6 @@ public class SessionImpl extends Abstrac
     protected final NodeTypeManagerImpl ntMgr;
 
     /**
-     * the AccessManager associated with this session
-     */
-    protected AccessManager accessMgr;
-
-    /**
      * the Workspace associated with this session
      */
     protected final WorkspaceImpl wsp;
@@ -270,7 +265,7 @@ public class SessionImpl extends Abstrac
         wsp = createWorkspaceInstance(wspConfig);
         context.setItemStateManager(createSessionItemStateManager());
         context.setItemManager(createItemManager());
-        accessMgr = createAccessManager(subject);
+        context.setAccessManager(createAccessManager(subject));
         versionMgr = createVersionManager();
         ntInstanceHandler = new NodeTypeInstanceHandler(userId);
     }
@@ -309,7 +304,7 @@ public class SessionImpl extends Abstrac
      */
     protected WorkspaceImpl createWorkspaceInstance(WorkspaceConfig wspConfig)
             throws RepositoryException {
-        return new WorkspaceImpl(wspConfig, repositoryContext, this);
+        return new WorkspaceImpl(wspConfig, context);
     }
 
     /**
@@ -378,9 +373,7 @@ public class SessionImpl extends Abstrac
      */
     public synchronized ItemValidator getValidator() throws RepositoryException {
         if (validator == null) {
-            validator = new ItemValidator(
-                    repositoryContext.getNodeTypeRegistry(),
-                    getHierarchyManager(), this);
+            validator = new ItemValidator(context);
         }
         return validator;
     }
@@ -427,7 +420,7 @@ public class SessionImpl extends Abstrac
      * @return the <code>AccessManager</code> associated with this session
      */
     public AccessManager getAccessManager() {
-        return accessMgr;
+        return context.getAccessManager();
     }
 
     /**
@@ -535,7 +528,7 @@ public class SessionImpl extends Abstrac
         List<String> names = new ArrayList<String>();
         for (String name : repositoryContext.getWorkspaceManager().getWorkspaceNames()) {
             try {
-                if (getAccessManager().canAccess(name)) {
+                if (context.getAccessManager().canAccess(name)) {
                     names.add(name);
                 }
             } catch (NoSuchWorkspaceException e) {
@@ -698,7 +691,7 @@ public class SessionImpl extends Abstrac
      */
     public Path getPath(String identifier) throws MalformedPathException {
         try {
-            return getHierarchyManager().getPath(NodeId.valueOf(identifier));
+            return context.getHierarchyManager().getPath(NodeId.valueOf(identifier));
         } catch (RepositoryException e) {
             throw new MalformedPathException("Identifier '" + identifier + "' cannot be resolved.");
         }
@@ -1031,7 +1024,7 @@ public class SessionImpl extends Abstrac
         }
 
         // check permissions
-        AccessManager acMgr = getAccessManager();
+        AccessManager acMgr = context.getAccessManager();
         if (!(acMgr.isGranted(srcPath, Permission.REMOVE_NODE) &&
                 acMgr.isGranted(destPath, Permission.ADD_NODE | Permission.NODE_TYPE_MNGMT))) {
             String msg = "Not allowed to move node " + srcAbsPath + " to " + destAbsPath;
@@ -1179,7 +1172,7 @@ public class SessionImpl extends Abstrac
         }
 
         try {
-            accessMgr.close();
+            context.getAccessManager().close();
         } catch (Exception e) {
             log.warn("error while closing AccessManager", e);
         }
@@ -1479,7 +1472,7 @@ public class SessionImpl extends Abstrac
             throw new IllegalArgumentException("Unknown actions: " + s);
         }
         try {
-            return getAccessManager().isGranted(path, permissions);
+            return context.getAccessManager().isGranted(path, permissions);
         } catch (AccessDeniedException e) {
             return false;
         }
@@ -1557,10 +1550,12 @@ public class SessionImpl extends Abstrac
      */
     public AccessControlManager getAccessControlManager()
             throws UnsupportedRepositoryOperationException, RepositoryException {
+        AccessManager accessMgr = context.getAccessManager();
         if (accessMgr instanceof AccessControlManager) {
             return (AccessControlManager) accessMgr;
         } else {
-            throw new UnsupportedRepositoryOperationException("Access control discovery is not supported.");
+            throw new UnsupportedRepositoryOperationException(
+                    "Access control discovery is not supported.");
         }
     }
 

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/WorkspaceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/WorkspaceImpl.java?rev=957229&r1=957228&r2=957229&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/WorkspaceImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/WorkspaceImpl.java Wed Jun 23 14:49:04 2010
@@ -48,6 +48,7 @@ import org.apache.jackrabbit.core.observ
 import org.apache.jackrabbit.core.observation.ObservationManagerImpl;
 import org.apache.jackrabbit.core.query.QueryManagerImpl;
 import org.apache.jackrabbit.core.retention.RetentionRegistry;
+import org.apache.jackrabbit.core.session.SessionContext;
 import org.apache.jackrabbit.core.state.LocalItemStateManager;
 import org.apache.jackrabbit.core.state.SharedItemStateManager;
 import org.apache.jackrabbit.core.xml.ImportHandler;
@@ -80,6 +81,11 @@ public class WorkspaceImpl extends Abstr
     protected final RepositoryContext repositoryContext;
 
     /**
+     * The component context of this session.
+     */
+    protected final SessionContext sessionContext;
+
+    /**
      * The persistent state mgr associated with the workspace represented by <i>this</i>
      * <code>Workspace</code> instance.
      */
@@ -133,20 +139,19 @@ public class WorkspaceImpl extends Abstr
      * Protected constructor.
      *
      * @param wspConfig The workspace configuration
-     * @param stateMgr  The shared item state manager
-     * @param rep       The repository
-     * @param session   The session
+     * @param sessionContext component context of this session
      */
     protected WorkspaceImpl(
-            WorkspaceConfig wspConfig, RepositoryContext repositoryContext,
-            SessionImpl session) throws RepositoryException {
+            WorkspaceConfig wspConfig, SessionContext sessionContext)
+            throws RepositoryException {
         this.wspConfig = wspConfig;
-        this.repositoryContext = repositoryContext;
+        this.sessionContext = sessionContext;
+        this.repositoryContext = sessionContext.getRepositoryContext();
         this.stateMgr = createItemStateManager();
         this.hierMgr = new CachingHierarchyManager(
                 repositoryContext.getRootNodeId(), this.stateMgr);
         this.stateMgr.addListener(hierMgr);
-        this.session = session;
+        this.session = sessionContext.getSessionImpl();
     }
 
     /**
@@ -390,9 +395,8 @@ public class WorkspaceImpl extends Abstr
             throw new RepositoryException("not an absolute path: " + destAbsPath);
         }
 
-        BatchedItemOperations ops = new BatchedItemOperations(
-                stateMgr, repositoryContext.getNodeTypeRegistry(),
-                session.getLockManager(), session, hierMgr);
+        BatchedItemOperations ops =
+            new BatchedItemOperations(stateMgr, sessionContext);
 
         try {
             ops.edit();
@@ -407,7 +411,7 @@ public class WorkspaceImpl extends Abstr
         try {
             NodeId id = ops.copy(srcPath, srcWsp.getItemStateManager(),
                     srcWsp.getHierarchyManager(),
-                    ((SessionImpl) srcWsp.getSession()).getAccessManager(),
+                    srcWsp.sessionContext.getAccessManager(),
                     destPath, flag);
             ops.update();
             succeeded = true;
@@ -466,9 +470,8 @@ public class WorkspaceImpl extends Abstr
             throw new RepositoryException("not an absolute path: " + destAbsPath);
         }
 
-        BatchedItemOperations ops = new BatchedItemOperations(
-                stateMgr, repositoryContext.getNodeTypeRegistry(),
-                session.getLockManager(), session, hierMgr);
+        BatchedItemOperations ops =
+            new BatchedItemOperations(stateMgr, sessionContext);
 
         try {
             ops.edit();
@@ -590,7 +593,7 @@ public class WorkspaceImpl extends Abstr
         }
 
         // check authorization for specified workspace
-        if (!session.getAccessManager().canAccess(srcWorkspace)) {
+        if (!sessionContext.getAccessManager().canAccess(srcWorkspace)) {
             throw new AccessDeniedException("not authorized to access " + srcWorkspace);
         }
 
@@ -652,7 +655,7 @@ public class WorkspaceImpl extends Abstr
         }
 
         // check authorization for specified workspace
-        if (!session.getAccessManager().canAccess(srcWorkspace)) {
+        if (!sessionContext.getAccessManager().canAccess(srcWorkspace)) {
             throw new AccessDeniedException("not authorized to access " + srcWorkspace);
         }
 
@@ -713,9 +716,8 @@ public class WorkspaceImpl extends Abstr
             throw new RepositoryException("not an absolute path: " + destAbsPath);
         }
 
-        BatchedItemOperations ops = new BatchedItemOperations(
-                stateMgr, repositoryContext.getNodeTypeRegistry(),
-                session.getLockManager(), session, hierMgr);
+        BatchedItemOperations ops =
+            new BatchedItemOperations(stateMgr, sessionContext);
 
         try {
             ops.edit();
@@ -843,8 +845,7 @@ public class WorkspaceImpl extends Abstr
         }
 
         Importer importer = new WorkspaceImporter(
-                parentPath, this,
-                repositoryContext.getNodeTypeRegistry(),
+                parentPath, this, sessionContext,
                 uuidBehavior, wspConfig.getImportConfig());
         return new ImportHandler(importer, session);
     }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/XASessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/XASessionImpl.java?rev=957229&r1=957228&r2=957229&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/XASessionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/XASessionImpl.java Wed Jun 23 14:49:04 2010
@@ -160,7 +160,7 @@ public class XASessionImpl extends Sessi
     @Override
     protected WorkspaceImpl createWorkspaceInstance(WorkspaceConfig wspConfig)
             throws RepositoryException {
-        return new XAWorkspace(wspConfig, repositoryContext, this);
+        return new XAWorkspace(wspConfig, context);
     }
 
     /**

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/XAWorkspace.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/XAWorkspace.java?rev=957229&r1=957228&r2=957229&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/XAWorkspace.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/XAWorkspace.java Wed Jun 23 14:49:04 2010
@@ -19,6 +19,7 @@ package org.apache.jackrabbit.core;
 import javax.jcr.RepositoryException;
 
 import org.apache.jackrabbit.core.config.WorkspaceConfig;
+import org.apache.jackrabbit.core.session.SessionContext;
 import org.apache.jackrabbit.core.state.LocalItemStateManager;
 import org.apache.jackrabbit.core.state.XAItemStateManager;
 
@@ -31,13 +32,12 @@ public class XAWorkspace extends Workspa
      * Protected constructor.
      *
      * @param wspConfig The workspace configuration
-     * @param repositoryContext repository context
-     * @param session   The session
+     * @param sessionContext component context of this session
      */
     protected XAWorkspace(
-            WorkspaceConfig wspConfig, RepositoryContext repositoryContext,
-            SessionImpl session) throws RepositoryException {
-        super(wspConfig, repositoryContext, session);
+            WorkspaceConfig wspConfig, SessionContext sessionContext)
+            throws RepositoryException {
+        super(wspConfig, sessionContext);
     }
 
     @Override

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionContext.java?rev=957229&r1=957228&r2=957229&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionContext.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionContext.java Wed Jun 23 14:49:04 2010
@@ -22,6 +22,7 @@ import org.apache.jackrabbit.core.Reposi
 import org.apache.jackrabbit.core.SessionImpl;
 import org.apache.jackrabbit.core.data.DataStore;
 import org.apache.jackrabbit.core.id.NodeId;
+import org.apache.jackrabbit.core.security.AccessManager;
 import org.apache.jackrabbit.core.state.SessionItemStateManager;
 
 public class SessionContext {
@@ -33,15 +34,19 @@ public class SessionContext {
     private volatile SessionState state;
 
     /**
-     * The item state manager associated with this session
+     * The item state manager of this session
      */
     private volatile SessionItemStateManager itemStateManager;
 
     /**
-     * The item manager associated with this session
+     * The item manager of this session
      */
     private volatile ItemManager itemManager;
 
+    /**
+     * The access manager of this session
+     */
+    private volatile AccessManager accessManager;
 
     public SessionContext(
             RepositoryContext repositoryContext, SessionImpl session) {
@@ -111,4 +116,14 @@ public class SessionContext {
         this.itemManager = itemManager;
     }
 
+    public AccessManager getAccessManager() {
+        assert accessManager != null;
+        return accessManager;
+    }
+
+    public void setAccessManager(AccessManager accessManager) {
+        assert accessManager != null;
+        this.accessManager = accessManager;
+    }
+
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/WorkspaceImporter.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/WorkspaceImporter.java?rev=957229&r1=957228&r2=957229&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/WorkspaceImporter.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/WorkspaceImporter.java Wed Jun 23 14:49:04 2010
@@ -39,7 +39,7 @@ import org.apache.jackrabbit.core.config
 import org.apache.jackrabbit.core.id.NodeId;
 import org.apache.jackrabbit.core.id.PropertyId;
 import org.apache.jackrabbit.core.nodetype.EffectiveNodeType;
-import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
+import org.apache.jackrabbit.core.session.SessionContext;
 import org.apache.jackrabbit.core.state.ChildNodeEntry;
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.state.PropertyState;
@@ -103,11 +103,11 @@ public class WorkspaceImporter implement
      */
     public WorkspaceImporter(Path parentPath,
                              WorkspaceImpl wsp,
-                             NodeTypeRegistry ntReg,
+                             SessionContext sessionContext,
                              int uuidBehavior)
             throws PathNotFoundException, ConstraintViolationException,
             VersionException, LockException, RepositoryException {
-        this(parentPath, wsp, ntReg, uuidBehavior, null);
+        this(parentPath, wsp, sessionContext, uuidBehavior, null);
     }
 
     /**
@@ -131,21 +131,18 @@ public class WorkspaceImporter implement
      *                                      the subtree
      * @throws RepositoryException          if another error occurs
      */
-    public WorkspaceImporter(Path parentPath,
-                             WorkspaceImpl wsp,
-                             NodeTypeRegistry ntReg,
-                             int uuidBehavior,
-                             ImportConfig config)
+    public WorkspaceImporter(
+            Path parentPath, WorkspaceImpl wsp, SessionContext sessionContext,
+            int uuidBehavior, ImportConfig config)
             throws PathNotFoundException, ConstraintViolationException,
             VersionException, LockException, RepositoryException {
         this.wsp = wsp;
-        this.session = (SessionImpl) wsp.getSession();
+        this.session = sessionContext.getSessionImpl();
         this.versionManager = session.getInternalVersionManager();
         this.uuidBehavior = uuidBehavior;
 
         itemOps = new BatchedItemOperations(
-                wsp.getItemStateManager(), ntReg, session.getLockManager(),
-                session, wsp.getHierarchyManager());
+                wsp.getItemStateManager(), sessionContext);
         hierMgr = wsp.getHierarchyManager();
 
         // perform preliminary checks