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 ju...@apache.org on 2012/07/23 10:51:10 UTC

svn commit: r1364543 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins: name/ type/

Author: jukka
Date: Mon Jul 23 08:51:10 2012
New Revision: 1364543

URL: http://svn.apache.org/viewvc?rev=1364543&view=rev
Log:
OAK-66: JCR Node Type Management

Content-based NodeTypeManagerImpl

Added:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/NodeTypeManagerImpl.java   (with props)
Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/NamespaceRegistryImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/ItemDefinitionImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/NodeTypeTemplateImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/NodeUtil.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/PropertyDefinitionImpl.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/NamespaceRegistryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/NamespaceRegistryImpl.java?rev=1364543&r1=1364542&r2=1364543&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/NamespaceRegistryImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/NamespaceRegistryImpl.java Mon Jul 23 08:51:10 2012
@@ -75,16 +75,16 @@ public class NamespaceRegistryImpl imple
 
     @Override
     public void unregisterNamespace(String prefix) throws RepositoryException {
+        Root root = session.getCurrentRoot();
+        Tree namespaces = root.getTree("/jcr:system/jcr:namespaces");
+        if (namespaces == null || !namespaces.hasProperty(prefix)) {
+            throw new NamespaceException(
+                    "Namespace mapping from " + prefix + " to "
+                    + getURI(prefix) + " can not be unregistered");
+        }
+
         try {
-            Root root = session.getCurrentRoot();
-            Tree namespaces = getOrCreate(root, "jcr:system", Namespaces.NSMAPNODENAME);
-            if (namespaces.hasProperty(prefix)) {
-                namespaces.removeProperty(prefix);
-            } else {
-                throw new NamespaceException(
-                        "Namespace mapping from " + prefix + " to "
-                        + getURI(prefix) + " can not be unregistered");
-            }
+            namespaces.removeProperty(prefix);
             root.commit(DefaultConflictHandler.OURS);
             refresh();
         } catch (NamespaceValidatorException e) {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/ItemDefinitionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/ItemDefinitionImpl.java?rev=1364543&r1=1364542&r2=1364543&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/ItemDefinitionImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/ItemDefinitionImpl.java Mon Jul 23 08:51:10 2012
@@ -16,17 +16,13 @@
  */
 package org.apache.jackrabbit.oak.plugins.type;
 
-import static javax.jcr.version.OnParentVersionAction.ACTIONNAME_ABORT;
-import static javax.jcr.version.OnParentVersionAction.ACTIONNAME_COMPUTE;
-import static javax.jcr.version.OnParentVersionAction.ACTIONNAME_COPY;
-import static javax.jcr.version.OnParentVersionAction.ACTIONNAME_IGNORE;
-import static javax.jcr.version.OnParentVersionAction.ACTIONNAME_INITIALIZE;
-import static javax.jcr.version.OnParentVersionAction.ACTIONNAME_VERSION;
-
 import javax.jcr.nodetype.ItemDefinition;
 import javax.jcr.nodetype.NodeType;
 import javax.jcr.version.OnParentVersionAction;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 /**
  * <pre>
  * [nt:{propertyDefinition,childNodeDefinition}]
@@ -41,6 +37,9 @@ import javax.jcr.version.OnParentVersion
  */
 class ItemDefinitionImpl implements ItemDefinition {
 
+    private static final Logger log =
+            LoggerFactory.getLogger(ItemDefinitionImpl.class);
+
     private final NodeType type;
 
     protected final NodeUtil node;
@@ -72,18 +71,12 @@ class ItemDefinitionImpl implements Item
 
     @Override
     public int getOnParentVersion() {
-        String opv = node.getString("jcr:onParentVersion", ACTIONNAME_COPY);
-        if (ACTIONNAME_ABORT.equalsIgnoreCase(opv)) {
-            return OnParentVersionAction.ABORT;
-        } else if (ACTIONNAME_COMPUTE.equalsIgnoreCase(opv)) {
-            return OnParentVersionAction.COMPUTE;
-        } else if (ACTIONNAME_IGNORE.equalsIgnoreCase(opv)) {
-            return OnParentVersionAction.IGNORE;
-        } else if (ACTIONNAME_INITIALIZE.equalsIgnoreCase(opv)) {
-            return OnParentVersionAction.INITIALIZE;
-        } else if (ACTIONNAME_VERSION.equalsIgnoreCase(opv)) {
-            return OnParentVersionAction.VERSION;
-        } else {
+        try {
+            return OnParentVersionAction.valueFromName(node.getString(
+                    "jcr:onParentVersion",
+                    OnParentVersionAction.ACTIONNAME_COPY));
+        } catch (IllegalArgumentException e) {
+            log.warn("Unexpected jcr:onParentVersion value", e);
             return OnParentVersionAction.COPY;
         }
     }

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/NodeTypeManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/NodeTypeManagerImpl.java?rev=1364543&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/NodeTypeManagerImpl.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/NodeTypeManagerImpl.java Mon Jul 23 08:51:10 2012
@@ -0,0 +1,374 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.type;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.List;
+import java.util.Map;
+
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+import javax.jcr.Value;
+import javax.jcr.ValueFactory;
+import javax.jcr.nodetype.ItemDefinition;
+import javax.jcr.nodetype.NoSuchNodeTypeException;
+import javax.jcr.nodetype.NodeDefinition;
+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.PropertyDefinition;
+import javax.jcr.nodetype.PropertyDefinitionTemplate;
+import javax.jcr.version.OnParentVersionAction;
+
+import org.apache.jackrabbit.commons.cnd.CompactNodeTypeDefReader;
+import org.apache.jackrabbit.commons.iterator.NodeTypeIteratorAdapter;
+import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.api.ContentSession;
+import org.apache.jackrabbit.oak.api.CoreValueFactory;
+import org.apache.jackrabbit.oak.api.Root;
+import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.core.DefaultConflictHandler;
+import org.apache.jackrabbit.oak.namepath.NameMapper;
+
+import com.google.common.collect.Lists;
+
+public class NodeTypeManagerImpl implements NodeTypeManager {
+
+    private final ContentSession session;
+
+    private final NameMapper mapper;
+
+    private final ValueFactory factory;
+
+    public NodeTypeManagerImpl(
+            ContentSession session, NameMapper mapper, ValueFactory factory) {
+        this.session = session;
+        this.mapper = mapper;
+        this.factory = factory;
+
+        try {
+            InputStream stream = NodeTypeManagerImpl.class.getResourceAsStream(
+                    "builtin_nodetypes.cnd");
+            try {
+                CompactNodeTypeDefReader<NodeTypeTemplate, Map<String, String>> reader =
+                        new CompactNodeTypeDefReader<NodeTypeTemplate, Map<String, String>>(
+                                new InputStreamReader(stream, "UTF-8"), null, new DefBuilderFactory());
+                registerNodeTypes(reader.getNodeTypeDefinitions().toArray(
+                        new NodeTypeTemplate[0]), true);
+            } finally {
+                stream.close();
+            }
+        } catch (Exception e) {
+            throw new IllegalStateException(
+                    "Unable to load built-in node types", e);
+        }
+}
+
+    protected String getOakName(String name) throws RepositoryException {
+        return name; // TODO
+    }
+
+    /**
+     * Called by the {@link NodeTypeManager} implementation methods to
+     * refresh the state of the session associated with this instance.
+     * That way the session is kept in sync with the latest global state
+     * seen by the node type manager.
+     *
+     * @throws RepositoryException if the session could not be refreshed
+     */
+    protected void refresh() throws RepositoryException {
+    }
+
+    //---------------------------------------------------< NodeTypeManager >--
+
+    @Override
+    public boolean hasNodeType(String name) throws RepositoryException {
+        Tree types = session.getCurrentRoot().getTree(
+                "/jcr:system/jcr:nodeTypes");
+        return types != null && types.hasChild(mapper.getOakName(name));
+    }
+
+    @Override
+    public NodeType getNodeType(String name) throws RepositoryException {
+        Tree types = session.getCurrentRoot().getTree(
+                "/jcr:system/jcr:nodeTypes");
+        if (types != null) {
+            Tree type = types.getChild(mapper.getOakName(name));
+            if (type != null) {
+                return new NodeTypeImpl(this, new NodeUtil(
+                        session.getCoreValueFactory(), mapper, type));
+            }
+        }
+        throw new NoSuchNodeTypeException(name);
+    }
+
+    @Override
+    public NodeTypeIterator getAllNodeTypes() throws RepositoryException {
+        List<NodeType> list = Lists.newArrayList();
+        Tree types = session.getCurrentRoot().getTree(
+                "/jcr:system/jcr:nodeTypes");
+        if (types != null) {
+            for (Tree type : types.getChildren()) {
+                list.add(new NodeTypeImpl(this, new NodeUtil(
+                        session.getCoreValueFactory(), mapper, type)));
+                
+            }
+        }
+        return new NodeTypeIteratorAdapter(list);
+    }
+
+    @Override
+    public NodeTypeIterator getPrimaryNodeTypes() throws RepositoryException {
+        List<NodeType> list = Lists.newArrayList();
+        NodeTypeIterator iterator = getAllNodeTypes();
+        while (iterator.hasNext()) {
+            NodeType type = iterator.nextNodeType();
+            if (!type.isMixin()) {
+                list.add(type);
+            }
+        }
+        return new NodeTypeIteratorAdapter(list);
+    }
+
+    @Override
+    public NodeTypeIterator getMixinNodeTypes() throws RepositoryException {
+        List<NodeType> list = Lists.newArrayList();
+        NodeTypeIterator iterator = getAllNodeTypes();
+        while (iterator.hasNext()) {
+            NodeType type = iterator.nextNodeType();
+            if (type.isMixin()) {
+                list.add(type);
+            }
+        }
+        return new NodeTypeIteratorAdapter(list);
+    }
+
+    @Override
+    public NodeTypeTemplate createNodeTypeTemplate() throws RepositoryException {
+        return new NodeTypeTemplateImpl(this, factory);
+    }
+
+    @Override
+    public NodeTypeTemplate createNodeTypeTemplate(NodeTypeDefinition ntd) throws RepositoryException {
+        return new NodeTypeTemplateImpl(this, factory, ntd);
+    }
+
+    @Override
+    public NodeDefinitionTemplate createNodeDefinitionTemplate() {
+        return new NodeDefinitionTemplateImpl();
+    }
+
+    @Override
+    public PropertyDefinitionTemplate createPropertyDefinitionTemplate() {
+        return new PropertyDefinitionTemplateImpl();
+    }
+
+    @Override
+    public NodeType registerNodeType(NodeTypeDefinition ntd, boolean allowUpdate) throws RepositoryException {
+        // TODO proper node type registration... (OAK-66)
+        Root root = session.getCurrentRoot();
+        Tree types = getOrCreateNodeTypes(root);
+        try {
+            NodeType type = internalRegister(types, ntd, allowUpdate);
+            root.commit(DefaultConflictHandler.OURS);
+            return type;
+        } catch (CommitFailedException e) {
+            throw new RepositoryException(e);
+        }
+    }
+
+    @Override
+    public NodeTypeIterator registerNodeTypes(NodeTypeDefinition[] ntds, boolean allowUpdate) throws RepositoryException {
+        // TODO handle inter-type dependencies (OAK-66)
+        Root root = session.getCurrentRoot();
+        Tree types = getOrCreateNodeTypes(root);
+        try {
+            List<NodeType> list = Lists.newArrayList();
+            for (int i = 0; i < ntds.length; i++) {
+                list.add(internalRegister(types, ntds[i], allowUpdate));
+            }
+            root.commit(DefaultConflictHandler.OURS);
+            return new NodeTypeIteratorAdapter(list);
+        } catch (CommitFailedException e) {
+            throw new RepositoryException(e);
+        }
+    }
+
+    private NodeType internalRegister(
+            Tree types, NodeTypeDefinition ntd, boolean allowUpdate)
+            throws RepositoryException {
+        String jcrName = ntd.getName();
+        String oakName = mapper.getOakName(jcrName);
+
+        Tree type = types.getChild(oakName);
+        if (type != null) {
+            if (allowUpdate) {
+                type.remove();
+            } else {
+                throw new NodeTypeExistsException(
+                        "Node type " + jcrName + " already exists");
+            }
+        }
+        type = types.addChild(oakName);
+
+        CoreValueFactory factory = session.getCoreValueFactory();
+        NodeUtil node = new NodeUtil(factory, mapper, type);
+        node.setName("jcr:nodeTypeName", jcrName);
+        node.setNames("jcr:supertypes", ntd.getDeclaredSupertypeNames());
+        node.setBoolean("jcr:isAbstract", ntd.isAbstract());
+        node.setBoolean("jcr:isQueryable", ntd.isQueryable());
+        node.setBoolean("jcr:isMixin", ntd.isMixin());
+        node.setBoolean("jcr:hasOrderableChildNodes", ntd.hasOrderableChildNodes());
+        String primaryItemName = ntd.getPrimaryItemName();
+        if (primaryItemName != null) {
+            node.setName("jcr:primaryItemName", primaryItemName);
+        }
+
+        Tree props = type.addChild("jcr:propertyDefinition");
+        for (PropertyDefinition pd : ntd.getDeclaredPropertyDefinitions()) {
+            Tree def = props.addChild(mapper.getOakName(pd.getName()));
+            internalRegisterPropertyDefinition(
+                    new NodeUtil(factory, mapper, def), pd);
+        }
+
+        Tree nodes = type.addChild("jcr:childNodeDefinition");
+        for (NodeDefinition nd : ntd.getDeclaredChildNodeDefinitions()) {
+            Tree def = nodes.addChild(mapper.getOakName(nd.getName()));
+            internalRegisterNodeDefinition(
+                    new NodeUtil(factory, mapper, def), nd);
+        }
+
+        return new NodeTypeImpl(this, node);
+    }
+
+    private void internalRegisterItemDefinition(
+            NodeUtil node, ItemDefinition def) {
+        node.setName("jcr:name", def.getName());
+        node.setBoolean("jcr:autoCreated", def.isAutoCreated());
+        node.setBoolean("jcr:mandatory", def.isMandatory());
+        node.setString(
+                "jcr:onParentVersion",
+                OnParentVersionAction.nameFromValue(def.getOnParentVersion()));
+    }
+
+    private void internalRegisterPropertyDefinition(
+            NodeUtil node, PropertyDefinition def)
+            throws RepositoryException {
+        internalRegisterItemDefinition(node, def);
+
+        node.setString(
+                "jcr:requiredType",
+                PropertyType.nameFromValue(def.getRequiredType()));
+        node.setBoolean("jcr:multiple", def.isMultiple());
+        node.setBoolean("jcr:isFullTextSearchable", def.isFullTextSearchable());
+        node.setBoolean("jcr:isQueryOrderable", def.isQueryOrderable());
+        node.setStrings("jcr:availableQueryOperators", def.getAvailableQueryOperators());
+
+        String[] constraints = def.getValueConstraints();
+        if (constraints != null) {
+            node.setStrings("jcr:valueConstraints", constraints);
+        }
+
+        Value[] values = def.getDefaultValues();
+        if (values != null) {
+            // TODO: convert to CoreValues
+        }
+    }
+
+    private void internalRegisterNodeDefinition(
+            NodeUtil node, NodeDefinition def) {
+        internalRegisterItemDefinition(node, def);
+
+        node.setBoolean("jcr:sameNameSiblings", def.allowsSameNameSiblings());
+        node.setNames(
+                "jcr:requiredPrimaryTypes",
+                def.getRequiredPrimaryTypeNames());
+        String defaultPrimaryType = def.getDefaultPrimaryTypeName();
+        if (defaultPrimaryType != null) {
+            node.setName("jcr:defaultPrimaryType", defaultPrimaryType);
+        }
+    }
+
+    private Tree getOrCreateNodeTypes(Root root) {
+        Tree types = root.getTree("/jcr:system/jcr:nodeTypes");
+        if (types == null) {
+            Tree system = root.getTree("/jcr:system");
+            if (system == null) {
+                system = root.getTree("/").addChild("jcr:system");
+            }
+            types = system.addChild("jcr:nodeTypes");
+        }
+        return types;
+    }
+
+    @Override
+    public void unregisterNodeType(String name) throws RepositoryException {
+        Tree type = null;
+        Root root = session.getCurrentRoot();
+        Tree types = root.getTree("/jcr:system/jcr:nodeTypes");
+        if (types != null) {
+            type = types.getChild(mapper.getOakName(name));
+        }
+        if (type == null) {
+            // TODO: Degrade gracefully? Or throw NoSuchNodeTypeException?
+            throw new RepositoryException(
+                    "Node type " + name + " can not be unregistered");
+        }
+
+        try {
+            type.remove();
+            root.commit(DefaultConflictHandler.OURS);
+            refresh();
+        } catch (CommitFailedException e) {
+            throw new RepositoryException(
+                    "Failed to unregister node type " + name, e);
+        }
+    }
+
+    @Override
+    public void unregisterNodeTypes(String[] names) throws RepositoryException {
+        Root root = session.getCurrentRoot();
+        Tree types = root.getTree("/jcr:system/jcr:nodeTypes");
+        if (types == null) {
+            // TODO: Degrade gracefully? Or throw NoSuchNodeTypeException?
+            throw new RepositoryException("Node types can not be unregistered");
+        }
+
+        try {
+            for (String name : names) {
+                Tree type = types.getChild(mapper.getOakName(name));
+                if (type == null) {
+                    // TODO: Degrade gracefully? Or throw NoSuchNodeTypeException?
+                    throw new RepositoryException(
+                            "Node type " + name + " can not be unregistered");
+                }
+                type.remove();
+            }
+            root.commit(DefaultConflictHandler.OURS);
+            refresh();
+        } catch (CommitFailedException e) {
+            throw new RepositoryException(
+                    "Failed to unregister node types", e);
+        }
+    }
+
+}

Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/NodeTypeManagerImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/NodeTypeTemplateImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/NodeTypeTemplateImpl.java?rev=1364543&r1=1364542&r2=1364543&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/NodeTypeTemplateImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/NodeTypeTemplateImpl.java Mon Jul 23 08:51:10 2012
@@ -51,7 +51,7 @@ class NodeTypeTemplateImpl
     private final List<NodeDefinitionTemplate> nodeDefinitionTemplates =
             new ArrayList<NodeDefinitionTemplate>();
 
-    private NodeTypeTemplateImpl(NodeTypeManager manager, ValueFactory factory) {
+    public NodeTypeTemplateImpl(NodeTypeManager manager, ValueFactory factory) {
         this.manager = manager;
         this.factory = factory;
     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/NodeUtil.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/NodeUtil.java?rev=1364543&r1=1364542&r2=1364543&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/NodeUtil.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/NodeUtil.java Mon Jul 23 08:51:10 2012
@@ -19,7 +19,10 @@ package org.apache.jackrabbit.oak.plugin
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.jcr.PropertyType;
+
 import org.apache.jackrabbit.oak.api.CoreValue;
+import org.apache.jackrabbit.oak.api.CoreValueFactory;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.namepath.NameMapper;
@@ -29,15 +32,22 @@ import org.apache.jackrabbit.oak.namepat
  */
 class NodeUtil {
 
+    private final CoreValueFactory factory;
+
     private final NameMapper mapper;
 
     private final Tree tree;
 
-    public NodeUtil(NameMapper mapper, Tree tree) {
+    public NodeUtil(CoreValueFactory factory, NameMapper mapper, Tree tree) {
+        this.factory = factory;
         this.mapper = mapper;
         this.tree = tree;
     }
 
+    public void remove(String name) {
+        tree.removeProperty(name);
+    }
+
     public String getName() {
         return mapper.getJcrName(tree.getName());
     }
@@ -48,6 +58,10 @@ class NodeUtil {
                 && property.getValue().getBoolean();
     }
 
+    public void setBoolean(String name, boolean value) {
+        tree.setProperty(name, factory.createValue(value));
+    }
+
     public String getString(String name, String defaultValue) {
         PropertyState property = tree.getProperty(name);
         if (property != null && !property.isArray()) {
@@ -57,6 +71,10 @@ class NodeUtil {
         }
     }
 
+    public void setString(String name, String value) {
+        tree.setProperty(name, factory.createValue(value));
+    }
+
     public String[] getStrings(String name) {
         PropertyState property = tree.getProperty(name);
         if (property == null) {
@@ -71,6 +89,14 @@ class NodeUtil {
         return strings;
     }
 
+    public void setStrings(String name, String... values) {
+        List<CoreValue> cvs = new ArrayList<CoreValue>(values.length);
+        for (String value : values) {
+            cvs.add(factory.createValue(value));
+        }
+        tree.setProperty(name, cvs);
+    }
+
     public String getName(String name) {
         return getName(name, null);
     }
@@ -84,6 +110,11 @@ class NodeUtil {
         }
     }
 
+    public void setName(String name, String value) {
+        tree.setProperty(name, factory.createValue(
+                mapper.getOakName(value), PropertyType.NAME));
+    }
+
     public String[] getNames(String name, String... defaultValues) {
         String[] strings = getStrings(name);
         if (strings == null) {
@@ -95,12 +126,21 @@ class NodeUtil {
         return strings;
     }
 
+    public void setNames(String name, String... values) {
+        List<CoreValue> cvs = new ArrayList<CoreValue>(values.length);
+        for (String value : values) {
+            cvs.add(factory.createValue(
+                    mapper.getOakName(value), PropertyType.NAME));
+        }
+        tree.setProperty(name, cvs);
+    }
+
     public NodeUtil[] getNodes(String name) {
         List<NodeUtil> nodes = new ArrayList<NodeUtil>();
         Tree child = tree.getChild(name);
         if (child != null) {
             for (Tree tree : child.getChildren()) {
-                nodes.add(new NodeUtil(mapper, tree));
+                nodes.add(new NodeUtil(factory, mapper, tree));
             }
         }
         return nodes.toArray(new NodeUtil[nodes.size()]);

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/PropertyDefinitionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/PropertyDefinitionImpl.java?rev=1364543&r1=1364542&r2=1364543&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/PropertyDefinitionImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/type/PropertyDefinitionImpl.java Mon Jul 23 08:51:10 2012
@@ -16,14 +16,15 @@
  */
 package org.apache.jackrabbit.oak.plugins.type;
 
-import static javax.jcr.PropertyType.TYPENAME_UNDEFINED;
-
 import javax.jcr.PropertyType;
 import javax.jcr.Value;
 import javax.jcr.nodetype.NodeType;
 import javax.jcr.nodetype.PropertyDefinition;
 import javax.jcr.query.qom.QueryObjectModelConstants;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 /**
  * <pre>
  * [nt:propertyDefinition]
@@ -43,38 +44,20 @@ import javax.jcr.query.qom.QueryObjectMo
 class PropertyDefinitionImpl extends ItemDefinitionImpl
         implements PropertyDefinition {
 
+    private static final Logger log =
+            LoggerFactory.getLogger(PropertyDefinitionImpl.class);
+
     public PropertyDefinitionImpl(NodeType type, NodeUtil node) {
         super(type, node);
     }
 
     @Override
     public int getRequiredType() {
-        String type = node.getString("jcr:requiredType", TYPENAME_UNDEFINED);
-        if (PropertyType.TYPENAME_BINARY.equalsIgnoreCase(type)) {
-            return PropertyType.BINARY;
-        } else if (PropertyType.TYPENAME_BOOLEAN.equalsIgnoreCase(type)) {
-            return PropertyType.BOOLEAN;
-        } else if (PropertyType.TYPENAME_DATE.equalsIgnoreCase(type)) {
-            return PropertyType.DATE;
-        } else if (PropertyType.TYPENAME_DECIMAL.equalsIgnoreCase(type)) {
-            return PropertyType.DECIMAL;
-        } else if (PropertyType.TYPENAME_DOUBLE.equalsIgnoreCase(type)) {
-            return PropertyType.DOUBLE;
-        } else if (PropertyType.TYPENAME_LONG.equalsIgnoreCase(type)) {
-            return PropertyType.LONG;
-        } else if (PropertyType.TYPENAME_NAME.equalsIgnoreCase(type)) {
-            return PropertyType.NAME;
-        } else if (PropertyType.TYPENAME_PATH.equalsIgnoreCase(type)) {
-            return PropertyType.PATH;
-        } else if (PropertyType.TYPENAME_REFERENCE.equalsIgnoreCase(type)) {
-            return PropertyType.REFERENCE;
-        } else if (PropertyType.TYPENAME_STRING.equalsIgnoreCase(type)) {
-            return PropertyType.STRING;
-        } else if (PropertyType.TYPENAME_URI.equalsIgnoreCase(type)) {
-            return PropertyType.URI;
-        } else if (PropertyType.TYPENAME_WEAKREFERENCE.equalsIgnoreCase(type)) {
-            return PropertyType.WEAKREFERENCE;
-        } else {
+        try {
+            return PropertyType.valueFromName(node.getString(
+                    "jcr:requiredType", PropertyType.TYPENAME_UNDEFINED));
+        } catch (IllegalArgumentException e) {
+            log.warn("Unexpected jcr:requiredType value", e);
             return PropertyType.UNDEFINED;
         }
     }