You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by mr...@apache.org on 2012/09/19 14:05:37 UTC

svn commit: r1387537 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/core/ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/

Author: mreutegg
Date: Wed Sep 19 12:05:37 2012
New Revision: 1387537

URL: http://svn.apache.org/viewvc?rev=1387537&view=rev
Log:
OAK-312: Use stable root from session in NodeTypeManagerImpl

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentSessionImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/AbstractNodeTypeManager.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/NodeTypeManagerImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentSessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentSessionImpl.java?rev=1387537&r1=1387536&r2=1387537&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentSessionImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentSessionImpl.java Wed Sep 19 12:05:37 2012
@@ -78,7 +78,7 @@ class ContentSessionImpl implements Cont
         synchronized (this) {
             if (!initialised) {
                 initialised = true;
-                NodeTypeManagerImpl.registerBuiltInNodeTypes(this);
+                NodeTypeManagerImpl.registerBuiltInNodeTypes(getLatestRoot());
             }
         }
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/AbstractNodeTypeManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/AbstractNodeTypeManager.java?rev=1387537&r1=1387536&r2=1387537&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/AbstractNodeTypeManager.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/AbstractNodeTypeManager.java Wed Sep 19 12:05:37 2012
@@ -35,12 +35,19 @@ import javax.jcr.nodetype.PropertyDefini
 import com.google.common.collect.Lists;
 import org.apache.jackrabbit.commons.iterator.NodeTypeIteratorAdapter;
 import org.apache.jackrabbit.oak.api.CoreValueFactory;
+import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.namepath.NameMapper;
 import org.apache.jackrabbit.oak.namepath.NamePathMapperImpl;
 import org.apache.jackrabbit.oak.plugins.memory.MemoryValueFactory;
 import org.apache.jackrabbit.oak.util.NodeUtil;
 
+/**
+ * Base implementation of a {@link NodeTypeManager} with support for reading
+ * node types from the {@link Tree} returned by {@link #getTypes()}. Methods
+ * related to node type modifications throw
+ * {@link UnsupportedRepositoryOperationException}.
+ */
 public abstract class AbstractNodeTypeManager implements NodeTypeManager {
 
     /**
@@ -88,11 +95,27 @@ public abstract class AbstractNodeTypeMa
         return null;
     }
 
+    /**
+     * Returns a {@link CoreValueFactory} to be used by this node type manager.
+     * This implementation returns a {@link MemoryValueFactory#INSTANCE}. A
+     * subclass may override this method and provide a different
+     * implementation.
+     *
+     * @return {@link CoreValueFactory} instance.
+     */
     @Nonnull
     protected CoreValueFactory getCoreValueFactory() {
         return MemoryValueFactory.INSTANCE;
     }
 
+    /**
+     * Returns a {@link NameMapper} to be used by this node type manager. This
+     * implementation returns the {@link NamePathMapperImpl#DEFAULT} instance. A
+     * subclass may override this method and provide a different
+     * implementation.
+     *
+     * @return {@link NameMapper} instance.
+     */
     @Nonnull
     protected NameMapper getNameMapper() {
         return NamePathMapperImpl.DEFAULT;
@@ -179,21 +202,33 @@ public abstract class AbstractNodeTypeMa
         return new PropertyDefinitionTemplateImpl(getNameMapper());
     }
 
+    /**
+     * This implementation always throws a {@link UnsupportedRepositoryOperationException}.
+     */
     @Override
     public NodeType registerNodeType(NodeTypeDefinition ntd, boolean allowUpdate) throws RepositoryException {
         throw new UnsupportedRepositoryOperationException();
     }
 
+    /**
+     * This implementation always throws a {@link UnsupportedRepositoryOperationException}.
+     */
     @Override
     public NodeTypeIterator registerNodeTypes(NodeTypeDefinition[] ntds, boolean allowUpdate) throws RepositoryException {
         throw new UnsupportedRepositoryOperationException();
     }
 
+    /**
+     * This implementation always throws a {@link UnsupportedRepositoryOperationException}.
+     */
     @Override
     public void unregisterNodeType(String name) throws RepositoryException {
         throw new UnsupportedRepositoryOperationException();
     }
 
+    /**
+     * This implementation always throws a {@link UnsupportedRepositoryOperationException}.
+     */
     @Override
     public void unregisterNodeTypes(String[] names) throws RepositoryException {
         throw new UnsupportedRepositoryOperationException();

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/NodeTypeManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/NodeTypeManagerImpl.java?rev=1387537&r1=1387536&r2=1387537&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/NodeTypeManagerImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/NodeTypeManagerImpl.java Wed Sep 19 12:05:37 2012
@@ -22,10 +22,10 @@ import java.security.PrivilegedAction;
 import java.util.List;
 import java.util.Map;
 
+import javax.annotation.Nonnull;
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
 import javax.jcr.Value;
-import javax.jcr.ValueFactory;
 import javax.jcr.nodetype.ItemDefinition;
 import javax.jcr.nodetype.NoSuchNodeTypeException;
 import javax.jcr.nodetype.NodeDefinition;
@@ -44,14 +44,9 @@ import org.apache.jackrabbit.commons.cnd
 import org.apache.jackrabbit.commons.cnd.ParseException;
 import org.apache.jackrabbit.commons.iterator.NodeTypeIteratorAdapter;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
-import org.apache.jackrabbit.oak.api.ContentSession;
-import org.apache.jackrabbit.oak.api.CoreValueFactory;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.core.DefaultConflictHandler;
-import org.apache.jackrabbit.oak.namepath.NameMapper;
-import org.apache.jackrabbit.oak.namepath.NamePathMapper;
-import org.apache.jackrabbit.oak.namepath.NamePathMapperImpl;
 import org.apache.jackrabbit.oak.spi.security.principal.AdminPrincipal;
 import org.apache.jackrabbit.oak.util.NodeUtil;
 
@@ -88,22 +83,68 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.plugins.type.NodeTypeConstants.JCR_NODE_TYPES;
 import static org.apache.jackrabbit.oak.plugins.type.NodeTypeConstants.NODE_TYPES_PATH;
 
-public class NodeTypeManagerImpl extends AbstractNodeTypeManager {
+/**
+ * <code>NodeTypeManagerImpl</code> extends the {@link AbstractNodeTypeManager}
+ * and add support for operations that modify node types:
+ * <ul>
+ *     <li>{@link #registerNodeType(NodeTypeDefinition, boolean)}</li>
+ *     <li>{@link #registerNodeTypes(NodeTypeDefinition[], boolean)}</li>
+ *     <li>{@link #unregisterNodeType(String)}</li>
+ *     <li>{@link #unregisterNodeTypes(String[])}</li>
+ * </ul>
+ * Calling any of the above methods will result in a {@link #refresh()} callback
+ * to e.g. inform an associated session that it should refresh to make the
+ * changes visible.
+ * </p>
+ * Subclass responsibility is to provide an implementation of
+ * {@link #getTypes()} for read only access to the tree where node types are
+ * stored in content and {@link #getWriteRoot()} for write access to the
+ * repository in order to modify node types stored in content. A subclass may
+ * also want to override the default implementation of
+ * {@link AbstractNodeTypeManager} for the following methods:
+ * <ul>
+ *     <li>{@link #getValueFactory()}</li>
+ *     <li>{@link #getCoreValueFactory()}</li>
+ *     <li>{@link #getNameMapper()}</li>
+ * </ul>
+ */
+public abstract class NodeTypeManagerImpl extends AbstractNodeTypeManager {
 
-    private final ContentSession session;
-
-    private final NamePathMapper mapper;
-
-    private final ValueFactory factory;
-
-    public NodeTypeManagerImpl(ContentSession session, NamePathMapper mapper, ValueFactory factory) {
-        this.session = session;
-        this.mapper = mapper;
-        this.factory = factory;
+    /**
+     * Called by the methods {@link #registerNodeType(NodeTypeDefinition,boolean)},
+     * {@link #registerNodeTypes(NodeTypeDefinition[], boolean)},
+     * {@link #unregisterNodeType(String)} and {@link #unregisterNodeTypes(String[])}
+     * to acquire a fresh {@link Root} instance that can be used to persist the
+     * requested node type changes (and nothing else).
+     * <p/>
+     * This default implementation throws an {@link UnsupportedOperationException}.
+     *
+     * @return fresh {@link Root} instance.
+     */
+    @Nonnull
+    protected Root getWriteRoot() {
+        throw new UnsupportedOperationException();
     }
 
-    public static void registerBuiltInNodeTypes(ContentSession session) {
-        new NodeTypeManagerImpl(session, NamePathMapperImpl.DEFAULT, null).registerBuiltinNodeTypes();
+    /**
+     * Registers built in node types using the given {@link Root}.
+     *
+     * @param root the {@link Root} instance.
+     */
+    public static void registerBuiltInNodeTypes(final Root root) {
+        NodeTypeManagerImpl ntMgr = new NodeTypeManagerImpl() {
+            @Override
+            protected Tree getTypes() {
+                return root.getTree(NODE_TYPES_PATH);
+            }
+
+            @Nonnull
+            @Override
+            protected Root getWriteRoot() {
+                return root;
+            }
+        };
+        ntMgr.registerBuiltinNodeTypes();
     }
 
     private void registerBuiltinNodeTypes() {
@@ -144,7 +185,7 @@ public class NodeTypeManagerImpl extends
     public void registerNodeTypes(InputStreamReader cnd) throws ParseException, RepositoryException {
         CompactNodeTypeDefReader<NodeTypeTemplate, Map<String, String>> reader =
                 new CompactNodeTypeDefReader<NodeTypeTemplate, Map<String, String>>(
-                        cnd, null, new DefBuilderFactory(mapper));
+                        cnd, null, new DefBuilderFactory(getNameMapper()));
         Map<String, NodeTypeTemplate> templates = Maps.newHashMap();
         for (NodeTypeTemplate template : reader.getNodeTypeDefinitions()) {
             templates.put(template.getName(), template);
@@ -181,36 +222,17 @@ public class NodeTypeManagerImpl extends
         registerNodeTypes(templates.values().toArray(new NodeTypeTemplate[templates.size()]), true);
     }
 
-    @Override
-    protected Tree getTypes() {
-        return session.getLatestRoot().getTree(NODE_TYPES_PATH);
-    }
-
-    @Override
-    protected ValueFactory getValueFactory() {
-        return factory;
-    }
-
-    @Override
-    protected CoreValueFactory getCoreValueFactory() {
-        return session.getCoreValueFactory();
-    }
-
-    @Override
-    protected NameMapper getNameMapper() {
-        return mapper;
-    }
-
     //----------------------------------------------------< NodeTypeManager >---
 
     @Override
     public NodeType registerNodeType(NodeTypeDefinition ntd, boolean allowUpdate) throws RepositoryException {
         // TODO proper node type registration... (OAK-66)
-        Root root = session.getLatestRoot();
+        Root root = getWriteRoot();
         Tree types = getOrCreateNodeTypes(root);
         try {
             NodeType type = internalRegister(types, ntd, allowUpdate);
             root.commit(DefaultConflictHandler.OURS);
+            refresh();
             return type;
         } catch (CommitFailedException e) {
             throw new RepositoryException(e);
@@ -221,7 +243,7 @@ public class NodeTypeManagerImpl extends
     public final NodeTypeIterator registerNodeTypes(NodeTypeDefinition[] ntds, boolean allowUpdate)
             throws RepositoryException {
         // TODO handle inter-type dependencies (OAK-66)
-        Root root = session.getLatestRoot();
+        Root root = getWriteRoot();
         Tree types = getOrCreateNodeTypes(root);
         try {
             List<NodeType> list = Lists.newArrayList();
@@ -229,6 +251,7 @@ public class NodeTypeManagerImpl extends
                 list.add(internalRegister(types, ntd, allowUpdate));
             }
             root.commit(DefaultConflictHandler.OURS);
+            refresh();
             return new NodeTypeIteratorAdapter(list);
         } catch (CommitFailedException e) {
             throw new RepositoryException(e);
@@ -252,7 +275,7 @@ public class NodeTypeManagerImpl extends
         }
         type = types.addChild(oakName);
 
-        NodeUtil node = new NodeUtil(type, getCoreValueFactory(), mapper);
+        NodeUtil node = new NodeUtil(type, getCoreValueFactory(), getNameMapper());
         node.setName(JCR_PRIMARYTYPE, NT_NODETYPE);
         node.setName(JCR_NODETYPENAME, jcrName);
         node.setNames(JCR_SUPERTYPES, ntd.getDeclaredSupertypeNames());
@@ -288,7 +311,7 @@ public class NodeTypeManagerImpl extends
             }
         }
 
-        return new NodeTypeImpl(this, this.factory, node);
+        return new NodeTypeImpl(this, getValueFactory(), node);
     }
 
     private static void internalRegisterItemDefinition(
@@ -356,15 +379,14 @@ public class NodeTypeManagerImpl extends
     }
 
     private boolean nodeTypesInContent() {
-        Root currentRoot = session.getLatestRoot();
-        Tree types = currentRoot.getTree(NODE_TYPES_PATH);
+        Tree types = getTypes();
         return types != null && types.getChildrenCount() > 0;
     }
 
     @Override
     public void unregisterNodeType(String name) throws RepositoryException {
         Tree type = null;
-        Root root = session.getLatestRoot();
+        Root root = getWriteRoot();
         Tree types = root.getTree(NODE_TYPES_PATH);
         if (types != null) {
             type = types.getChild(getOakName(name));
@@ -384,7 +406,7 @@ public class NodeTypeManagerImpl extends
 
     @Override
     public void unregisterNodeTypes(String[] names) throws RepositoryException {
-        Root root = session.getLatestRoot();
+        Root root = getWriteRoot();
         Tree types = root.getTree(NODE_TYPES_PATH);
         if (types == null) {
             throw new NoSuchNodeTypeException("Node types can not be unregistered.");

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java?rev=1387537&r1=1387536&r2=1387537&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java Wed Sep 19 12:05:37 2012
@@ -19,10 +19,12 @@ package org.apache.jackrabbit.oak.jcr;
 import java.io.IOException;
 import java.io.InputStream;
 
+import javax.annotation.Nonnull;
 import javax.jcr.NamespaceRegistry;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.UnsupportedRepositoryOperationException;
+import javax.jcr.ValueFactory;
 import javax.jcr.lock.LockManager;
 import javax.jcr.nodetype.NodeTypeManager;
 import javax.jcr.observation.ObservationManager;
@@ -32,6 +34,7 @@ import javax.jcr.version.VersionManager;
 
 import org.apache.jackrabbit.api.JackrabbitWorkspace;
 import org.apache.jackrabbit.api.security.authorization.PrivilegeManager;
+import org.apache.jackrabbit.oak.api.CoreValueFactory;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.commons.PathUtils;
@@ -39,6 +42,7 @@ import org.apache.jackrabbit.oak.jcr.loc
 import org.apache.jackrabbit.oak.jcr.query.QueryManagerImpl;
 import org.apache.jackrabbit.oak.jcr.security.privilege.PrivilegeManagerImpl;
 import org.apache.jackrabbit.oak.jcr.version.VersionManagerImpl;
+import org.apache.jackrabbit.oak.namepath.NameMapper;
 import org.apache.jackrabbit.oak.plugins.name.NamespaceRegistryImpl;
 import org.apache.jackrabbit.oak.plugins.type.NodeTypeManagerImpl;
 import org.slf4j.Logger;
@@ -46,6 +50,8 @@ import org.slf4j.LoggerFactory;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.InputSource;
 
+import static org.apache.jackrabbit.oak.plugins.type.NodeTypeConstants.NODE_TYPES_PATH;
+
 /**
  * {@code WorkspaceImpl}...
  */
@@ -165,14 +171,39 @@ public class WorkspaceImpl implements Ja
 
     @Override
     public NodeTypeManager getNodeTypeManager() {
-        return new NodeTypeManagerImpl(
-                sessionDelegate.getContentSession(),
-                sessionDelegate.getNamePathMapper(),
-                sessionDelegate.getValueFactory()) {
+        return new NodeTypeManagerImpl() {
             @Override
             protected void refresh() throws RepositoryException {
                 getSession().refresh(true);
             }
+
+            @Override
+            protected Tree getTypes() {
+                return sessionDelegate.getRoot().getTree(NODE_TYPES_PATH);
+            }
+
+            @Nonnull
+            @Override
+            protected Root getWriteRoot() {
+                return sessionDelegate.getContentSession().getLatestRoot();
+            }
+
+            @Nonnull
+            @Override
+            protected CoreValueFactory getCoreValueFactory() {
+                return sessionDelegate.getContentSession().getCoreValueFactory();
+            }
+
+            @Override
+            protected ValueFactory getValueFactory() {
+                return sessionDelegate.getValueFactory();
+            }
+
+            @Nonnull
+            @Override
+            protected NameMapper getNameMapper() {
+                return sessionDelegate.getNamePathMapper();
+            }
         };
     }