GitLab Mirror pushed to branch 2.12 at cms-community / hippo-jackrabbit
Commits: d2188876 by Julian Reschke at 2017-01-06T14:04:18+00:00 JCR-4079: incorrect PROPPATCH response error handling (ported to 2.12) git-svn-id: https://svn.apache.org/repos/asf/jackrabbit/branches/2.12@1777614 13f79535-47bb-0310-9956-ffa450edef68 - - - - - 3 changed files: - jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java - jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/MultiStatusResponse.java - jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/PropPatchMethod.java Changes: ===================================== jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java ===================================== --- a/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java +++ b/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java @@ -1915,8 +1915,11 @@ public class RepositoryServiceImpl implements RepositoryService, DavConstants { 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); } } ===================================== jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/MultiStatusResponse.java ===================================== --- a/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/MultiStatusResponse.java +++ b/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/MultiStatusResponse.java @@ -268,6 +268,13 @@ public class MultiStatusResponse implements XmlSerializable, DavConstants { } /** + * @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) */ ===================================== jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/PropPatchMethod.java ===================================== --- a/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/PropPatchMethod.java +++ b/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/PropPatchMethod.java @@ -102,33 +102,46 @@ public class PropPatchMethod extends DavMethodBase implements DavConstants { // 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 ++) { View it on GitLab: https://code.onehippo.org/cms-community/hippo-jackrabbit/commit/d2188876f00c2b376e9d02f59a5a4dd386e61f62
_______________________________________________ Hippocms-svn mailing list Hippocms-svn@lists.onehippo.org https://lists.onehippo.org/mailman/listinfo/hippocms-svn