You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by re...@apache.org on 2016/12/12 15:57:23 UTC

svn commit: r1773809 [1/3] - in /jackrabbit/trunk/jackrabbit-webdav: ./ src/main/java/org/apache/jackrabbit/webdav/client/methods/ src/main/java/org/apache/jackrabbit/webdav/header/ src/main/java/org/apache/jackrabbit/webdav/util/ src/test/java/org/apa...

Author: reschke
Date: Mon Dec 12 15:57:22 2016
New Revision: 1773809

URL: http://svn.apache.org/viewvc?rev=1773809&view=rev
Log:
JCR-4065: add WebDAV API based on HttpClient4

Added:
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/BaseDavRequest.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpBind.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCheckin.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCheckout.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCopy.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpDelete.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpLabel.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpLock.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMerge.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMkcol.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMkworkspace.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMove.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpOptions.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpOrderpatch.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpPoll.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpPropfind.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpProppatch.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpRebind.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpReport.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpSearch.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpSubscribe.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnbind.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnlock.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnsubscribe.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUpdate.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpVersionControl.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/XmlEntity.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/header/FieldValueParser.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/test/java/org/apache/jackrabbit/webdav/header/
    jackrabbit/trunk/jackrabbit-webdav/src/test/java/org/apache/jackrabbit/webdav/header/FieldValueParserTest.java   (with props)
    jackrabbit/trunk/jackrabbit-webdav/src/test/java/org/apache/jackrabbit/webdav/server/WebDAVTest.java   (with props)
Modified:
    jackrabbit/trunk/jackrabbit-webdav/pom.xml
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/package-info.java
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/header/package-info.java
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/util/LinkHeaderFieldParser.java
    jackrabbit/trunk/jackrabbit-webdav/src/test/java/org/apache/jackrabbit/webdav/server/BindTest.java
    jackrabbit/trunk/jackrabbit-webdav/src/test/java/org/apache/jackrabbit/webdav/server/RFC4918DestinationHeaderTest.java
    jackrabbit/trunk/jackrabbit-webdav/src/test/java/org/apache/jackrabbit/webdav/server/RFC4918IfHeaderTest.java
    jackrabbit/trunk/jackrabbit-webdav/src/test/java/org/apache/jackrabbit/webdav/server/RFC4918PropfindTest.java
    jackrabbit/trunk/jackrabbit-webdav/src/test/java/org/apache/jackrabbit/webdav/util/LinkHeaderFieldParserTest.java

Modified: jackrabbit/trunk/jackrabbit-webdav/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/pom.xml?rev=1773809&r1=1773808&r2=1773809&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/pom.xml (original)
+++ jackrabbit/trunk/jackrabbit-webdav/pom.xml Mon Dec 12 15:57:22 2016
@@ -101,6 +101,16 @@
       <scope>provided</scope>
     </dependency>
     <dependency>
+        <groupId>commons-codec</groupId>
+        <artifactId>commons-codec</artifactId>
+        <version>1.10</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpclient</artifactId>
+      <version>4.5.2</version>
+    </dependency>
+    <dependency>
       <groupId>commons-httpclient</groupId>
       <artifactId>commons-httpclient</artifactId>
       <version>3.1</version>

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/BaseDavRequest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/BaseDavRequest.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/BaseDavRequest.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/BaseDavRequest.java Mon Dec 12 15:57:22 2016
@@ -0,0 +1,219 @@
+/*
+ * 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.webdav.client.methods;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.StatusLine;
+import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.DavException;
+import org.apache.jackrabbit.webdav.MultiStatus;
+import org.apache.jackrabbit.webdav.lock.LockDiscovery;
+import org.apache.jackrabbit.webdav.observation.EventDiscovery;
+import org.apache.jackrabbit.webdav.observation.ObservationConstants;
+import org.apache.jackrabbit.webdav.observation.Subscription;
+import org.apache.jackrabbit.webdav.observation.SubscriptionDiscovery;
+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 org.xml.sax.SAXException;
+
+/**
+ * Base class for HTTP request classes defined in this package.
+ */
+public abstract class BaseDavRequest extends HttpEntityEnclosingRequestBase {
+
+    private static Logger log = LoggerFactory.getLogger(BaseDavRequest.class);
+
+    public BaseDavRequest(URI uri) {
+        super();
+        super.setURI(uri);
+    }
+
+    /**
+     * Gets a {@link Document} representing the response body.
+     * @return document or {@code null} for null entity
+     * @throws IOException in case of I/O or XMP pasting problems 
+     */
+    public Document getResponseBodyAsDocument(HttpEntity entity) throws IOException {
+
+        if (entity == null) {
+            return null;
+        } else {
+            // read response and try to build a xml document
+            InputStream in = entity.getContent();
+            try {
+                return DomUtil.parseDocument(in);
+            } catch (ParserConfigurationException ex) {
+                throw new IOException("XML parser configuration error", ex);
+            } catch (SAXException ex) {
+                throw new IOException("XML parsing error", ex);
+            } finally {
+                in.close();
+            }
+        }
+    }
+
+    /**
+     * Return response body as {@link MultiStatus} object.
+     * @throws IllegalStateException when response does not represent a {@link MultiStatus}
+     * @throws DavException for failures in obtaining/parsing the response body
+     */
+    public MultiStatus getResponseBodyAsMultiStatus(HttpResponse response) throws DavException {
+        try {
+            Document doc = getResponseBodyAsDocument(response.getEntity());
+            if (doc == null) {
+                throw new DavException(response.getStatusLine().getStatusCode(), "no response body");
+            }
+            return MultiStatus.createFromXml(doc.getDocumentElement());
+        } catch (IOException ex) {
+            throw new DavException(response.getStatusLine().getStatusCode(), ex);
+        }
+    }
+
+    /**
+     * Return response body as {@link LockDiscovery} object.
+     * @throws IllegalStateException when response does not represent a {@link LockDiscovery}
+     * @throws DavException for failures in obtaining/parsing the response body
+     */
+    public LockDiscovery getResponseBodyAsLockDiscovery(HttpResponse response) throws DavException {
+        try {
+            Document doc = getResponseBodyAsDocument(response.getEntity());
+            if (doc == null) {
+                throw new DavException(response.getStatusLine().getStatusCode(), "no response body");
+            }
+            Element root = doc.getDocumentElement();
+
+            if (!DomUtil.matches(root, DavConstants.XML_PROP, DavConstants.NAMESPACE)
+                    && DomUtil.hasChildElement(root, DavConstants.PROPERTY_LOCKDISCOVERY, DavConstants.NAMESPACE)) {
+                throw new DavException(response.getStatusLine().getStatusCode(),
+                        "Missing DAV:prop response body in LOCK response.");
+            }
+
+            Element lde = DomUtil.getChildElement(root, DavConstants.PROPERTY_LOCKDISCOVERY, DavConstants.NAMESPACE);
+            if (!DomUtil.hasChildElement(lde, DavConstants.XML_ACTIVELOCK, DavConstants.NAMESPACE)) {
+                throw new DavException(response.getStatusLine().getStatusCode(),
+                        "The DAV:lockdiscovery must contain a least a single DAV:activelock in response to a successful LOCK request.");
+            }
+
+            return LockDiscovery.createFromXml(lde);
+        } catch (IOException ex) {
+            throw new DavException(response.getStatusLine().getStatusCode(), ex);
+        }
+    }
+
+    /**
+     * Return response body as {@link SubscriptionDiscovery} object.
+     * @throws IllegalStateException when response does not represent a {@link SubscriptionDiscovery}
+     * @throws DavException for failures in obtaining/parsing the response body
+     */
+    public SubscriptionDiscovery getResponseBodyAsSubscriptionDiscovery(HttpResponse response) throws DavException {
+        try {
+            Document doc = getResponseBodyAsDocument(response.getEntity());
+            if (doc == null) {
+                throw new DavException(response.getStatusLine().getStatusCode(), "no response body");
+            }
+            Element root = doc.getDocumentElement();
+
+            if (!DomUtil.matches(root, DavConstants.XML_PROP, DavConstants.NAMESPACE)
+                    && DomUtil.hasChildElement(root, ObservationConstants.SUBSCRIPTIONDISCOVERY.getName(),
+                            ObservationConstants.SUBSCRIPTIONDISCOVERY.getNamespace())) {
+                throw new DavException(response.getStatusLine().getStatusCode(),
+                        "Missing DAV:prop response body in SUBSCRIBE response.");
+            }
+
+            Element sde = DomUtil.getChildElement(root, ObservationConstants.SUBSCRIPTIONDISCOVERY.getName(),
+                    ObservationConstants.SUBSCRIPTIONDISCOVERY.getNamespace());
+            SubscriptionDiscovery sd = SubscriptionDiscovery.createFromXml(sde);
+            if (((Subscription[]) sd.getValue()).length > 0) {
+                return sd;
+            } else {
+                throw new DavException(response.getStatusLine().getStatusCode(),
+                        "Missing 'subscription' elements in SUBSCRIBE response body. At least a single subscription must be present if SUBSCRIBE was successful.");
+            }
+        } catch (IOException ex) {
+            throw new DavException(response.getStatusLine().getStatusCode(), ex);
+        }
+    }
+
+    /**
+     * Return response body as {@link EventDiscovery} object.
+     * @throws IllegalStateException when response does not represent a {@link EventDiscovery}
+     * @throws DavException for failures in obtaining/parsing the response body
+     */
+    public EventDiscovery getResponseBodyAsEventDiscovery(HttpResponse response) throws DavException {
+        try {
+            Document doc = getResponseBodyAsDocument(response.getEntity());
+            if (doc == null) {
+                throw new DavException(response.getStatusLine().getStatusCode(), "no response body");
+            }
+            return EventDiscovery.createFromXml(doc.getDocumentElement());
+        } catch (IOException ex) {
+            throw new DavException(response.getStatusLine().getStatusCode(), ex);
+        }
+    }
+
+    /**
+     * Check the response and throw when it is considered to represent a failure.
+     */
+    public void checkSuccess(HttpResponse response) throws DavException {
+        if (!succeeded(response)) {
+            throw getResponseException(response);
+        }
+    }
+
+    /**
+     * Obtain a {@link DavException} representing the response.
+     * @throws IllegalStateException when the response is considered to be successful
+     */
+    public DavException getResponseException(HttpResponse response) {
+        if (succeeded(response)) {
+            String msg = "Cannot retrieve exception from successful response.";
+            log.warn(msg);
+            throw new IllegalStateException(msg);
+        }
+
+        StatusLine st = response.getStatusLine();
+        Element responseRoot = null;
+        try {
+            responseRoot = getResponseBodyAsDocument(response.getEntity()).getDocumentElement();
+        } catch (IOException e) {
+            // non-parseable body -> use null element
+        }
+
+        return new DavException(st.getStatusCode(), st.getReasonPhrase(), null, responseRoot);
+    }
+
+    /**
+     * Check the provided {@link HttpResponse} for successful execution. The default implementation treats all
+     * 2xx status codes (<a href="http://webdav.org/specs/rfc7231.html#rfc.section.6.3">RFC 7231, Section 6.3</a>).
+     * Implementations can further restrict the accepted range of responses (or even check the response body).
+     */
+    public boolean succeeded(HttpResponse response) {
+        int status = response.getStatusLine().getStatusCode();
+        return status >= 200 && status <= 299;
+    }
+}

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/BaseDavRequest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpBind.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpBind.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpBind.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpBind.java Mon Dec 12 15:57:22 2016
@@ -0,0 +1,54 @@
+/*
+ * 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.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.bind.BindInfo;
+
+/**
+ * Represents an HTTP BIND request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc5842.html#rfc.section.4">RFC 5842, Section 4</a>
+ * @since 2.13.6
+ */
+public class HttpBind extends BaseDavRequest {
+
+    public HttpBind(URI uri, BindInfo info) throws IOException {
+        super(uri);
+        super.setEntity(XmlEntity.create(info));
+    }
+
+    public HttpBind(String uri, BindInfo info) throws IOException {
+        this(URI.create(uri), info);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_BIND;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_OK || statusCode == DavServletResponse.SC_CREATED;
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpBind.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCheckin.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCheckin.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCheckin.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCheckin.java Mon Dec 12 15:57:22 2016
@@ -0,0 +1,51 @@
+/*
+ * 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.webdav.client.methods;
+
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+
+/**
+ * Represents an HTTP CHECKIN request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc3253.html#rfc.section.4.4">RFC 3253, Section 4.4</a>
+ * @since 2.13.6
+ */
+public class HttpCheckin extends BaseDavRequest {
+
+    public HttpCheckin(URI uri) {
+        super(uri);
+    }
+
+    public HttpCheckin(String uri) {
+        this(URI.create(uri));
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_CHECKIN;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_CREATED;
+    }
+}

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCheckin.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCheckout.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCheckout.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCheckout.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCheckout.java Mon Dec 12 15:57:22 2016
@@ -0,0 +1,51 @@
+/*
+ * 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.webdav.client.methods;
+
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+
+/**
+ * Represents an HTTP CHECKOUT request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc3253.html#rfc.section.4.3">RFC 3253, Section 4.3</a>
+ * @since 2.13.6
+ */
+public class HttpCheckout extends BaseDavRequest {
+
+    public HttpCheckout(URI uri) {
+        super(uri);
+    }
+
+    public HttpCheckout(String uri) {
+        this(URI.create(uri));
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_CHECKOUT;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_OK;
+    }
+}

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCheckout.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCopy.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCopy.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCopy.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCopy.java Mon Dec 12 15:57:22 2016
@@ -0,0 +1,59 @@
+/*
+ * 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.webdav.client.methods;
+
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+
+/**
+ * Represents an HTTP COPY request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc4918.html#rfc.section.9.8">RFC 4918, Section 9.8</a>
+ * @since 2.13.6
+ */
+public class HttpCopy extends BaseDavRequest {
+
+    public HttpCopy(URI uri, URI dest, boolean overwrite, boolean shallow) {
+        super(uri);
+        super.setHeader(DavConstants.HEADER_DESTINATION, dest.toASCIIString());
+        if (!overwrite) {
+            super.setHeader(DavConstants.HEADER_OVERWRITE, "F");
+        }
+        if (shallow) {
+            super.setHeader("Depth", "0");
+        }
+    }
+
+    public HttpCopy(String uri, String dest, boolean overwrite, boolean shallow) {
+        this(URI.create(uri), URI.create(dest), overwrite, shallow);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_COPY;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_CREATED || statusCode == DavServletResponse.SC_NO_CONTENT;
+    }
+}

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpCopy.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpDelete.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpDelete.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpDelete.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpDelete.java Mon Dec 12 15:57:22 2016
@@ -0,0 +1,43 @@
+/*
+ * 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.webdav.client.methods;
+
+import java.net.URI;
+
+import org.apache.jackrabbit.webdav.DavMethods;
+
+/**
+ * Represents an HTTP DELETE request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc7231.html#rfc.section.4.3.5">RFC 7231, Section 4.3.5</a>
+ * @since 2.13.6
+ */
+public class HttpDelete extends BaseDavRequest {
+
+    public HttpDelete(URI uri){
+        super(uri);
+    }
+
+    public HttpDelete(String uri) {
+        this(URI.create(uri));
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_DELETE;
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpDelete.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpLabel.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpLabel.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpLabel.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpLabel.java Mon Dec 12 15:57:22 2016
@@ -0,0 +1,57 @@
+/*
+ * 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.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.header.DepthHeader;
+import org.apache.jackrabbit.webdav.version.LabelInfo;
+
+/**
+ * Represents an HTTP LABEL request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc3253.html#rfc.section.8.2">RFC 3253, Section 8.2</a>
+ * @since 2.13.6
+ */
+public class HttpLabel extends BaseDavRequest {
+
+    public HttpLabel(URI uri, LabelInfo labelInfo) throws IOException {
+        super(uri);
+        DepthHeader dh = new DepthHeader(labelInfo.getDepth());
+        super.setHeader(dh.getHeaderName(), dh.getHeaderValue());
+        super.setEntity(XmlEntity.create(labelInfo));
+    }
+
+    public HttpLabel(String uri, LabelInfo labelInfo) throws IOException {
+        this(URI.create(uri), labelInfo);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_LABEL;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_OK;
+    }
+}

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpLabel.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpLock.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpLock.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpLock.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpLock.java Mon Dec 12 15:57:22 2016
@@ -0,0 +1,107 @@
+/*
+ * 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.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.Arrays;
+
+import org.apache.http.Header;
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.header.DepthHeader;
+import org.apache.jackrabbit.webdav.header.IfHeader;
+import org.apache.jackrabbit.webdav.header.TimeoutHeader;
+import org.apache.jackrabbit.webdav.lock.LockInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Represents an HTTP LOCK request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc4918.html#rfc.section.9.10">RFC 4918, Section 9.10</a>
+ * @since 2.13.6
+ */
+public class HttpLock extends BaseDavRequest {
+
+    private static final Logger LOG = LoggerFactory.getLogger(HttpLock.class);
+
+    private final boolean isRefresh;
+
+    public HttpLock(URI uri, LockInfo lockInfo) throws IOException {
+        super(uri);
+
+        TimeoutHeader th = new TimeoutHeader(lockInfo.getTimeout());
+        super.setHeader(th.getHeaderName(), th.getHeaderValue());
+        DepthHeader dh = new DepthHeader(lockInfo.isDeep());
+        super.setHeader(dh.getHeaderName(), dh.getHeaderValue());
+
+        super.setEntity(XmlEntity.create(lockInfo));
+
+        isRefresh = false;
+    }
+
+    public HttpLock(String uri, LockInfo lockInfo) throws IOException {
+        this(URI.create(uri), lockInfo);
+    }
+
+    public HttpLock(URI uri, long timeout, String[] lockTokens) {
+        super(uri);
+
+        TimeoutHeader th = new TimeoutHeader(timeout);
+        super.setHeader(th.getHeaderName(), th.getHeaderValue());
+        IfHeader ifh = new IfHeader(lockTokens);
+        super.setHeader(ifh.getHeaderName(), ifh.getHeaderValue());
+        isRefresh = true;
+    }
+
+    public HttpLock(String uri, long timeout, String[] lockTokens) {
+        this(URI.create(uri), timeout, lockTokens);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_LOCK;
+    }
+
+    public String getLockToken(HttpResponse response) {
+        Header[] ltHeader = response.getHeaders(DavConstants.HEADER_LOCK_TOKEN);
+        if (ltHeader == null || ltHeader.length == 0) {
+            return null;
+        } else if (ltHeader.length != 1) {
+            LOG.debug("Multiple 'Lock-Token' header fields in response for " + getURI() + ": " + Arrays.asList(ltHeader));
+            return null;
+        } else {
+            String v = ltHeader[0].getValue().trim();
+            if (!v.startsWith("<") || !v.endsWith(">")) {
+                LOG.debug("Invalid 'Lock-Token' header field in response for " + getURI() + ": " + Arrays.asList(ltHeader));
+                return null;
+            } else {
+                return v.substring(1, v.length() - 1);
+            }
+        }
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        boolean lockTokenHeaderOk = isRefresh || null != getLockToken(response);
+        return lockTokenHeaderOk && (statusCode == DavServletResponse.SC_OK || statusCode == DavServletResponse.SC_CREATED);
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpLock.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMerge.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMerge.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMerge.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMerge.java Mon Dec 12 15:57:22 2016
@@ -0,0 +1,55 @@
+/*
+ * 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.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.version.MergeInfo;
+
+/**
+ * Represents an HTTP MERGE request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc3253.html#rfc.section.11.2">RFC 3253, Section 11.2</a>
+ * @since 2.13.6
+ */
+public class HttpMerge extends BaseDavRequest {
+
+    public HttpMerge(URI uri, MergeInfo mergeInfo) throws IOException {
+        super(uri);
+        super.setEntity(XmlEntity.create(mergeInfo));
+    }
+
+    public HttpMerge(String uri, MergeInfo mergeInfo) throws IOException {
+        this(URI.create(uri), mergeInfo);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_MERGE;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        // TODO: is this correct?
+        return statusCode == DavServletResponse.SC_MULTI_STATUS;
+    }
+}

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMerge.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMkcol.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMkcol.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMkcol.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMkcol.java Mon Dec 12 15:57:22 2016
@@ -0,0 +1,51 @@
+/*
+ * 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.webdav.client.methods;
+
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+
+/**
+ * Represents an HTTP MKCOL request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc4918.html#rfc.section.9.3">RFC 4918, Section 9.3</a>
+ * @since 2.13.6
+ */
+public class HttpMkcol extends BaseDavRequest {
+
+    public HttpMkcol(URI uri) {
+        super(uri);
+    }
+
+    public HttpMkcol(String uri) {
+        this(URI.create(uri));
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_MKCOL;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_CREATED;
+    }
+}

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMkcol.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMkworkspace.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMkworkspace.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMkworkspace.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMkworkspace.java Mon Dec 12 15:57:22 2016
@@ -0,0 +1,51 @@
+/*
+ * 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.webdav.client.methods;
+
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+
+/**
+ * Represents an HTTP MKWORKSPACE request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc3253.html#rfc.section.6.3">RFC 3253, Section 6.3</a>
+ * @since 2.13.6
+ */
+public class HttpMkworkspace extends BaseDavRequest {
+
+    public HttpMkworkspace(URI uri) {
+        super(uri);
+    }
+
+    public HttpMkworkspace(String uri) {
+        this(URI.create(uri));
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_MKWORKSPACE;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_CREATED;
+    }
+}

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMkworkspace.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMove.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMove.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMove.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMove.java Mon Dec 12 15:57:22 2016
@@ -0,0 +1,56 @@
+/*
+ * 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.webdav.client.methods;
+
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+
+/**
+ * Represents an HTTP MOVE request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc4918.html#rfc.section.9.9">RFC 4918, Section 9.9</a>
+ * @since 2.13.6
+ */
+public class HttpMove extends BaseDavRequest {
+
+    public HttpMove(URI uri, URI dest, boolean overwrite) {
+        super(uri);
+        super.setHeader(DavConstants.HEADER_DESTINATION, dest.toASCIIString());
+        if (!overwrite) {
+            super.setHeader(DavConstants.HEADER_OVERWRITE, "F");
+        }
+    }
+
+    public HttpMove(String uri, String dest, boolean overwrite) {
+        this(URI.create(uri), URI.create(dest), overwrite);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_MOVE;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_CREATED || statusCode == DavServletResponse.SC_NO_CONTENT;
+    }
+}

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpMove.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpOptions.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpOptions.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpOptions.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpOptions.java Mon Dec 12 15:57:22 2016
@@ -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.webdav.client.methods;
+
+import java.net.URI;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.http.Header;
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.header.FieldValueParser;
+import org.apache.jackrabbit.webdav.search.SearchConstants;
+
+/**
+ * Represents an HTTP OPTIONS request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc7231.html#rfc.section.4.3.7">RFC 7231, Section 4.3.7</a>
+ * @since 2.13.6
+ */
+public class HttpOptions extends org.apache.http.client.methods.HttpOptions {
+
+    public HttpOptions(URI uri) {
+        super(uri);
+    }
+
+    public HttpOptions(String uri) {
+        super(URI.create(uri));
+    }
+
+    /**
+     * Compute the set of compliance classes returned in the "dav" header field
+     */
+    public Set<String> getDavComplianceClasses(HttpResponse response) {
+        Header[] headers = response.getHeaders(DavConstants.HEADER_DAV);
+        return parseTokenOrCodedUrlheaderField(headers, false);
+    }
+
+    /**
+     * Compute set of search grammars returned in the "dasl" header field
+     */
+    public Set<String> getSearchGrammars(HttpResponse response) {
+        Header[] headers = response.getHeaders(SearchConstants.HEADER_DASL);
+        return parseTokenOrCodedUrlheaderField(headers, true);
+    }
+
+    private Set<String> parseTokenOrCodedUrlheaderField(Header[] headers, boolean removeBrackets) {
+        if (headers == null) {
+            return Collections.emptySet();
+        }
+        else {
+            Set<String> result = new HashSet<String>();
+            for (Header h : headers) {
+                for (String s : FieldValueParser.tokenizeList(h.getValue())) {
+                    if (removeBrackets && s.startsWith("<") && s.endsWith(">")) {
+                        s = s.substring(1, s.length() - 1);
+                    }
+                    result.add(s.trim());
+                }
+            }
+            return Collections.unmodifiableSet(result);
+        }
+    }
+}

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpOptions.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpOrderpatch.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpOrderpatch.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpOrderpatch.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpOrderpatch.java Mon Dec 12 15:57:22 2016
@@ -0,0 +1,53 @@
+/*
+ * 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.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.ordering.OrderPatch;
+
+/**
+ * Represents an HTTP ORDERPATCH request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc3648.html#rfc.section.5">RFC 3648, Section 5</a>
+ * @since 2.13.6
+ */
+public class HttpOrderpatch extends BaseDavRequest {
+
+    public HttpOrderpatch(URI uri, OrderPatch info) throws IOException {
+        super(uri);
+        super.setEntity(XmlEntity.create(info));
+    }
+
+    public HttpOrderpatch(String uri, OrderPatch info) throws IOException {
+        this(URI.create(uri), info);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_ORDERPATCH;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        return response.getStatusLine().getStatusCode() == DavServletResponse.SC_OK;
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpOrderpatch.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpPoll.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpPoll.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpPoll.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpPoll.java Mon Dec 12 15:57:22 2016
@@ -0,0 +1,58 @@
+/*
+ * 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.webdav.client.methods;
+
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.header.PollTimeoutHeader;
+import org.apache.jackrabbit.webdav.observation.ObservationConstants;
+
+/**
+ * Represents an HTTP POLL request.
+ * <p>
+ * Note that "POLL" is a custom HTTP extension, not defined in a standards paper.
+ * @since 2.13.6
+ */
+public class HttpPoll extends BaseDavRequest {
+
+    public HttpPoll(URI uri, String subscriptionId, long timeout) {
+        super(uri);
+        super.setHeader(ObservationConstants.HEADER_SUBSCRIPTIONID, subscriptionId);
+        if (timeout > 0) {
+            PollTimeoutHeader th = new PollTimeoutHeader(timeout);
+            super.setHeader(th.getHeaderName(), th.getHeaderValue());
+        }
+    }
+
+    public HttpPoll(String uri, String subscriptionId, long timeout) {
+        this(URI.create(uri), subscriptionId, timeout);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_POLL;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_OK;
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpPoll.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpPropfind.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpPropfind.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpPropfind.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpPropfind.java Mon Dec 12 15:57:22 2016
@@ -0,0 +1,77 @@
+/*
+ * 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.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.header.DepthHeader;
+import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;
+import org.apache.jackrabbit.webdav.property.PropfindInfo;
+
+/**
+ * Represents an HTTP PROPFIND request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc4918.html#rfc.section.9.1">RFC 4918, Section 9.1</a>
+ * @since 2.13.6
+ */
+public class HttpPropfind extends BaseDavRequest {
+
+    public HttpPropfind(URI uri, int propfindType, DavPropertyNameSet names, int depth) throws IOException {
+        super(uri);
+
+        DepthHeader dh = new DepthHeader(depth);
+        super.setHeader(dh.getHeaderName(), dh.getHeaderValue());
+
+        PropfindInfo info = new PropfindInfo(propfindType, names);
+        super.setEntity(XmlEntity.create(info));
+    }
+
+    public HttpPropfind(URI uri, DavPropertyNameSet names, int depth) throws IOException {
+        this(uri, DavConstants.PROPFIND_BY_PROPERTY, names, depth);
+    }
+
+    public HttpPropfind(URI uri, int propfindType, int depth) throws IOException {
+        this(uri, propfindType, new DavPropertyNameSet(), depth);
+    }
+
+    public HttpPropfind(String uri, int propfindType, int depth) throws IOException {
+        this(URI.create(uri), propfindType, depth);
+    }
+
+    public HttpPropfind(String uri, int propfindType, DavPropertyNameSet names, int depth) throws IOException {
+        this(URI.create(uri), propfindType, names, depth);
+    }
+
+    public HttpPropfind(String uri, DavPropertyNameSet names, int depth) throws IOException {
+        this(URI.create(uri), names, depth);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_PROPFIND;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        return response.getStatusLine().getStatusCode() == DavServletResponse.SC_MULTI_STATUS;
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpPropfind.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpProppatch.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpProppatch.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpProppatch.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpProppatch.java Mon Dec 12 15:57:22 2016
@@ -0,0 +1,104 @@
+/*
+ * 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.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.List;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;
+import org.apache.jackrabbit.webdav.property.DavPropertySet;
+import org.apache.jackrabbit.webdav.property.PropEntry;
+import org.apache.jackrabbit.webdav.property.ProppatchInfo;
+
+/**
+ * Represents an HTTP PROPPATCH request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc4918.html#rfc.section.9.2">RFC 4918, Section 9.2</a>
+ * @since 2.13.6
+ */
+public class HttpProppatch extends BaseDavRequest {
+
+    // private DavPropertyNameSet propertyNames;
+
+    public HttpProppatch(URI uri, ProppatchInfo info) throws IOException {
+        super(uri);
+        super.setEntity(XmlEntity.create(info));
+        // this.propertyNames = info.getAffectedProperties();
+    }
+
+    public HttpProppatch(URI uri, List<? extends PropEntry> changeList) throws IOException {
+        this(uri, new ProppatchInfo(changeList));
+    }
+
+    public HttpProppatch(URI uri, DavPropertySet setProperties, DavPropertyNameSet removeProperties) throws IOException {
+        this(uri, new ProppatchInfo(setProperties, removeProperties));
+    }
+
+    public HttpProppatch(String uri, List<? extends PropEntry> changeList) throws IOException {
+        this(URI.create(uri), new ProppatchInfo(changeList));
+    }
+
+    public HttpProppatch(String uri, DavPropertySet setProperties, DavPropertyNameSet removeProperties) throws IOException {
+        this(URI.create(uri), new ProppatchInfo(setProperties, removeProperties));
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_PROPPATCH;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        return response.getStatusLine().getStatusCode() == DavServletResponse.SC_MULTI_STATUS;
+
+        // disabled code that fails for current PROPPATCH behavior of Jackrabbit
+//        MultiStatusResponse responses[] = super.getResponseBodyAsMultiStatus(response).getResponses();
+//        if (responses.length != 1) {
+//            throw new DavException(DavServletResponse.SC_MULTI_STATUS,
+//                    "PROPPATCH failed: Expected exactly one multistatus response element, but got " + responses.length);
+//        }
+//        DavPropertyNameSet okSet = responses[0].getPropertyNames(DavServletResponse.SC_OK);
+//        if (okSet.isEmpty()) {
+//            throw new DavException(DavServletResponse.SC_MULTI_STATUS,
+//                    "PROPPATCH failed: No 'OK' response found for resource " + responses[0].getHref());
+//        } else {
+//            DavPropertyNameIterator it = propertyNames.iterator();
+//            while (it.hasNext()) {
+//                DavPropertyName pn = it.nextPropertyName();
+//                boolean success = okSet.remove(pn);
+//                if (!success) {
+//                    throw new DavException(DavServletResponse.SC_MULTI_STATUS,
+//                            "PROPPATCH failed: Property name not present in multistatus response: " + pn);
+//                }
+//            }
+//        }
+//        if (!okSet.isEmpty()) {
+//            StringBuilder b = new StringBuilder();
+//            DavPropertyNameIterator it = okSet.iterator();
+//            while (it.hasNext()) {
+//                b.append(it.nextPropertyName().toString()).append("; ");
+//            }
+//            throw new DavException(DavServletResponse.SC_MULTI_STATUS,
+//                    "PROPPATCH failed: The following properties outside of the original request where set or removed: " + b.toString());
+//        }
+//        return true;
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpProppatch.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpRebind.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpRebind.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpRebind.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpRebind.java Mon Dec 12 15:57:22 2016
@@ -0,0 +1,54 @@
+/*
+ * 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.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.bind.RebindInfo;
+
+/**
+ * Represents an HTTP REBIND request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc5842.html#rfc.section.6">RFC 5842, Section 6</a>
+ * @since 2.13.6
+ */
+public class HttpRebind extends BaseDavRequest {
+
+    public HttpRebind(URI uri, RebindInfo info) throws IOException {
+        super(uri);
+        super.setEntity(XmlEntity.create(info));
+    }
+
+    public HttpRebind(String uri, RebindInfo info) throws IOException {
+        this(URI.create(uri), info);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_REBIND;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_OK || statusCode == DavServletResponse.SC_CREATED;
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpRebind.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpReport.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpReport.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpReport.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpReport.java Mon Dec 12 15:57:22 2016
@@ -0,0 +1,66 @@
+/*
+ * 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.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.header.DepthHeader;
+import org.apache.jackrabbit.webdav.version.report.ReportInfo;
+
+/**
+ * Represents an HTTP REPORT request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc3253.html#rfc.section.3.6">RFC 3253, Section 3.6</a>
+ * @since 2.13.6
+ */
+public class HttpReport extends BaseDavRequest {
+
+    private final boolean isDeep;
+
+    public HttpReport(URI uri, ReportInfo reportInfo) throws IOException {
+        super(uri);
+        DepthHeader dh = new DepthHeader(reportInfo.getDepth());
+        isDeep = reportInfo.getDepth() > DavConstants.DEPTH_0;
+        super.setHeader(dh.getHeaderName(), dh.getHeaderValue());
+        super.setEntity(XmlEntity.create(reportInfo));
+    }
+
+    public HttpReport(String uri, ReportInfo reportInfo) throws IOException {
+        this(URI.create(uri), reportInfo);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_REPORT;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        if (isDeep) {
+            return statusCode == DavServletResponse.SC_MULTI_STATUS;
+        } else {
+            return statusCode == DavServletResponse.SC_OK || statusCode == DavServletResponse.SC_MULTI_STATUS;
+        }
+
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpReport.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpSearch.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpSearch.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpSearch.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpSearch.java Mon Dec 12 15:57:22 2016
@@ -0,0 +1,54 @@
+/*
+ * 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.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.search.SearchInfo;
+
+/**
+ * Represents an HTTP SEARCH request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc5323.html#rfc.section.2">RFC 5323, Section 2</a>
+ * @since 2.13.6
+ */
+public class HttpSearch extends BaseDavRequest {
+
+    public HttpSearch(URI uri, SearchInfo searchInfo) throws IOException {
+        super(uri);
+        super.setEntity(XmlEntity.create(searchInfo));
+    }
+
+    public HttpSearch(String uri, SearchInfo searchInfo) throws IOException {
+        this(URI.create(uri), searchInfo);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_SEARCH;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_MULTI_STATUS;
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpSearch.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpSubscribe.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpSubscribe.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpSubscribe.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpSubscribe.java Mon Dec 12 15:57:22 2016
@@ -0,0 +1,88 @@
+/*
+ * 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.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.header.CodedUrlHeader;
+import org.apache.jackrabbit.webdav.header.DepthHeader;
+import org.apache.jackrabbit.webdav.header.TimeoutHeader;
+import org.apache.jackrabbit.webdav.observation.ObservationConstants;
+import org.apache.jackrabbit.webdav.observation.SubscriptionInfo;
+
+/**
+ * Represents an HTTP SUBSCRIBE request.
+ * <p>
+ * Note that "SUBSCRIBE" is a custom HTTP extension, not defined in a standards paper.
+ * @since 2.13.6
+ */
+public class HttpSubscribe extends BaseDavRequest {
+
+    public HttpSubscribe(URI uri, SubscriptionInfo info, String subscriptionId) throws IOException {
+        super(uri);
+        if (info == null) {
+            throw new IllegalArgumentException("SubscriptionInfo must not be null.");
+        }
+        // optional subscriptionId (only required to modify an existing
+        // subscription)
+        if (subscriptionId != null) {
+            CodedUrlHeader h = new CodedUrlHeader(ObservationConstants.HEADER_SUBSCRIPTIONID, subscriptionId);
+            super.setHeader(h.getHeaderName(), h.getHeaderValue());
+        }
+        // optional timeout header
+        long to = info.getTimeOut();
+        if (to != DavConstants.UNDEFINED_TIMEOUT) {
+            TimeoutHeader h = new TimeoutHeader(info.getTimeOut());
+            super.setHeader(h.getHeaderName(), h.getHeaderValue());
+        }
+        // always set depth header since value is boolean flag
+        DepthHeader dh = new DepthHeader(info.isDeep());
+        super.setHeader(dh.getHeaderName(), dh.getHeaderValue());
+        super.setEntity(XmlEntity.create(info));
+    }
+
+    public HttpSubscribe(String uri, SubscriptionInfo info, String subscriptionId) throws IOException {
+        this(URI.create(uri), info, subscriptionId);
+    }
+
+    public String getSubscriptionId(HttpResponse response) {
+        org.apache.http.Header sbHeader = response.getFirstHeader(ObservationConstants.HEADER_SUBSCRIPTIONID);
+        if (sbHeader != null) {
+            CodedUrlHeader cuh = new CodedUrlHeader(ObservationConstants.HEADER_SUBSCRIPTIONID, sbHeader.getValue());
+            return cuh.getCodedUrl();
+        }
+        else {
+            return null;
+        }
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_SUBSCRIBE;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_OK;
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpSubscribe.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnbind.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnbind.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnbind.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnbind.java Mon Dec 12 15:57:22 2016
@@ -0,0 +1,54 @@
+/*
+ * 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.webdav.client.methods;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.bind.UnbindInfo;
+
+/**
+ * Represents an HTTP UNBIND request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc5842.html#rfc.section.5">RFC 5842, Section 5</a>
+ * @since 2.13.6
+ */
+public class HttpUnbind extends BaseDavRequest {
+
+    public HttpUnbind(URI uri, UnbindInfo info) throws IOException {
+        super(uri);
+        super.setEntity(XmlEntity.create(info));
+    }
+
+    public HttpUnbind(String uri, UnbindInfo info) throws IOException {
+        this(URI.create(uri), info);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_UNBIND;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_OK || statusCode == DavServletResponse.SC_NO_CONTENT;
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnbind.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnlock.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnlock.java?rev=1773809&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnlock.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnlock.java Mon Dec 12 15:57:22 2016
@@ -0,0 +1,55 @@
+/*
+ * 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.webdav.client.methods;
+
+import java.net.URI;
+
+import org.apache.http.HttpResponse;
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.header.CodedUrlHeader;
+
+/**
+ * Represents an HTTP UNLOCK request.
+ * 
+ * @see <a href="http://webdav.org/specs/rfc4918.html#rfc.section.9.11">RFC 4918, Section 9.11</a>
+ * @since 2.13.6
+ */
+public class HttpUnlock extends BaseDavRequest {
+
+    public HttpUnlock(URI uri, String lockToken) {
+        super(uri);
+        CodedUrlHeader lth = new CodedUrlHeader(DavConstants.HEADER_LOCK_TOKEN, lockToken);
+        super.setHeader(lth.getHeaderName(), lth.getHeaderValue());
+    }
+
+    public HttpUnlock(String uri, String lockToken) {
+        this(URI.create(uri), lockToken);
+    }
+
+    @Override
+    public String getMethod() {
+        return DavMethods.METHOD_UNLOCK;
+    }
+
+    @Override
+    public boolean succeeded(HttpResponse response) {
+        int statusCode = response.getStatusLine().getStatusCode();
+        return statusCode == DavServletResponse.SC_OK || statusCode == DavServletResponse.SC_NO_CONTENT;
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/HttpUnlock.java
------------------------------------------------------------------------------
    svn:eol-style = native