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/11/30 14:51:46 UTC

svn commit: r1772049 - in /jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav: client/methods/PropPatchMethod.java property/ProppatchInfo.java

Author: reschke
Date: Wed Nov 30 14:51:46 2016
New Revision: 1772049

URL: http://svn.apache.org/viewvc?rev=1772049&view=rev
Log:
JCR-4064: Refactor WebDAV related code out of HttpClient3-specific classes for better future re-use

move PROPPATCH request building into separate *Info class

Added:
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/property/ProppatchInfo.java   (with props)
Modified:
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/client/methods/PropPatchMethod.java

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=1772049&r1=1772048&r2=1772049&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 Wed Nov 30 14:51:46 2016
@@ -16,30 +16,26 @@
  */
 package org.apache.jackrabbit.webdav.client.methods;
 
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.commons.httpclient.HttpConnection;
+import org.apache.commons.httpclient.HttpState;
 import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.DavException;
 import org.apache.jackrabbit.webdav.DavMethods;
-import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;
-import org.apache.jackrabbit.webdav.property.DavPropertySet;
-import org.apache.jackrabbit.webdav.property.DavPropertyName;
-import org.apache.jackrabbit.webdav.property.DavPropertyNameIterator;
-import org.apache.jackrabbit.webdav.property.DavProperty;
-import org.apache.jackrabbit.webdav.property.PropEntry;
 import org.apache.jackrabbit.webdav.DavServletResponse;
 import org.apache.jackrabbit.webdav.MultiStatus;
 import org.apache.jackrabbit.webdav.MultiStatusResponse;
-import org.apache.jackrabbit.webdav.DavException;
 import org.apache.jackrabbit.webdav.Status;
-import org.apache.jackrabbit.webdav.xml.DomUtil;
-import org.apache.commons.httpclient.HttpState;
-import org.apache.commons.httpclient.HttpConnection;
+import org.apache.jackrabbit.webdav.property.DavPropertyName;
+import org.apache.jackrabbit.webdav.property.DavPropertyNameIterator;
+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;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import javax.xml.parsers.ParserConfigurationException;
-import java.io.IOException;
-import java.util.List;
 
 /**
  * <code>PropPatchMethod</code>...
@@ -48,9 +44,8 @@ public class PropPatchMethod extends Dav
 
     private static Logger log = LoggerFactory.getLogger(PropPatchMethod.class);
 
-    private final DavPropertyNameSet propertyNames = new DavPropertyNameSet();
-
     private DavException responseException;
+    private DavPropertyNameSet propertyNames;
 
     /**
      *
@@ -61,81 +56,17 @@ public class PropPatchMethod extends Dav
      */
     public PropPatchMethod(String uri, List<? extends PropEntry> changeList) throws IOException {
         super(uri);
-        if (changeList == null || changeList.isEmpty()) {
-            throw new IllegalArgumentException("PROPPATCH cannot be executed without properties to be set or removed.");
-        }
-        try {
-            Document document = DomUtil.createDocument();
-            Element propUpdateElement = DomUtil.addChildElement(document, XML_PROPERTYUPDATE, NAMESPACE);
-
-            Element propElement = null;
-            boolean isSet = false;
-            for (Object entry : changeList) {
-                if (entry instanceof DavPropertyName) {
-                    // DAV:remove
-                    DavPropertyName removeName = (DavPropertyName) entry;
-                    if (propElement == null || isSet) {
-                        isSet = false;
-                        propElement = getPropElement(propUpdateElement, isSet);
-                    }
-                    propElement.appendChild(removeName.toXml(document));
-                    propertyNames.add(removeName);
-                } else if (entry instanceof DavProperty) {
-                    // DAV:set
-                    DavProperty<?> setProperty = (DavProperty<?>) entry;
-                    if (propElement == null || !isSet) {
-                        isSet = true;
-                        propElement = getPropElement(propUpdateElement, isSet);
-                    }
-                    propElement.appendChild(setProperty.toXml(document));
-                    propertyNames.add(setProperty.getName());
-                } else {
-                    throw new IllegalArgumentException("ChangeList may only contain DavPropertyName and DavProperty elements.");
-                }
-            }
-            setRequestBody(document);
-        } catch (ParserConfigurationException e) {
-            throw new IOException(e.getMessage());
-        }
+        ProppatchInfo info = new ProppatchInfo(changeList);
+        setRequestBody(info);
+        this.propertyNames = info.getAffectedProperties();
     }
 
     public PropPatchMethod(String uri, DavPropertySet setProperties,
                            DavPropertyNameSet removeProperties) throws IOException {
         super(uri);
-        if (setProperties == null || removeProperties == null) {
-            throw new IllegalArgumentException("Neither setProperties nor removeProperties must be null.");
-        }
-        if (setProperties.isEmpty() && removeProperties.isEmpty()) {
-            throw new IllegalArgumentException("Either setProperties or removeProperties can be empty; not both of them.");
-        }
-
-        propertyNames.addAll(removeProperties);
-        for (DavPropertyName setName : setProperties.getPropertyNames()) {
-            propertyNames.add(setName);
-        }
-
-        try {
-            Document document = DomUtil.createDocument();
-            Element propupdate = DomUtil.addChildElement(document, XML_PROPERTYUPDATE, NAMESPACE);
-            // DAV:set
-            if (!setProperties.isEmpty()) {
-                Element set = DomUtil.addChildElement(propupdate, XML_SET, NAMESPACE);
-                set.appendChild(setProperties.toXml(document));
-            }
-            // DAV:remove
-            if (!removeProperties.isEmpty()) {
-                Element remove = DomUtil.addChildElement(propupdate, XML_REMOVE, NAMESPACE);
-                remove.appendChild(removeProperties.toXml(document));
-            }
-            setRequestBody(document);
-        } catch (ParserConfigurationException e) {
-            throw new IOException(e.getMessage());
-        }
-    }
-
-    private Element getPropElement(Element propUpdate, boolean isSet) {
-        Element updateEntry = DomUtil.addChildElement(propUpdate, (isSet) ? XML_SET : XML_REMOVE , NAMESPACE);
-        return DomUtil.addChildElement(updateEntry, XML_PROP, NAMESPACE);
+        ProppatchInfo info = new ProppatchInfo(setProperties, removeProperties);
+        setRequestBody(info);
+        this.propertyNames = info.getAffectedProperties();
     }
 
     //---------------------------------------------------------< HttpMethod >---

Added: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/property/ProppatchInfo.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/property/ProppatchInfo.java?rev=1772049&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/property/ProppatchInfo.java (added)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/property/ProppatchInfo.java Wed Nov 30 14:51:46 2016
@@ -0,0 +1,128 @@
+/*
+ * 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.property;
+
+import java.util.List;
+
+import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class ProppatchInfo implements XmlSerializable {
+
+    private final List<? extends PropEntry> changeList;
+    private final DavPropertySet setProperties;
+    private final DavPropertyNameSet removeProperties;
+
+    private final DavPropertyNameSet propertyNames = new DavPropertyNameSet();
+
+    public ProppatchInfo(List<? extends PropEntry> changeList) {
+        if (changeList == null || changeList.isEmpty()) {
+            throw new IllegalArgumentException("PROPPATCH cannot be executed without properties to be set or removed.");
+        }
+        this.changeList = changeList;
+        this.setProperties = null;
+        this.removeProperties = null;
+        for (PropEntry entry : changeList) {
+            if (entry instanceof DavPropertyName) {
+                // DAV:remove
+                this.propertyNames.add((DavPropertyName) entry);
+            } else if (entry instanceof DavProperty) {
+                // DAV:set
+                DavProperty<?> setProperty = (DavProperty<?>) entry;
+                this.propertyNames.add(setProperty.getName());
+            } else {
+                throw new IllegalArgumentException("ChangeList may only contain DavPropertyName and DavProperty elements.");
+            }
+        }
+    }
+
+    public ProppatchInfo(DavPropertySet setProperties, DavPropertyNameSet removeProperties) {
+        if (setProperties == null || removeProperties == null) {
+            throw new IllegalArgumentException("Neither setProperties nor removeProperties must be null.");
+        }
+        if (setProperties.isEmpty() && removeProperties.isEmpty()) {
+            throw new IllegalArgumentException("Either setProperties or removeProperties can be empty; not both of them.");
+        }
+        this.changeList = null;
+        this.setProperties = setProperties;
+        this.removeProperties = removeProperties;
+        this.propertyNames.addAll(removeProperties);
+        for (DavPropertyName setName : setProperties.getPropertyNames()) {
+            this.propertyNames.add(setName);
+        }
+    }
+
+    public DavPropertyNameSet getAffectedProperties() {
+        if (this.propertyNames.isEmpty()) {
+            throw new IllegalStateException("must be called after toXml()");
+        }
+        return this.propertyNames;
+    }
+
+    @Override
+    public Element toXml(Document document) {
+        Element proppatch = DomUtil.createElement(document, DavConstants.XML_PROPERTYUPDATE, DavConstants.NAMESPACE);
+
+        if (changeList != null) {
+            Element propElement = null;
+            boolean isSet = false;
+            for (Object entry : changeList) {
+                if (entry instanceof DavPropertyName) {
+                    // DAV:remove
+                    DavPropertyName removeName = (DavPropertyName) entry;
+                    if (propElement == null || isSet) {
+                        isSet = false;
+                        propElement = getPropElement(proppatch, false);
+                    }
+                    propElement.appendChild(removeName.toXml(document));
+                } else if (entry instanceof DavProperty) {
+                    // DAV:set
+                    DavProperty<?> setProperty = (DavProperty<?>) entry;
+                    if (propElement == null || !isSet) {
+                        isSet = true;
+                        propElement = getPropElement(proppatch, true);
+                    }
+                    propElement.appendChild(setProperty.toXml(document));
+                } else {
+                    throw new IllegalArgumentException("ChangeList may only contain DavPropertyName and DavProperty elements.");
+                }
+            }
+        } else {
+            // DAV:set
+            if (!setProperties.isEmpty()) {
+                Element set = DomUtil.addChildElement(proppatch, DavConstants.XML_SET, DavConstants.NAMESPACE);
+                set.appendChild(setProperties.toXml(document));
+            }
+            // DAV:remove
+            if (!removeProperties.isEmpty()) {
+                Element remove = DomUtil.addChildElement(proppatch, DavConstants.XML_REMOVE, DavConstants.NAMESPACE);
+                remove.appendChild(removeProperties.toXml(document));
+            }
+        }
+
+        return proppatch;
+    }
+
+    private Element getPropElement(Element propUpdate, boolean isSet) {
+        Element updateEntry = DomUtil.addChildElement(propUpdate, isSet ? DavConstants.XML_SET : DavConstants.XML_REMOVE,
+                DavConstants.NAMESPACE);
+        return DomUtil.addChildElement(updateEntry, DavConstants.XML_PROP, DavConstants.NAMESPACE);
+    }
+}

Propchange: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/property/ProppatchInfo.java
------------------------------------------------------------------------------
    svn:eol-style = native