You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by an...@apache.org on 2010/09/29 16:11:54 UTC

svn commit: r1002639 [1/3] - in /jackrabbit/trunk: jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/ jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/util/ jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/ser...

Author: angela
Date: Wed Sep 29 14:11:53 2010
New Revision: 1002639

URL: http://svn.apache.org/viewvc?rev=1002639&view=rev
Log:
JCR-2453 - Break the spi2dav dependency to jcr-server

Added:
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/EventUtil.java   (with props)
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/JcrRemotingConstants.java   (with props)
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/JcrValueType.java   (with props)
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/NodeTypeConstants.java   (with props)
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/NodeTypeUtil.java   (with props)
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/QueryUtil.java   (with props)
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/ValueUtil.java   (with props)
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/util/XMLUtil.java   (with props)
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/ItemResourceConstants.java
      - copied, changed from r987195, jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/ItemResourceConstants.java
Removed:
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/nodetype/NodeTypeConstants.java
Modified:
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JsonDiffHandler.java
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/ItemResourceConstants.java
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/JcrValueType.java
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/nodetype/ItemDefinitionImpl.java
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/nodetype/NodeTypeProperty.java
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/observation/SubscriptionImpl.java
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/property/ValuesProperty.java
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/search/SearchResultProperty.java
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/version/report/ExportViewReport.java
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/version/report/JcrPrivilegeReport.java
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/version/report/LocateByUuidReport.java
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/version/report/LocateCorrespondingNodeReport.java
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/version/report/NodeTypesReport.java
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/version/report/RegisteredNamespacesReport.java
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/version/report/RepositoryDescriptorsReport.java
    jackrabbit/trunk/jackrabbit-spi2dav/pom.xml
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/DefinitionUtil.java
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/EventImpl.java
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/ItemInfoImpl.java
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/LockInfoImpl.java
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/NodeInfoImpl.java
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/PropertyInfoImpl.java
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QueryResultRowImpl.java
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2davex/QValueFactoryImpl.java
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2davex/RepositoryServiceImpl.java
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2davex/ValueLoader.java
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/observation/DefaultEventType.java
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/property/DavPropertyNameSet.java
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/version/report/ReportInfo.java

Added: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/EventUtil.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/EventUtil.java?rev=1002639&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/EventUtil.java (added)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/EventUtil.java Wed Sep 29 14:11:53 2010
@@ -0,0 +1,171 @@
+/*
+ * 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.commons.webdav;
+
+import javax.jcr.observation.Event;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * <code>EventConstants</code>...
+ */
+public abstract class EventUtil {
+
+
+    /**
+     * Element representing the 'nodeadded' event type.
+     * @see javax.jcr.observation.Event#NODE_ADDED
+     */
+    public static final String EVENT_NODEADDED = "nodeadded";
+
+    /**
+     * Element representing the 'noderemoved' event type.
+     * @see javax.jcr.observation.Event#NODE_REMOVED
+     */
+    public static final String EVENT_NODEREMOVED = "noderemoved";
+
+    /**
+     * Element representing the 'propertyadded' event type.
+     * @see javax.jcr.observation.Event#PROPERTY_ADDED
+     */
+    public static final String EVENT_PROPERTYADDED = "propertyadded";
+
+    /**
+     * Element representing the 'propertyremoved' event type.
+     * @see javax.jcr.observation.Event#PROPERTY_REMOVED
+     */
+    public static final String EVENT_PROPERTYREMOVED = "propertyremoved";
+
+    /**
+     * Element representing the 'propertychanged' event type.
+     * @see javax.jcr.observation.Event#PROPERTY_CHANGED
+     */
+    public static final String EVENT_PROPERTYCHANGED = "propertychanged";
+
+    /**
+     * Element representing the 'nodemoved' event type.
+     * @see javax.jcr.observation.Event#NODE_MOVED
+     */
+    public static final String EVENT_NODEMOVED = "nodemoved";
+
+    /**
+     * Element representing the 'persist' event type.
+     * @see javax.jcr.observation.Event#PERSIST
+     */
+    public static final String EVENT_PERSIST = "persist";
+
+    /**
+     * String array listing the xml local names of all type of jcr events.
+     */
+    public static final String[] EVENT_ALL = new String[] {
+            EVENT_NODEADDED,
+            EVENT_NODEREMOVED,
+            EVENT_PROPERTYADDED,
+            EVENT_PROPERTYREMOVED,
+            EVENT_PROPERTYCHANGED,
+            EVENT_NODEMOVED,
+            EVENT_PERSIST};
+
+    private static Map<String, Integer> NAME_TO_JCR = new HashMap<String, Integer>();
+    static {
+        NAME_TO_JCR.put(EVENT_NODEADDED, Event.NODE_ADDED);
+        NAME_TO_JCR.put(EVENT_NODEREMOVED, Event.NODE_REMOVED);
+        NAME_TO_JCR.put(EVENT_PROPERTYADDED, Event.PROPERTY_ADDED);
+        NAME_TO_JCR.put(EVENT_PROPERTYREMOVED, Event.PROPERTY_REMOVED);
+        NAME_TO_JCR.put(EVENT_PROPERTYCHANGED, Event.PROPERTY_CHANGED);
+        NAME_TO_JCR.put(EVENT_NODEMOVED, Event.NODE_MOVED);
+        NAME_TO_JCR.put(EVENT_PERSIST, Event.PERSIST);
+
+    }
+
+    /**
+     * Tests if the specified eventName can be mapped to a JCR event type.
+     * 
+     * @param eventName
+     * @return true if the specified eventName can be mapped to a JCR event type.
+     */
+    public static boolean isValidEventName(String eventName) {
+        return NAME_TO_JCR.containsKey(eventName);
+    }
+
+    /**
+     * Static utility method to convert the localName of a <code>EventType</code>
+     * as present in the Xml body into the corresponding JCR event constant defined by
+     * {@link javax.jcr.observation.Event}.
+     *
+     * @param eventName
+     * @return Any of the event types defined by {@link Event} or <code>null</code>.
+     * @throws IllegalArgumentException if the specified evenName is invalid.
+     */
+    public static int getJcrEventType(String eventName) {
+        if (NAME_TO_JCR.containsKey(eventName)) {
+            return NAME_TO_JCR.get(eventName);
+        } else {
+            throw new IllegalArgumentException("Invalid eventName : " + eventName);
+        }
+    }
+
+    /**
+     * Static utility method to retrieve a String representation of the type
+     * defined by a {@link javax.jcr.observation.Event JCR event}.
+     *
+     * @param jcrEventType
+     * @return Event name of the given JCR event type.
+     * @throws IllegalArgumentException if the given int does not represent a
+     * valid type constants as defined by {@link Event}.<br>
+     * Valid values are
+     * <ul>
+     * <li>{@link Event#NODE_ADDED}</li>
+     * <li>{@link Event#NODE_REMOVED}</li>
+     * <li>{@link Event#PROPERTY_ADDED}</li>
+     * <li>{@link Event#PROPERTY_REMOVED}</li>
+     * <li>{@link Event#PROPERTY_CHANGED}</li>
+     * <li>{@link Event#NODE_MOVED}</li>
+     * <li>{@link Event#PERSIST}</li>
+     * </ul>
+     */
+    public static String getEventName(int jcrEventType) {
+        String eventName;
+        switch (jcrEventType) {
+            case Event.NODE_ADDED:
+                eventName = EVENT_NODEADDED;
+                break;
+            case Event.NODE_REMOVED:
+                eventName = EVENT_NODEREMOVED;
+                break;
+            case Event.PROPERTY_ADDED:
+                eventName = EVENT_PROPERTYADDED;
+                break;
+            case Event.PROPERTY_CHANGED:
+                eventName = EVENT_PROPERTYCHANGED;
+                break;
+            case Event.PROPERTY_REMOVED:
+                eventName = EVENT_PROPERTYREMOVED;
+                break;
+            case Event.NODE_MOVED:
+                eventName = EVENT_NODEMOVED;
+                break;
+            case Event.PERSIST:
+                eventName = EVENT_PERSIST;
+                break;
+            default: // no default
+                throw new IllegalArgumentException("Invalid JCR event type: " + jcrEventType);
+        }
+        return eventName;
+    }
+
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/EventUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/EventUtil.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Added: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/JcrRemotingConstants.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/JcrRemotingConstants.java?rev=1002639&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/JcrRemotingConstants.java (added)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/JcrRemotingConstants.java Wed Sep 29 14:11:53 2010
@@ -0,0 +1,146 @@
+/*
+ * 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.commons.webdav;
+
+/**
+ * <code>JcrRemotingConstants</code> provides string constants for WebDAV
+ * resources representing repository items.
+ */
+public interface JcrRemotingConstants {
+
+    /**
+     * Namespace prefix used for Jackrabbit specific WebDAV extensions related
+     * to JCR remoting.
+     * @see #NS_URI
+     */
+    public static final String NS_PREFIX = "dcr";
+    
+    /**
+     * Namespace uri used for Jackrabbit specific WebDAV extensions related
+     * to JCR remoting.
+     * @see #NS_PREFIX
+     */
+    public static final String NS_URI = "http://www.day.com/jcr/webdav/1.0";
+
+    /**
+     * The resource path of the root-item-resource.
+     */
+    public static final String ROOT_ITEM_PATH = "/";
+    /**
+     * Placeholder resource path for the JCR root node.
+     */
+    public static final String ROOT_ITEM_RESOURCEPATH = "/jcr:root";
+
+    /**
+     * The version storage item resource path.
+     */
+    public static final String VERSIONSTORAGE_PATH = "/jcr:system/jcr:versionStorage";
+
+    public static final String IMPORT_UUID_BEHAVIOR = "ImportUUIDBehavior";
+
+    // xml element names
+    public static final String XML_PRIMARYNODETYPE = "primarynodetype";
+    public static final String XML_VALUE = "value";
+    /**
+     * 'type' attribute for the {@link #XML_VALUE value} element, reflecting the
+     * {@link javax.jcr.PropertyType type} of the value being transported.
+     */
+    public static final String ATTR_VALUE_TYPE = "type";
+    public static final String XML_LENGTH = "length";
+    public static final String XML_EXCLUSIVE_SESSION_SCOPED = "exclusive-session-scoped";
+
+    // xml elements used to reflect the workspaces ns-registry
+    public static final String XML_NAMESPACE = "namespace";
+    public static final String XML_PREFIX = "prefix";
+    public static final String XML_URI = "uri";
+
+    // xml elements used for repository-descriptors report
+    public static final String XML_DESCRIPTOR = "descriptor";
+    public static final String XML_DESCRIPTORKEY = "descriptorkey";
+    public static final String XML_DESCRIPTORVALUE = "descriptorvalue";
+
+    /**
+     * The 'removeexisting' element is not defined by RFC 3253. If it is present
+     * in the UPDATE request body, uuid conflicts should be solved by removing
+     * the existing nodes.
+     *
+     * @see javax.jcr.Node#restore(javax.jcr.version.Version, boolean)
+     * @see javax.jcr.Workspace#restore(javax.jcr.version.Version[], boolean)
+     */
+    public static final String XML_REMOVEEXISTING = "removeexisting";
+
+    /**
+     * The 'relpath' element is not defined by RFC 3253. If it is present
+     * in the UPDATE request body, the server is forced to used the text contained
+     * as 'relPath' argument for the {@link javax.jcr.Node#restore(javax.jcr.version.Version, String, boolean)
+     * Node.restore} call.
+     *
+     * @see javax.jcr.Node#restore(javax.jcr.version.Version, String, boolean)
+     */
+    public static final String XML_RELPATH = "relpath";
+
+    // oroperty local name of the workspace for which the repository session has been created.
+    public static final String JCR_WORKSPACE_NAME_LN = "workspaceName";
+
+    // general property local names
+    public static final String JCR_NAME_LN = "name";
+    public static final String JCR_PATH_LN = "path";
+    public static final String JCR_DEPTH_LN = "depth";
+    public static final String JCR_PARENT_LN = "parent";
+    public static final String JCR_ISNEW_LN = "isnew";
+    public static final String JCR_ISMODIFIED_LN = "ismodified";
+    public static final String JCR_DEFINITION_LN = "definition";
+    public static final String JCR_SELECTOR_NAME_LN = "selectorName";
+
+    // property local names used for resources representing jcr-nodes
+    public static final String JCR_PRIMARYNODETYPE_LN = XML_PRIMARYNODETYPE;
+    public static final String JCR_MIXINNODETYPES_LN = "mixinnodetypes";
+    public static final String JCR_INDEX_LN = "index";
+    public static final String JCR_REFERENCES_LN = "references";
+    /**
+     * @since JCR 2.0
+     */
+    public static final String JCR_WEAK_REFERENCES_LN = "weakreferences";
+    public static final String JCR_UUID_LN = "uuid";
+    public static final String JCR_PRIMARYITEM_LN = "primaryitem";
+
+    // property local names used for resources representing jcr-properties
+    public static final String JCR_TYPE_LN = "type";
+    public static final String JCR_VALUE_LN = "value";
+    public static final String JCR_VALUES_LN = "values";
+    public static final String JCR_LENGTH_LN = "length";
+    public static final String JCR_LENGTHS_LN = "lengths";
+
+    public static final String JCR_NAMESPACES_LN = "namespaces";
+
+    // property local names used for resource representing a version history
+    public static final String JCR_VERSIONABLEUUID_LN = "versionableuuid";
+
+    // property local names related to query
+    public static final String JCR_QUERY_RESULT_LN = "search-result-property";
+
+    // name of the xml element containing the result columns.
+    public static final String XML_QUERY_RESULT_COLUMN = "column";
+
+    public static final String REPORT_EXPORT_VIEW = "exportview";
+    public static final String REPORT_PRIVILEGES = "privileges";
+    public static final String REPORT_LOCATE_BY_UUID = "locate-by-uuid";
+    public static final String REPORT_LOCATE_CORRESPONDING_NODE = "locate-corresponding-node";
+    public static final String REPORT_NODETYPES = "nodetypes";
+    public static final String REPORT_REGISTERED_NAMESPACES = "registerednamespaces";
+    public static final String REPORT_REPOSITORY_DESCRIPTORS = "repositorydescriptors";
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/JcrRemotingConstants.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/JcrRemotingConstants.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Added: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/JcrValueType.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/JcrValueType.java?rev=1002639&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/JcrValueType.java (added)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/JcrValueType.java Wed Sep 29 14:11:53 2010
@@ -0,0 +1,94 @@
+/*
+ * 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.commons.webdav;
+
+import javax.jcr.PropertyType;
+import java.util.HashMap;
+import java.util.Map;
+
+/** <code>JcrValueType</code>... */
+public class JcrValueType {
+
+    /**
+     * Fragment for build the content type of request entities representing
+     * a JCR-value. The fragment must be completed as follows:
+     * <pre>
+     * jcr-value/ + Value.getType().toLowerCase()
+     * </pre>
+     *
+     * resulting in the following types:
+     * <pre>
+     * jcr-value/binary
+     * jcr-value/boolean
+     * jcr-value/date
+     * jcr-value/decimal
+     * jcr-value/double
+     * jcr-value/long
+     * jcr-value/name
+     * jcr-value/path
+     * jcr-value/reference
+     * jcr-value/string
+     * jcr-value/undefined
+     * jcr-value/uri
+     * jcr-value/weakreference
+     * </pre>
+     */
+    private static final String VALUE_CONTENT_TYPE_FRAGMENT = "jcr-value/";
+
+    /**
+     * Hardcoded lookup from content type as created by {@link #contentTypeFromType(int)}.
+     * Reason: As of JCR 2.0 there is no trivial rule to obtain the the TYPENAME
+     * constant from a lower-cased string: WeakReference uses camel-case and URI
+     * is all upper case...
+     */
+    private static final Map<String, Integer> TYPE_LOOKUP = new HashMap<String,Integer>();
+    static {
+        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.BINARY), PropertyType.BINARY);
+        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.BOOLEAN), PropertyType.BOOLEAN);
+        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.DATE), PropertyType.DATE);
+        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.DECIMAL), PropertyType.DECIMAL);
+        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.DOUBLE), PropertyType.DOUBLE);
+        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.LONG), PropertyType.LONG);
+        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.NAME), PropertyType.NAME);
+        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.PATH), PropertyType.PATH);
+        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.REFERENCE), PropertyType.REFERENCE);
+        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.STRING), PropertyType.STRING);
+        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.UNDEFINED), PropertyType.UNDEFINED);
+        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.URI), PropertyType.URI);
+        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.WEAKREFERENCE), PropertyType.WEAKREFERENCE);
+    }
+
+    public static String contentTypeFromType(int propertyType) {
+        return VALUE_CONTENT_TYPE_FRAGMENT + PropertyType.nameFromValue(propertyType).toLowerCase();
+    }
+
+    public static int typeFromContentType(String contentType) {
+        if (contentType != null) {
+            // remove charset if present
+            int pos = contentType.indexOf(';');
+            String ct = (pos == -1) ? contentType : contentType.substring(0, pos);
+            if (TYPE_LOOKUP.containsKey(ct)) {
+                return TYPE_LOOKUP.get(ct);
+            }
+        }
+
+        // some invalid content type argument that does not match any of the
+        // strings created by contentTypeFromType(int propertyType)
+        // -> Fallback to UNDEFINED
+        return PropertyType.UNDEFINED;
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/JcrValueType.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/JcrValueType.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Added: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/NodeTypeConstants.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/NodeTypeConstants.java?rev=1002639&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/NodeTypeConstants.java (added)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/NodeTypeConstants.java Wed Sep 29 14:11:53 2010
@@ -0,0 +1,153 @@
+/*
+ * 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.commons.webdav;
+
+/**
+ * <code>NodeTypeConstants</code> used to represent nodetype definitions in
+ * Xml.
+ *
+ * @see javax.jcr.nodetype.NodeType
+ */
+public interface NodeTypeConstants {
+
+    public static final String XML_NODETYPENAME = "nodetypename";
+
+    public static final String XML_REPORT_ALLNODETYPES = "all-nodetypes";
+    public static final String XML_REPORT_MIXINNODETYPES = "mixin-nodetypes";
+    public static final String XML_REPORT_PRIMARYNODETYPES = "primary-nodetypes";
+    public static final String XML_NODETYPES = "nodetypes";
+    public static final String XML_NODETYPE = "nodetype";
+
+    //------< copied from org.apache.jackrabbit.core.nodetype.xml.Constants >---
+
+    /** Name of the node type definition root element. */
+    String NODETYPES_ELEMENT = "nodeTypes";
+
+    /** Name of the node type definition element. */
+    String NODETYPE_ELEMENT = "nodeType";
+
+    /** Name of the child node definition element. */
+    String CHILDNODEDEFINITION_ELEMENT = "childNodeDefinition";
+
+    /** Name of the property definition element. */
+    String PROPERTYDEFINITION_ELEMENT = "propertyDefinition";
+
+    /** Name of the <code>isMixin</code> attribute. */
+    String ISMIXIN_ATTRIBUTE = "isMixin";
+
+    /** Name of the <code>hasOrderableChildNodes</code> attribute. */
+    String HASORDERABLECHILDNODES_ATTRIBUTE = "hasOrderableChildNodes";
+
+    /**
+     * Name of the <code>isAbstract</code> attribute.
+     * @since JCR 2.0
+     */
+    String ISABSTRACT_ATTRIBUTE = "isAbstract";
+
+    /**
+     * Name of the <code>isQueryable</code> attribute.
+     * @since JCR 2.0
+     */
+    String ISQUERYABLE_ATTRIBUTE = "isQueryable";
+
+    /** Name of the primary item name attribute. */
+    String PRIMARYITEMNAME_ATTRIBUTE = "primaryItemName";
+
+    /** Name of the supertypes element. */
+    String SUPERTYPES_ELEMENT = "supertypes";
+
+    /** Name of the supertype element. */
+    String SUPERTYPE_ELEMENT = "supertype";
+
+    /** Name of the <code>name</code> attribute. */
+    String NAME_ATTRIBUTE = "name";
+
+    /** Name of the <code>autoCreated</code> attribute. */
+    String AUTOCREATED_ATTRIBUTE = "autoCreated";
+
+    /** Name of the <code>mandatory</code> attribute. */
+    String MANDATORY_ATTRIBUTE = "mandatory";
+
+    /** Name of the <code>onParentVersion</code> attribute. */
+    String ONPARENTVERSION_ATTRIBUTE = "onParentVersion";
+
+    /** Name of the <code>protected</code> attribute. */
+    String PROTECTED_ATTRIBUTE = "protected";
+
+    /** Name of the required type attribute. */
+    String REQUIREDTYPE_ATTRIBUTE = "requiredType";
+
+    /** Name of the value constraints element. */
+    String VALUECONSTRAINTS_ELEMENT = "valueConstraints";
+
+    /** Name of the value constraint element. */
+    String VALUECONSTRAINT_ELEMENT = "valueConstraint";
+
+    /** Name of the default values element. */
+    String DEFAULTVALUES_ELEMENT = "defaultValues";
+
+    /** Name of the default value element. */
+    String DEFAULTVALUE_ELEMENT = "defaultValue";
+
+    /** Name of the <code>multiple</code> attribute. */
+    String MULTIPLE_ATTRIBUTE = "multiple";
+
+    /** Name of the required primary types element. */
+    String REQUIREDPRIMARYTYPES_ELEMENT = "requiredPrimaryTypes";
+
+    /** Name of the required primary type element. */
+    String REQUIREDPRIMARYTYPE_ELEMENT = "requiredPrimaryType";
+
+    /** Name of the default primary type attribute. */
+    String DEFAULTPRIMARYTYPE_ATTRIBUTE = "defaultPrimaryType";
+
+    /** Name of the <code>sameNameSiblings</code> attribute. */
+    String SAMENAMESIBLINGS_ATTRIBUTE = "sameNameSiblings";
+
+    /**
+     * Name of the availableQueryOperators element.
+     * @since JCR 2.0
+     */
+    String AVAILABLE_QUERY_OPERATORS_ELEMENT = "availableQueryOperators";
+
+    /**
+     * Name of the availableQueryOperator element.
+     * @since JCR 2.0
+     */
+    String AVAILABLE_QUERY_OPERATOR_ELEMENT = "availableQueryOperator";
+
+    /**
+     * Name of the fullTextSearchable attribute.
+     * @since JCR 2.0
+     */
+    String FULL_TEXT_SEARCHABLE_ATTRIBUTE = "fullTextSearchable";
+
+    /**
+     * Name of the queryOrderable attribute.
+     * @since JCR 2.0
+     */
+    String QUERY_ORDERABLE_ATTRIBUTE = "queryOrderable";
+
+    //----------< attr. not defined by copied from o.a.j.core.n.x.Constants >---
+    /**
+     * Name of the declaring nodetype. This value is not needed during
+     * discovery of nodetype definitions. However if the definition of an item is
+     * retrieved (instead of being calculated on the client), this information is
+     * needed
+     */
+    String DECLARINGNODETYPE_ATTRIBUTE = "declaringNodeType";
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/NodeTypeConstants.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/NodeTypeConstants.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Added: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/NodeTypeUtil.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/NodeTypeUtil.java?rev=1002639&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/NodeTypeUtil.java (added)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/NodeTypeUtil.java Wed Sep 29 14:11:53 2010
@@ -0,0 +1,73 @@
+/*
+ * 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.commons.webdav;
+
+import org.apache.jackrabbit.util.XMLUtil;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Text;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * <code>NodeTypeUtil</code>...
+ */
+public class NodeTypeUtil implements NodeTypeConstants {
+
+    public static Element ntNameToXml(String nodeTypeName, Document document) {
+        Element ntElem = document.createElementNS(JcrRemotingConstants.NS_URI, JcrRemotingConstants.NS_PREFIX + ":" + XML_NODETYPE);
+        Element nameElem = document.createElementNS(JcrRemotingConstants.NS_URI, JcrRemotingConstants.NS_PREFIX + ":" + XML_NODETYPENAME);
+        Text txt = document.createTextNode(nodeTypeName);
+        nameElem.appendChild(txt);
+        ntElem.appendChild(nameElem);
+        return ntElem;
+    }
+
+    public static Collection<String> ntNamesFromXml(Object propValue) {
+        // assume property has be built from xml
+        if (propValue instanceof List) {
+            return retrieveNodeTypeNames(((List<?>)propValue));
+        } else if (propValue instanceof Element) {
+            List<Element> l = Collections.singletonList((Element) propValue);
+            return retrieveNodeTypeNames(l);
+        } else {
+            // Property value cannot be parsed into node type names.
+            return Collections.emptySet();
+        }
+    }
+
+    private static Set<String> retrieveNodeTypeNames(List<?> elementList) {
+        Set<String> nodetypeNames = new HashSet<String>();
+        for (Object content : elementList) {
+            if (!(content instanceof Element)) {
+                continue;
+            }
+            Element el = (Element) content;
+            if (XML_NODETYPE.equals(el.getLocalName()) && JcrRemotingConstants.NS_URI.equals(el.getNamespaceURI())) {
+                String nodetypeName = XMLUtil.getChildText(el, XML_NODETYPENAME, JcrRemotingConstants.NS_URI);
+                if (nodetypeName != null && !"".equals(nodetypeName)) {
+                    nodetypeNames.add(nodetypeName);
+                }
+            } // else: 'dcr:nodetype' element expected -> ignoring element
+        }
+        return nodetypeNames;
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/NodeTypeUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/NodeTypeUtil.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Added: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/QueryUtil.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/QueryUtil.java?rev=1002639&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/QueryUtil.java (added)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/QueryUtil.java Wed Sep 29 14:11:53 2010
@@ -0,0 +1,79 @@
+/*
+ * 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.commons.webdav;
+
+import org.apache.jackrabbit.util.XMLUtil;
+import org.apache.jackrabbit.value.ValueHelper;
+import org.w3c.dom.Element;
+
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+import javax.jcr.Value;
+import javax.jcr.ValueFactory;
+import javax.jcr.ValueFormatException;
+import java.util.List;
+
+/**
+ * <code>QueryUtil</code>...
+ */
+public class QueryUtil implements JcrRemotingConstants {
+
+    public static void parseResultPropertyValue(Object propValue,
+                                                List<String> columnNames,
+                                                List<String> selectorNames,
+                                                List<Value> values,
+                                                ValueFactory valueFactory)
+            throws ValueFormatException, RepositoryException {
+        if (propValue instanceof List) {
+            for (Object o : ((List<?>) propValue)) {
+                if (o instanceof Element) {
+                    parseColumnElement((Element) o, columnNames, selectorNames, values, valueFactory);
+                }
+            }
+        } else if (propValue instanceof Element) {
+            parseColumnElement((Element) propValue, columnNames, selectorNames, values, valueFactory);
+        } else {
+            throw new IllegalArgumentException("SearchResultProperty requires a list of 'dcr:column' xml elements.");
+        }
+    }
+
+    private static void parseColumnElement(Element columnElement,
+                                           List<String> columnNames,
+                                           List<String> selectorNames,
+                                           List<Value> values,
+                                           ValueFactory valueFactory)
+            throws ValueFormatException, RepositoryException {
+        if (!XML_QUERY_RESULT_COLUMN.equals(columnElement.getLocalName()) && NS_URI.equals(columnElement.getNamespaceURI())) {
+            // dcr:column element expected within search result -> can't parse
+            return;
+        }
+
+        columnNames.add(XMLUtil.getChildText(columnElement, JCR_NAME_LN, NS_URI));
+        selectorNames.add(XMLUtil.getChildText(columnElement, JCR_SELECTOR_NAME_LN, NS_URI));
+
+        Value jcrValue;
+        Element valueElement = XMLUtil.getChildElement(columnElement, JCR_VALUE_LN, NS_URI);
+        if (valueElement != null) {
+            String typeStr = XMLUtil.getAttribute(valueElement, ATTR_VALUE_TYPE, NS_URI);
+            jcrValue = ValueHelper.deserialize(XMLUtil.getText(valueElement),
+                    PropertyType.valueFromName(typeStr), true, valueFactory);
+        } else {
+            jcrValue = null;
+        }
+        values.add(jcrValue);
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/QueryUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/QueryUtil.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Added: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/ValueUtil.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/ValueUtil.java?rev=1002639&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/ValueUtil.java (added)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/ValueUtil.java Wed Sep 29 14:11:53 2010
@@ -0,0 +1,113 @@
+/*
+ * 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.commons.webdav;
+
+import org.apache.jackrabbit.util.XMLUtil;
+import org.apache.jackrabbit.value.ValueHelper;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Text;
+
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+import javax.jcr.Value;
+import javax.jcr.ValueFactory;
+import javax.jcr.ValueFormatException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <code>ValuesUtil</code>...
+ */
+public class ValueUtil {
+
+    public static Element valueToXml(Value jcrValue, Document document) throws RepositoryException {
+
+        String type = PropertyType.nameFromValue(jcrValue.getType());
+        String serializedValue = ValueHelper.serialize(jcrValue, true);
+
+        Element xmlValue = document.createElementNS(JcrRemotingConstants.NS_URI, JcrRemotingConstants.NS_PREFIX + ":" + JcrRemotingConstants.XML_VALUE);
+
+        Text txt = document.createTextNode(serializedValue);
+        xmlValue.appendChild(txt);
+
+        Attr attr = document.createAttributeNS(JcrRemotingConstants.NS_URI, JcrRemotingConstants.NS_PREFIX + ":" + JcrRemotingConstants.ATTR_VALUE_TYPE);
+        attr.setValue(type);
+        xmlValue.setAttributeNodeNS(attr);
+
+        return xmlValue;
+    }
+
+    public static Value[] valuesFromXml(Object propValue, int defaultType, ValueFactory valueFactory) throws RepositoryException {
+        Value[] jcrValues;
+        // retrieve jcr-values from child 'value'-element(s)
+        List<Element> valueElements = new ArrayList<Element>();
+        if (propValue == null) {
+            jcrValues = new Value[0];
+        } else { /* not null propValue */
+            if (isValueElement(propValue)) {
+                valueElements.add((Element) propValue);
+            } else if (propValue instanceof List) {
+                for (Object el : ((List<?>) propValue)) {
+                    /* make sure, only Elements with name 'value' are used for
+                    * the 'value' field. any other content (other elements, text,
+                    * comment etc.) is ignored. NO bad-request/conflict error is
+                    * thrown.
+                    */
+                    if (isValueElement(el)) {
+                        valueElements.add((Element) el);
+                    }
+                }
+            }
+            /* fill the 'value' with the valid 'value' elements found before */
+            jcrValues = new Value[valueElements.size()];
+            int i = 0;
+            for (Element element : valueElements) {
+                jcrValues[i] = getJcrValue(element, defaultType, valueFactory);
+                i++;
+            }
+        }
+        return jcrValues;
+    }
+
+    private static boolean isValueElement(Object obj) {
+        return obj instanceof Element && JcrRemotingConstants.XML_VALUE.equals(((Element)obj).getLocalName());
+    }
+
+    /**
+     *
+     * @param valueElement
+     * @param defaultType
+     * @return
+     * @throws javax.jcr.ValueFormatException
+     * @throws javax.jcr.RepositoryException
+     */
+    private static Value getJcrValue(Element valueElement, int defaultType,
+                                     ValueFactory valueFactory)
+        throws ValueFormatException, RepositoryException {
+        if (valueElement == null) {
+            return null;
+        }
+        // make sure the value is never 'null'
+        String value = XMLUtil.getText(valueElement, "");
+        String typeStr = XMLUtil.getAttribute(valueElement, JcrRemotingConstants.ATTR_VALUE_TYPE, JcrRemotingConstants.NS_URI);
+        int type = (typeStr == null) ? defaultType : PropertyType.valueFromName(typeStr);
+        // deserialize value ->> see #valueToXml where values are serialized
+        return ValueHelper.deserialize(value, type, true, valueFactory);
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/ValueUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/webdav/ValueUtil.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Added: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/util/XMLUtil.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/util/XMLUtil.java?rev=1002639&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/util/XMLUtil.java (added)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/util/XMLUtil.java Wed Sep 29 14:11:53 2010
@@ -0,0 +1,140 @@
+/*
+ * 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.util;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.CharacterData;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * <code>XMLUtil</code>...
+ */
+public class XMLUtil {
+
+    /**
+     * @param node
+     * @return true if the given node is of type text or CDATA.
+     */
+    public static boolean isText(Node node) {
+        int ntype = node.getNodeType();
+        return ntype == Node.TEXT_NODE || ntype == Node.CDATA_SECTION_NODE;
+    }
+
+    /**
+     * Concatenates the values of all child nodes of type 'Text' or 'CDATA'/
+     *
+     * @param element
+     * @return String representing the value of all Text and CDATA child nodes or
+     * <code>null</code> if the length of the resulting String is 0.
+     * @see #isText(org.w3c.dom.Node)
+     */
+    public static String getText(Element element) {
+        StringBuffer content = new StringBuffer();
+        if (element != null) {
+            NodeList nodes = element.getChildNodes();
+            for (int i = 0; i < nodes.getLength(); i++) {
+                Node child = nodes.item(i);
+                if (isText(child)) {
+                    // cast to super class that contains Text and CData
+                    content.append(((CharacterData) child).getData());
+                }
+            }
+        }
+        return (content.length()==0) ? null : content.toString();
+    }
+
+    /**
+     * Same as {@link #getText(Element)} except that 'defaultValue' is returned
+     * instead of <code>null</code>, if the element does not contain any text.
+     *
+     * @param element
+     * @param defaultValue
+     * @return the text contained in the specified element or
+     * <code>defaultValue</code> if the element does not contain any text.
+     */
+    public static String getText(Element element, String defaultValue) {
+        String txt = getText(element);
+        return (txt == null) ? defaultValue : txt;
+    }
+
+    /**
+     * Calls {@link #getText(Element)} on the first child element that matches
+     * the given local name and namespace.
+     *
+     * @param parent
+     * @param childLocalName
+     * @param childNamespaceURI
+     * @return text contained in the first child that matches the given local name
+     * and namespace or <code>null</code>.
+     * @see #getText(Element)
+     */
+    public static String getChildText(Element parent, String childLocalName, String childNamespaceURI) {
+        Element child = getChildElement(parent, childLocalName, childNamespaceURI);
+        return (child == null) ? null : getText(child);
+    }
+
+    /**
+     * Returns the first child element that matches the given local name and
+     * namespace. If no child element is present or no child element matches,
+     * <code>null</code> is returned.
+     *
+     * @param parent
+     * @param childLocalName
+     * @param childNamespaceURI
+     * @return first child element matching the specified names or <code>null</code>.
+     */
+    public static Element getChildElement(Node parent, String childLocalName, String childNamespaceURI) {
+        if (parent != null) {
+            NodeList children = parent.getChildNodes();
+            for (int i = 0; i < children.getLength(); i++) {
+                Node child = children.item(i);
+                if (child.getNodeType() == Node.ELEMENT_NODE && childLocalName.equals(child.getLocalName()) && childNamespaceURI.equals(child.getNamespaceURI())) {
+                    return (Element)child;
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Returns the value of the named attribute of the current element.
+     *
+     * @param parent
+     * @param localName attribute local name or 'nodeName' if no namespace is
+     * specified.
+     * @param  namespaceURI or <code>null</code>
+     * @return attribute value, or <code>null</code> if not found
+     */
+    public static String getAttribute(Element parent, String localName, String namespaceURI) {
+        if (parent == null) {
+            return null;
+        }
+        Attr attribute;
+        if (namespaceURI == null) {
+            attribute = parent.getAttributeNode(localName);
+        } else {
+            attribute = parent.getAttributeNodeNS(namespaceURI, localName);
+        }
+        if (attribute != null) {
+            return attribute.getValue();
+        } else {
+            return null;
+        }
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/util/XMLUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/util/XMLUtil.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JsonDiffHandler.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JsonDiffHandler.java?rev=1002639&r1=1002638&r2=1002639&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JsonDiffHandler.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JsonDiffHandler.java Wed Sep 29 14:11:53 2010
@@ -17,11 +17,11 @@
 package org.apache.jackrabbit.server.remoting.davex;
 
 import org.apache.jackrabbit.JcrConstants;
+import org.apache.jackrabbit.commons.webdav.JcrValueType;
 import org.apache.jackrabbit.server.util.RequestData;
 import org.apache.jackrabbit.commons.json.JsonHandler;
 import org.apache.jackrabbit.commons.json.JsonParser;
 import org.apache.jackrabbit.util.Text;
-import org.apache.jackrabbit.webdav.jcr.JcrValueType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.ContentHandler;

Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/ItemResourceConstants.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/ItemResourceConstants.java?rev=1002639&r1=1002638&r2=1002639&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/ItemResourceConstants.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/ItemResourceConstants.java Wed Sep 29 14:11:53 2010
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.webdav.jcr;
 
+import org.apache.jackrabbit.commons.webdav.JcrRemotingConstants;
 import org.apache.jackrabbit.webdav.DavResource;
 import org.apache.jackrabbit.webdav.lock.Scope;
 import org.apache.jackrabbit.webdav.observation.ObservationResource;
@@ -25,13 +26,11 @@ import org.apache.jackrabbit.webdav.secu
 import org.apache.jackrabbit.webdav.version.DeltaVResource;
 import org.apache.jackrabbit.webdav.xml.Namespace;
 
-import javax.jcr.PropertyType;
-
 /**
  * <code>ItemResourceConstants</code> provides constants for any resources
  * representing repository items.
  */
-public interface ItemResourceConstants {
+public interface ItemResourceConstants extends JcrRemotingConstants {
 
     /**
      * Methods common to all item resources.
@@ -39,47 +38,9 @@ public interface ItemResourceConstants {
     public static final String METHODS = DavResource.METHODS + ", " + ObservationResource.METHODS + ", " + SearchResource.METHODS + ", " +DeltaVResource.METHODS;
 
     /**
-     * The resource path of the root-item-resource.
-     */
-    public static final String ROOT_ITEM_PATH = "/";
-    /**
-     * Placeholder resource path for the JCR root node.
-     */
-    public static final String ROOT_ITEM_RESOURCEPATH = "/jcr:root";
-
-    /**
-     * The version storage item resource path.
-     */
-    public static final String VERSIONSTORAGE_PATH = "/jcr:system/jcr:versionStorage";
-
-    /**
      * The namespace for all jcr specific extensions.
      */
-    public static final Namespace NAMESPACE = Namespace.getNamespace("dcr", "http://www.day.com/jcr/webdav/1.0");
-
-    public static final String IMPORT_UUID_BEHAVIOR = "ImportUUIDBehavior";
-
-    // xml element names
-    public static final String XML_PRIMARYNODETYPE = "primarynodetype";
-    public static final String XML_VALUE = "value";
-    /**
-     * 'type' attribute for the {@link #XML_VALUE value} element, reflecting the
-     * {@link PropertyType type} of the value being transported.
-     */
-    public static final String ATTR_VALUE_TYPE = "type";
-    public static final String XML_LENGTH = "length";
-    public static final String XML_EXCLUSIVE_SESSION_SCOPED = "exclusive-session-scoped";
-
-    // xml elements used to reflect the workspaces ns-registry
-    // TODO: to be reviewed...
-    public static final String XML_NAMESPACE = "namespace";
-    public static final String XML_PREFIX = "prefix";
-    public static final String XML_URI = "uri";
-
-    // xml elements used for repository-descriptors report
-    public static final String XML_DESCRIPTOR = "descriptor";
-    public static final String XML_DESCRIPTORKEY = "descriptorkey";
-    public static final String XML_DESCRIPTORVALUE = "descriptorvalue";
+    public static final Namespace NAMESPACE = Namespace.getNamespace(NS_PREFIX, NS_URI);
 
     /**
      * Extension to the WebDAV 'exclusive' lock, that allows to distinguish
@@ -89,65 +50,43 @@ public interface ItemResourceConstants {
      */
     public static final Scope EXCLUSIVE_SESSION = Scope.create(XML_EXCLUSIVE_SESSION_SCOPED, NAMESPACE);
 
-    /**
-     * The 'removeexisting' element is not defined by RFC 3253. If it is present
-     * in the UPDATE request body, uuid conflicts should be solved by removing
-     * the existing nodes.
-     *
-     * @see javax.jcr.Node#restore(javax.jcr.version.Version, boolean)
-     * @see javax.jcr.Workspace#restore(javax.jcr.version.Version[], boolean)
-     * @see org.apache.jackrabbit.webdav.version.UpdateInfo
-     */
-    public static final String XML_REMOVEEXISTING = "removeexisting";
-
-    /**
-     * The 'relpath' element is not defined by RFC 3253. If it is present
-     * in the UPDATE request body, the server is forced to used the text contained
-     * as 'relPath' argument for the {@link javax.jcr.Node#restore(javax.jcr.version.Version, String, boolean)
-     * Node.restore} call.
-     *
-     * @see javax.jcr.Node#restore(javax.jcr.version.Version, String, boolean)
-     * @see org.apache.jackrabbit.webdav.version.UpdateInfo
-     */
-    public static final String XML_RELPATH = "relpath";
-
     // name of the workspace for which the repository session has been created.
-    public static final DavPropertyName JCR_WORKSPACE_NAME = DavPropertyName.create("workspaceName", NAMESPACE);
+    public static final DavPropertyName JCR_WORKSPACE_NAME = DavPropertyName.create(JCR_WORKSPACE_NAME_LN, NAMESPACE);
 
     // general property names
-    public static final DavPropertyName JCR_NAME = DavPropertyName.create("name", NAMESPACE);
-    public static final DavPropertyName JCR_PATH = DavPropertyName.create("path", NAMESPACE);
-    public static final DavPropertyName JCR_DEPTH = DavPropertyName.create("depth", NAMESPACE);
-    public static final DavPropertyName JCR_PARENT = DavPropertyName.create("parent", NAMESPACE);
-    public static final DavPropertyName JCR_ISNEW = DavPropertyName.create("isnew", NAMESPACE);
-    public static final DavPropertyName JCR_ISMODIFIED = DavPropertyName.create("ismodified", NAMESPACE);
-    public static final DavPropertyName JCR_DEFINITION = DavPropertyName.create("definition", NAMESPACE);
-    public static final DavPropertyName JCR_SELECTOR_NAME = DavPropertyName.create("selectorName", NAMESPACE);
+    public static final DavPropertyName JCR_NAME = DavPropertyName.create(JCR_NAME_LN, NAMESPACE);
+    public static final DavPropertyName JCR_PATH = DavPropertyName.create(JCR_PATH_LN, NAMESPACE);
+    public static final DavPropertyName JCR_DEPTH = DavPropertyName.create(JCR_DEPTH_LN, NAMESPACE);
+    public static final DavPropertyName JCR_PARENT = DavPropertyName.create(JCR_PARENT_LN, NAMESPACE);
+    public static final DavPropertyName JCR_ISNEW = DavPropertyName.create(JCR_ISNEW_LN, NAMESPACE);
+    public static final DavPropertyName JCR_ISMODIFIED = DavPropertyName.create(JCR_ISMODIFIED_LN, NAMESPACE);
+    public static final DavPropertyName JCR_DEFINITION = DavPropertyName.create(JCR_DEFINITION_LN, NAMESPACE);
+    public static final DavPropertyName JCR_SELECTOR_NAME = DavPropertyName.create(JCR_SELECTOR_NAME_LN, NAMESPACE);
 
     // property names used for resources representing jcr-nodes
-    public static final DavPropertyName JCR_PRIMARYNODETYPE = DavPropertyName.create(XML_PRIMARYNODETYPE, NAMESPACE);
-    public static final DavPropertyName JCR_MIXINNODETYPES = DavPropertyName.create("mixinnodetypes", NAMESPACE);
-    public static final DavPropertyName JCR_INDEX = DavPropertyName.create("index", NAMESPACE);
-    public static final DavPropertyName JCR_REFERENCES = DavPropertyName.create("references", NAMESPACE);
+    public static final DavPropertyName JCR_PRIMARYNODETYPE = DavPropertyName.create(JCR_PRIMARYNODETYPE_LN, NAMESPACE);
+    public static final DavPropertyName JCR_MIXINNODETYPES = DavPropertyName.create(JCR_MIXINNODETYPES_LN, NAMESPACE);
+    public static final DavPropertyName JCR_INDEX = DavPropertyName.create(JCR_INDEX_LN, NAMESPACE);
+    public static final DavPropertyName JCR_REFERENCES = DavPropertyName.create(JCR_REFERENCES_LN, NAMESPACE);
     /**
      * @since JCR 2.0
      */
-    public static final DavPropertyName JCR_WEAK_REFERENCES = DavPropertyName.create("weakreferences", NAMESPACE);
-    public static final DavPropertyName JCR_UUID = DavPropertyName.create("uuid", NAMESPACE);
-    public static final DavPropertyName JCR_PRIMARYITEM = DavPropertyName.create("primaryitem", NAMESPACE);
+    public static final DavPropertyName JCR_WEAK_REFERENCES = DavPropertyName.create(JCR_WEAK_REFERENCES_LN, NAMESPACE);
+    public static final DavPropertyName JCR_UUID = DavPropertyName.create(JCR_UUID_LN, NAMESPACE);
+    public static final DavPropertyName JCR_PRIMARYITEM = DavPropertyName.create(JCR_PRIMARYITEM_LN, NAMESPACE);
 
     // property names used for resources representing jcr-properties
-    public static final DavPropertyName JCR_TYPE = DavPropertyName.create("type", NAMESPACE);
-    public static final DavPropertyName JCR_VALUE = DavPropertyName.create("value", NAMESPACE);
-    public static final DavPropertyName JCR_VALUES = DavPropertyName.create("values", NAMESPACE);
-    public static final DavPropertyName JCR_LENGTH = DavPropertyName.create("length", NAMESPACE);
-    public static final DavPropertyName JCR_LENGTHS = DavPropertyName.create("lengths", NAMESPACE);
+    public static final DavPropertyName JCR_TYPE = DavPropertyName.create(JCR_TYPE_LN, NAMESPACE);
+    public static final DavPropertyName JCR_VALUE = DavPropertyName.create(JCR_VALUE_LN, NAMESPACE);
+    public static final DavPropertyName JCR_VALUES = DavPropertyName.create(JCR_VALUES_LN, NAMESPACE);
+    public static final DavPropertyName JCR_LENGTH = DavPropertyName.create(JCR_LENGTH_LN, NAMESPACE);
+    public static final DavPropertyName JCR_LENGTHS = DavPropertyName.create(JCR_LENGTHS_LN, NAMESPACE);
 
     // property names used for resource representing a workspace
-    public static final DavPropertyName JCR_NAMESPACES = DavPropertyName.create("namespaces", NAMESPACE);
+    public static final DavPropertyName JCR_NAMESPACES = DavPropertyName.create(JCR_NAMESPACES_LN, NAMESPACE);
 
     // property names used for resource representing a version history
-    public static final DavPropertyName JCR_VERSIONABLEUUID = DavPropertyName.create("versionableuuid", NAMESPACE);
+    public static final DavPropertyName JCR_VERSIONABLEUUID = DavPropertyName.create(JCR_VERSIONABLEUUID_LN, NAMESPACE);
 
     //-----------------------------------------< JSR170 specific privileges >---
     /**

Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/JcrValueType.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/JcrValueType.java?rev=1002639&r1=1002638&r2=1002639&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/JcrValueType.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/JcrValueType.java Wed Sep 29 14:11:53 2010
@@ -16,84 +16,10 @@
  */
 package org.apache.jackrabbit.webdav.jcr;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.jcr.PropertyType;
-import java.util.HashMap;
-import java.util.Map;
-
-/** <code>JcrValueType</code>... */
-public final class JcrValueType {
-
-    private static Logger log = LoggerFactory.getLogger(JcrValueType.class);
-
-    /**
-     * Fragment for build the content type of request entities representing
-     * a JCR-value. The fragment must be completed as follows:
-     * <pre>
-     * jcr-value/ + Value.getType().toLowerCase()
-     * </pre>
-     *
-     * resulting in the following types:
-     * <pre>
-     * jcr-value/binary
-     * jcr-value/boolean
-     * jcr-value/date
-     * jcr-value/decimal
-     * jcr-value/double
-     * jcr-value/long
-     * jcr-value/name
-     * jcr-value/path
-     * jcr-value/reference
-     * jcr-value/string
-     * jcr-value/undefined
-     * jcr-value/uri
-     * jcr-value/weakreference
-     * </pre>
-     */
-    private static final String VALUE_CONTENT_TYPE_FRAGMENT = "jcr-value/";
-
-    /**
-     * Hardcoded lookup from content type as created by {@link #contentTypeFromType(int)}.
-     * Reason: As of JCR 2.0 there is no trivial rule to obtain the the TYPENAME
-     * constant from a lower-cased string: WeakReference uses camel-case and URI
-     * is all upper case...
-     */
-    private static final Map<String, Integer> TYPE_LOOKUP = new HashMap<String,Integer>();
-    static {
-        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.BINARY), PropertyType.BINARY);
-        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.BOOLEAN), PropertyType.BOOLEAN);
-        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.DATE), PropertyType.DATE);
-        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.DECIMAL), PropertyType.DECIMAL);
-        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.DOUBLE), PropertyType.DOUBLE);
-        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.LONG), PropertyType.LONG);
-        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.NAME), PropertyType.NAME);
-        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.PATH), PropertyType.PATH);
-        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.REFERENCE), PropertyType.REFERENCE);
-        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.STRING), PropertyType.STRING);
-        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.UNDEFINED), PropertyType.UNDEFINED);
-        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.URI), PropertyType.URI);
-        TYPE_LOOKUP.put(contentTypeFromType(PropertyType.WEAKREFERENCE), PropertyType.WEAKREFERENCE);
-    }
-
-    public static String contentTypeFromType(int propertyType) {
-        return VALUE_CONTENT_TYPE_FRAGMENT + PropertyType.nameFromValue(propertyType).toLowerCase();
-    }
-
-    public static int typeFromContentType(String contentType) {
-        if (contentType != null) {
-            // remove charset if present
-            int pos = contentType.indexOf(';');
-            String ct = (pos == -1) ? contentType : contentType.substring(0, pos);
-            if (TYPE_LOOKUP.containsKey(ct)) {
-                return TYPE_LOOKUP.get(ct);
-            }
-        }
+/** <code>JcrValueType</code>...
+ *
+ * @deprecate As of Jackrabbit 2.2. Please Use {@link org.apache.jackrabbit.commons.webdav.JcrValueType} instead.
+ */
+public final class JcrValueType extends org.apache.jackrabbit.commons.webdav.JcrValueType {
 
-        // some invalid content type argument that does not match any of the
-        // strings created by contentTypeFromType(int propertyType)
-        log.warn("Cannot extract property type from content type " + contentType + " -> Fallback is UNDEFINED.");
-        return PropertyType.UNDEFINED;
-    }
 }
\ No newline at end of file

Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/nodetype/ItemDefinitionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/nodetype/ItemDefinitionImpl.java?rev=1002639&r1=1002638&r2=1002639&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/nodetype/ItemDefinitionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/nodetype/ItemDefinitionImpl.java Wed Sep 29 14:11:53 2010
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.webdav.jcr.nodetype;
 
+import org.apache.jackrabbit.commons.webdav.NodeTypeConstants;
 import org.apache.jackrabbit.webdav.xml.XmlSerializable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/nodetype/NodeTypeProperty.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/nodetype/NodeTypeProperty.java?rev=1002639&r1=1002638&r2=1002639&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/nodetype/NodeTypeProperty.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/nodetype/NodeTypeProperty.java Wed Sep 29 14:11:53 2010
@@ -16,19 +16,17 @@
  */
 package org.apache.jackrabbit.webdav.jcr.nodetype;
 
+import org.apache.jackrabbit.commons.webdav.NodeTypeConstants;
+import org.apache.jackrabbit.commons.webdav.NodeTypeUtil;
 import org.apache.jackrabbit.webdav.property.AbstractDavProperty;
 import org.apache.jackrabbit.webdav.property.DavProperty;
 import org.apache.jackrabbit.webdav.property.DavPropertyName;
-import org.apache.jackrabbit.webdav.xml.DomUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
 import javax.jcr.nodetype.NodeType;
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
 
 /**
@@ -36,8 +34,6 @@ import java.util.Set;
  */
 public class NodeTypeProperty extends AbstractDavProperty<Set<String>> implements NodeTypeConstants {
 
-    private static Logger log = LoggerFactory.getLogger(NodeTypeProperty.class);
-
     private final Set<String> nodetypeNames = new HashSet<String>();
 
     public NodeTypeProperty(DavPropertyName name, NodeType nodeType, boolean isProtected) {
@@ -73,43 +69,17 @@ public class NodeTypeProperty extends Ab
         if (property instanceof NodeTypeProperty) {
             nodetypeNames.addAll(((NodeTypeProperty) property).nodetypeNames);
         } else {
-            // assume property has be built from xml
-            Object propValue = property.getValue();
-            if (propValue instanceof List) {
-                retrieveNodeTypeNames(((List<?>)propValue));
-            } else if (propValue instanceof Element) {
-                List<Element> l = Collections.singletonList((Element) propValue);
-                retrieveNodeTypeNames(l);
-            } else {
-                log.debug("NodeTypeProperty '" + property.getName() + "' has no/unparsable value.");
-            }
-        }
-    }
-
-    private void retrieveNodeTypeNames(List<?> elementList) {
-        for (Object content : elementList) {
-            if (!(content instanceof Element)) {
-                continue;
-            }
-            Element el = (Element) content;
-            if (XML_NODETYPE.equals(el.getLocalName()) && NodeTypeConstants.NAMESPACE.isSame(el.getNamespaceURI())) {
-                String nodetypeName = DomUtil.getChildText(el, XML_NODETYPENAME, NodeTypeConstants.NAMESPACE);
-                if (nodetypeName != null && !"".equals(nodetypeName)) {
-                    nodetypeNames.add(nodetypeName);
-                }
-            } else {
-                log.debug("'dcr:nodetype' element expected -> ignoring element '" + ((Element) content).getNodeName() + "'");
-            }
+            nodetypeNames.addAll(NodeTypeUtil.ntNamesFromXml(property.getValue()));
         }
     }
 
     /**
-     * Return a set of nodetype names present in this property.
+     * Return a set of node type names present in this property.
      *
-     * @return set of nodetype names
+     * @return set of node type names
      */
     public Set<String> getNodeTypeNames() {
-        return nodetypeNames;
+        return Collections.unmodifiableSet(nodetypeNames);
     }
 
     /**
@@ -118,7 +88,7 @@ public class NodeTypeProperty extends Ab
      * @return a Set of nodetype names (String).
      */
     public Set<String> getValue() {
-        return nodetypeNames;
+        return Collections.unmodifiableSet(nodetypeNames);
     }
 
     /**
@@ -128,8 +98,7 @@ public class NodeTypeProperty extends Ab
     public Element toXml(Document document) {
         Element elem = getName().toXml(document);
         for (String name : getNodeTypeNames()) {
-            Element ntElem = DomUtil.addChildElement(elem, XML_NODETYPE, NodeTypeConstants.NAMESPACE);
-            DomUtil.addChildElement(ntElem, XML_NODETYPENAME, NodeTypeConstants.NAMESPACE, name);
+            elem.appendChild(NodeTypeUtil.ntNameToXml(name, document));
         }
         return elem;
     }

Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/observation/SubscriptionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/observation/SubscriptionImpl.java?rev=1002639&r1=1002638&r2=1002639&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/observation/SubscriptionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/observation/SubscriptionImpl.java Wed Sep 29 14:11:53 2010
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.webdav.jcr.observation;
 
+import org.apache.jackrabbit.commons.webdav.EventUtil;
 import org.apache.jackrabbit.webdav.DavException;
 import org.apache.jackrabbit.webdav.DavResourceLocator;
 import org.apache.jackrabbit.webdav.DavServletResponse;
@@ -63,48 +64,6 @@ public class SubscriptionImpl implements
     private static Logger log = LoggerFactory.getLogger(SubscriptionImpl.class);
     private static final long DEFAULT_TIMEOUT = 300000; // 5 minutes
 
-    /**
-     * Element representing the 'nodeadded' event type.
-     * @see javax.jcr.observation.Event#NODE_ADDED
-     */
-    private static final String EVENT_NODEADDED = "nodeadded";
-
-    /**
-     * Element representing the 'noderemoved' event type.
-     * @see javax.jcr.observation.Event#NODE_REMOVED
-     */
-    private static final String EVENT_NODEREMOVED = "noderemoved";
-
-    /**
-     * Element representing the 'propertyadded' event type.
-     * @see javax.jcr.observation.Event#PROPERTY_ADDED
-     */
-    private static final String EVENT_PROPERTYADDED = "propertyadded";
-
-    /**
-     * Element representing the 'propertyremoved' event type.
-     * @see javax.jcr.observation.Event#PROPERTY_REMOVED
-     */
-    private static final String EVENT_PROPERTYREMOVED = "propertyremoved";
-
-    /**
-     * Element representing the 'propertychanged' event type.
-     * @see javax.jcr.observation.Event#PROPERTY_CHANGED
-     */
-    private static final String EVENT_PROPERTYCHANGED = "propertychanged";
-
-    /**
-     * Element representing the 'nodemoved' event type.
-     * @see javax.jcr.observation.Event#NODE_MOVED
-     */
-    private static final String EVENT_NODEMOVED = "nodemoved";
-
-    /**
-     * Element representing the 'persist' event type.
-     * @see javax.jcr.observation.Event#PERSIST
-     */
-    private static final String EVENT_PERSIST = "persist";
-
     private SubscriptionInfo info;
     private long expirationTime;
 
@@ -401,32 +360,7 @@ public class SubscriptionImpl implements
      * </ul>
      */
     public static EventType getEventType(int jcrEventType) {
-        String localName;
-        switch (jcrEventType) {
-            case Event.NODE_ADDED:
-                localName = EVENT_NODEADDED;
-                break;
-            case Event.NODE_REMOVED:
-                localName = EVENT_NODEREMOVED;
-                break;
-            case Event.PROPERTY_ADDED:
-                localName = EVENT_PROPERTYADDED;
-                break;
-            case Event.PROPERTY_CHANGED:
-                localName = EVENT_PROPERTYCHANGED;
-                break;
-            case Event.PROPERTY_REMOVED:
-                localName = EVENT_PROPERTYREMOVED;
-                break;
-            case Event.NODE_MOVED:
-                localName = EVENT_NODEMOVED;
-                break;
-            case Event.PERSIST:
-                localName = EVENT_PERSIST;
-                break;
-            default: // no default
-                throw new IllegalArgumentException("Invalid JCR event type: " + jcrEventType);
-        }
+        String localName = EventUtil.getEventName(jcrEventType);
         return DefaultEventType.create(localName, NAMESPACE);
     }
 
@@ -434,15 +368,7 @@ public class SubscriptionImpl implements
      * @return The DAV event type representation for all known JCR event types.
      */
     public static EventType[] getAllEventTypes() {
-        EventType[] types = new EventType[] {
-                getEventType(javax.jcr.observation.Event.NODE_ADDED),
-                getEventType(javax.jcr.observation.Event.NODE_REMOVED),
-                getEventType(javax.jcr.observation.Event.PROPERTY_ADDED),
-                getEventType(javax.jcr.observation.Event.PROPERTY_CHANGED),
-                getEventType(javax.jcr.observation.Event.PROPERTY_REMOVED),
-                getEventType(javax.jcr.observation.Event.NODE_MOVED),
-                getEventType(javax.jcr.observation.Event.PERSIST)
-        };
+        EventType[] types = DefaultEventType.create(EventUtil.EVENT_ALL, NAMESPACE);
         return types;
     }
 
@@ -470,26 +396,11 @@ public class SubscriptionImpl implements
         if (eventType == null || !NAMESPACE.equals(eventType.getNamespace())) {
             throw new DavException(DavServletResponse.SC_UNPROCESSABLE_ENTITY, "Invalid JCR event type: "+ eventType + ": Namespace mismatch.");
         }
-        int eType;
         String eventName = eventType.getName();
-        if (EVENT_NODEADDED.equals(eventName)) {
-            eType = Event.NODE_ADDED;
-        } else if (EVENT_NODEREMOVED.equals(eventName)) {
-            eType = Event.NODE_REMOVED;
-        } else if (EVENT_PROPERTYADDED.equals(eventName)) {
-            eType = Event.PROPERTY_ADDED;
-        } else if (EVENT_PROPERTYCHANGED.equals(eventName)) {
-            eType = Event.PROPERTY_CHANGED;
-        } else if (EVENT_PROPERTYREMOVED.equals(eventName)) {
-            eType = Event.PROPERTY_REMOVED;
-        } else if (EVENT_NODEMOVED.equals(eventName)) {
-            eType = Event.NODE_MOVED;
-        } else if (EVENT_PERSIST.equals(eventName)) {
-            eType = Event.PERSIST;
-        } else {
+        if (!EventUtil.isValidEventName(eventName)) {
             throw new DavException(DavServletResponse.SC_UNPROCESSABLE_ENTITY, "Invalid event type: "+eventName);
         }
-        return eType;
+        return EventUtil.getJcrEventType(eventName);
     }
 
     /**

Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/property/ValuesProperty.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/property/ValuesProperty.java?rev=1002639&r1=1002638&r2=1002639&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/property/ValuesProperty.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/property/ValuesProperty.java Wed Sep 29 14:11:53 2010
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.webdav.jcr.property;
 
+import org.apache.jackrabbit.commons.webdav.ValueUtil;
 import org.apache.jackrabbit.value.ValueHelper;
 import org.apache.jackrabbit.webdav.DavException;
 import org.apache.jackrabbit.webdav.DavServletResponse;
@@ -23,7 +24,6 @@ import org.apache.jackrabbit.webdav.jcr.
 import org.apache.jackrabbit.webdav.property.AbstractDavProperty;
 import org.apache.jackrabbit.webdav.property.DavProperty;
 import org.apache.jackrabbit.webdav.property.DavPropertyName;
-import org.apache.jackrabbit.webdav.xml.DomUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
@@ -34,13 +34,12 @@ import javax.jcr.RepositoryException;
 import javax.jcr.Value;
 import javax.jcr.ValueFormatException;
 import javax.jcr.ValueFactory;
-import java.util.ArrayList;
-import java.util.List;
 
 /**
- * <code>ValuesProperty</code> extends {@link org.apache.jackrabbit.webdav.property.DavProperty} providing
- * utilities to handle the multiple values of the property item represented
- * by this resource.
+ * <code>ValuesProperty</code> implements {@link org.apache.jackrabbit.webdav.property.DavProperty}
+ * providing utilities to handle the value(s) of a JCR property item resource.
+ * In case the property is multivalued the DavProperty value consists of
+ * an element named {@link #JCR_VALUES} otherwise its name is {@link #JCR_VALUE}.
  */
 public class ValuesProperty extends AbstractDavProperty<Value[]> implements ItemResourceConstants {
 
@@ -90,38 +89,7 @@ public class ValuesProperty extends Abst
             throw new DavException(DavServletResponse.SC_BAD_REQUEST, "ValuesProperty may only be created with a property that has name="+JCR_VALUES.getName());
         }
 
-        // retrieve jcr-values from child 'value'-element(s)
-        List<Element> valueElements = new ArrayList<Element>();
-        Object propValue = property.getValue();
-        if (propValue == null) {
-            jcrValues = new Value[0];
-        } else { /* not null propValue */
-            if (isValueElement(propValue)) {
-                valueElements.add((Element) propValue);
-            } else if (propValue instanceof List) {
-                for (Object el : ((List<?>) property.getValue())) {
-                    /* make sure, only Elements with name 'value' are used for
-                    * the 'value' field. any other content (other elements, text,
-                    * comment etc.) is ignored. NO bad-request/conflict error is
-                    * thrown.
-                    */
-                    if (isValueElement(el)) {
-                        valueElements.add((Element) el);
-                    }
-                }
-            }
-            /* fill the 'value' with the valid 'value' elements found before */
-            jcrValues = new Value[valueElements.size()];
-            int i = 0;
-            for (Element element : valueElements) {
-                jcrValues[i] = getJcrValue(element, defaultType, valueFactory);
-                i++;
-            }
-        }
-    }
-
-    private static boolean isValueElement(Object obj) {
-        return obj instanceof Element && XML_VALUE.equals(((Element)obj).getLocalName());
+        jcrValues = ValueUtil.valuesFromXml(property.getValue(), defaultType, valueFactory);
     }
 
     private void checkPropertyName(DavPropertyName reqName) throws ValueFormatException {
@@ -131,32 +99,10 @@ public class ValuesProperty extends Abst
     }
 
     /**
-     *
-     * @param valueElement
-     * @param defaultType
-     * @return
-     * @throws ValueFormatException
-     * @throws RepositoryException
-     */
-    private static Value getJcrValue(Element valueElement, int defaultType,
-                                     ValueFactory valueFactory)
-        throws ValueFormatException, RepositoryException {
-        if (valueElement == null) {
-            return null;
-        }
-        // make sure the value is never 'null'
-        String value = DomUtil.getText(valueElement, "");
-        String typeStr = DomUtil.getAttribute(valueElement, ATTR_VALUE_TYPE, ItemResourceConstants.NAMESPACE);
-        int type = (typeStr == null) ? defaultType : PropertyType.valueFromName(typeStr);
-        // deserialize value ->> see #toXml where values are serialized
-        return ValueHelper.deserialize(value, type, true, valueFactory);
-    }
-
-    /**
      * Converts the value of this property to a {@link javax.jcr.Value value array}.
      *
      * @return Array of Value objects
-     * @throws ValueFormatException if convertion of the internal jcr values to
+     * @throws ValueFormatException if converting the internal jcr values to
      * the specified value type fails.
      */
     public Value[] getJcrValues(int propertyType, ValueFactory valueFactory) throws ValueFormatException {
@@ -165,7 +111,7 @@ public class ValuesProperty extends Abst
         for (int i = 0; i < jcrValues.length; i++) {
             vs[i] = ValueHelper.convert(jcrValues[i], propertyType, valueFactory);
         }
-        return jcrValues;
+        return vs;
     }
 
     /**
@@ -234,10 +180,7 @@ public class ValuesProperty extends Abst
         Element elem = getName().toXml(document);
         try {
             for (Value v : jcrValues) {
-                String type = PropertyType.nameFromValue(v.getType());
-                String serializedValue = ValueHelper.serialize(v, true);
-                Element xmlValue = DomUtil.createElement(document, XML_VALUE, ItemResourceConstants.NAMESPACE, serializedValue);
-                DomUtil.setAttribute(xmlValue, ATTR_VALUE_TYPE, ItemResourceConstants.NAMESPACE, type);
+                Element xmlValue = ValueUtil.valueToXml(v, document);
                 elem.appendChild(xmlValue);
             }
         } catch (RepositoryException e) {