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 ju...@apache.org on 2012/07/12 23:34:14 UTC

svn commit: r1360963 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/TypeValidator.java oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/nodetype/NodeTypeManagerImpl.java

Author: jukka
Date: Thu Jul 12 21:34:14 2012
New Revision: 1360963

URL: http://svn.apache.org/viewvc?rev=1360963&view=rev
Log:
OAK-66: JCR Node Type Management

Add-hoc solution to allow the TypeValidator see tyeps that have been registered through the NodeTypeManager

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/TypeValidator.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/nodetype/NodeTypeManagerImpl.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/TypeValidator.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/TypeValidator.java?rev=1360963&r1=1360962&r2=1360963&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/TypeValidator.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/TypeValidator.java Thu Jul 12 21:34:14 2012
@@ -16,7 +16,6 @@
  */
 package org.apache.jackrabbit.oak.plugins.type;
 
-import java.util.Collections;
 import java.util.Set;
 
 import javax.jcr.nodetype.NoSuchNodeTypeException;

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/nodetype/NodeTypeManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/nodetype/NodeTypeManagerImpl.java?rev=1360963&r1=1360962&r2=1360963&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/nodetype/NodeTypeManagerImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/nodetype/NodeTypeManagerImpl.java Thu Jul 12 21:34:14 2012
@@ -35,18 +35,25 @@ import javax.jcr.nodetype.NodeTypeTempla
 import javax.jcr.nodetype.PropertyDefinitionTemplate;
 
 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.Root;
+import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.core.DefaultConflictHandler;
 import org.apache.jackrabbit.oak.jcr.SessionDelegate;
 import org.apache.jackrabbit.oak.jcr.value.ValueFactoryImpl;
 import org.apache.jackrabbit.oak.namepath.NameMapper;
 
 public class NodeTypeManagerImpl implements NodeTypeManager {
 
+    private final ContentSession cs;
     private final ValueFactoryImpl vf;
     private final NameMapper mapper;
     private final NodeTypeManagerDelegate ntmd;
     private final Map<String, NodeType> typemap = new HashMap<String, NodeType>();
 
     public NodeTypeManagerImpl(SessionDelegate sd, NodeTypeManagerDelegate ntmd) throws RepositoryException {
+        this.cs = sd.getContentSession();
         this.vf = sd.getValueFactory();
         this.mapper = sd.getNamePathMapper();
         this.ntmd = ntmd;
@@ -134,23 +141,51 @@ public class NodeTypeManagerImpl impleme
     @Override
     public NodeType registerNodeType(NodeTypeDefinition ntd, boolean allowUpdate) throws RepositoryException {
         // TODO proper node type registration... (OAK-66)
+        try {
+            Root root = cs.getCurrentRoot();
+            NodeType type = internalRegister(ntd, root.getTree("/"));
+            root.commit(DefaultConflictHandler.OURS);
+            return type;
+        } catch (CommitFailedException e) {
+            throw new RepositoryException(e);
+        }
+    }
+
+    @Override
+    public NodeTypeIterator registerNodeTypes(NodeTypeDefinition[] ntds, boolean allowUpdate) throws RepositoryException {
+        // TODO handle inter-type dependencies (OAK-66)
+        try {
+            Root root = cs.getCurrentRoot();
+            NodeType[] types = new NodeType[ntds.length];
+            for (int i = 0; i < ntds.length; i++) {
+                types[i] = internalRegister(ntds[i], root.getTree("/"));
+            }
+            root.commit(DefaultConflictHandler.OURS);
+            return new NodeTypeIteratorAdapter(Arrays.asList(types));
+        } catch (CommitFailedException e) {
+            throw new RepositoryException(e);
+        }
+    }
+
+    private NodeType internalRegister(NodeTypeDefinition ntd, Tree root) {
         NodeTypeDelegate delegate = new NodeTypeDelegate(
                 ntd.getName(),
                 ntd.getDeclaredSupertypeNames(), ntd.getPrimaryItemName(),
                 ntd.isMixin(), ntd.isAbstract(), ntd.hasOrderableChildNodes());
         NodeType type = new NodeTypeImpl(this, vf, mapper, delegate);
         typemap.put(ntd.getName(), type);
-        return type;
-    }
 
-    @Override
-    public NodeTypeIterator registerNodeTypes(NodeTypeDefinition[] ntds, boolean allowUpdate) throws RepositoryException {
-        // TODO handle inter-type dependencies (OAK-66)
-        NodeType[] types = new NodeType[ntds.length];
-        for (int i = 0; i < ntds.length; i++) {
-            types[i] = registerNodeType(ntds[i], allowUpdate);
+        Tree system = root.getChild("jcr:system");
+        if (system == null) {
+            system = root.addChild("jcr:system");
+        }
+        Tree nodetypes = system.getChild("jcr:nodeTypes");
+        if (nodetypes == null) {
+            nodetypes = system.addChild("jcr:nodeTypes");
         }
-        return new NodeTypeIteratorAdapter(Arrays.asList(types));
+        nodetypes.addChild(ntd.getName());
+
+        return type;
     }
 
     @Override