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 mr...@apache.org on 2012/10/31 09:49:05 UTC
svn commit: r1404038 - in /jackrabbit/oak/trunk:
oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/
oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/
Author: mreutegg
Date: Wed Oct 31 08:49:04 2012
New Revision: 1404038
URL: http://svn.apache.org/viewvc?rev=1404038&view=rev
Log:
OAK-66: JCR Node Type Management
- use correct node type for child node based on child node definitions when no type is given on addNode()
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/DefinitionProvider.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ReadOnlyNodeTypeManager.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/DefinitionProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/DefinitionProvider.java?rev=1404038&r1=1404037&r2=1404038&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/DefinitionProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/DefinitionProvider.java Wed Oct 31 08:49:04 2012
@@ -32,6 +32,22 @@ public interface DefinitionProvider {
@Nonnull
NodeDefinition getRootDefinition() throws RepositoryException;
+ /**
+ * Returns the node definition for a child node of <code>parent</code> named
+ * <code>nodeName</code> with a default primary type. First the non-residual
+ * child node definitions of <code>parent</code> are checked matching the
+ * given node name. Then the residual definitions are checked.
+ *
+ * @param parent the parent node.
+ * @param nodeName the name of the child node.
+ * @return the applicable node definition.
+ * @throws RepositoryException if there is no applicable node definition
+ * with a default primary type.
+ */
+ @Nonnull
+ NodeDefinition getDefinition(@Nonnull Node parent, @Nonnull String nodeName)
+ throws RepositoryException;
+
@Nonnull
NodeDefinition getDefinition(Node parent, Node targetNode) throws RepositoryException;
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ReadOnlyNodeTypeManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ReadOnlyNodeTypeManager.java?rev=1404038&r1=1404037&r2=1404038&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ReadOnlyNodeTypeManager.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ReadOnlyNodeTypeManager.java Wed Oct 31 08:49:04 2012
@@ -54,6 +54,8 @@ import org.apache.jackrabbit.oak.util.No
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
import static javax.jcr.PropertyType.UNDEFINED;
import static org.apache.jackrabbit.JcrConstants.JCR_MIXINTYPES;
import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
@@ -287,6 +289,36 @@ public abstract class ReadOnlyNodeTypeMa
return new RootNodeDefinition(this);
}
+ @Nonnull
+ @Override
+ public NodeDefinition getDefinition(@Nonnull Node parent,
+ @Nonnull String nodeName)
+ throws RepositoryException {
+ checkNotNull(parent);
+ checkNotNull(nodeName);
+ List<NodeDefinition> residualDefs = new ArrayList<NodeDefinition>();
+ for (NodeType nt : getEffectiveNodeTypes(parent)) {
+ for (NodeDefinition def : nt.getDeclaredChildNodeDefinitions()) {
+ String defName = def.getName();
+ if (nodeName.equals(defName)
+ && def.getDefaultPrimaryTypeName() != null) {
+ return def;
+ } else if ("*".equals(defName)) {
+ residualDefs.add(def);
+ }
+ }
+ }
+
+ for (NodeDefinition def : residualDefs) {
+ if (def.getDefaultPrimaryTypeName() != null) {
+ // return the first definition with a default primary type
+ return def;
+ }
+ }
+
+ throw new RepositoryException("No matching node definition found for " + this);
+ }
+
@Override
public NodeDefinition getDefinition(@Nonnull Node parent, @Nonnull Node targetNode) throws RepositoryException {
String name = targetNode.getName();
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java?rev=1404038&r1=1404037&r2=1404038&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java Wed Oct 31 08:49:04 2012
@@ -73,6 +73,7 @@ import org.apache.jackrabbit.oak.api.Tre
import org.apache.jackrabbit.oak.api.Tree.Status;
import org.apache.jackrabbit.oak.commons.PathUtils;
import org.apache.jackrabbit.oak.plugins.identifier.IdentifierManager;
+import org.apache.jackrabbit.oak.plugins.nodetype.DefinitionProvider;
import org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants;
import org.apache.jackrabbit.oak.util.TODO;
import org.apache.jackrabbit.value.ValueHelper;
@@ -244,8 +245,17 @@ public class NodeImpl extends ItemImpl<N
throw new ItemExistsException(relPath);
}
- // TODO retrieve matching nt from effective definition based on name-matching.
- String ntName = primaryNodeTypeName == null ? NodeType.NT_UNSTRUCTURED : primaryNodeTypeName;
+ String ntName = primaryNodeTypeName;
+ if (ntName == null) {
+ DefinitionProvider dp = sessionDelegate.getDefinitionProvider();
+ try {
+ ntName = dp.getDefinition(new NodeImpl(parent),
+ PathUtils.getName(relPath)).getDefaultPrimaryTypeName();
+ } catch (RepositoryException e) {
+ throw new ConstraintViolationException(
+ "no matching child node definition found for " + relPath);
+ }
+ }
// TODO: figure out the right place for this check
NodeTypeManager ntm = sessionDelegate.getNodeTypeManager();