You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-dev@jakarta.apache.org by re...@locus.apache.org on 2000/09/05 01:49:14 UTC

cvs commit: jakarta-slide/src/share/org/apache/slide/webdav/method CopyMethod.java LockMethod.java MkcolMethod.java MoveMethod.java PropFindMethod.java PropPatchMethod.java PutMethod.java WebdavMethod.java

remm        00/09/04 16:49:13

  Modified:    .        STATUS.html
               src/share/org/apache/slide/content NodeProperty.java
                        NodeRevisionDescriptor.java
               src/share/org/apache/slide/store
                        DescriptorsStoreDatabaseImpl.java
               src/share/org/apache/slide/webdav/method CopyMethod.java
                        LockMethod.java MkcolMethod.java MoveMethod.java
                        PropFindMethod.java PropPatchMethod.java
                        PutMethod.java WebdavMethod.java
  Log:
  - Status update
  - Improved XML namespace management support, in PROPFIND,
    PROPPATCH, and internally in Slide
  - Remove non-native DAV mode
  - DAV basic properties are now enforced on all objects
  - JDBC store will correctly handle negative permissions
  
  Revision  Changes    Path
  1.15      +40 -19    jakarta-slide/STATUS.html
  
  Index: STATUS.html
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/STATUS.html,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- STATUS.html	2000/08/13 02:41:30	1.14
  +++ STATUS.html	2000/09/04 23:49:10	1.15
  @@ -55,6 +55,7 @@
         <li><a href="#Utility">Utility Components</a>
         <li><a href="#Webdav">WebDAV Server</a>
         <li><a href="#Samples">Samples and Tests</a>
  +      <li><a href="#Documentation">Documentation</a>
       </ul>
       
       <br><br>
  @@ -69,6 +70,22 @@
           <th width="60%">Action Item</th>
           <th width="30%">Volunteers</th>
         </tr>
  +      <tr>
  +        <td align="center">High</td>
  +        <td>
  +          Make the helpers pluggable.
  +          [org.apache.slide.common]
  +        </td>
  +        <td><a href="mailto:remm@apache.org">Remy Maucherat</a></td>
  +      </tr>
  +      <tr>
  +        <td align="center">High</td>
  +        <td>
  +          Improve lifecycle handling of namespaces.
  +          [org.apache.slide.common]
  +        </td>
  +        <td><a href="mailto:remm@apache.org">Remy Maucherat</a></td>
  +      </tr>
       </table>
       
       
  @@ -132,19 +149,12 @@
         </tr>
         <tr>
           <td align="center">Low</td>
  -        <td>
  -          Add negative permissions support.
  -          [org.apache.slide.security]
  -        </td>
  -        <td><a href="mailto:remm@apache.org">Remy Maucherat</a></td>
  -      </tr>
  -      <tr>
  -        <td align="center">Low</td>
           <td>
  -          Make lock tokens able to hold multiple lock types.
  -          [org.apache.slide.lock]
  +          Add additional helper macros (for exemple, macros for users / groups
  +          management).
  +          [org.apache.slide.macro]
           </td>
  -        <td><a href="mailto:remm@apache.org">Remy Maucherat</a></td>
  +        <td>---</td>
         </tr>
       </table>
       
  @@ -284,13 +294,6 @@
         <tr>
           <td align="center">Medium</td>
           <td>
  -          XML Namespace support in PROPATCH and PROPFIND.
  -        </td>
  -        <td>---</td>
  -      </tr>
  -      <tr>
  -        <td align="center">Medium</td>
  -        <td>
             MKCOL doesn't return 409 - Conflict.
           </td>
           <td>---</td>
  @@ -354,9 +357,27 @@
       </table>
       
       
  +    <a name="Documentation"></a>
  +    <div align="center"><h1>Documentation</h1></div>
  +    <table border="1" width="100%">
  +      <tr>
  +        <th width="10%">Priority</th>
  +        <th width="60%">Action Item</th>
  +        <th width="30%">Volunteers</th>
  +      </tr>
  +      <tr>
  +        <td align="center">High</td>
  +        <td>
  +          Document the object model.
  +        </td>
  +        <td><a href="mailto:remm@apache.org">Remy Maucherat</a></td>
  +      </tr>
  +    </table>
  +    
  +    
       <br>
       <div align="center"><hr width="75%"><font size="2">
  -        $Id: STATUS.html,v 1.14 2000/08/13 02:41:30 remm Exp $
  +        $Id: STATUS.html,v 1.15 2000/09/04 23:49:10 remm Exp $
         </font></div>
       
     </body>
  
  
  
  1.2       +30 -59    jakarta-slide/src/share/org/apache/slide/content/NodeProperty.java
  
  Index: NodeProperty.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/content/NodeProperty.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- NodeProperty.java	2000/05/09 02:47:24	1.1
  +++ NodeProperty.java	2000/09/04 23:49:10	1.2
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/content/NodeProperty.java,v 1.1 2000/05/09 02:47:24 remm Exp $
  - * $Revision: 1.1 $
  - * $Date: 2000/05/09 02:47:24 $
  + * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/content/NodeProperty.java,v 1.2 2000/09/04 23:49:10 remm Exp $
  + * $Revision: 1.2 $
  + * $Date: 2000/09/04 23:49:10 $
    *
    * ====================================================================
    *
  @@ -72,11 +72,17 @@
    * Node property class
    * 
    * @author <a href="mailto:remm@exoffice.com">Remy Maucherat</a>
  - * @version $Revision: 1.1 $
  + * @version $Revision: 1.2 $
    */
   public final class NodeProperty implements Serializable, Cloneable {
       
       
  +    // -------------------------------------------------------------- Constants
  +    
  +    
  +    public static final String DEFAULT_NAMESPACE = "DAV:";
  +    
  +    
       // ----------------------------------------------------------- Constructors
       
       
  @@ -89,8 +95,7 @@
       public NodeProperty(String name, Object value) {
           setName(name);
           setValue(value);
  -        this.definition = new String();
  -        this.definitionName = new String();
  +        this.namespace = DEFAULT_NAMESPACE;
           this.type = new String();
           this.protectedProperty = false;
           this.permissions = new Vector();
  @@ -115,14 +120,11 @@
        * 
        * @param name Name
        * @param value Value
  -     * @param definitionName Definition name
  -     * @param definition Definition
  +     * @param namespace Namespace
        */
  -    public NodeProperty(String name, Object value, String definitionName, 
  -                        String definition) {
  +    public NodeProperty(String name, Object value, String namespace) {
           this(name, value);
  -        setDefinitionName(definitionName);
  -        setDefinition(definition);
  +        setNamespace(namespace);
       }
       
       
  @@ -131,14 +133,13 @@
        * 
        * @param name Name
        * @param value Value
  -     * @param definitionName Definition name
  -     * @param definition Definition
  +     * @param namespace Namespace
        * @param type Type info
  +     * @param protectedProperty Protected property
        */
  -    public NodeProperty(String name, Object value, String definitionName, 
  -                        String definition, String type, 
  -                        boolean protectedProperty) {
  -        this(name, value, definitionName, definition);
  +    public NodeProperty(String name, Object value, String namespace, 
  +                        String type, boolean protectedProperty) {
  +        this(name, value, namespace);
           setType(type);
           this.protectedProperty = protectedProperty;
       }
  @@ -160,18 +161,12 @@
       
       
       /**
  -     * Definition of the property.
  +     * Namespace of the property.
        */
  -    private String definition;
  +    private String namespace;
       
       
       /**
  -     * Name of the definition.
  -     */
  -    private String definitionName;
  -    
  -    
  -    /**
        * Property value.
        */
       private Object value;
  @@ -229,49 +224,25 @@
       
       
       /**
  -     * Definition accessor.
  +     * Namespace accessor.
        * 
        * @return String definition
  -     */
  -    public String getDefinition() {
  -        return this.definition;
  -    }
  -    
  -    
  -    /**
  -     * Definition mutator.
  -     * 
  -     * @param definition Definition
  -     */
  -    void setDefinition(String definition) {
  -        if (definition == null) {
  -            this.definition = new String();
  -        } else {
  -            this.definition = definition;
  -        }
  -    }
  -    
  -    
  -    /**
  -     * Definition name accessor.
  -     * 
  -     * @return String definition name
        */
  -    public String getDefinitionName() {
  -        return this.definitionName;
  +    public String getNamespace() {
  +        return this.namespace;
       }
       
       
       /**
  -     * Definition name mutator.
  +     * Namespace mutator.
        * 
  -     * @param definitionName Definition name
  +     * @param definition Namepsace
        */
  -    void setDefinitionName(String definitionName) {
  -        if (definitionName == null) {
  -            this.definitionName = new String();
  +    void setNamespace(String namespace) {
  +        if (namespace == null) {
  +            this.namespace = DEFAULT_NAMESPACE;
           } else {
  -            this.definitionName = definitionName;
  +            this.namespace = namespace;
           }
       }
       
  
  
  
  1.4       +202 -20   jakarta-slide/src/share/org/apache/slide/content/NodeRevisionDescriptor.java
  
  Index: NodeRevisionDescriptor.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/content/NodeRevisionDescriptor.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- NodeRevisionDescriptor.java	2000/07/27 15:15:10	1.3
  +++ NodeRevisionDescriptor.java	2000/09/04 23:49:10	1.4
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/content/NodeRevisionDescriptor.java,v 1.3 2000/07/27 15:15:10 remm Exp $
  - * $Revision: 1.3 $
  - * $Date: 2000/07/27 15:15:10 $
  + * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/content/NodeRevisionDescriptor.java,v 1.4 2000/09/04 23:49:10 remm Exp $
  + * $Revision: 1.4 $
  + * $Date: 2000/09/04 23:49:10 $
    *
    * ====================================================================
    *
  @@ -75,7 +75,7 @@
    * Node Revision Descriptor class.
    * 
    * @author <a href="mailto:remm@exoffice.com">Remy Maucherat</a>
  - * @version $Revision: 1.3 $
  + * @version $Revision: 1.4 $
    */
   public final class NodeRevisionDescriptor implements Serializable, Cloneable {
       
  @@ -90,12 +90,30 @@
       
       
       /**
  +     * Last modification date.
  +     */
  +    public static final String LAST_MODIFIED = "getlastmodified";
  +    
  +    
  +    /**
        * Name.
        */
       public static final String NAME = "displayname";
       
       
       /**
  +     * Type.
  +     */
  +    public static final String TYPE = "resourcetype";
  +    
  +    
  +    /**
  +     * Source.
  +     */
  +    public static final String SOURCE = "source";
  +    
  +    
  +    /**
        * MIME type of the content.
        */
       public static final String CONTENT_TYPE = "getcontenttype";
  @@ -113,6 +131,18 @@
       public static final String CONTENT_LENGTH = "getcontentlength";
       
       
  +    /**
  +     * ETag.
  +     */
  +    public static final String ETAG = "getetag";
  +    
  +    
  +    /**
  +     * Collection type.
  +     */
  +    public static final String COLLECTION_TYPE = "<collection/>";
  +    
  +    
       // ----------------------------------------------------------- Constructors
       
       
  @@ -123,6 +153,7 @@
           this.properties = new Hashtable();
           this.labels = new Vector();
           this.branchName = NodeRevisionDescriptors.MAIN_BRANCH;
  +        initDefaultProperties();
       }
       
       
  @@ -148,7 +179,7 @@
               this.branchName = branchName;
           }
           this.labels = labels;
  -        this.properties = properties;
  +        setProperties(properties);
       }
       
       
  @@ -266,18 +297,56 @@
        * Properties mutator.
        */
       void setProperties(Hashtable properties) {
  +        // FIXME : Do a clean merge
           this.properties = properties;
       }
       
       
       /**
  +     * Tests if a property has been set.
  +     * 
  +     * @param name Property name
  +     * @return true if the property has been set
  +     */
  +    public boolean exists(String name) {
  +        return exists(name, NodeProperty.DEFAULT_NAMESPACE);
  +    }
  +    
  +    
  +    /**
  +     * Tests if a property has been set.
  +     * 
  +     * @param name Property name
  +     * @return true if the property has been set
  +     */
  +    public boolean exists(String name, String namespace) {
  +        if (name != null)
  +            return (properties.get(namespace + ":" + name) != null);
  +        else
  +            return (false);
  +    }
  +    
  +    
  +    /**
        * Property accessor.
        * 
        * @param name Property name
        * @return String property value
        */
       public NodeProperty getProperty(String name) {
  -        Object result = properties.get(name);
  +        return getProperty(name, NodeProperty.DEFAULT_NAMESPACE);
  +    }
  +    
  +    
  +    /**
  +     * Property accessor.
  +     * 
  +     * @param name Property name
  +     * @param namespace Property namespace
  +     * @return String property value
  +     */
  +    public NodeProperty getProperty(String name, String namespace) {
  +        Object result = properties.get(namespace + ":" + name);
           if (result != null) {
               return (NodeProperty) result;
           } else {
  @@ -293,7 +362,19 @@
        * @param value Property value
        */
       public void setProperty(String name, Object value) {
  -        properties.put(name, new NodeProperty(name, value));
  +        setProperty(new NodeProperty(name, value));
  +    }
  +    
  +    
  +    /**
  +     * Property mutator.
  +     * 
  +     * @param name Property name
  +     * @param value Property value
  +     * @param namespace Property value
  +     */
  +    public void setProperty(String name, String namespace, Object value) {
  +        setProperty(new NodeProperty(name, value, namespace));
       }
       
       
  @@ -302,10 +383,10 @@
        * 
        * @param name Property name
        * @param value Property value
  -     * @param standard True if one of the four standrad properties
  +     * @param standard True if one of the standrad properties
        */
       protected void setProperty(String name, Object value, boolean standard) {
  -        properties.put(name, new NodeProperty(name, value, standard));
  +        setProperty(new NodeProperty(name, value, standard));
       }
       
       
  @@ -315,7 +396,8 @@
        * @param property Property
        */
       public void setProperty(NodeProperty property) {
  -        properties.put(property.getName(), property);
  +        properties.put(property.getNamespace() + ":" + property.getName(), 
  +                       property);
       }
       
       
  @@ -325,7 +407,7 @@
        * @param property Property
        */
       public void removeProperty(NodeProperty property) {
  -        properties.remove(property.getName());
  +        properties.remove(property.getNamespace() + ":" + property.getName());
       }
       
       
  @@ -335,7 +417,7 @@
        * @param property Property
        */
       public void removeProperty(String property) {
  -        properties.remove(property);
  +        properties.remove(NodeProperty.DEFAULT_NAMESPACE + ":" + property);
       }
       
       
  @@ -343,33 +425,65 @@
        * Properties names enumerator.
        * 
        * @return Enumeration of the properties names
  +     * @deprecated Replaced by enumeratePropertiesName
        */
       public Enumeration getPropertiesNames() {
  -        return properties.keys();
  +        return enumeratePropertiesName();
       }
       
       
       /**
  -     * Properties names parser.
  +     * Properties names enumerator.
        * 
  -     * @return Vector of the properties names
  +     * @return Enumeration of the properties names
        */
  -    public Vector getPropertiesNamesParser() {
  +    public Enumeration enumeratePropertiesName() {
           Vector result = new Vector();
  -        Enumeration keys = getPropertiesNames();
  -        while (keys.hasMoreElements()) {
  -            result.addElement(keys.nextElement());
  +        Enumeration propertyList = getPropertiesValues();
  +        while (propertyList.hasMoreElements()) {
  +            NodeProperty currentProperty = 
  +                (NodeProperty) propertyList.nextElement();
  +            result.addElement(currentProperty.getName());
           }
  -        return result;
  +        return result.elements();
       }
       
       
       /**
  +     * Properties names parser.
  +     * 
  +     * @return Vector of the properties names
  +     * @deprecated
  +     */
  +    /*
  +      public Vector getPropertiesNamesParser() {
  +      Vector result = new Vector();
  +      Enumeration keys = getPropertiesNames();
  +      while (keys.hasMoreElements()) {
  +      result.addElement(keys.nextElement());
  +      }
  +      return result;
  +      }
  +    */
  +    
  +    
  +    /**
        * Properties values enumerator.
        * 
        * @return Enumeration of the properties values
  +     * @deprecated Replaced by enumerate properties
        */
       public Enumeration getPropertiesValues() {
  +        return enumerateProperties();
  +    }
  +    
  +    
  +    /**
  +     * Properties values enumerator.
  +     * 
  +     * @return Enumeration of the properties values
  +     */
  +    public Enumeration enumerateProperties() {
           return properties.elements();
       }
       
  @@ -501,6 +615,57 @@
       
       
       /**
  +     * Last modification date accessor.
  +     * 
  +     * @return String last modification date
  +     */
  +    public String getLastModified() {
  +        NodeProperty lastModified = getProperty(LAST_MODIFIED);
  +        if (lastModified == null) {
  +            return null;
  +        } else {
  +            return lastModified.getValue().toString();
  +        }
  +    }
  +    
  +    
  +    /**
  +     * Creation date accessor.
  +     * 
  +     * @return String creation date
  +     */
  +    public Date getLastModifiedAsDate() {
  +        NodeProperty lastModified = getProperty(LAST_MODIFIED);
  +        if ((lastModified == null) || 
  +            (!(lastModified.getValue() instanceof Date))) {
  +            return null;
  +        } else {
  +            return (Date) lastModified.getValue();
  +        }
  +    }
  +    
  +    
  +    /**
  +     * Last modified mutator.
  +     * 
  +     * @param lastModified New last modified date
  +     */
  +    void setLastModified(Date lastModified) {
  +        setProperty(LAST_MODIFIED, lastModified, true);
  +    }
  +    
  +    
  +    /**
  +     * Last modified mutator.
  +     * 
  +     * @param lastModified New last modified
  +     */
  +    void setLastModified(String lastModified) {
  +        setProperty(LAST_MODIFIED, lastModified, true);
  +    }
  +    
  +    
  +    /**
        * Creation length mutator.
        * 
        * @param creationLength New content length
  @@ -547,6 +712,22 @@
       }
       
       
  +    // -------------------------------------------------------- Private methods
  +    
  +    
  +    private void initDefaultProperties() {
  +        
  +        setCreationDate(new Date());
  +        setName("");
  +        // By default, a resource is a collection
  +        setProperty(TYPE, "<collection/>", true);
  +        setProperty(SOURCE, "", true);
  +        setContentLength(0);
  +        setLastModified(new Date());
  +        
  +    }
  +    
  +    
       // --------------------------------------------------------- Object Methods
       
       
  @@ -595,5 +776,6 @@
           }
           return result;
       }
  +    
       
   }
  
  
  
  1.5       +23 -17    jakarta-slide/src/share/org/apache/slide/store/DescriptorsStoreDatabaseImpl.java
  
  Index: DescriptorsStoreDatabaseImpl.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/store/DescriptorsStoreDatabaseImpl.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- DescriptorsStoreDatabaseImpl.java	2000/08/13 02:41:34	1.4
  +++ DescriptorsStoreDatabaseImpl.java	2000/09/04 23:49:11	1.5
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/store/DescriptorsStoreDatabaseImpl.java,v 1.4 2000/08/13 02:41:34 remm Exp $
  - * $Revision: 1.4 $
  - * $Date: 2000/08/13 02:41:34 $
  + * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/store/DescriptorsStoreDatabaseImpl.java,v 1.5 2000/09/04 23:49:11 remm Exp $
  + * $Revision: 1.5 $
  + * $Date: 2000/09/04 23:49:11 $
    *
    * ====================================================================
    *
  @@ -80,7 +80,7 @@
    * JDBC 1.0 and 2.0 compliant DataSource implementation.
    * 
    * @author <a href="mailto:remm@exoffice.com">Remy Maucherat</a>
  - * @version $Revision: 1.4 $
  + * @version $Revision: 1.5 $
    */
   public class DescriptorsStoreDatabaseImpl 
       extends ServiceImpl 
  @@ -116,6 +116,7 @@
       protected static final int PERMISSIONS_SUBJECT = 2;
       protected static final int PERMISSIONS_ACTION = 3;
       protected static final int PERMISSIONS_INHERITABLE = 4;
  +    protected static final int PERMISSIONS_NEGATIVE = 5;
       
       // Lock descriptors
       
  @@ -157,10 +158,9 @@
       protected static final int PROPERTY_NUMBER = 2;
       protected static final int PROPERTY_NAME = 3;
       protected static final int PROPERTY_VALUE = 4;
  -    protected static final int PROPERTY_DEFINITION = 5;
  -    protected static final int PROPERTY_DEFINITIONNAME = 6;
  -    protected static final int PROPERTY_TYPE = 7;
  -    protected static final int PROPERTY_PROTECTED = 8;
  +    protected static final int PROPERTY_NAMESPACE = 5;
  +    protected static final int PROPERTY_TYPE = 6;
  +    protected static final int PROPERTY_PROTECTED = 7;
       
       
       // ----------------------------------------------------- Instance Variables
  @@ -277,7 +277,7 @@
               
               s = "create table permissions(object varchar(65536)," 
                   + " subject varchar(65536), action varchar(65536), " 
  -                + "inheritable int)";
  +                + "inheritable int, negative int)";
               statement.execute(s);
               
               s = "create table locks(id varchar(65536), object varchar(4096),"
  @@ -312,8 +312,7 @@
               
               s = "create table property(uri varchar(65536), number" 
                   + " varchar(20), name varchar(4096), value varchar(65536), " 
  -                + "definition varchar(4096), definitionname varchar(20), " 
  -                + "type varchar(100), protected int)";
  +                + "namespace varchar(4096), type varchar(100), protected int)";
               statement.execute(s);
               
           } catch (SQLException e) {
  @@ -732,11 +731,16 @@
                   inheritable = 1;
               }
               
  +            int negative = 0;
  +            if (permission.isNegative()) {
  +                negative = 1;
  +            }
  +            
               String s = "insert into permissions values('" 
                   + permission.getObjectUri() + "', '" 
                   + permission.getSubjectUri() + "', '" 
                   + permission.getActionUri()
  -                + "', " + inheritable + ")";
  +                + "', " + inheritable + "', " + negative + ")";
               statement.execute(s);
               
           } catch (SQLException e) {
  @@ -823,11 +827,15 @@
                   if (res.getInt(PERMISSIONS_INHERITABLE) == 1) {
                       inheritable = true;
                   }
  +                boolean negative = false;
  +                if (res.getInt(PERMISSIONS_NEGATIVE) == 1) {
  +                    negative = true;
  +                }
                   NodePermission permission = 
                       new NodePermission(res.getString(PERMISSIONS_OBJECT),
                                          res.getString(PERMISSIONS_SUBJECT),
                                          res.getString(PERMISSIONS_ACTION), 
  -                                       inheritable);
  +                                       inheritable, negative);
                   permissionVector.addElement(permission);
               }
               
  @@ -1272,8 +1280,7 @@
                   NodeProperty property = 
                       new NodeProperty(propertyName, 
                                        res.getString(PROPERTY_VALUE), 
  -                                     res.getString(PROPERTY_DEFINITIONNAME), 
  -                                     res.getString(PROPERTY_DEFINITION),
  +                                     res.getString(PROPERTY_NAMESPACE), 
                                        res.getString(PROPERTY_TYPE), 
                                        (res.getInt(PROPERTY_PROTECTED) == 1));
                   properties.put(propertyName, property);
  @@ -1337,8 +1344,7 @@
                       + revisionDescriptor.getRevisionNumber() + "', '" 
                       + property.getName() + "', '"
                       + property.getValue() + "', '"
  -                    + property.getDefinition() + "', '"
  -                    + property.getDefinitionName() + "', '"
  +                    + property.getNamespace() + "', '"
                       + property.getType() + "', " + protectedProperty + ")";
                   statement.execute(s);
               }
  
  
  
  1.4       +8 -9      jakarta-slide/src/share/org/apache/slide/webdav/method/CopyMethod.java
  
  Index: CopyMethod.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/CopyMethod.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- CopyMethod.java	2000/09/02 03:13:32	1.3
  +++ CopyMethod.java	2000/09/04 23:49:12	1.4
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/CopyMethod.java,v 1.3 2000/09/02 03:13:32 remm Exp $
  - * $Revision: 1.3 $
  - * $Date: 2000/09/02 03:13:32 $
  + * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/CopyMethod.java,v 1.4 2000/09/04 23:49:12 remm Exp $
  + * $Revision: 1.4 $
  + * $Date: 2000/09/04 23:49:12 $
    *
    * ====================================================================
    *
  @@ -159,12 +159,11 @@
               }
           }
           
  -        if (!isStandalone()) {
  -            String servletPath = req.getServletPath();
  -            if (destinationUri.startsWith(servletPath)) {
  -                destinationUri = destinationUri
  -                    .substring(servletPath.length());
  -            }
  +        String servletPath = req.getServletPath();
  +        if ((servletPath != null) 
  +            && (destinationUri.startsWith(servletPath))) {
  +            destinationUri = destinationUri
  +                .substring(servletPath.length());
           }
           
           String overwriteHeader = req.getHeader("Overwrite");
  
  
  
  1.7       +3 -4      jakarta-slide/src/share/org/apache/slide/webdav/method/LockMethod.java
  
  Index: LockMethod.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/LockMethod.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- LockMethod.java	2000/09/02 03:13:32	1.6
  +++ LockMethod.java	2000/09/04 23:49:12	1.7
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/LockMethod.java,v 1.6 2000/09/02 03:13:32 remm Exp $
  - * $Revision: 1.6 $
  - * $Date: 2000/09/02 03:13:32 $
  + * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/LockMethod.java,v 1.7 2000/09/04 23:49:12 remm Exp $
  + * $Revision: 1.7 $
  + * $Date: 2000/09/04 23:49:12 $
    *
    * ====================================================================
    *
  @@ -213,7 +213,6 @@
               System.out.println(new String(requestBody));
           }
           
  -        davNative = isDavNative();
           msProprietarySupport = isMsProprietarySupport();
           
   	// Loads the associated object from the store.
  
  
  
  1.4       +49 -57    jakarta-slide/src/share/org/apache/slide/webdav/method/MkcolMethod.java
  
  Index: MkcolMethod.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/MkcolMethod.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- MkcolMethod.java	2000/09/02 03:13:32	1.3
  +++ MkcolMethod.java	2000/09/04 23:49:12	1.4
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/MkcolMethod.java,v 1.3 2000/09/02 03:13:32 remm Exp $
  - * $Revision: 1.3 $
  - * $Date: 2000/09/02 03:13:32 $
  + * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/MkcolMethod.java,v 1.4 2000/09/04 23:49:12 remm Exp $
  + * $Revision: 1.4 $
  + * $Date: 2000/09/04 23:49:12 $
    *
    * ====================================================================
    *
  @@ -145,57 +145,51 @@
           NodeRevisionDescriptor revisionDescriptor = 
               new NodeRevisionDescriptor(0);
           
  -        if (isDavNative()) {
  -            NodeProperty property = null;
  -            
  -            // Resource type
  -            property = new NodeProperty("resourcetype", "<d:collection/>", 
  -                                        "d", "DAV");
  -            revisionDescriptor.setProperty(property);
  -            
  -            // Creation date
  -            DateFormat formatter = new SimpleDateFormat(DATE_FORMAT);
  -            property = new NodeProperty("creationdate", 
  -                                        formatter.format(new Date()), 
  -                                        "d", "DAV");
  -            revisionDescriptor.setProperty(property);
  -            
  -            // Last modification date
  -            property = new NodeProperty("getlastmodified", 
  -                                        formatter.format(new Date()), 
  -                                        "d", "DAV");
  -            revisionDescriptor.setProperty(property);
  -            
  -            // Display name
  -            property = new NodeProperty("displayname", colName, "d", "DAV");
  -            revisionDescriptor.setProperty(property);
  -            
  -            // Display name
  -            property = new NodeProperty("getcontentlength", "0", "d", "DAV");
  -            revisionDescriptor.setProperty(property);
  -            
  -            // Source
  -            property = new NodeProperty("source", "", "d", "DAV");
  -            revisionDescriptor.setProperty(property);
  -            
  -            // Supported locks
  -            String supportedLocks = "<d:lockentry>" 
  -                + "<d:lockscope><d:exclusive/></d:lockscope>"
  -                + "<d:locktype><d:write/></d:locktype>"
  -                + "</d:lockentry>"
  -                + "<d:lockentry>" 
  -                + "<d:lockscope><d:shared/></d:lockscope>"
  -                + "<d:locktype><d:write/></d:locktype>"
  -                + "</d:lockentry>";
  -            property = new NodeProperty("suportedlock", supportedLocks, 
  -                                        "d", "DAV");
  -            revisionDescriptor.setProperty(property);
  -        }
  +        NodeProperty property = null;
  +        
  +        // Resource type
  +        property = new NodeProperty("resourcetype", "<d:collection/>", true);
  +        revisionDescriptor.setProperty(property);
  +        
  +        // Creation date
  +        DateFormat formatter = new SimpleDateFormat(DATE_FORMAT);
  +        property = new NodeProperty("creationdate", 
  +                                    formatter.format(new Date()), true);
  +        revisionDescriptor.setProperty(property);
  +        
  +        // Last modification date
  +        property = new NodeProperty("getlastmodified", 
  +                                    formatter.format(new Date()), true);
  +        revisionDescriptor.setProperty(property);
           
  +        // Display name
  +        property = new NodeProperty("displayname", colName, true);
  +        revisionDescriptor.setProperty(property);
  +        
  +        // Display name
  +        property = new NodeProperty("getcontentlength", "0", true);
  +        revisionDescriptor.setProperty(property);
  +        
  +        // Source
  +        property = new NodeProperty("source", "", true);
  +        revisionDescriptor.setProperty(property);
  +        
  +        // Supported locks
  +        /*
  +          String supportedLocks = "<d:lockentry>" 
  +          + "<d:lockscope><d:exclusive/></d:lockscope>"
  +          + "<d:locktype><d:write/></d:locktype>"
  +          + "</d:lockentry>"
  +          + "<d:lockentry>" 
  +          + "<d:lockscope><d:shared/></d:lockscope>"
  +          + "<d:locktype><d:write/></d:locktype>"
  +          + "</d:lockentry>";
  +          property = new NodeProperty("suportedlock", supportedLocks, true);
  +          revisionDescriptor.setProperty(property);
  +        */
  +        
           if (isMsProprietarySupport()) {
               
  -            NodeProperty property = null;
  -            
               // Name
               /*
                 property = new NodeProperty("name", colName, "ms", "MICROSOFT");
  @@ -217,22 +211,20 @@
               */
               
               // Is hidden
  -            property = new NodeProperty("ishidden", "0", "ms", "MICROSOFT");
  +            property = new NodeProperty("ishidden", "0", "MICROSOFT");
               revisionDescriptor.setProperty(property);
               
               // Is collection
  -            property = new NodeProperty("iscollection", "1", "ms", 
  -                                        "MICROSOFT");
  +            property = new NodeProperty("iscollection", "1", "MICROSOFT");
               revisionDescriptor.setProperty(property);
               
               // Is read only
  -            property = new NodeProperty("isreadonly", "0", "ms", "MICROSOFT");
  +            property = new NodeProperty("isreadonly", "0", "MICROSOFT");
               revisionDescriptor.setProperty(property);
               
               // Last accessed
               property = new NodeProperty("lastaccessed", 
  -                                        (new Date()).toString(), 
  -                                        "ms", "MICROSOFT");
  +                                        (new Date()).toString(), "MICROSOFT");
               revisionDescriptor.setProperty(property);
               
           }
  
  
  
  1.4       +8 -9      jakarta-slide/src/share/org/apache/slide/webdav/method/MoveMethod.java
  
  Index: MoveMethod.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/MoveMethod.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- MoveMethod.java	2000/09/02 03:13:33	1.3
  +++ MoveMethod.java	2000/09/04 23:49:12	1.4
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/MoveMethod.java,v 1.3 2000/09/02 03:13:33 remm Exp $
  - * $Revision: 1.3 $
  - * $Date: 2000/09/02 03:13:33 $
  + * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/MoveMethod.java,v 1.4 2000/09/04 23:49:12 remm Exp $
  + * $Revision: 1.4 $
  + * $Date: 2000/09/04 23:49:12 $
    *
    * ====================================================================
    *
  @@ -155,12 +155,11 @@
               }
           }
           
  -        if (!isStandalone()) {
  -            String servletPath = req.getServletPath();
  -            if (destinationUri.startsWith(servletPath)) {
  -                destinationUri = destinationUri
  -                    .substring(servletPath.length());
  -            }
  +        String servletPath = req.getServletPath();
  +        if ((servletPath != null) 
  +            && (destinationUri.startsWith(servletPath))) {
  +            destinationUri = destinationUri
  +                .substring(servletPath.length());
           }
           
           String overwriteHeader = req.getHeader("Overwrite");
  
  
  
  1.5       +267 -421  jakarta-slide/src/share/org/apache/slide/webdav/method/PropFindMethod.java
  
  Index: PropFindMethod.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/PropFindMethod.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- PropFindMethod.java	2000/09/02 03:13:33	1.4
  +++ PropFindMethod.java	2000/09/04 23:49:12	1.5
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/PropFindMethod.java,v 1.4 2000/09/02 03:13:33 remm Exp $
  - * $Revision: 1.4 $
  - * $Date: 2000/09/02 03:13:33 $
  + * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/PropFindMethod.java,v 1.5 2000/09/04 23:49:12 remm Exp $
  + * $Revision: 1.5 $
  + * $Date: 2000/09/04 23:49:12 $
    *
    * ====================================================================
    *
  @@ -141,17 +141,23 @@
       
       
       /**
  -     * DAV Namespace support.
  +     * MS Proprietary properties support.
        */
  -    private boolean davNative;
  +    private boolean msProprietarySupport;
       
       
       /**
  -     * MS Proprietary properties support.
  +     * Current namespace number used to generate namespace abbreviations.
        */
  -    private boolean msProprietarySupport;
  +    private int namespaceNumber = 0;
       
       
  +    /**
  +     * Namespaces list. Keyed by namespace names.
  +     */
  +    private Hashtable namespaceAbbrevs;
  +    
  +    
       // ----------------------------------------------------------- Constructors
       
       
  @@ -167,6 +173,7 @@
           super(servlet, token, req, resp);
           readRequestContent();
           
  +        namespaceAbbrevs = new Hashtable();
           depth = INFINITY;
           propFindType = FIND_ALL_PROP;
       }
  @@ -183,7 +190,6 @@
       protected void parseRequest() 
   	throws WebdavException {
   	
  -        davNative = isDavNative();
           msProprietarySupport = isMsProprietarySupport();
           
   	String depthStr = req.getHeader("Depth");
  @@ -219,12 +225,15 @@
                   Element rootElement = document.getDocumentElement();
                   NodeList childList = rootElement.getChildNodes();
                   
  +                parseNodeNamespaceDeclarations(rootElement);
  +                
                   for (int i=0; i < childList.getLength(); i++) {
                       Node currentNode = childList.item(i);
                       switch (currentNode.getNodeType()) {
                       case Node.TEXT_NODE:
                           break;
                       case Node.ELEMENT_NODE:
  +                        parseNodeNamespaceDeclarations(currentNode);
                           if (currentNode.getNodeName().endsWith("prop")) {
                               propFindType = FIND_BY_PROPERTY;
                               propNode = currentNode;
  @@ -254,16 +263,9 @@
                       case Node.TEXT_NODE:
                           break;
                       case Node.ELEMENT_NODE:
  -                        String nodeName = currentNode.getNodeName();
  -                        String propertyName = null;
  -                        if (nodeName.indexOf(':') != -1) {
  -                            propertyName = nodeName.substring
  -                                (nodeName.indexOf(':') + 1);
  -                        } else {
  -                            propertyName = nodeName;
  -                        }
  -                        // href is a live property which is handled differently
  -                        propertyVector.addElement(propertyName);
  +                        parseNodeNamespaceDeclarations(currentNode);
  +                        Property property = getProperty(currentNode);
  +                        propertyVector.addElement(property);
                           break;
                       }
                   }
  @@ -283,19 +285,10 @@
       protected void executeRequest() 
   	throws WebdavException {
   	
  -        System.out.println(System.currentTimeMillis() + " - PROPFIND - Begin");
  -        
           resp.setStatus(WebdavStatus.SC_MULTI_STATUS);
           
   	// Loads the associated object from the store.
   	String resourceUri = requestUri;
  -	if (resourceUri == null) {
  -	    resourceUri = "/";
  -	}
  -        if (resourceUri.equals("/")) {
  -            // The root node is never native
  -            davNative = false;
  -        }
           
           // Get the object from Data.
           ObjectNode resource = null;
  @@ -328,7 +321,8 @@
           WebdavXMLPrinter generatedXML = new WebdavXMLPrinter();
           
           generatedXML.writeXMLHeader();
  -        generatedXML.writeElement("d", "DAV", "multistatus", 
  +        generatedXML.writeElement(null, "multistatus" 
  +                                  + generateNamespaceDeclarations(), 
                                     WebdavXMLPrinter.OPENING);
           
           if (resource != null) {
  @@ -374,7 +368,7 @@
               }
           }
           
  -        generatedXML.writeElement("d", "multistatus", 
  +        generatedXML.writeElement(null, "multistatus", 
                                     WebdavXMLPrinter.CLOSING);
           
           
  @@ -390,8 +384,6 @@
   	    throw new WebdavException(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
   	}
           
  -        System.out.println(System.currentTimeMillis() + " - PROPFIND - End");
  -        
       }
       
       
  @@ -403,10 +395,10 @@
        * @exception WebdavException 
        */
       protected void parsePropertiesOfObject(ObjectNode object, 
  -                                         WebdavXMLPrinter generatedXML)
  +                                           WebdavXMLPrinter generatedXML)
   	throws WebdavException {
           
  -        generatedXML.writeElement("d", "response", WebdavXMLPrinter.OPENING);
  +        generatedXML.writeElement(null, "response", WebdavXMLPrinter.OPENING);
           
           String status = new String("HTTP/1.1 " + WebdavStatus.SC_OK + " " 
                                      + WebdavStatus.getStatusText
  @@ -419,35 +411,56 @@
           NodeLock objectLockToken = null;
           
           try {
  -            generatedXML.writeElement("d", "href", WebdavXMLPrinter.OPENING);
  +            generatedXML.writeElement(null, "href", WebdavXMLPrinter.OPENING);
               revisionDescriptors = content.retrieve(credToken, object.getUri());
               
  -            // TODO : What if the object has NO revisions ?
  -            
               try {
  +                
                   revisionDescriptor = content.retrieve(credToken, 
                                                         revisionDescriptors);
                   isCollection = WebdavUtil.isCollection(revisionDescriptor);
  -                generatedXML.writeText(object.getUri());
  -                if ((isCollection) && (!object.getUri().equals(DIRECTORY))) {
  -                    generatedXML.writeText(DIRECTORY);
  +                
  +                String path = object.getUri();
  +                
  +                String absoluteUri = req.getRequestURI();
  +                String relativePath = requestUri;
  +                String toAppend = "";
  +                if (relativePath.length() <= path.length()) {
  +                    toAppend = path.substring(relativePath.length());
  +                    if ((!absoluteUri.endsWith("/")) && 
  +                        (!toAppend.startsWith("/"))) {
  +                        toAppend = "/" + toAppend;
  +                    }
                   }
  +                
  +                generatedXML.writeText(absoluteUri + toAppend);
  +                
               } catch (RevisionDescriptorNotFoundException e) {
  -                // The object doesn't have any revision.
  -                // Either :
  -                // - the namespace is not DAV aware
  -                // - we are on the root node
  -                // In any case, we create a dummy NodeRevisionDescriptor object
  +                
  +                // The object doesn't have any revision, we create a dummy 
  +                // NodeRevisionDescriptor object
                   isCollection = true;
                   revisionDescriptor = new NodeRevisionDescriptor(0);
                   revisionDescriptor.setName(object.getUri());
  -                generatedXML.writeText(object.getUri());
  -                if (!object.getUri().equals(DIRECTORY)) {
  -                    generatedXML.writeText(DIRECTORY);
  +                
  +                String path = object.getUri();
  +                
  +                String absoluteUri = req.getRequestURI();
  +                String relativePath = requestUri;
  +                String toAppend = "";
  +                if (relativePath.length() <= path.length()) {
  +                    toAppend = path.substring(relativePath.length());
  +                    if ((!absoluteUri.endsWith("/")) 
  +                        && (!toAppend.startsWith("/"))) {
  +                        toAppend = "/" + toAppend;
  +                    }
                   }
  +                
  +                generatedXML.writeText(absoluteUri + toAppend);
  +                
               }
               
  -            generatedXML.writeElement("d", "href", WebdavXMLPrinter.CLOSING);
  +            generatedXML.writeElement(null, "href", WebdavXMLPrinter.CLOSING);
               
               Enumeration lockTokens = lock.enumerateLocks(credToken, 
                                                            object.getUri());
  @@ -473,173 +486,62 @@
           Vector propertiesParser = null;
           String supportedLocks = null;
           
  -        if (!davNative) {
  -            propertiesParser = revisionDescriptor.getPropertiesNamesParser();
  -        }
  -        
           switch (propFindType) {
           case FIND_ALL_PROP :
               
               // Show properties / values for current object.
  -            generatedXML.writeElement("d", "propstat", 
  +            generatedXML.writeElement(null, "propstat", 
                                         WebdavXMLPrinter.OPENING);
  -            generatedXML.writeElement("d", "prop", WebdavXMLPrinter.OPENING);
  +            generatedXML.writeElement(null, "prop", WebdavXMLPrinter.OPENING);
               
               status = new String("HTTP/1.1 " + WebdavStatus.SC_OK 
                                   + " " + WebdavStatus.getStatusText
                                   (WebdavStatus.SC_OK));
               
  -            // Default properties
  -            
  -            if (!davNative) {
  -                
  -                String creationDate = revisionDescriptor.getCreationDate();
  -                if (creationDate == null) {
  -                    creationDate = new String();
  -                }
  -                generatedXML.writeProperty("d", "DAV", "creationdate", 
  -                                           creationDate);
  -                propertiesParser.removeElement
  -                    (NodeRevisionDescriptor.CREATION_DATE);
  -                
  -                generatedXML.writeProperty("d", "DAV", "displayname", 
  -                                           revisionDescriptor.getName());
  -                propertiesParser.removeElement(NodeRevisionDescriptor.NAME);
  -                
  -                if (!isCollection) {
  -                    generatedXML.writeProperty
  -                        ("d", "DAV", "getcontentlanguage", 
  -                         revisionDescriptor.getContentLanguage());
  -                }
  -                propertiesParser.removeElement
  -                    (NodeRevisionDescriptor.CONTENT_LANGUAGE);
  -                
  -                if (!isCollection) {
  -                    generatedXML.writeProperty
  -                        ("d", "DAV", "getcontentlength", 
  -                         (new Long(revisionDescriptor.getContentLength()))
  -                         .toString());
  -                }
  -                propertiesParser.removeElement("getcontentlength");
  -                
  -                if (!isCollection) {
  -                    generatedXML.writeProperty
  -                        ("d", "DAV", "getcontenttype", 
  -                         revisionDescriptor.getContentType());
  -                }
  -                propertiesParser.removeElement
  -                    (NodeRevisionDescriptor.CONTENT_TYPE);
  -                
  -                if (!isCollection) {
  -                    String etag = null;
  -                    if (revisionDescriptor != null) {
  -                        etag = revisionDescriptors.getUri().hashCode() + "_" 
  -                            + revisionDescriptors.getLatestRevision()
  -                            .hashCode() + "_"
  -                            + revisionDescriptor.getContentLength();
  -                    } else {
  -                        etag = "";
  -                    }
  -                    generatedXML.writeProperty("d", "DAV", "getetag", etag);
  -                }
  -                propertiesParser.removeElement("getetag");
  -                
  -                if (!isCollection) {
  -                    generatedXML.writeProperty
  -                        ("d", "DAV", "getlastmodified", 
  -                         revisionDescriptor.getCreationDate());
  -                }
  -                propertiesParser.removeElement("getlastmodified");
  -                
  -                if (isCollection) {
  -                    generatedXML.writeElement("d", "DAV", "resourcetype", 
  -                                              WebdavXMLPrinter.OPENING);
  -                    generatedXML.writeElement("d", "collection", 
  -                                              WebdavXMLPrinter.NO_CONTENT);
  -                    generatedXML.writeElement("d", "resourcetype", 
  -                                              WebdavXMLPrinter.CLOSING);
  -                } else {
  -                    NodeProperty resourceTypeProperty = 
  -                        revisionDescriptor.getProperty("resourcetype");
  -                    if ((resourceTypeProperty == null) || 
  -                        (resourceTypeProperty.getValue().equals(""))) {
  -                        generatedXML.writeElement("d", "DAV", "resourcetype", 
  -                                                  WebdavXMLPrinter.NO_CONTENT);
  -                    } else {
  -                        generatedXML.writeElement("d", "DAV", "resourcetype", 
  -                                                  WebdavXMLPrinter.OPENING);
  -                        generatedXML.writeText
  -                            (resourceTypeProperty.getValue().toString());
  -                        generatedXML.writeElement("d", "resourcetype", 
  -                                                  WebdavXMLPrinter.CLOSING);
  -                    }
  -                }
  -                propertiesParser.removeElement("resourcetype");
  -                
  -                generatedXML.writeProperty("d", "DAV", "source", "");
  -                propertiesParser.removeElement("source");
  -                
  -                supportedLocks = "<d:lockentry>" 
  -                    + "<d:lockscope><d:exclusive/></d:lockscope>"
  -                    + "<d:locktype><d:write/></d:locktype>"
  -                    + "</d:lockentry>";
  -                generatedXML.writeProperty("d", "DAV", "supportedlock", 
  -                                           supportedLocks);
  -                propertiesParser.removeElement("supportedlock");
  -            }
  -            
               // Lock information, which is dynamically generated
               
               if (objectLockToken != null) {
                   showLockDiscoveryInfo(objectLockToken, generatedXML);
               }
  -            if (!davNative) {
  -                propertiesParser.removeElement("lockdiscovery");
  -            }
               
  -            
               // Custom properties
  -            Enumeration customPropertiesList = null;
  +            Enumeration propertyList = 
  +                revisionDescriptor.enumerateProperties();
               
  -            if (!davNative) {
  -                customPropertiesList = propertiesParser.elements();
  -            } else {
  -                customPropertiesList = revisionDescriptor.getPropertiesNames();
  -            }
  -            
  -            while (customPropertiesList.hasMoreElements()) {
  +            while (propertyList.hasMoreElements()) {
                   NodeProperty currentProperty = 
  -                    revisionDescriptor.getProperty
  -                    ((String) customPropertiesList.nextElement());
  +                    (NodeProperty) propertyList.nextElement();
  +                //revisionDescriptor.getProperty
  +                //((String) customPropertiesList.nextElement());
                   if (currentProperty != null) {
  +                    String namespace = currentProperty.getNamespace();
  +                    String namespaceAbbrev = 
  +                        (String) namespaceAbbrevs.get(namespace);
                       Object currentPropertyValue = currentProperty.getValue();
                       if ((currentPropertyValue == null) || 
                           (currentPropertyValue.toString().equals(""))) {
                           generatedXML.writeElement
  -                            (currentProperty.getDefinitionName(), 
  -                             currentProperty.getDefinition(),
  +                            (namespaceAbbrev, namespace,
                                currentProperty.getName(), 
                                WebdavXMLPrinter.NO_CONTENT);
                       } else {
                           generatedXML.writeElement
  -                            (currentProperty.getDefinitionName(), 
  -                             currentProperty.getDefinition(),
  +                            (namespaceAbbrev, namespace,
                                currentProperty.getName(), 
                                WebdavXMLPrinter.OPENING);
                           generatedXML.writeText
                               (currentPropertyValue.toString());
                           generatedXML.writeElement
  -                            (currentProperty.getDefinitionName(), 
  -                             currentProperty.getDefinition(),
  +                            (namespaceAbbrev, namespace,
                                currentProperty.getName(), 
                                WebdavXMLPrinter.CLOSING);
                       }
                   }
               }
               
  -            generatedXML.writeElement("d", "prop", WebdavXMLPrinter.CLOSING);
  -            generatedXML.writeProperty("d", "status", status);
  -            generatedXML.writeElement("d", "propstat", 
  +            generatedXML.writeElement(null, "prop", WebdavXMLPrinter.CLOSING);
  +            generatedXML.writeProperty(null, "status", status);
  +            generatedXML.writeElement(null, "propstat", 
                                         WebdavXMLPrinter.CLOSING);
               
   	    break;
  @@ -650,115 +552,48 @@
                                   + " " + WebdavStatus.getStatusText
                                   (WebdavStatus.SC_OK));
               
  -            generatedXML.writeElement("d", "propstat", 
  +            generatedXML.writeElement(null, "propstat", 
                                         WebdavXMLPrinter.OPENING);
  -            generatedXML.writeElement("d", "prop", WebdavXMLPrinter.OPENING);
  +            generatedXML.writeElement(null, "prop", WebdavXMLPrinter.OPENING);
               
               // First step : find the supported default properties
               
  -            if (!davNative) {
  -                
  -                propertiesParser.removeElement("href");
  -                
  -                generatedXML.writeElement("d", "DAV", "creationdate", 
  -                                          WebdavXMLPrinter.NO_CONTENT);
  -                propertiesParser.removeElement
  -                    (NodeRevisionDescriptor.CREATION_DATE);
  -                
  -                generatedXML.writeElement("d", "DAV", "displayname", 
  -                                          WebdavXMLPrinter.NO_CONTENT); // Temp
  -                propertiesParser.removeElement(NodeRevisionDescriptor.NAME);
  -                
  -                if (!isCollection) {
  -                    generatedXML.writeElement("d", "DAV", "getcontentlanguage",
  -                                              WebdavXMLPrinter.NO_CONTENT);
  -                }
  -                propertiesParser.removeElement
  -                    (NodeRevisionDescriptor.CONTENT_LANGUAGE);
  -                
  -                if (!isCollection) {
  -                    generatedXML.writeElement("d", "DAV", "getcontentlength", 
  -                                              WebdavXMLPrinter.NO_CONTENT);
  -                }
  -                propertiesParser.removeElement("getcontentlength");
  -                
  -                if (!isCollection) {
  -                    generatedXML.writeElement("d", "DAV", "getcontenttype", 
  -                                              WebdavXMLPrinter.NO_CONTENT);
  -                }
  -                propertiesParser.removeElement
  -                    (NodeRevisionDescriptor.CONTENT_TYPE);
  -                
  -                if (!isCollection) {
  -                    generatedXML.writeElement("d", "DAV", "getetag", 
  -                                              WebdavXMLPrinter.NO_CONTENT);
  -                }
  -                propertiesParser.removeElement("getetag");
  -                
  -                if (!isCollection) {
  -                    generatedXML.writeElement("d", "DAV", "getlastmodified", 
  -                                              WebdavXMLPrinter.NO_CONTENT);
  -                }
  -                propertiesParser.removeElement("getlastmodified");
  -                
  -                generatedXML.writeElement("d", "DAV", "resourcetype", 
  -                                          WebdavXMLPrinter.NO_CONTENT);
  -                propertiesParser.removeElement("resourcetype");
  -                
  -                generatedXML.writeElement("d", "DAV", "source", 
  -                                          WebdavXMLPrinter.NO_CONTENT);
  -                propertiesParser.removeElement("source");
  -                
  -                generatedXML.writeElement("d", "DAV", "supportedlock", 
  -                                          WebdavXMLPrinter.NO_CONTENT);
  -                propertiesParser.removeElement("supportedlock");
  -                
  -            }
  -            
               // Lock information
               
  -            generatedXML.writeElement("d", "DAV", "lockdiscovery", 
  +            generatedXML.writeElement(null, "DAV", "lockdiscovery", 
                                         WebdavXMLPrinter.NO_CONTENT);
  -            if (!davNative) {
  -                propertiesParser.removeElement("lockdiscovery");
  -            }
               
  -            System.out.println("Went there 2");
  -            
               // Then, add this resource's custom properties
  -            if (!davNative) {
  -                customPropertiesList = propertiesParser.elements();
  -            } else {
  -                customPropertiesList = revisionDescriptor.getPropertiesNames();
  -            }
  +            propertyList = revisionDescriptor.enumerateProperties();
               
  -            while (customPropertiesList.hasMoreElements()) {
  +            while (propertyList.hasMoreElements()) {
                   NodeProperty currentProperty = 
  -                    revisionDescriptor.getProperty
  -                    ((String) customPropertiesList.nextElement());
  +                    (NodeProperty) propertyList.nextElement();
                   if (currentProperty != null) {
  +                    String namespace = currentProperty.getNamespace();
  +                    String namespaceAbbrev = 
  +                        (String) namespaceAbbrevs.get(namespace);
                       generatedXML.writeElement
  -                        (currentProperty.getDefinitionName(), 
  -                         currentProperty.getDefinition(),
  +                        (namespaceAbbrev, namespace,
                            currentProperty.getName(), 
                            WebdavXMLPrinter.NO_CONTENT);
                   }
               }
               
  -            generatedXML.writeElement("d", "prop", WebdavXMLPrinter.CLOSING);
  -            generatedXML.writeProperty("d", "status", status);
  -            generatedXML.writeElement("d", "propstat", 
  +            generatedXML.writeElement(null, "prop", WebdavXMLPrinter.CLOSING);
  +            generatedXML.writeProperty(null, "status", status);
  +            generatedXML.writeElement(null, "propstat", 
                                         WebdavXMLPrinter.CLOSING);
               
   	    break;
   	case FIND_BY_PROPERTY :
   	    // Show requested properties value.
               
  -            Enumeration propertyList = propertyVector.elements();
  +            propertyList = propertyVector.elements();
               
  -            generatedXML.writeElement("d", "propstat", 
  +            generatedXML.writeElement(null, "propstat", 
                                         WebdavXMLPrinter.OPENING);
  -            generatedXML.writeElement("d", "prop", WebdavXMLPrinter.OPENING);
  +            generatedXML.writeElement(null, "prop", WebdavXMLPrinter.OPENING);
               
               status = new String("HTTP/1.1 " + WebdavStatus.SC_OK 
                                   + " " + WebdavStatus.getStatusText
  @@ -767,109 +602,11 @@
               Vector propertiesNotFoundVector = new Vector();
               
               while (propertyList.hasMoreElements()) {
  -                String propertyName = (String) propertyList.nextElement();
  +                Property property = (Property) propertyList.nextElement();
  +                String propertyName = property.name;
  +                String propertyNamespace = property.namespace;
                   boolean propertyFound = false;
                   
  -                if (!davNative) {
  -                    
  -                    if ((!propertyFound) && 
  -                        (propertyName.equals("creationdate"))) {
  -                        propertyFound = true;
  -                        String creationDate = 
  -                            revisionDescriptor.getCreationDate();
  -                        if (creationDate == null) {
  -                            creationDate = new String();
  -                        }
  -                        generatedXML.writeProperty("d", "DAV", "creationdate",
  -                                                   creationDate);
  -                    }
  -                    
  -                    if ((!propertyFound) && 
  -                        (propertyName.equals("displayname"))) {
  -                        propertyFound = true;
  -                        generatedXML.writeProperty("d", "DAV", "displayname", 
  -                                                   object.getUri());
  -                    }
  -                    
  -                    if ((!propertyFound) && (!isCollection) && 
  -                        (propertyName.equals("getcontentlanguage"))) {
  -                        propertyFound = true;
  -                        generatedXML.writeProperty
  -                            ("d", "DAV", "getcontentlanguage", 
  -                             revisionDescriptor.getContentLanguage());
  -                    }
  -                    
  -                    if ((!propertyFound) && (!isCollection) && 
  -                        (propertyName.equals("getcontentlength"))) {
  -                        propertyFound = true;
  -                        // Temp content length. Retrieve latest revision ...
  -                        generatedXML.writeProperty
  -                            ("d", "DAV", "getcontentlength", 
  -                             (new Long(revisionDescriptor.getContentLength()))
  -                             .toString());
  -                    }
  -                    
  -                    if ((!propertyFound) && (!isCollection) && 
  -                        (propertyName.equals("getcontenttype"))) {
  -                        propertyFound = true;
  -                        generatedXML.writeProperty
  -                            ("d", "DAV", "getcontenttype", 
  -                             revisionDescriptor.getContentType());
  -                    }
  -                    
  -                    if ((!propertyFound) && (!isCollection) && 
  -                        (propertyName.equals("getetag"))) {
  -                        propertyFound = true;
  -                        generatedXML.writeProperty("d", "DAV", "getetag", "0");
  -                    }
  -                    
  -                    if ((!propertyFound) && (!isCollection) && 
  -                        (propertyName.equals("getlastmodified"))) {
  -                        propertyFound = true;
  -                        // For now, return creation date
  -                        generatedXML.writeProperty
  -                            ("d", "DAV", "getlastmodified", 
  -                             revisionDescriptor.getCreationDate().toString());
  -                    }
  -                    
  -                    if ((!propertyFound) && 
  -                        (propertyName.equals("resourcetype"))) {
  -                        propertyFound = true;
  -                        if (isCollection) {
  -                            generatedXML.writeElement
  -                                ("d", "DAV", "resourcetype", 
  -                                 WebdavXMLPrinter.OPENING);
  -                            generatedXML.writeElement
  -                                ("d", "collection", 
  -                                 WebdavXMLPrinter.NO_CONTENT);
  -                            generatedXML.writeElement
  -                                ("d", "resourcetype", 
  -                                 WebdavXMLPrinter.CLOSING);
  -                        } else {
  -                            generatedXML.writeElement
  -                                ("d", "DAV", "resourcetype", 
  -                                 WebdavXMLPrinter.NO_CONTENT);
  -                        }
  -                    }
  -                    
  -                    if ((!propertyFound) && (propertyName.equals("source"))) {
  -                        propertyFound = true;
  -                        generatedXML.writeProperty("d", "DAV", "source", "");
  -                    }
  -                    
  -                    if ((!propertyFound) && 
  -                        (propertyName.equals("supportedlock"))) {
  -                        propertyFound = true;
  -                        supportedLocks = "<d:lockentry>" 
  -                            + "<d:lockscope><d:exclusive/></d:lockscope>"
  -                            + "<d:locktype><d:write/></d:locktype>"
  -                            + "</d:lockentry>";
  -                        generatedXML.writeProperty("d", "DAV", "supportedlock",
  -                                                   supportedLocks);
  -                    }
  -                    
  -                }
  -                
                   // Lock information, dynamically generated
                   
                   if ((!propertyFound) && 
  @@ -881,12 +618,12 @@
                       }
                   }
                   
  -                
                   // Search in the custom properties
                   
                   if (!propertyFound) {
                       NodeProperty currentProperty = 
  -                        revisionDescriptor.getProperty(propertyName);
  +                        revisionDescriptor.getProperty(propertyName,
  +                                                       propertyNamespace);
                       if (currentProperty != null) {
                           propertyFound = true;
                           Object currentPropertyValue = 
  @@ -894,21 +631,18 @@
                           if ((currentPropertyValue == null) || 
                               (currentPropertyValue.toString().equals(""))) {
                               generatedXML.writeElement
  -                                (currentProperty.getDefinitionName(), 
  -                                 currentProperty.getDefinition(),
  +                                (property.namespaceAbbrev, null,
                                    currentProperty.getName(), 
                                    WebdavXMLPrinter.NO_CONTENT);
                           } else {
                               generatedXML.writeElement
  -                                (currentProperty.getDefinitionName(), 
  -                                 currentProperty.getDefinition(),
  +                                (property.namespaceAbbrev, null,
                                    currentProperty.getName(), 
                                    WebdavXMLPrinter.OPENING);
                               generatedXML.writeText
                                   (currentPropertyValue.toString());
                               generatedXML.writeElement
  -                                (currentProperty.getDefinitionName(), 
  -                                 currentProperty.getDefinition(),
  +                                (property.namespaceAbbrev, null,
                                    currentProperty.getName(), 
                                    WebdavXMLPrinter.CLOSING);
                           }
  @@ -921,9 +655,9 @@
                   
               }
               
  -            generatedXML.writeElement("d", "prop", WebdavXMLPrinter.CLOSING);
  -            generatedXML.writeProperty("d", "status", status);
  -            generatedXML.writeElement("d", "propstat", 
  +            generatedXML.writeElement(null, "prop", WebdavXMLPrinter.CLOSING);
  +            generatedXML.writeProperty(null, "status", status);
  +            generatedXML.writeElement(null, "propstat", 
                                         WebdavXMLPrinter.CLOSING);
               
               Enumeration propertiesNotFoundList = 
  @@ -935,9 +669,9 @@
                                       + " " + WebdavStatus.getStatusText
                                       (WebdavStatus.SC_NOT_FOUND));
                   
  -                generatedXML.writeElement("d", "propstat", 
  +                generatedXML.writeElement(null, "propstat", 
                                             WebdavXMLPrinter.OPENING);
  -                generatedXML.writeElement("d", "prop", 
  +                generatedXML.writeElement(null, "prop", 
                                             WebdavXMLPrinter.OPENING);
                   
                   while (propertiesNotFoundList.hasMoreElements()) {
  @@ -946,22 +680,137 @@
                            WebdavXMLPrinter.NO_CONTENT);
                   }
                   
  -                generatedXML.writeElement("d", "prop", 
  +                generatedXML.writeElement(null, "prop", 
                                             WebdavXMLPrinter.CLOSING);
  -                generatedXML.writeProperty("d", "status", status);
  -                generatedXML.writeElement("d", "propstat", 
  +                generatedXML.writeProperty(null, "status", status);
  +                generatedXML.writeElement(null, "propstat", 
                                             WebdavXMLPrinter.CLOSING);
                   
               }
               
  -	    break;
  -	}
  -	
  -        generatedXML.writeElement("d", "response", WebdavXMLPrinter.CLOSING);
  +            break;
  +        }
  +        
  +        generatedXML.writeElement(null, "response", WebdavXMLPrinter.CLOSING);
  +        
  +    }
  +    
  +    
  +    /**
  +     * Parse a node for namespace declaration attributes.
  +     * 
  +     * @param node DOM node
  +     */
  +    protected void parseNodeNamespaceDeclarations(Node node) {
  +        
  +        NamedNodeMap nodeMap = node.getAttributes();
  +        if (nodeMap != null) {
  +            for (int i = 0; i < nodeMap.getLength(); i++) {
  +                Node currentNode = nodeMap.item(i);
  +                if (currentNode.getNodeType() != Node.ATTRIBUTE_NODE)
  +                    continue;
  +                String attributeName = currentNode.getNodeName();
  +                if (attributeName.startsWith("xmlns")) {
  +                    // We found a namespace declaration
  +                    if (attributeName.equals("xmlns")) {
  +                        defaultNamespace = currentNode.getNodeValue();
  +                    } else {
  +                        // Stripping out the prefix
  +                        if (attributeName.startsWith("xmlns:")) {
  +                            String namespaceAbbreviation =
  +                                attributeName.substring(6);
  +                            namespaces.put(namespaceAbbreviation, 
  +                                           currentNode.getNodeValue());
  +                            namespaceAbbrevs.put(currentNode.getNodeValue(),
  +                                                 namespaceAbbreviation);
  +                        }
  +                    }
  +                }
  +            }
  +        }
           
       }
       
  +    
       /**
  +     * Parse the namespace info of a node name.
  +     * 
  +     * @param node The DOM node to parse
  +     * @return The corresponding Property object
  +     */
  +    private Property getProperty(Node node) {
  +        
  +        Property property = new Property();
  +        
  +        String nodeName = node.getNodeName();
  +        int colon = nodeName.indexOf(':');
  +        if (colon != -1) {
  +            property.name = nodeName.substring(colon + 1);
  +            property.namespaceAbbrev = nodeName.substring(0, colon - 1);
  +            String namespace = 
  +                (String) namespaces.get(property.namespaceAbbrev);
  +            if ((namespace) != null) {
  +                property.namespace = namespace;
  +            } else {
  +                property.namespace = defaultNamespace;
  +            }
  +        } else {
  +            property.name = nodeName;
  +            property.namespace = defaultNamespace;
  +        }
  +        
  +        return property;
  +        
  +    }
  +    
  +    
  +    /**
  +     * Generate a namespace abbreviation for the given namespace.
  +     * 
  +     * @param namespaceName Name of the namespace
  +     */
  +    private void generateNamespaceAbbreviation(String namespaceName) {
  +        
  +        if (namespaces.get(namespaceName) != null)
  +            return;
  +        
  +        String namespaceAbbrev = "ns" + namespaceNumber++;
  +        while (namespaces.get(namespaceAbbrev) != null) {
  +            namespaceAbbrev = "ns" + namespaceNumber++;
  +        }
  +        
  +        namespaces.put(namespaceAbbrev, namespaceName);
  +        
  +    }
  +    
  +    
  +    /**
  +     * Generate namespace declaration attributes.
  +     * 
  +     * @return String namespace attributes
  +     */
  +    private String generateNamespaceDeclarations() {
  +        
  +        StringBuffer result = new StringBuffer();
  +        
  +        result.append(" xmlns=\"").append(defaultNamespace).append("\" ");
  +        
  +        Enumeration abbreviationList = namespaces.keys();
  +        while (abbreviationList.hasMoreElements()) {
  +            
  +            String abbrev = (String) abbreviationList.nextElement();
  +            String namespace = (String) namespaces.get(abbrev);
  +            result.append("xmlns:").append(abbrev).append("=\"")
  +                .append(namespace).append("\" ");
  +            
  +        }
  +        
  +        return result.toString();
  +        
  +    }
  +    
  +    
  +    /**
        * Show lockdiscovery info.
        * 
        * @exception WebdavException Something is wrong with the servlet container
  @@ -970,78 +819,75 @@
                                          WebdavXMLPrinter generatedXML) 
           throws WebdavException {
           
  -        generatedXML.writeElement("d", "DAV", "lockdiscovery", 
  +        generatedXML.writeElement(null, "lockdiscovery", 
                                     WebdavXMLPrinter.OPENING);
           
  -        generatedXML.writeElement("d", "DAV", "activelock", 
  +        generatedXML.writeElement(null, "activelock", 
                                     WebdavXMLPrinter.OPENING);
           
  -        generatedXML.writeElement("d", "DAV", "locktype", 
  -                                  WebdavXMLPrinter.OPENING);
  -        generatedXML.writeElement("d", "DAV", "write", 
  -                                  WebdavXMLPrinter.NO_CONTENT);
  -        generatedXML.writeElement("d", "DAV", "locktype", 
  -                                  WebdavXMLPrinter.CLOSING);
  +        generatedXML.writeElement(null, "locktype", WebdavXMLPrinter.OPENING);
  +        generatedXML.writeElement(null, "write", WebdavXMLPrinter.NO_CONTENT);
  +        generatedXML.writeElement(null, "locktype", WebdavXMLPrinter.CLOSING);
           
  -        generatedXML.writeElement("d", "DAV", "lockscope", 
  -                                  WebdavXMLPrinter.OPENING);
  +        generatedXML.writeElement(null, "lockscope", WebdavXMLPrinter.OPENING);
           if (token.isExclusive()) {
  -            generatedXML.writeElement("d", "DAV", "exclusive", 
  +            generatedXML.writeElement(null, "exclusive", 
                                         WebdavXMLPrinter.NO_CONTENT);
           } else {
  -            generatedXML.writeElement("d", "DAV", "shared", 
  +            generatedXML.writeElement(null, "shared", 
                                         WebdavXMLPrinter.NO_CONTENT);
           }
  -        generatedXML.writeElement("d", "DAV", "lockscope", 
  -                                  WebdavXMLPrinter.CLOSING);
  +        generatedXML.writeElement(null, "lockscope", WebdavXMLPrinter.CLOSING);
           
  -        generatedXML.writeElement("d", "DAV", "depth", 
  -                                  WebdavXMLPrinter.OPENING);
  +        generatedXML.writeElement(null, "depth", WebdavXMLPrinter.OPENING);
           if (token.isInheritable()) {
               generatedXML.writeText("Infinity");
           } else {
               generatedXML.writeText("0");
           }
  -        generatedXML.writeElement("d", "DAV", "depth", 
  -                                  WebdavXMLPrinter.CLOSING);
  +        generatedXML.writeElement(null, "depth", WebdavXMLPrinter.CLOSING);
           
  -        generatedXML.writeElement("d", "DAV", "owner", 
  -                                  WebdavXMLPrinter.OPENING);
  -        generatedXML.writeElement("d", "DAV", "href", 
  -                                  WebdavXMLPrinter.OPENING);
  -        // FIXME !
  +        generatedXML.writeElement(null, "owner", WebdavXMLPrinter.OPENING);
  +        generatedXML.writeElement(null, "href", WebdavXMLPrinter.OPENING);
           generatedXML.writeText(req.getServletPath() + token.getSubjectUri());
  -        generatedXML.writeElement("d", "DAV", "href", 
  -                                  WebdavXMLPrinter.CLOSING);
  -        generatedXML.writeElement("d", "DAV", "owner", 
  -                                  WebdavXMLPrinter.CLOSING);
  +        generatedXML.writeElement(null, "href", WebdavXMLPrinter.CLOSING);
  +        generatedXML.writeElement(null, "owner", WebdavXMLPrinter.CLOSING);
           
  -        generatedXML.writeElement("d", "DAV", "timeout", 
  -                                  WebdavXMLPrinter.OPENING);
  +        generatedXML.writeElement(null, "timeout", WebdavXMLPrinter.OPENING);
           generatedXML.writeText("Second-" 
                                  + (new Long((token.getExpirationDate().getTime()
                                               - (new Date()).getTime())/1000))
                                  .toString());
  -        generatedXML.writeElement("d", "DAV", "timeout", 
  -                                  WebdavXMLPrinter.CLOSING);
  +        generatedXML.writeElement(null, "timeout", WebdavXMLPrinter.CLOSING);
           
  -        generatedXML.writeElement("d", "DAV", "locktoken", 
  -                                  WebdavXMLPrinter.OPENING);
  -        generatedXML.writeElement("d", "DAV", "href", 
  -                                  WebdavXMLPrinter.OPENING);
  +        generatedXML.writeElement(null, "locktoken", WebdavXMLPrinter.OPENING);
  +        generatedXML.writeElement(null, "href", WebdavXMLPrinter.OPENING);
           // Put here the token Id
           generatedXML.writeText("opaquelocktoken:" + token.getLockId());
  -        generatedXML.writeElement("d", "DAV", "href", 
  -                                  WebdavXMLPrinter.CLOSING);
  -        generatedXML.writeElement("d", "DAV", "locktoken", 
  -                                  WebdavXMLPrinter.CLOSING);
  +        generatedXML.writeElement(null, "href", WebdavXMLPrinter.CLOSING);
  +        generatedXML.writeElement(null, "locktoken", WebdavXMLPrinter.CLOSING);
           
  -        generatedXML.writeElement("d", "DAV", "activelock", 
  +        generatedXML.writeElement(null, "activelock", 
                                     WebdavXMLPrinter.CLOSING);
           
  -        generatedXML.writeElement("d", "DAV", "lockdiscovery", 
  +        generatedXML.writeElement(null, "lockdiscovery", 
                                     WebdavXMLPrinter.CLOSING);
           
       }
  +    
  +    
  +    // --------------------------------------------------- Property Inner Class
  +    
  +    
  +    private class Property {
  +        
  +        public String name;
  +        public String value;
  +        public String namespace;
  +        public String namespaceAbbrev;
  +        public int status = WebdavStatus.SC_OK;
  +        
  +    }
  +    
       
   }
  
  
  
  1.8       +46 -27    jakarta-slide/src/share/org/apache/slide/webdav/method/PropPatchMethod.java
  
  Index: PropPatchMethod.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/PropPatchMethod.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- PropPatchMethod.java	2000/09/02 03:13:33	1.7
  +++ PropPatchMethod.java	2000/09/04 23:49:12	1.8
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/PropPatchMethod.java,v 1.7 2000/09/02 03:13:33 remm Exp $
  - * $Revision: 1.7 $
  - * $Date: 2000/09/02 03:13:33 $
  + * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/PropPatchMethod.java,v 1.8 2000/09/04 23:49:12 remm Exp $
  + * $Revision: 1.8 $
  + * $Date: 2000/09/04 23:49:12 $
    *
    * ====================================================================
    *
  @@ -169,12 +169,15 @@
                   Element rootElement = document.getDocumentElement();
                   NodeList childList = rootElement.getChildNodes();
                   
  +                parseNodeNamespaceDeclarations(rootElement);
  +                
                   for (int i=0; i < childList.getLength(); i++) {
                       Node currentNode = childList.item(i);
                       switch (currentNode.getNodeType()) {
                       case Node.TEXT_NODE:
                           break;
                       case Node.ELEMENT_NODE:
  +                        parseNodeNamespaceDeclarations(currentNode);
                           if (currentNode.getNodeName().endsWith("set")) {
                               NodeList tempList = currentNode.getChildNodes();
                               for (int j=0; j < tempList.getLength(); j++) {
  @@ -182,6 +185,8 @@
                                   case Node.TEXT_NODE:
                                       break;
                                   case Node.ELEMENT_NODE:
  +                                    parseNodeNamespaceDeclarations
  +                                        (tempList.item(j));
                                       if (tempList.item(j).getNodeName()
                                           .endsWith("prop")) {
                                           parseSetNode(tempList.item(j));
  @@ -197,6 +202,8 @@
                                   case Node.TEXT_NODE:
                                       break;
                                   case Node.ELEMENT_NODE:
  +                                    parseNodeNamespaceDeclarations
  +                                        (tempList.item(j));
                                       if (tempList.item(j).getNodeName()
                                           .endsWith("prop")) {
                                           parseRemoveNode(tempList.item(j));
  @@ -265,7 +272,6 @@
                       NodeProperty newProperty = 
                           new NodeProperty(currentProperty.name,
                                            currentProperty.value,
  -                                         currentProperty.namespaceAbbrev,
                                            currentProperty.namespace);
                       revisionDescriptor.setProperty(newProperty);
                       
  @@ -347,18 +353,9 @@
                   break;
               case Node.ELEMENT_NODE:
                   
  -                Property propertyToSet = new Property();
  +                parseNodeNamespaceDeclarations(currentNode);
                   
  -                String nodeName = currentNode.getNodeName();
  -                int colon = nodeName.indexOf(':');
  -                if (colon != -1) {
  -                    propertyToSet.name = nodeName.substring(colon);
  -                    propertyToSet.namespaceAbbrev = 
  -                        nodeName.substring(0, colon - 1);
  -                    // TODO : Add namespace name
  -                } else {
  -                    propertyToSet.name = nodeName;
  -                }
  +                Property propertyToSet = getProperty(currentNode);
                   
                   StringWriter writer = new StringWriter();
                   domWriter = new DOMWriter(writer, true);
  @@ -397,25 +394,47 @@
                   break;
               case Node.ELEMENT_NODE:
                   
  -                Property propertyToRemove = new Property();
  +                parseNodeNamespaceDeclarations(currentNode);
                   
  -                String nodeName = currentNode.getNodeName();
  -                int colon = nodeName.indexOf(':');
  -                if (colon != -1) {
  -                    propertyToRemove.name = 
  -                        nodeName.substring(colon);
  -                    propertyToRemove.namespaceAbbrev = 
  -                        nodeName.substring(0, colon - 1);
  -                    // TODO : Add namespace name
  -                } else {
  -                    propertyToRemove.name = nodeName;
  -                }
  +                Property propertyToRemove = getProperty(currentNode);
                   
                   propertiesToRemove.addElement(propertyToRemove);
                   
                   break;
               }
           }
  +    }
  +    
  +    
  +    /**
  +     * Parse the namespace info of a node name.
  +     * 
  +     * @param node The DOM node to parse
  +     * @return The corresponding Property object
  +     */
  +    private Property getProperty(Node node) {
  +        
  +        Property property = new Property();
  +        
  +        String nodeName = node.getNodeName();
  +        int colon = nodeName.indexOf(':');
  +        if (colon != -1) {
  +            property.name = nodeName.substring(colon + 1);
  +            property.namespaceAbbrev = nodeName.substring(0, colon - 1);
  +            String namespace = 
  +                (String) namespaces.get(property.namespaceAbbrev);
  +            if ((namespace) != null) {
  +                property.namespace = namespace;
  +            } else {
  +                property.namespace = defaultNamespace;
  +            }
  +        } else {
  +            property.name = nodeName;
  +            property.namespace = defaultNamespace;
  +        }
  +        
  +        return property;
  +        
       }
       
       
  
  
  
  1.4       +100 -110  jakarta-slide/src/share/org/apache/slide/webdav/method/PutMethod.java
  
  Index: PutMethod.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/PutMethod.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- PutMethod.java	2000/09/02 03:13:33	1.3
  +++ PutMethod.java	2000/09/04 23:49:12	1.4
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/PutMethod.java,v 1.3 2000/09/02 03:13:33 remm Exp $
  - * $Revision: 1.3 $
  - * $Date: 2000/09/02 03:13:33 $
  + * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/PutMethod.java,v 1.4 2000/09/04 23:49:12 remm Exp $
  + * $Revision: 1.4 $
  + * $Date: 2000/09/04 23:49:12 $
    *
    * ====================================================================
    *
  @@ -157,30 +157,28 @@
                   //revisionContent.setContent(req.getReader());
                   revisionContent.setContent(req.getInputStream());
                   
  -                if (isDavNative()) {
  -                    NodeProperty property = null;
  -                    
  -                    // Get content length
  -                    property = new NodeProperty
  -                        ("getcontentlength", new Long(req.getContentLength()),
  -                         "d", "DAV");
  -                    revisionDescriptor.setProperty(property);
  -                    
  -                    // Last modification date
  -                    DateFormat formatter = new SimpleDateFormat(DATE_FORMAT);
  -                    property = new NodeProperty("getlastmodified", 
  -                                                formatter.format(new Date()), 
  -                                                "d", "DAV");
  -                    revisionDescriptor.setProperty(property);
  -                    
  -                    // Etag generation
  -                    String etag = resourcePath.hashCode() + "_" 
  -                        + revisionNumber.hashCode() + "_"
  -                        + revisionDescriptor.getContentLength();
  -                    property = new NodeProperty("getetag", etag, "d", "DAV");
  -                    revisionDescriptor.setProperty(property);
  -                }
  +                NodeProperty property = null;
  +                
  +                // Get content length
  +                property = new NodeProperty
  +                    ("getcontentlength", new Long(req.getContentLength()),
  +                     true);
  +                revisionDescriptor.setProperty(property);
  +                
  +                // Last modification date
  +                DateFormat formatter = new SimpleDateFormat(DATE_FORMAT);
  +                property = new NodeProperty("getlastmodified", 
  +                                            formatter.format(new Date()), 
  +                                            true);
  +                revisionDescriptor.setProperty(property);
                   
  +                // Etag generation
  +                String etag = resourcePath.hashCode() + "_" 
  +                    + revisionNumber.hashCode() + "_"
  +                    + revisionDescriptor.getContentLength();
  +                property = new NodeProperty("getetag", etag, true);
  +                revisionDescriptor.setProperty(property);
  +                
                   content.create(credToken, resourcePath, revisionDescriptor, 
                                  revisionContent);
                   
  @@ -197,83 +195,76 @@
                   NodeRevisionDescriptor revisionDescriptor = 
                       new NodeRevisionDescriptor(req.getContentLength());
                   
  -                if (isDavNative()) {
  -                    NodeProperty property = null;
  -                    
  -                    // Creation date
  -                    DateFormat formatter = new SimpleDateFormat(DATE_FORMAT);
  -                    property = new NodeProperty("creationdate", 
  -                                                formatter.format(new Date()), 
  -                                                "d", "DAV");
  -                    revisionDescriptor.setProperty(property);
  -                    
  -                    // Display name
  -                    property = new NodeProperty("displayname", resourcePath, 
  -                                                "d", "DAV");
  -                    revisionDescriptor.setProperty(property);
  -                    
  -                    // Resource type
  -                    property = new NodeProperty("resourcetype", "", 
  -                                                "d", "DAV");
  -                    revisionDescriptor.setProperty(property);
  -                    
  -                    // Source
  -                    property = new NodeProperty("source", "", "d", "DAV");
  -                    revisionDescriptor.setProperty(property);
  -                    
  -                    // Supported locks
  -                    String supportedLocks = "<d:lockentry>" 
  -                        + "<d:lockscope><d:exclusive/></d:lockscope>"
  -                        + "<d:locktype><d:write/></d:locktype>"
  -                        + "</d:lockentry>"
  -                        + "<d:lockentry>" 
  -                        + "<d:lockscope><d:shared/></d:lockscope>"
  -                        + "<d:locktype><d:write/></d:locktype>"
  -                        + "</d:lockentry>";
  -                    property = new NodeProperty("supportedlock", 
  -                                                supportedLocks, "d", "DAV");
  -                    revisionDescriptor.setProperty(property);
  -                    
  -                    // Get content language
  -                    property = new NodeProperty("getcontentlanguage", "en", 
  -                                                "d", "DAV");
  -                    revisionDescriptor.setProperty(property);
  -                    
  -                    // Get content length
  -                    property = new NodeProperty
  -                        ("getcontentlength", 
  -                         new Long(req.getContentLength()), "d", "DAV");
  -                    revisionDescriptor.setProperty(property);
  -                    
  -                    // Get content type
  -                    String contentType = 
  -                        servlet.getServletContext().getMimeType(resourcePath);
  -                    if (contentType == null) {
  -                        contentType = "TEXT/PLAIN";
  -                    }
  -                    property = new NodeProperty("getcontenttype", contentType,
  -                                                "d", "DAV");
  -                    revisionDescriptor.setProperty(property);
  -                    
  -                    // Last modification date
  -                    property = new NodeProperty
  -                        ("getlastmodified", formatter.format(new Date()), 
  -                         "d", "DAV");
  -                    revisionDescriptor.setProperty(property);
  -                    
  -                    // Etag generation
  -                    String etag = resourcePath.hashCode() + "_" 
  -                        + (new NodeRevisionNumber()).hashCode() + "_"
  -                        + req.getContentLength();
  -                    property = new NodeProperty("getetag", etag, "d", "DAV");
  -                    revisionDescriptor.setProperty(property);
  -                    
  +                NodeProperty property = null;
  +                
  +                // Creation date
  +                DateFormat formatter = new SimpleDateFormat(DATE_FORMAT);
  +                property = new NodeProperty("creationdate", 
  +                                            formatter.format(new Date()), 
  +                                            true);
  +                revisionDescriptor.setProperty(property);
  +                
  +                // Display name
  +                property = new NodeProperty("displayname", resourcePath, true);
  +                revisionDescriptor.setProperty(property);
  +                
  +                // Resource type
  +                property = new NodeProperty("resourcetype", "", true);
  +                revisionDescriptor.setProperty(property);
  +                
  +                // Source
  +                property = new NodeProperty("source", "", true);
  +                revisionDescriptor.setProperty(property);
  +                
  +                // Supported locks
  +                /*
  +                  String supportedLocks = "<d:lockentry>" 
  +                  + "<d:lockscope><d:exclusive/></d:lockscope>"
  +                  + "<d:locktype><d:write/></d:locktype>"
  +                  + "</d:lockentry>"
  +                  + "<d:lockentry>" 
  +                  + "<d:lockscope><d:shared/></d:lockscope>"
  +                  + "<d:locktype><d:write/></d:locktype>"
  +                  + "</d:lockentry>";
  +                  property = new NodeProperty("supportedlock", 
  +                  supportedLocks, true);
  +                  revisionDescriptor.setProperty(property);
  +                */
  +                
  +                // Get content language
  +                property = new NodeProperty("getcontentlanguage", "en", true);
  +                revisionDescriptor.setProperty(property);
  +                
  +                // Get content length
  +                property = new NodeProperty
  +                    ("getcontentlength", 
  +                     new Long(req.getContentLength()), true);
  +                revisionDescriptor.setProperty(property);
  +                
  +                // Get content type
  +                String contentType = 
  +                    servlet.getServletContext().getMimeType(resourcePath);
  +                if (contentType == null) {
  +                    contentType = "TEXT/PLAIN";
                   }
  +                property = new NodeProperty("getcontenttype", contentType, 
  +                                            true);
  +                revisionDescriptor.setProperty(property);
  +                
  +                // Last modification date
  +                property = new NodeProperty
  +                    ("getlastmodified", formatter.format(new Date()), true);
  +                revisionDescriptor.setProperty(property);
  +                
  +                // Etag generation
  +                String etag = resourcePath.hashCode() + "_" 
  +                    + (new NodeRevisionNumber()).hashCode() + "_"
  +                    + req.getContentLength();
  +                property = new NodeProperty("getetag", etag, true);
  +                revisionDescriptor.setProperty(property);
                   
                   if (isMsProprietarySupport()) {
                       
  -                    NodeProperty property = null;
  -                    
                       // Name
                       /*
                         property = new NodeProperty("name", resourcePath, 
  @@ -297,52 +288,51 @@
                       */
                       
                       // Is hidden
  -                    property = new NodeProperty("ishidden", "0", "ms", 
  -                                                "MICROSOFT");
  +                    property = new NodeProperty("ishidden", "0", "MICROSOFT");
                       revisionDescriptor.setProperty(property);
                       
                       // Is collection
  -                    property = new NodeProperty("iscollection", "0", "ms", 
  +                    property = new NodeProperty("iscollection", "0", 
                                                   "MICROSOFT");
                       revisionDescriptor.setProperty(property);
                       
                       // Is read only
  -                    property = new NodeProperty("isreadonly", "0", "ms", 
  +                    property = new NodeProperty("isreadonly", "0", 
                                                   "MICROSOFT");
                       revisionDescriptor.setProperty(property);
                       
                       // Content class
                       // TODO : Find what it is ...
                       /*
  -                      property = new NodeProperty("contentclass", "", "ms", 
  +                      property = new NodeProperty("contentclass", "", 
                         "MICROSOFT");
                         revisionDescriptor.setProperty(property);
                       */
                       
                       // Last accessed
  -                    property = new NodeProperty
  -                        ("lastaccessed", (new Date()).toString(), 
  -                         "ms", "MICROSOFT");
  +                    property = new NodeProperty("lastaccessed", 
  +                                                (new Date()).toString(), 
  +                                                "MICROSOFT");
                       revisionDescriptor.setProperty(property);
                       
                       // Is structured document
                       /*
                         property = new NodeProperty("isstructureddocument", 
  -                      "false", "ms", "MICROSOFT");
  +                      "false", "MICROSOFT");
                         revisionDescriptor.setProperty(property);
                       */
                       
                       // Default document
                       /*
                         property = new NodeProperty("defaultdocument", 
  -                      "", "ms", "MICROSOFT");
  +                      "", "MICROSOFT");
                         revisionDescriptor.setProperty(property);
                       */
                       
                       // Is root
                       /*
                         property = new NodeProperty("isroot", "false", 
  -                      "ms", "MICROSOFT");
  +                      "MICROSOFT");
                         revisionDescriptor.setProperty(property);
                       */
                       
  
  
  
  1.5       +57 -28    jakarta-slide/src/share/org/apache/slide/webdav/method/WebdavMethod.java
  
  Index: WebdavMethod.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/WebdavMethod.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- WebdavMethod.java	2000/09/02 03:13:33	1.4
  +++ WebdavMethod.java	2000/09/04 23:49:12	1.5
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/WebdavMethod.java,v 1.4 2000/09/02 03:13:33 remm Exp $
  - * $Revision: 1.4 $
  - * $Date: 2000/09/02 03:13:33 $
  + * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/webdav/method/WebdavMethod.java,v 1.5 2000/09/04 23:49:12 remm Exp $
  + * $Revision: 1.5 $
  + * $Date: 2000/09/04 23:49:12 $
    *
    * ====================================================================
    *
  @@ -68,6 +68,10 @@
   import java.util.*;
   import javax.servlet.*;
   import javax.servlet.http.*;
  +import javax.xml.parsers.DocumentBuilderFactory;
  +import javax.xml.parsers.DocumentBuilder;
  +import javax.xml.parsers.ParserConfigurationException;
  +import org.w3c.dom.*;
   import org.apache.slide.common.*;
   import org.apache.slide.authenticate.*;
   import org.apache.slide.structure.*;
  @@ -77,9 +81,6 @@
   import org.apache.slide.security.*;
   import org.apache.slide.webdav.common.*;
   import org.apache.slide.webdav.*;
  -import javax.xml.parsers.DocumentBuilderFactory;
  -import javax.xml.parsers.DocumentBuilder;
  -import javax.xml.parsers.ParserConfigurationException;
   
   /**
    * WebDAV method.
  @@ -185,6 +186,18 @@
       protected static DocumentBuilder documentBuilder;
       
       
  +    /**
  +     * Namespaces list. Keyed by abbreviation.
  +     */
  +    protected Hashtable namespaces;
  +    
  +    
  +    /**
  +     * Default namespace.
  +     */
  +    protected String defaultNamespace = NodeProperty.DEFAULT_NAMESPACE;
  +    
  +    
       // ----------------------------------------------------------- Constructors
       
       
  @@ -271,8 +284,42 @@
           return result;
           
       }
  -
  -
  +    
  +    
  +    /**
  +     * Parse a node for namespace declaration attributes.
  +     * 
  +     * @param node DOM node
  +     */
  +    protected void parseNodeNamespaceDeclarations(Node node) {
  +        
  +        NamedNodeMap nodeMap = node.getAttributes();
  +        if (nodeMap != null) {
  +            for (int i = 0; i < nodeMap.getLength(); i++) {
  +                Node currentNode = nodeMap.item(i);
  +                if (currentNode.getNodeType() != Node.ATTRIBUTE_NODE)
  +                    continue;
  +                String attributeName = currentNode.getNodeName();
  +                if (attributeName.startsWith("xmlns")) {
  +                    // We found a namespace declaration
  +                    if (attributeName.equals("xmlns")) {
  +                        defaultNamespace = currentNode.getNodeValue();
  +                    } else {
  +                        // Stripping out the prefix
  +                        if (attributeName.startsWith("xmlns:")) {
  +                            String namespaceAbbreviation =
  +                                attributeName.substring(6);
  +                            namespaces.put(namespaceAbbreviation, 
  +                                           currentNode.getNodeValue());
  +                        }
  +                    }
  +                }
  +            }
  +        }
  +        
  +    }
  +    
  +    
       /**
        * Read request contents.
        * 
  @@ -281,6 +328,8 @@
        */
       protected void readRequestContent() {
           
  +        namespaces = new Hashtable();
  +        
           // TODO : Modify this and make it chunking aware
           
           int contentLength = req.getContentLength();
  @@ -328,16 +377,6 @@
       
       
       /**
  -     * Is namespace DAV native ? Recommended !!
  -     * 
  -     * @return boolean Namespace is a DAV native namespace
  -     */
  -    protected boolean isDavNative() {
  -        return (token.getNamespaceConfig().getParameter("dav") != null);
  -    }
  -    
  -    
  -    /**
        * Simulate MS IIS5 ?
        * 
        * @return boolean
  @@ -346,15 +385,5 @@
           return (token.getNamespaceConfig().getParameter("ms") != null);
       }
       
  -    
  -    /**
  -     * Standalone DAV server ? The standalone mode makes use of either Tomcat
  -     * or Tomcat Catalina.
  -     * 
  -     * @return boolean
  -     */
  -    protected boolean isStandalone() {
  -        return (token.getNamespaceConfig().getParameter("standalone") != null);
  -    }
       
   }