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/08/13 18:30:55 UTC

svn commit: r985269 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core: SessionImpl.java nodetype/NodeTypeManagerImpl.java session/SessionContext.java

Author: jukka
Date: Fri Aug 13 16:30:54 2010
New Revision: 985269

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

Move ValueFactory into SessionContext.

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeManagerImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionContext.java

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=985269&r1=985268&r2=985269&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 Fri Aug 13 16:30:54 2010
@@ -87,7 +87,6 @@ import org.apache.jackrabbit.core.sessio
 import org.apache.jackrabbit.core.session.SessionSaveOperation;
 import org.apache.jackrabbit.core.state.SessionItemStateManager;
 import org.apache.jackrabbit.core.util.Dumpable;
-import org.apache.jackrabbit.core.value.ValueFactoryImpl;
 import org.apache.jackrabbit.core.version.InternalVersionManager;
 import org.apache.jackrabbit.core.xml.ImportHandler;
 import org.apache.jackrabbit.core.xml.SessionImporter;
@@ -186,11 +185,6 @@ public class SessionImpl extends Abstrac
         new ReferenceMap(ReferenceMap.WEAK, ReferenceMap.WEAK);
 
     /**
-     * value factory
-     */
-    protected ValueFactory valueFactory;
-
-    /**
      * Principal Manager
      */
     private PrincipalManager principalManager;
@@ -994,11 +988,7 @@ public class SessionImpl extends Abstrac
      * {@inheritDoc}
      */
     public ValueFactory getValueFactory() {
-        if (valueFactory == null) {
-            valueFactory =
-                new ValueFactoryImpl(this, context.getDataStore());
-        }
-        return valueFactory;
+        return context.getValueFactory();
     }
 
     /**

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeManagerImpl.java?rev=985269&r1=985268&r2=985269&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeManagerImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeManagerImpl.java Fri Aug 13 16:30:54 2010
@@ -35,7 +35,6 @@ import java.util.Set;
 import javax.jcr.NamespaceException;
 import javax.jcr.RepositoryException;
 import javax.jcr.UnsupportedRepositoryOperationException;
-import javax.jcr.ValueFactory;
 import javax.jcr.nodetype.InvalidNodeTypeDefinitionException;
 import javax.jcr.nodetype.NoSuchNodeTypeException;
 import javax.jcr.nodetype.NodeType;
@@ -49,9 +48,8 @@ import org.apache.jackrabbit.commons.Nam
 import org.apache.jackrabbit.commons.cnd.CompactNodeTypeDefReader;
 import org.apache.jackrabbit.commons.cnd.ParseException;
 import org.apache.jackrabbit.commons.iterator.NodeTypeIteratorAdapter;
-import org.apache.jackrabbit.core.SessionImpl;
-import org.apache.jackrabbit.core.data.DataStore;
 import org.apache.jackrabbit.core.nodetype.xml.NodeTypeReader;
+import org.apache.jackrabbit.core.session.SessionContext;
 import org.apache.jackrabbit.core.util.Dumpable;
 import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.spi.QNodeDefinition;
@@ -77,19 +75,9 @@ public class NodeTypeManagerImpl extends
         implements JackrabbitNodeTypeManager, Dumpable, NodeTypeRegistryListener {
 
     /**
-     * The wrapped node type registry.
+     * Component context of the current session.
      */
-    private final NodeTypeRegistry ntReg;
-
-    /**
-     * Current session.
-     */
-    private final SessionImpl session;
-
-    /**
-     * The value factory obtained from the current session.
-     */
-    private final ValueFactory valueFactory;
+    private final SessionContext context;
 
     /**
      * The root node definition.
@@ -114,8 +102,6 @@ public class NodeTypeManagerImpl extends
      */
     private final Map<QNodeDefinition, NodeDefinitionImpl> ndCache;
 
-    private final DataStore store;
-
     /**
      * Creates a new <code>NodeTypeManagerImpl</code> instance.
      *
@@ -124,13 +110,8 @@ public class NodeTypeManagerImpl extends
      * @param store      the data store
      */
     @SuppressWarnings("unchecked")
-    public NodeTypeManagerImpl(
-            NodeTypeRegistry ntReg, SessionImpl session, DataStore store) {
-        this.ntReg = ntReg;
-        this.session = session;
-        this.valueFactory = session.getValueFactory();
-        this.ntReg.addListener(this);
-        this.store = store;
+    public NodeTypeManagerImpl(SessionContext context) {
+        this.context = context;
 
         // setup caches with soft references to node type
         // & item definition instances
@@ -138,9 +119,13 @@ public class NodeTypeManagerImpl extends
         pdCache = new ReferenceMap(ReferenceMap.HARD, ReferenceMap.SOFT);
         ndCache = new ReferenceMap(ReferenceMap.HARD, ReferenceMap.SOFT);
 
-        rootNodeDef =
-            new NodeDefinitionImpl(ntReg.getRootNodeDef(), this, session);
+        NodeTypeRegistry registry = context.getNodeTypeRegistry();
+
+        rootNodeDef = new NodeDefinitionImpl(
+                registry.getRootNodeDef(), this, context);
         ndCache.put(rootNodeDef.unwrap(), rootNodeDef);
+
+        registry.addListener(this);
     }
 
     /**
@@ -158,7 +143,7 @@ public class NodeTypeManagerImpl extends
         synchronized (ndCache) {
             NodeDefinitionImpl ndi = ndCache.get(def);
             if (ndi == null) {
-                ndi = new NodeDefinitionImpl(def, this, session);
+                ndi = new NodeDefinitionImpl(def, this, context);
                 ndCache.put(def, ndi);
             }
             return ndi;
@@ -173,7 +158,8 @@ public class NodeTypeManagerImpl extends
         synchronized (pdCache) {
             PropertyDefinitionImpl pdi = pdCache.get(def);
             if (pdi == null) {
-                pdi = new PropertyDefinitionImpl(def, this, session, valueFactory);
+                pdi = new PropertyDefinitionImpl(
+                        def, this, context, context.getValueFactory());
                 pdCache.put(def, pdi);
             }
             return pdi;
@@ -189,9 +175,12 @@ public class NodeTypeManagerImpl extends
         synchronized (ntCache) {
             NodeTypeImpl nt = ntCache.get(name);
             if (nt == null) {
-                EffectiveNodeType ent = ntReg.getEffectiveNodeType(name);
-                QNodeTypeDefinition def = ntReg.getNodeTypeDef(name);
-                nt = new NodeTypeImpl(ent, def, this, session, valueFactory, store);
+                NodeTypeRegistry registry = context.getNodeTypeRegistry();
+                EffectiveNodeType ent = registry.getEffectiveNodeType(name);
+                QNodeTypeDefinition def = registry.getNodeTypeDef(name);
+                nt = new NodeTypeImpl(
+                        ent, def, this, context,
+                        context.getValueFactory(), context.getDataStore());
                 ntCache.put(name, nt);
             }
             return nt;
@@ -202,14 +191,14 @@ public class NodeTypeManagerImpl extends
      * @see org.apache.jackrabbit.spi.commons.nodetype.AbstractNodeTypeManager#getNamePathResolver()
      */
     public NamePathResolver getNamePathResolver() {
-        return session;
+        return context;
     }
 
     /**
      * @return the node type registry
      */
     public NodeTypeRegistry getNodeTypeRegistry() {
-        return ntReg;
+        return context.getNodeTypeRegistry();
     }
 
     /**
@@ -257,7 +246,7 @@ public class NodeTypeManagerImpl extends
                 }
             } else if (contentType.equalsIgnoreCase(TEXT_X_JCR_CND)) {
                 try {
-                    NamespaceMapping mapping = new NamespaceMapping(session);
+                    NamespaceMapping mapping = new NamespaceMapping(context.getSessionImpl());
 
                     CompactNodeTypeDefReader<QNodeTypeDefinition, NamespaceMapping> reader =
                         new CompactNodeTypeDefReader<QNodeTypeDefinition, NamespaceMapping>(
@@ -278,16 +267,17 @@ public class NodeTypeManagerImpl extends
                         "Unsupported content type: " + contentType);
             }
 
-            new NamespaceHelper(session).registerNamespaces(namespaceMap);
+            new NamespaceHelper(context.getSessionImpl()).registerNamespaces(namespaceMap);
 
             if (reregisterExisting) {
+                NodeTypeRegistry registry = context.getNodeTypeRegistry();
                 // split the node types into new and already registered node types.
                 // this way we can register new node types together with already
                 // registered node types which make circular dependencies possible
                 List<QNodeTypeDefinition> newNodeTypeDefs = new ArrayList<QNodeTypeDefinition>();
                 List<QNodeTypeDefinition> registeredNodeTypeDefs = new ArrayList<QNodeTypeDefinition>();
                 for (QNodeTypeDefinition nodeTypeDef: nodeTypeDefs) {
-                    if (ntReg.isRegistered(nodeTypeDef.getName())) {
+                    if (registry.isRegistered(nodeTypeDef.getName())) {
                         registeredNodeTypeDefs.add(nodeTypeDef);
                     } else {
                         newNodeTypeDefs.add(nodeTypeDef);
@@ -301,7 +291,7 @@ public class NodeTypeManagerImpl extends
 
                 // re-register already existing node types
                 for (QNodeTypeDefinition nodeTypeDef: registeredNodeTypeDefs) {
-                    ntReg.reregisterNodeType(nodeTypeDef);
+                    registry.reregisterNodeType(nodeTypeDef);
                     nodeTypes.add(getNodeType(nodeTypeDef.getName()));
                 }
                 return nodeTypes.toArray(new NodeType[nodeTypes.size()]);
@@ -382,7 +372,7 @@ public class NodeTypeManagerImpl extends
      * {@inheritDoc}
      */
     public NodeTypeIterator getAllNodeTypes() throws RepositoryException {
-        Name[] ntNames = ntReg.getRegisteredNodeTypes();
+        Name[] ntNames = context.getNodeTypeRegistry().getRegisteredNodeTypes();
         Arrays.sort(ntNames);
         ArrayList<NodeType> list = new ArrayList<NodeType>(ntNames.length);
         for (Name ntName : ntNames) {
@@ -395,7 +385,7 @@ public class NodeTypeManagerImpl extends
      * {@inheritDoc}
      */
     public NodeTypeIterator getPrimaryNodeTypes() throws RepositoryException {
-        Name[] ntNames = ntReg.getRegisteredNodeTypes();
+        Name[] ntNames = context.getNodeTypeRegistry().getRegisteredNodeTypes();
         Arrays.sort(ntNames);
         ArrayList<NodeType> list = new ArrayList<NodeType>(ntNames.length);
         for (Name ntName : ntNames) {
@@ -411,7 +401,7 @@ public class NodeTypeManagerImpl extends
      * {@inheritDoc}
      */
     public NodeTypeIterator getMixinNodeTypes() throws RepositoryException {
-        Name[] ntNames = ntReg.getRegisteredNodeTypes();
+        Name[] ntNames = context.getNodeTypeRegistry().getRegisteredNodeTypes();
         Arrays.sort(ntNames);
         ArrayList<NodeType> list = new ArrayList<NodeType>(ntNames.length);
         for (Name ntName : ntNames) {
@@ -429,7 +419,7 @@ public class NodeTypeManagerImpl extends
     public NodeType getNodeType(String nodeTypeName)
             throws NoSuchNodeTypeException {
         try {
-            return getNodeType(session.getQName(nodeTypeName));
+            return getNodeType(context.getQName(nodeTypeName));
         } catch (NameException e) {
             throw new NoSuchNodeTypeException(nodeTypeName, e);
         } catch (NamespaceException e) {
@@ -450,7 +440,7 @@ public class NodeTypeManagerImpl extends
      */
     private Collection<NodeType> registerNodeTypes(List<QNodeTypeDefinition> defs)
             throws InvalidNodeTypeDefException, RepositoryException {
-        ntReg.registerNodeTypes(defs);
+        context.getNodeTypeRegistry().registerNodeTypes(defs);
 
         Set<NodeType> types = new HashSet<NodeType>();
         for (QNodeTypeDefinition def : defs) {
@@ -507,7 +497,7 @@ public class NodeTypeManagerImpl extends
      */
     public boolean hasNodeType(String name) throws RepositoryException {
         try {
-            Name qname = session.getQName(name);
+            Name qname = context.getQName(name);
             return getNodeTypeRegistry().isRegistered(qname);
         } catch (NamespaceException e) {
             return false;
@@ -559,6 +549,8 @@ public class NodeTypeManagerImpl extends
             NodeTypeDefinition[] definitions, boolean allowUpdate)
             throws InvalidNodeTypeDefinitionException, NodeTypeExistsException,
             UnsupportedRepositoryOperationException, RepositoryException {
+        NodeTypeRegistry registry = context.getNodeTypeRegistry();
+
         // split the node types into new and already registered node types.
         // this way we can register new node types together with already
         // registered node types which make circular dependencies possible
@@ -567,7 +559,7 @@ public class NodeTypeManagerImpl extends
         for (NodeTypeDefinition definition : definitions) {
             // convert to QNodeTypeDefinition
             QNodeTypeDefinition def = toNodeTypeDef(definition);
-            if (ntReg.isRegistered(def.getName())) {
+            if (registry.isRegistered(def.getName())) {
               if (allowUpdate) {
                   modifiedDefs.add(def);
               } else {
@@ -586,7 +578,7 @@ public class NodeTypeManagerImpl extends
 
             // re-register already existing node types
             for (QNodeTypeDefinition nodeTypeDef: modifiedDefs) {
-                ntReg.reregisterNodeType(nodeTypeDef);
+                registry.reregisterNodeType(nodeTypeDef);
                 result.add(getNodeType(nodeTypeDef.getName()));
             }
 
@@ -616,7 +608,7 @@ public class NodeTypeManagerImpl extends
         Set<Name> ntNames = new HashSet<Name>();
         for (String name : names) {
             try {
-                ntNames.add(session.getQName(name));
+                ntNames.add(context.getQName(name));
             } catch (NamespaceException e) {
                 throw new RepositoryException("Invalid name: " + name, e);
             } catch (NameException e) {
@@ -638,7 +630,7 @@ public class NodeTypeManagerImpl extends
      */
     private QNodeTypeDefinition toNodeTypeDef(NodeTypeDefinition definition)
             throws InvalidNodeTypeDefinitionException, RepositoryException {
-        return new QNodeTypeDefinitionImpl(definition, session, QValueFactoryImpl.getInstance());
+        return new QNodeTypeDefinitionImpl(definition, context, QValueFactoryImpl.getInstance());
     }
 
     //-------------------------------------------------------------< Dumpable >
@@ -648,7 +640,7 @@ public class NodeTypeManagerImpl extends
     public void dump(PrintStream ps) {
         ps.println("NodeTypeManager (" + this + ")");
         ps.println();
-        ntReg.dump(ps);
+        context.getNodeTypeRegistry().dump(ps);
     }
 
 }

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=985269&r1=985268&r2=985269&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 Fri Aug 13 16:30:54 2010
@@ -17,6 +17,7 @@
 package org.apache.jackrabbit.core.session;
 
 import javax.jcr.NamespaceException;
+import javax.jcr.ValueFactory;
 
 import org.apache.jackrabbit.core.HierarchyManager;
 import org.apache.jackrabbit.core.ItemManager;
@@ -30,6 +31,7 @@ import org.apache.jackrabbit.core.nodety
 import org.apache.jackrabbit.core.observation.ObservationManagerImpl;
 import org.apache.jackrabbit.core.security.AccessManager;
 import org.apache.jackrabbit.core.state.SessionItemStateManager;
+import org.apache.jackrabbit.core.value.ValueFactoryImpl;
 import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.spi.Path;
 import org.apache.jackrabbit.spi.commons.conversion.IllegalNameException;
@@ -58,6 +60,11 @@ public class SessionContext implements N
     private final SessionState state;
 
     /**
+     * The value factory of this session
+     */
+    private final ValueFactory valueFactory;
+
+    /**
      * The item validator of this session
      */
     private final ItemValidator itemValidator;
@@ -100,10 +107,10 @@ public class SessionContext implements N
         this.repositoryContext = repositoryContext;
         this.session = session;
         this.state = new SessionState(this);
-        this.nodeTypeManager = new NodeTypeManagerImpl(
-                repositoryContext.getNodeTypeRegistry(), session,
-                repositoryContext.getDataStore());
+        this.valueFactory =
+            new ValueFactoryImpl(session, repositoryContext.getDataStore());
         this.itemValidator = new ItemValidator(this);
+        this.nodeTypeManager = new NodeTypeManagerImpl(this);
     }
 
     /**
@@ -162,6 +169,15 @@ public class SessionContext implements N
     }
 
     /**
+     * Returns the value factory of this session.
+     *
+     * @return value factory
+     */
+    public ValueFactory getValueFactory() {
+        return valueFactory;
+    }
+
+    /**
      * Returns the item validator of this session.
      *
      * @return item validator