You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by md...@apache.org on 2012/09/20 11:21:07 UTC
svn commit: r1387929 -
/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/cnd/CndImporter.java
Author: mduerig
Date: Thu Sep 20 09:21:07 2012
New Revision: 1387929
URL: http://svn.apache.org/viewvc?rev=1387929&view=rev
Log:
JCR-3430: CNDImporter should handle implied nt:base
Modified:
jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/cnd/CndImporter.java
Modified: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/cnd/CndImporter.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/cnd/CndImporter.java?rev=1387929&r1=1387928&r2=1387929&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/cnd/CndImporter.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/cnd/CndImporter.java Thu Sep 20 09:21:07 2012
@@ -19,7 +19,9 @@ package org.apache.jackrabbit.commons.cn
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import javax.jcr.NamespaceRegistry;
import javax.jcr.RepositoryException;
@@ -27,15 +29,19 @@ import javax.jcr.Session;
import javax.jcr.UnsupportedRepositoryOperationException;
import javax.jcr.ValueFactory;
import javax.jcr.Workspace;
+import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.nodetype.InvalidNodeTypeDefinitionException;
import javax.jcr.nodetype.NodeDefinitionTemplate;
import javax.jcr.nodetype.NodeType;
+import javax.jcr.nodetype.NodeTypeDefinition;
import javax.jcr.nodetype.NodeTypeExistsException;
import javax.jcr.nodetype.NodeTypeIterator;
import javax.jcr.nodetype.NodeTypeManager;
import javax.jcr.nodetype.NodeTypeTemplate;
import javax.jcr.nodetype.PropertyDefinitionTemplate;
+import static org.apache.jackrabbit.JcrConstants.NT_BASE;
+
/**
* Utility class for importing compact node type definitions.
* @see CompactNodeTypeDefReader
@@ -141,22 +147,20 @@ public final class CndImporter {
CompactNodeTypeDefReader<NodeTypeTemplate, NamespaceRegistry> cndReader =
new CompactNodeTypeDefReader<NodeTypeTemplate, NamespaceRegistry>(cnd, systemId, factory);
- List<NodeTypeTemplate> ntts = cndReader.getNodeTypeDefinitions();
+ Map<String, NodeTypeTemplate> templates = new HashMap<String, NodeTypeTemplate>();
+ for (NodeTypeTemplate template : cndReader.getNodeTypeDefinitions()) {
+ templates.put(template.getName(), template);
+ }
- NodeTypeIterator registered;
- if (reregisterExisting) {
- registered = nodeTypeManager.registerNodeTypes(ntts.toArray(new NodeTypeTemplate[ntts.size()]), true);
- } else {
- List<NodeTypeTemplate> toRegister = new ArrayList<NodeTypeTemplate>(ntts.size());
- for (NodeTypeTemplate ntt : ntts) {
- if (!nodeTypeManager.hasNodeType(ntt.getName())) {
- toRegister.add(ntt);
- }
+ List<NodeTypeTemplate> toRegister = new ArrayList<NodeTypeTemplate>(templates.size());
+ for (NodeTypeTemplate ntt : templates.values()) {
+ if (reregisterExisting || !nodeTypeManager.hasNodeType(ntt.getName())) {
+ ensureNtBase(ntt, templates, nodeTypeManager);
+ toRegister.add(ntt);
}
-
- registered = nodeTypeManager.registerNodeTypes(toRegister.toArray(new NodeTypeTemplate[toRegister.size()]), true);
}
-
+ NodeTypeIterator registered = nodeTypeManager.registerNodeTypes(
+ toRegister.toArray(new NodeTypeTemplate[toRegister.size()]), true);
return toArray(registered);
}
finally {
@@ -164,6 +168,34 @@ public final class CndImporter {
}
}
+ private static void ensureNtBase(NodeTypeTemplate ntt, Map<String, NodeTypeTemplate> templates,
+ NodeTypeManager nodeTypeManager) throws RepositoryException {
+ if (!ntt.isMixin() && !NT_BASE.equals(ntt.getName())) {
+ String[] supertypes = ntt.getDeclaredSupertypeNames();
+ if (supertypes.length == 0) {
+ ntt.setDeclaredSuperTypeNames(new String[] {NT_BASE});
+ } else {
+ // Check whether we need to add the implicit "nt:base" supertype
+ boolean needsNtBase = true;
+ for (String name : supertypes) {
+ NodeTypeDefinition std = templates.get(name);
+ if (std == null) {
+ std = nodeTypeManager.getNodeType(name);
+ }
+ if (std != null && !std.isMixin()) {
+ needsNtBase = false;
+ }
+ }
+ if (needsNtBase) {
+ String[] withNtBase = new String[supertypes.length + 1];
+ withNtBase[0] = NT_BASE;
+ System.arraycopy(supertypes, 0, withNtBase, 1, supertypes.length);
+ ntt.setDeclaredSuperTypeNames(withNtBase);
+ }
+ }
+ }
+ }
+
// -----------------------------------------------------< private >---
private static NodeType[] toArray(NodeTypeIterator nodeTypes) {