Index: C:/src/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDef.java =================================================================== --- C:/src/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDef.java (revision 418367) +++ C:/src/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDef.java (working copy) @@ -69,7 +69,7 @@ if (dependencies == null) { dependencies = new HashSet(); // supertypes - dependencies.addAll(supertypes); + dependencies.addAll(Arrays.asList(getSupertypes())); // child node definitions for (Iterator iter = nodeDefs.iterator(); iter.hasNext();) { NodeDef nd = (NodeDef) iter.next(); @@ -192,17 +192,21 @@ } /** - * Returns an array containing the names of the supertypes or - * null if not set. + * Returns an array containing the names of the supertypes. If no + * supertypes have been set, then nt:base or an empty + * array is returned depending on whether type defined type is a + * mixin type or nt:base itself. * - * @return an array listing the names of the supertypes or - * null if not set. + * @return an array listing the names of the supertypes (if any) */ public QName[] getSupertypes() { - if (supertypes.isEmpty()) { + if (!supertypes.isEmpty()) { + return (QName[]) supertypes.toArray(new QName[supertypes.size()]); + } else if (isMixin() || QName.NT_BASE.equals(getName())) { return QName.EMPTY_ARRAY; + } else { + return new QName[] { QName.NT_BASE }; } - return (QName[]) supertypes.toArray(new QName[supertypes.size()]); } /** @@ -282,7 +286,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) + && equals(getSupertypes(), other.getSupertypes()) && mixin == other.mixin && orderableChildNodes == other.orderableChildNodes && propDefs.equals(other.propDefs) @@ -291,6 +295,12 @@ return false; } + private static boolean equals(QName[] a, QName[] b) { + Arrays.sort(a); + Arrays.sort(b); + return Arrays.equals(a, b); + } + /** * Returns zero to satisfy the Object equals/hashCode contract. * This class is mutable and not meant to be used as a hash key.