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 2006/07/18 14:40:50 UTC

svn commit: r423074 - in /jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype: ./ compact/ xml/

Author: jukka
Date: Tue Jul 18 05:40:50 2006
New Revision: 423074

URL: http://svn.apache.org/viewvc?rev=423074&view=rev
Log:
JCR-433: Make primary NodeTypeDefs automatically subtype nt:base

Modified:
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDef.java
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefReader.java
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefWriter.java
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/xml/NodeTypeWriter.java

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java?rev=423074&r1=423073&r2=423074&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java Tue Jul 18 05:40:50 2006
@@ -198,7 +198,7 @@
 
         // resolve supertypes recursively
         QName[] supertypes = ntd.getSupertypes();
-        if (supertypes != null && supertypes.length > 0) {
+        if (supertypes.length > 0) {
             ent.internalMerge(NodeTypeRegistry.getEffectiveNodeType(supertypes, entCache, ntdCache), true);
         }
 

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDef.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDef.java?rev=423074&r1=423073&r2=423074&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDef.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDef.java Tue Jul 18 05:40:50 2006
@@ -24,6 +24,8 @@
 import java.util.HashSet;
 import java.util.Set;
 import java.util.Iterator;
+import java.util.SortedSet;
+import java.util.TreeSet;
 
 /**
  * A <code>NodeTypeDef</code> holds the definition of a node type.
@@ -31,7 +33,13 @@
 public class NodeTypeDef implements Cloneable {
 
     private QName name;
-    private HashSet supertypes;
+
+    /**
+     * Ordered array of supertype names. Empty if no supertypes have been
+     * specified. Never <code>null</code>.
+     */
+    private QName[] supertypes;
+
     private boolean mixin;
     private boolean orderableChildNodes;
     private QName primaryItemName;
@@ -48,7 +56,7 @@
         primaryItemName = null;
         nodeDefs = new HashSet();
         propDefs = new HashSet();
-        supertypes = new HashSet();
+        supertypes = QName.EMPTY_ARRAY;
         mixin = false;
         orderableChildNodes = false;
     }
@@ -69,7 +77,7 @@
         if (dependencies == null) {
             dependencies = new HashSet();
             // supertypes
-            dependencies.addAll(supertypes);
+            dependencies.addAll(Arrays.asList(supertypes));
             // child node definitions
             for (Iterator iter = nodeDefs.iterator(); iter.hasNext();) {
                 NodeDef nd = (NodeDef) iter.next();
@@ -127,8 +135,17 @@
      */
     public void setSupertypes(QName[] names) {
         resetDependencies();
-        supertypes.clear();
-        supertypes.addAll(Arrays.asList(names));
+        // Optimize common cases (zero or one supertypes)
+        if (names.length == 0) {
+            supertypes = QName.EMPTY_ARRAY;
+        } else if (names.length == 1) {
+            supertypes = new QName[] { names[0] };
+        } else {
+            // Sort and remove duplicates
+            SortedSet types = new TreeSet();
+            types.addAll(Arrays.asList(names));
+            supertypes = (QName[]) types.toArray(new QName[types.size()]);
+        }
     }
 
     /**
@@ -192,17 +209,22 @@
     }
 
     /**
-     * Returns an array containing the names of the supertypes or
-     * <code>null</code> if not set.
+     * Returns an array containing the names of the supertypes. If no
+     * supertypes have been specified, then an empty array is returned
+     * for mixin types and the <code>nt:base</code> primary type and
+     * an array containing just <code>nt:base<code> for other primary types.
+     * <p>
+     * The returned array must not be modified by the application.
      *
-     * @return an array listing the names of the supertypes or
-     *         <code>null</code> if not set.
+     * @return a sorted array of supertype names
      */
     public QName[] getSupertypes() {
-        if (supertypes.isEmpty()) {
-            return QName.EMPTY_ARRAY;
+        if (supertypes.length > 0
+                || isMixin() || QName.NT_BASE.equals(getName())) {
+            return supertypes;
+        } else {
+            return new QName[] { QName.NT_BASE };
         }
-        return (QName[]) supertypes.toArray(new QName[supertypes.size()]);
     }
 
     /**
@@ -266,7 +288,7 @@
         NodeTypeDef clone = new NodeTypeDef();
         clone.name = name;
         clone.primaryItemName = primaryItemName;
-        clone.supertypes = (HashSet) supertypes.clone();
+        clone.supertypes = supertypes; // immutable, thus ok to share
         clone.mixin = mixin;
         clone.orderableChildNodes = orderableChildNodes;
         clone.nodeDefs = (HashSet) nodeDefs.clone();
@@ -282,7 +304,7 @@
             NodeTypeDef other = (NodeTypeDef) obj;
             return (name == null ? other.name == null : name.equals(other.name))
                     && (primaryItemName == null ? other.primaryItemName == null : primaryItemName.equals(other.primaryItemName))
-                    && supertypes.equals(other.supertypes)
+                    && Arrays.equals(getSupertypes(), other.getSupertypes())
                     && mixin == other.mixin
                     && orderableChildNodes == other.orderableChildNodes
                     && propDefs.equals(other.propDefs)

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java?rev=423074&r1=423073&r2=423074&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java Tue Jul 18 05:40:50 2006
@@ -1026,7 +1026,7 @@
 
                 NodeTypeDef ntd = (NodeTypeDef) ntDefCache.get(nt);
                 QName[] sta = ntd.getSupertypes();
-                if (sta != null && sta.length > 0) {
+                if (sta.length > 0) {
                     // check recursively
                     inheritanceChain.push(nt);
                     checkForCircularInheritance(sta, inheritanceChain, ntDefCache);
@@ -1307,7 +1307,7 @@
 
         // validate supertypes
         QName[] supertypes = ntd.getSupertypes();
-        if (supertypes != null && supertypes.length > 0) {
+        if (supertypes.length > 0) {
             for (int i = 0; i < supertypes.length; i++) {
                 checkNamespace(supertypes[i], nsReg);
                 /**
@@ -1348,7 +1348,7 @@
          * build effective (i.e. merged and resolved) node type from supertypes
          * and check for conflicts
          */
-        if (supertypes != null && supertypes.length > 0) {
+        if (supertypes.length > 0) {
             try {
                 EffectiveNodeType est = getEffectiveNodeType(supertypes, entCache, ntdCache);
                 // make sure that all primary types except nt:base extend from nt:base
@@ -1367,14 +1367,6 @@
                 String msg = "[" + name + "] failed to validate supertypes";
                 log.debug(msg);
                 throw new InvalidNodeTypeDefException(msg, nsnte);
-            }
-        } else {
-            // no supertypes specified: has to be either a mixin type or nt:base
-            if (!ntd.isMixin() && !QName.NT_BASE.equals(ntd.getName())) {
-                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);
             }
         }
 

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefReader.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefReader.java?rev=423074&r1=423073&r2=423074&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefReader.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefReader.java Tue Jul 18 05:40:50 2006
@@ -204,11 +204,6 @@
             doNodeTypeName(ntd);
             doSuperTypes(ntd);
             doOptions(ntd);
-            // add nt:base to supertypes if not mixin and does not define
-            // any supertype yet.
-            if (!ntd.isMixin() && ntd.getSupertypes().length == 0) {
-                ntd.setSupertypes(new QName[]{QName.NT_BASE});
-            }
             doItemDefs(ntd);
             nodeTypeDefs.add(ntd);
         }

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefWriter.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefWriter.java?rev=423074&r1=423073&r2=423074&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefWriter.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/compact/CompactNodeTypeDefWriter.java Tue Jul 18 05:40:50 2006
@@ -170,14 +170,12 @@
      */
     private void writeSupertypes(NodeTypeDef ntd) throws IOException {
         QName[] sta = ntd.getSupertypes();
-        if (sta != null) {
-            String delim = " > ";
-            for (int i = 0; i < sta.length; i++) {
-                if (!sta[i].equals(QName.NT_BASE)) {
-                    out.write(delim);
-                    out.write(resolve(sta[i]));
-                    delim = ", ";
-                }
+        String delim = " > ";
+        for (int i = 0; i < sta.length; i++) {
+            if (!sta[i].equals(QName.NT_BASE)) {
+                out.write(delim);
+                out.write(resolve(sta[i]));
+                delim = ", ";
             }
         }
     }

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/xml/NodeTypeWriter.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/xml/NodeTypeWriter.java?rev=423074&r1=423073&r2=423074&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/xml/NodeTypeWriter.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/xml/NodeTypeWriter.java Tue Jul 18 05:40:50 2006
@@ -136,7 +136,7 @@
 
         // supertype declarations
         QName[] supertypes = def.getSupertypes();
-        if (supertypes != null && supertypes.length > 0) {
+        if (supertypes.length > 0) {
             builder.startElement(Constants.SUPERTYPES_ELEMENT);
             for (int i = 0; i < supertypes.length; i++) {
                 builder.addContentElement(