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/11 15:24:08 UTC

svn commit: r1773579 - in /jackrabbit/trunk: jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/ jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/ jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/

Author: reschke
Date: Sun Dec 11 15:24:07 2016
New Revision: 1773579

URL: http://svn.apache.org/viewvc?rev=1773579&view=rev
Log:
JCR-4079: incorrect PROPPATCH response error handling

Modified:
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/MultiStatusResponse.java
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/PropPatchMethod.java

Modified: jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java?rev=1773579&r1=1773578&r2=1773579&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java Sun Dec 11 15:24:07 2016
@@ -1922,8 +1922,11 @@ public class RepositoryServiceImpl imple
 
             PropPatchMethod method = new PropPatchMethod(getItemUri(nodeId, sessionInfo), changeList);
             execute(method, sessionInfo);
+            method.checkSuccess();
         } catch (IOException e) {
             throw new RepositoryException(e);
+        } catch (DavException e) {
+            throw ExceptionConverter.generate(e);
         }
     }
 

Modified: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/MultiStatusResponse.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/MultiStatusResponse.java?rev=1773579&r1=1773578&r2=1773579&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/MultiStatusResponse.java (original)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/MultiStatusResponse.java Sun Dec 11 15:24:07 2016
@@ -268,6 +268,13 @@ public class MultiStatusResponse impleme
     }
 
     /**
+     * @return {@code true} if the response is of type "propstat" (containing information about individual properties)
+     */
+    public boolean isPropStat() {
+        return this.type == TYPE_PROPSTAT;
+    }
+
+    /**
      * @param document
      * @see org.apache.jackrabbit.webdav.xml.XmlSerializable#toXml(org.w3c.dom.Document)
      */

Modified: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/PropPatchMethod.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/PropPatchMethod.java?rev=1773579&r1=1773578&r2=1773579&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/PropPatchMethod.java (original)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/PropPatchMethod.java Sun Dec 11 15:24:07 2016
@@ -102,33 +102,46 @@ public class PropPatchMethod extends Dav
         // check of OK response contains all set/remove properties
         MultiStatusResponse[] resp = multiStatus.getResponses();
         if (resp.length != 1) {
-            log.warn("Expected a single multi-status response in PROPPATCH.");
+            log.warn("Expected a single multi-status response in PROPPATCH, but got " + resp.length + " elements.");
         }
         boolean success = true;
+
         // only check the first ms-response
-        for (int i = 0; i < 1; i++) {
-            DavPropertyNameSet okSet = resp[i].getPropertyNames(DavServletResponse.SC_OK);
-            if (okSet.isEmpty()) {
-                log.debug("PROPPATCH failed: No 'OK' response found for resource " + resp[i].getHref());
-                success = false;
-            } else {
-                DavPropertyNameIterator it = propertyNames.iterator();
-                while (it.hasNext()) {
-                    DavPropertyName pn = it.nextPropertyName();
-                    success = okSet.remove(pn);
+        if (resp.length == 1) {
+            MultiStatusResponse r = resp[0];
+
+            if (r.isPropStat()) {
+                DavPropertyNameSet okSet = r.getPropertyNames(DavServletResponse.SC_OK);
+                if (okSet.isEmpty()) {
+                    log.debug("PROPPATCH failed: No 'OK' response found for resource " + r.getHref());
+                    success = false;
+                } else {
+                    DavPropertyNameIterator it = propertyNames.iterator();
+                    while (it.hasNext()) {
+                        DavPropertyName pn = it.nextPropertyName();
+                        success = okSet.remove(pn);
+                    }
+                }
+                if (!okSet.isEmpty()) {
+                    StringBuffer b = new StringBuffer("The following properties outside of the original request where set or removed: ");
+                    DavPropertyNameIterator it = okSet.iterator();
+                    while (it.hasNext()) {
+                        b.append(it.nextPropertyName().toString()).append("; ");
+                    }
+                    log.warn(b.toString());
                 }
             }
-            if (!okSet.isEmpty()) {
-                StringBuffer b = new StringBuffer("The following properties outside of the original request where set or removed: ");
-                DavPropertyNameIterator it = okSet.iterator();
-                while (it.hasNext()) {
-                    b.append(it.nextPropertyName().toString()).append("; ");
+            else {
+                int status = r.getStatus()[0].getStatusCode();
+                success = status == DavServletResponse.SC_OK;
+                if (!success) {
+                    log.warn("PROPPATCH failed: overall status of " + status);
                 }
-                log.warn(b.toString());
             }
         }
         // if  build the error message
         if (!success) {
+            // TODO: array might be empty, no?
             Status[] st = resp[0].getStatus();
             // TODO: respect multiple error reasons (not only the first one)
             for (int i = 0; i < st.length && responseException == null; i ++) {