To clarify this commit some, this allows one to do:

<D:propertyupdate xmlns:D="DAV:">
 <D:set>
   <D:prop>
     <D:group-member-set>
       <D:href xmlns:D='DAV:'>/slide/users/root</D:href>
       <D:href xmlns:D='DAV:'>/slide/users/unico</D:href>
     </D:group-member-set>
   </D:prop>
 </D:set>
</D:propertyupdate>

notice that members are referenced with their absolute network uri. Before one had to know context path where Slide was mapped, strip that from the user uri before doing the proppatch in order to prevent context paths ending up in the backend.

Propfind already has such a mechanism that converts of href elements (i.e. /users/root) into absolute network uris (/slide/users/root).

--
Unico

[EMAIL PROTECTED] wrote:

unico       2004/07/22 07:57:25

Modified: src/webdav/server/org/apache/slide/webdav/method
PropPatchMethod.java
Log:
convert absolute href property values to context-path-relative ones.
Thanks to Johan Stuyts ([EMAIL PROTECTED])
Revision Changes Path
1.82 +109 -7 jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/PropPatchMethod.java
Index: PropPatchMethod.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/PropPatchMethod.java,v
retrieving revision 1.81
retrieving revision 1.82
diff -u -r1.81 -r1.82
--- PropPatchMethod.java 24 Jun 2004 13:18:52 -0000 1.81
+++ PropPatchMethod.java 22 Jul 2004 14:57:25 -0000 1.82
@@ -29,19 +29,20 @@
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
+
import org.apache.slide.common.NamespaceAccessToken;
import org.apache.slide.common.PropertyParseException;
import org.apache.slide.common.RequestedPropertiesImpl;
import org.apache.slide.common.RequestedProperty;
import org.apache.slide.common.RequestedPropertyImpl;
import org.apache.slide.common.ServiceAccessException;
-import org.apache.slide.common.SlideToken;
import org.apache.slide.content.NodeProperty;
-import org.apache.slide.content.NodeProperty.NamespaceCache;
import org.apache.slide.content.NodeRevisionDescriptor;
import org.apache.slide.content.NodeRevisionDescriptors;
import org.apache.slide.content.NodeRevisionNumber;
import org.apache.slide.content.RevisionDescriptorNotFoundException;
+import org.apache.slide.content.NodeProperty.NamespaceCache;
+import org.apache.slide.event.EventDispatcher;
import org.apache.slide.structure.LinkedObjectNotFoundException;
import org.apache.slide.util.Configuration;
import org.apache.slide.util.XMLValue;
@@ -58,13 +59,17 @@
import org.apache.slide.webdav.util.resourcekind.AbstractResourceKind;
import org.apache.slide.webdav.util.resourcekind.CheckedInVersionControlled;
import org.apache.slide.webdav.util.resourcekind.ResourceKind;
-import org.apache.slide.event.EventDispatcher;
import org.apache.util.WebdavStatus;
+import org.jdom.CDATA;
+import org.jdom.Comment;
import org.jdom.Document;
import org.jdom.Element;
+import org.jdom.EntityRef;
import org.jdom.JDOMException;
import org.jdom.Namespace;
+import org.jdom.ProcessingInstruction;
import org.jdom.Text;
+import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
/**
@@ -283,9 +288,44 @@
currentProperty = (PropPatchProperty)propertyIterator.next();
if (checkPropertyModification(currentProperty, revisionDescriptor, resourceKind)) {
+ // Convert absolute URIs to relative ones, because Slide
+ // converts them to absolute ones in the result of queries.
+ String finalValue = currentProperty.getValue();
+ Element property = new Element(currentProperty.getName(), currentProperty.getNamespace());
+ String propertyValue = currentProperty.getValue();
+ if ( (propertyValue != null) && (propertyValue.toString().length() > 0)) {
+ if( propertyValue.toString().indexOf('<') >= 0 ) {
+ try {
+ XMLValue xmlValue = new XMLValue(propertyValue.toString(), Namespace.getNamespace(currentProperty.getNamespace()));
+ if (AbstractResourceKind.isLiveProperty(currentProperty.getName())) {
+ convertHrefValueToRelativeURL (xmlValue, getSlideContextPath(), config);
+ }
+ Iterator iterator = xmlValue.iterator();
+ while (iterator.hasNext()) {
+ Object o = iterator.next();
+ if( o instanceof Element )
+ property.addContent((Element)o);
+ else if( o instanceof Text )
+ property.addContent((Text)o);
+ else if( o instanceof Comment )
+ property.addContent((Comment)o);
+ else if( o instanceof ProcessingInstruction )
+ property.addContent((ProcessingInstruction)o);
+ else if( o instanceof CDATA )
+ property.addContent((CDATA)o);
+ else if( o instanceof EntityRef )
+ property.addContent((EntityRef)o);
+ }
+ finalValue = new XMLOutputter(Format.getRawFormat()).outputString(property.getContent());
+ }
+ catch (JDOMException e) {
+ // Fallback to original value
+ }
+ }
+ }
NodeProperty newProperty =
new NodeProperty(currentProperty.getName(),
- currentProperty.getValue(),
+ finalValue,
currentProperty.getNamespace());
revisionDescriptor.setProperty(newProperty);
@@ -641,6 +681,68 @@
// ...is there any property to check here yet ?
return null;
+ }
+ + + + /**
+ * If the given <code>xmlValue</code> contains <code>&lt;href&gt;</code>
+ * elements (at any depth), absolute URIs are converted to relative ones.
+ * + * This method modifies <code>xmlValue</code> (and its children).
+ *
+ * @param xmlValue The XMLValue that might contain
+ * <code>&lt;href&gt;</code> values to convert.
+ * @param servletContextPath The prefix which when added to a relative URI
+ * makes it an absolute one.
+ * @param config Configuration of the WebDAV servlet.
+ */
+ private static void convertHrefValueToRelativeURL (XMLValue xmlValue,
+ String servletContextPath,
+ WebdavServletConfig config) {
+ if (xmlValue != null) {
+ Iterator iterator = xmlValue.iterator();
+ Element element = null;
+ while (iterator.hasNext()) {
+ Object o = iterator.next();
+ if( o instanceof Element ) {
+ element = (Element)o;
+ convertHrefValueToRelativeURL(element, servletContextPath, config);
+ }
+ }
+ }
+ }
+ + + + /**
+ * If the given <code>Element</code> contains <code>&lt;href&gt;</code>
+ * elements (at any depth), the absolute URI is converted to a relative
+ * one.
+ * + * This method modifies the <code>Element</code> (and its children).
+ *
+ * @param element The <code>Element</code> that might contain
+ * <code>&lt;href&gt;</code> values to convert.
+ * @param servletContextPath The prefix which when added to a relative URI
+ * makes it an absolute one.
+ * @param config Configuration of the WebDAV servlet.
+ */
+ private static void convertHrefValueToRelativeURL (Element element,
+ String servletContextPath,
+ WebdavServletConfig config) {
+ if (element.getChildren().size() > 0) {
+ Iterator i = element.getChildren().iterator();
+ while (i.hasNext()) {
+ Element child = (Element) i.next();
+ convertHrefValueToRelativeURL(child, servletContextPath, config);
+ }
+ }
+ if ( E_HREF.equals(element.getName()) && (element.getText() != null) ) {
+ if ( PropertyHelper.isAbsoluteURL(servletContextPath, element.getText()) ) {
+ element.setText(element.getText().substring(servletContextPath.length()));
+ }
+ }
}


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]





---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to