You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2009/06/18 12:17:26 UTC

svn commit: r786003 - in /jackrabbit/trunk: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/ jackrabbit-core/src/main/resources/org/apache/jackrabbit/core/nodetype/ jackrabbit-jcr-tests/src/main/resources/org/apache/jackrabbit/test/ap...

Author: tripod
Date: Thu Jun 18 10:17:23 2009
New Revision: 786003

URL: http://svn.apache.org/viewvc?rev=786003&view=rev
Log:
JCR-2066 NodeTypeRegistry could auto-subtype from nt:base

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java
    jackrabbit/trunk/jackrabbit-core/src/main/resources/org/apache/jackrabbit/core/nodetype/builtin_nodetypes.cnd
    jackrabbit/trunk/jackrabbit-jcr-tests/src/main/resources/org/apache/jackrabbit/test/api/nodetype/spec/nt-folder.txt
    jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/compact/CompactNodeTypeDefWriter.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java?rev=786003&r1=786002&r2=786003&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java Thu Jun 18 10:17:23 2009
@@ -1460,14 +1460,6 @@
         if (supertypes.length > 0) {
             try {
                 EffectiveNodeType est = getEffectiveNodeType(supertypes, entCache, ntdCache);
-                // make sure that all primary types except nt:base extend from nt:base
-                if (!ntd.isMixin() && !NameConstants.NT_BASE.equals(ntd.getName())
-                        && !est.includesNodeType(NameConstants.NT_BASE)) {
-                    String msg = "[" + name + "] all primary node types except"
-                            + " nt:base itself must be (directly or indirectly) derived from nt:base";
-                    log.debug(msg);
-                    throw new InvalidNodeTypeDefException(msg);
-                }
                 // check whether specified node type definition overrides
                 // a supertypes's primaryItem -> illegal (JCR-1947)
                 if (ntd.getPrimaryItemName() != null
@@ -1477,6 +1469,16 @@
                     throw new InvalidNodeTypeDefException(msg);
 
                 }
+                // make sure that all primary types except nt:base extend from nt:base
+                if (!ntd.isMixin() && !NameConstants.NT_BASE.equals(ntd.getName())
+                        && !est.includesNodeType(NameConstants.NT_BASE)) {
+                    // auto-subtype from nt:base
+                    Name[] s = new Name[supertypes.length + 1];
+                    System.arraycopy(supertypes, 0 ,s, 1, supertypes.length);
+                    s[0] = NameConstants.NT_BASE;
+                    supertypes = s;
+                    ntd.setSupertypes(s);
+                }
             } catch (NodeTypeConflictException ntce) {
                 String msg = "[" + name + "] failed to validate supertypes";
                 log.debug(msg);

Modified: jackrabbit/trunk/jackrabbit-core/src/main/resources/org/apache/jackrabbit/core/nodetype/builtin_nodetypes.cnd
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/resources/org/apache/jackrabbit/core/nodetype/builtin_nodetypes.cnd?rev=786003&r1=786002&r2=786003&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/resources/org/apache/jackrabbit/core/nodetype/builtin_nodetypes.cnd (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/resources/org/apache/jackrabbit/core/nodetype/builtin_nodetypes.cnd Thu Jun 18 10:17:23 2009
@@ -43,7 +43,7 @@
  * This abstract node type serves as the supertype of nt:file and nt:folder.
  * @since 1.0
  */
-[nt:hierarchyNode] > nt:base, mix:created
+[nt:hierarchyNode] > mix:created
   // abstract (currently fails due to JCR-2159)
 
 /**
@@ -70,7 +70,7 @@
  *
  * @since 1.0
  */
-[nt:linkedFile] > nt:base, nt:hierarchyNode
+[nt:linkedFile] > nt:hierarchyNode
   primaryitem jcr:content
   - jcr:content (REFERENCE) mandatory
 
@@ -83,7 +83,7 @@
  *
  * @since 1.0
  */
-[nt:folder] > nt:base, nt:hierarchyNode
+[nt:folder] > nt:hierarchyNode
   + * (nt:hierarchyNode) VERSION
 
 /**
@@ -92,7 +92,7 @@
  *
  * @since 1.0
  */
-[nt:resource] > nt:base, mix:mimeType, mix:lastModified
+[nt:resource] > mix:mimeType, mix:lastModified
   primaryitem jcr:data
   - jcr:data (BINARY) mandatory
   
@@ -331,7 +331,7 @@
 /**
  * @since 1.0
  */
-[nt:versionHistory] > nt:base, mix:referenceable
+[nt:versionHistory] > mix:referenceable
   - jcr:versionableUuid (STRING) mandatory autocreated protected ABORT
     /** @since 2.0 */
   - jcr:copiedFrom (WEAKREFERENCE) protected ABORT < 'nt:version'
@@ -348,7 +348,7 @@
 /**
  * @since 1.0
  */
-[nt:version] > nt:base, mix:referenceable
+[nt:version] > mix:referenceable
   - jcr:created (DATE) mandatory autocreated protected ABORT
   - jcr:predecessors (REFERENCE) protected multiple ABORT < 'nt:version'
   - jcr:successors (REFERENCE) protected multiple ABORT < 'nt:version'
@@ -359,7 +359,7 @@
 /**
  * @since 1.0
  */
-[nt:frozenNode] > nt:base, mix:referenceable
+[nt:frozenNode] > mix:referenceable
   orderable
   - jcr:frozenPrimaryType (NAME) mandatory autocreated protected ABORT
   - jcr:frozenMixinTypes (NAME) protected multiple ABORT
@@ -377,13 +377,13 @@
 /**
  * @since 2.0
  */
-[nt:activity] > nt:base, mix:referenceable
+[nt:activity] > mix:referenceable
   - jcr:activityTitle (STRING) mandatory autocreated PROTECTED
 
 /**
  * @since 2.0
  */
-[nt:configuration] > nt:base, mix:versionable
+[nt:configuration] > mix:versionable
   - jcr:root (REFERENCE) mandatory autocreated protected
 
 //------------------------------------------------------------------------------
@@ -557,7 +557,7 @@
 // User Management 
 // -----------------------------------------------------------------------------
 
-[rep:Authorizable] > nt:base, mix:referenceable
+[rep:Authorizable] > mix:referenceable
   abstract
   + * (rep:Authorizable) = rep:Authorizable protected VERSION
   + * (rep:AuthorizableFolder) = rep:AuthorizableFolder protected VERSION
@@ -577,7 +577,7 @@
 
 [rep:Group] > rep:Authorizable
 
-[rep:AuthorizableFolder] > nt:base, mix:referenceable
+[rep:AuthorizableFolder] > mix:referenceable
   + * (rep:Authorizable) = rep:User protected VERSION
   + * (rep:AuthorizableFolder) = rep:AuthorizableFolder protected VERSION
 

Modified: jackrabbit/trunk/jackrabbit-jcr-tests/src/main/resources/org/apache/jackrabbit/test/api/nodetype/spec/nt-folder.txt
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-tests/src/main/resources/org/apache/jackrabbit/test/api/nodetype/spec/nt-folder.txt?rev=786003&r1=786002&r2=786003&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-tests/src/main/resources/org/apache/jackrabbit/test/api/nodetype/spec/nt-folder.txt (original)
+++ jackrabbit/trunk/jackrabbit-jcr-tests/src/main/resources/org/apache/jackrabbit/test/api/nodetype/spec/nt-folder.txt Thu Jun 18 10:17:23 2009
@@ -1,7 +1,6 @@
 NodeTypeName
   nt:folder
 Supertypes
-  nt:base
   nt:hierarchyNode
 IsMixin
   false

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/compact/CompactNodeTypeDefWriter.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/compact/CompactNodeTypeDefWriter.java?rev=786003&r1=786002&r2=786003&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/compact/CompactNodeTypeDefWriter.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/compact/CompactNodeTypeDefWriter.java Thu Jun 18 10:17:23 2009
@@ -26,10 +26,13 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
+import java.util.TreeSet;
 
 import javax.jcr.NamespaceException;
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.nodetype.NodeTypeDefinition;
 import javax.jcr.query.qom.QueryObjectModelConstants;
 import javax.jcr.version.OnParentVersionAction;
 
@@ -39,12 +42,16 @@
 import org.apache.jackrabbit.spi.QPropertyDefinition;
 import org.apache.jackrabbit.spi.QValue;
 import org.apache.jackrabbit.spi.QValueConstraint;
+import org.apache.jackrabbit.spi.commons.QNodeTypeDefinitionImpl;
 import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.commons.conversion.DefaultNamePathResolver;
 import org.apache.jackrabbit.spi.commons.name.NameConstants;
 import org.apache.jackrabbit.spi.commons.namespace.NamespaceResolver;
+import org.apache.jackrabbit.spi.commons.namespace.SessionNamespaceResolver;
 import org.apache.jackrabbit.spi.commons.nodetype.InvalidConstraintException;
 import org.apache.jackrabbit.spi.commons.nodetype.constraint.ValueConstraint;
 import org.apache.jackrabbit.spi.commons.query.qom.Operator;
+import org.apache.jackrabbit.spi.commons.value.QValueFactoryImpl;
 import org.apache.jackrabbit.spi.commons.value.ValueFormat;
 import org.apache.jackrabbit.util.ISO9075;
 
@@ -62,8 +69,6 @@
  */
 public class CompactNodeTypeDefWriter {
 
-    // TODO: valueFactory not needed any more -> remove from constructor and write calls...
-
     /**
      * the indention string
      */
@@ -95,6 +100,30 @@
     private final Set<String> usedNamespaces = new HashSet<String>();
 
     /**
+     * Creates a new nodetype writer based on a session
+     *
+     * @param out the underlaying writer
+     * @param s repository session
+     * @param includeNS if <code>true</code> all used namespace decl. are also
+     *                  written to the writer
+     */
+    public CompactNodeTypeDefWriter(Writer out, Session s, boolean includeNS) {
+        this(out, new SessionNamespaceResolver(s), new DefaultNamePathResolver(s), includeNS);
+    }
+
+    /**
+     * Creates a new nodetype writer based on a namespace resolver
+     *
+     * @param out the underlaying writer
+     * @param r the naespace resolver
+     * @param includeNS if <code>true</code> all used namespace decl. are also
+     *                  written to the writer
+     */
+    public CompactNodeTypeDefWriter(Writer out, NamespaceResolver r, boolean includeNS) {
+        this(out, r, new DefaultNamePathResolver(r), includeNS);
+    }
+
+    /**
      * Creates a new nodetype writer that does not include namepsaces.
      *
      * @param out the underlaying writer
@@ -114,6 +143,7 @@
      * @param r the naespace resolver
      * @param npResolver name-path resolver
      * @param includeNS if <code>true</code> all used namespace decl. are also
+     *                  written to the writer
      */
     public CompactNodeTypeDefWriter(Writer out,
                                     NamespaceResolver r,
@@ -168,7 +198,7 @@
     }
 
     /**
-     * Write one QNodeTypeDefinition to this writer
+     * Write a collection of QNodeTypeDefinitions to this writer
      *
      * @param defs node type definitions
      * @throws IOException if an I/O error occurs
@@ -180,6 +210,20 @@
     }
 
     /**
+     * Write one NodeTypeDefinition to this writer
+     *
+     * @param nt node type definition
+     * @throws IOException if an I/O error occurs
+     */
+    public void write(NodeTypeDefinition nt) throws IOException {
+        try {
+            write(new QNodeTypeDefinitionImpl(nt, npResolver, QValueFactoryImpl.getInstance()));
+        } catch (RepositoryException e) {
+            throw new IOException("Error during internal conversion of nodetype definition:" + e.toString());
+        }
+    }
+
+    /**
      * Flushes all pending write operations and Closes this writer. please note,
      * that the underlying writer remains open.
      *
@@ -214,11 +258,20 @@
      * @throws IOException if an I/O error occurs
      */
     private void writeSupertypes(QNodeTypeDefinition ntd) throws IOException {
-        String delim = " > ";
+        // get ordered list of supertypes, omitting nt:Base
+        TreeSet<Name> supertypes = new TreeSet<Name>();
         for (Name name : ntd.getSupertypes()) {
-            out.write(delim);
-            out.write(resolve(name));
-            delim = ", ";
+            if (!name.equals(NameConstants.NT_BASE)) {
+                supertypes.add(name);
+            }
+        }
+        if (!supertypes.isEmpty()) {
+            String delim = " > ";
+            for (Name name : supertypes) {
+                out.write(delim);
+                out.write(resolve(name));
+                delim = ", ";
+            }
         }
     }