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 ju...@apache.org on 2001/01/29 13:18:12 UTC

cvs commit: jakarta-slide/src/webdav/server/org/apache/slide/webdav/method LockMethod.java PropFindMethod.java PropPatchMethod.java WebdavMethod.java

juergen     01/01/29 04:18:11

  Modified:    src/webdav/server/org/apache/slide/webdav/method
                        LockMethod.java PropFindMethod.java
                        PropPatchMethod.java WebdavMethod.java
  Log:
  if the body of a propfind method was coded in utf-8, the body was not properly decoded by the Reader wrapper.. Now a Stream is used and the bytes are converted to a String using the right encoding. Remy, isn't this a reader bug in Tomcat? The encoding stays quoted in speachmarks, do we want to change this?
  
  Revision  Changes    Path
  1.4       +28 -28    jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/LockMethod.java
  
  Index: LockMethod.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/LockMethod.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- LockMethod.java	2001/01/17 16:49:00	1.3
  +++ LockMethod.java	2001/01/29 12:18:04	1.4
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/LockMethod.java,v 1.3 2001/01/17 16:49:00 juergen Exp $
  - * $Revision: 1.3 $
  - * $Date: 2001/01/17 16:49:00 $
  + * $Header: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/LockMethod.java,v 1.4 2001/01/29 12:18:04 juergen Exp $
  + * $Revision: 1.4 $
  + * $Date: 2001/01/29 12:18:04 $
    *
    * ====================================================================
    *
  @@ -211,28 +211,28 @@
           
           // Show request
           if (req.getContentLength() > 0) {
  -            System.out.println(new String(requestBody));
  +            System.out.println(requestBody);
           }
           
           msProprietarySupport = isMsProprietarySupport();
           
  -	// Loads the associated object from the store.
  -	lockInfo_lockSubject = requestUri;
  -	if (lockInfo_lockSubject == null) {
  -	    lockInfo_lockSubject = "/";
  -	}
  -        
  -	String depthStr = req.getHeader("Depth");
  -	
  -	if (depthStr == null) {
  -	    depth = INFINITY;
  -	} else {
  -	    if (depthStr.equals("0")) {
  -		depth = 0;
  -	    } else {
  +    // Loads the associated object from the store.
  +    lockInfo_lockSubject = requestUri;
  +    if (lockInfo_lockSubject == null) {
  +        lockInfo_lockSubject = "/";
  +    }
  +        
  +    String depthStr = req.getHeader("Depth");
  +    
  +    if (depthStr == null) {
  +        depth = INFINITY;
  +    } else {
  +        if (depthStr.equals("0")) {
  +        depth = 0;
  +        } else {
                   depth = INFINITY;
  -	    }
  -	}
  +        }
  +    }
           
           String lockDurationStr = req.getHeader("Timeout");
           if (lockDurationStr == null) {
  @@ -269,7 +269,7 @@
             }
           */
           
  -	if (req.getContentLength() > 0) {
  +    if (req.getContentLength() > 0) {
               
               lockType = LOCK_CREATION;
               
  @@ -277,15 +277,15 @@
               
               try {
                   Document document = documentBuilder.parse(new InputSource
  -                    (new StringReader(new String(requestBody))));
  +                    (new StringReader(requestBody)));
                   
                   // Get the root element of the document
                   Element rootElement = document.getDocumentElement();
                   lockInfoNode = rootElement;
               } catch(Exception e) {
                   e.printStackTrace();
  -		resp.setStatus(WebdavStatus.SC_BAD_REQUEST);
  -		throw new WebdavException(WebdavStatus.SC_BAD_REQUEST);
  +        resp.setStatus(WebdavStatus.SC_BAD_REQUEST);
  +        throw new WebdavException(WebdavStatus.SC_BAD_REQUEST);
               }
               
               NodeList childList = lockInfoNode.getChildNodes();
  @@ -693,13 +693,13 @@
           
       }
      
  -	
  -	
  +    
  +    
       /**
        * Returns true
        */
  -	protected boolean methodNeedsTransactionSupport() {
  -		return true;
  +    protected boolean methodNeedsTransactionSupport() {
  +        return true;
       }
       
       
  
  
  
  1.5       +130 -129  jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/PropFindMethod.java
  
  Index: PropFindMethod.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/PropFindMethod.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- PropFindMethod.java	2001/01/25 05:48:11	1.4
  +++ PropFindMethod.java	2001/01/29 12:18:05	1.5
  @@ -1,13 +1,13 @@
   /*
  - * $Header: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/PropFindMethod.java,v 1.4 2001/01/25 05:48:11 remm Exp $
  - * $Revision: 1.4 $
  - * $Date: 2001/01/25 05:48:11 $
  + * $Header: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/PropFindMethod.java,v 1.5 2001/01/29 12:18:05 juergen Exp $
  + * $Revision: 1.5 $
  + * $Date: 2001/01/29 12:18:05 $
    *
    * ====================================================================
    *
    * The Apache Software License, Version 1.1
    *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights 
  + * Copyright (c) 1999 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -15,7 +15,7 @@
    * are met:
    *
    * 1. Redistributions of source code must retain the above copyright
  - *    notice, this list of conditions and the following disclaimer. 
  + *    notice, this list of conditions and the following disclaimer.
    *
    * 2. Redistributions in binary form must reproduce the above copyright
    *    notice, this list of conditions and the following disclaimer in
  @@ -23,15 +23,15 @@
    *    distribution.
    *
    * 3. The end-user documentation included with the redistribution, if
  - *    any, must include the following acknowlegement:  
  - *       "This product includes software developed by the 
  + *    any, must include the following acknowlegement:
  + *       "This product includes software developed by the
    *        Apache Software Foundation (http://www.apache.org/)."
    *    Alternately, this acknowlegement may appear in the software itself,
    *    if and wherever such third-party acknowlegements normally appear.
    *
    * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
    *    Foundation" must not be used to endorse or promote products derived
  - *    from this software without prior written permission. For written 
  + *    from this software without prior written permission. For written
    *    permission, please contact apache@apache.org.
    *
    * 5. Products derived from this software may not be called "Apache"
  @@ -59,7 +59,7 @@
    *
    * [Additional notices, if required by prior licensing conditions]
    *
  - */ 
  + */
   
   package org.apache.slide.webdav.method;
   
  @@ -82,7 +82,7 @@
   
   /**
    * PROPFIND method.
  - * 
  + *
    * @author <a href="mailto:remm@apache.org">Remy Maucherat</a>
    */
   public final class PropFindMethod extends WebdavMethod {
  @@ -124,11 +124,11 @@
       /**
        * Supported locks property value.
        */
  -    private static final String SUPPORTED_LOCK = "<lockentry>" 
  +    private static final String SUPPORTED_LOCK = "<lockentry>"
           + "<lockscope><exclusive/></lockscope>"
           + "<locktype><write/></locktype>"
           + "</lockentry>"
  -        + "<lockentry>" 
  +        + "<lockentry>"
           + "<lockscope><shared/></lockscope>"
           + "<locktype><write/></locktype>"
           + "</lockentry>";
  @@ -150,7 +150,7 @@
       
       
       /**
  -     * Properties to display 
  +     * Properties to display
        */
       private Vector propertyVector;
       
  @@ -178,12 +178,12 @@
       
       /**
        * PROPFIND method constructor.
  -     * 
  +     *
        * @param token Namespace access token
        * @param req HTTP request
        * @param resp HTTP response
        */
  -    public PropFindMethod(GenericServlet servlet, NamespaceAccessToken token, 
  +    public PropFindMethod(GenericServlet servlet, NamespaceAccessToken token,
                             HttpServletRequest req, HttpServletResponse resp) {
           super(servlet, token, req, resp);
           readRequestContent();
  @@ -199,32 +199,32 @@
       
       /**
        * Parse the request.
  -     * 
  +     *
        * @exception WebdavException Bad request
        */
  -    protected void parseRequest() 
  -	throws WebdavException {
  -	
  +    protected void parseRequest()
  +    throws WebdavException {
  +    
           msProprietarySupport = isMsProprietarySupport();
           
  -	String depthStr = req.getHeader("Depth");
  -	
  -	if (depthStr == null) {
  -	    depth = INFINITY;
  -	} else {
  -	    if (depthStr.equals("0")) {
  +    String depthStr = req.getHeader("Depth");
  +    
  +    if (depthStr == null) {
  +        depth = INFINITY;
  +    } else {
  +        if (depthStr.equals("0")) {
                   depth = 0;
  -	    }
  -	    if (depthStr.equals("1")) {
  +        }
  +        if (depthStr.equals("1")) {
                   depth = 1;
  -	    }
  -	    if (depthStr.equals("infinity")) {
  +        }
  +        if (depthStr.equals("infinity")) {
                   depth = INFINITY;
  -	    }
  -	}
  +        }
  +    }
  +        
  +    if (req.getContentLength() != 0) {
           
  -	if (req.getContentLength() != 0) {
  -	    
               //Propfind propfind = null;
               
               // Workaround : Castor doesn't work, so I use DOM in the meantime
  @@ -232,9 +232,9 @@
               Node propNode = null;
               
               try {
  -                Document document = 
  +                Document document =
                       documentBuilder.parse(new InputSource
  -                        (new StringReader(new String(requestBody))));
  +                        (new StringReader(requestBody)));
                   
                   // Get the root element of the document
                   Element rootElement = document.getDocumentElement();
  @@ -287,23 +287,23 @@
                   
               }
               
  -	}
  -	
  +    }
  +    
       }
       
       
       /**
        * Execute the request.
  -     * 
  -     * @exception WebdavException 
  +     *
  +     * @exception WebdavException
        */
  -    protected void executeRequest() 
  -	throws IOException, WebdavException {
  -	
  +    protected void executeRequest()
  +    throws IOException, WebdavException {
  +    
           resp.setStatus(WebdavStatus.SC_MULTI_STATUS);
           
  -	// Loads the associated object from the store.
  -	String resourceUri = requestUri;
  +    // Loads the associated object from the store.
  +    String resourceUri = requestUri;
           
           // Get the object from Data.
           ObjectNode resource = null;
  @@ -315,7 +315,7 @@
               e.printStackTrace();
               try {
                   resp.sendError
  -                    (WebdavStatus.SC_NOT_FOUND, 
  +                    (WebdavStatus.SC_NOT_FOUND,
                        WebdavStatus.getStatusText(WebdavStatus.SC_NOT_FOUND));
               } catch(IOException ex) {
                   ex.printStackTrace();
  @@ -336,8 +336,8 @@
           WebdavXMLPrinter generatedXML = new WebdavXMLPrinter(resp.getWriter());
           
           generatedXML.writeXMLHeader();
  -        generatedXML.writeElement(null, "multistatus" 
  -                                  + generateNamespaceDeclarations(), 
  +        generatedXML.writeElement(null, "multistatus"
  +                                  + generateNamespaceDeclarations(),
                                     WebdavXMLPrinter.OPENING);
           
           if (resource != null) {
  @@ -387,24 +387,24 @@
               }
           }
           
  -        generatedXML.writeElement(null, "multistatus", 
  +        generatedXML.writeElement(null, "multistatus",
                                     WebdavXMLPrinter.CLOSING);
           
           // Send remaining data
           generatedXML.sendData();
           
           /*
  -	try {
  +    try {
               //System.out.println("Query result");
               //System.out.println(generatedXML.toString());
               
  -	    Writer writer = resp.getWriter();
  +        Writer writer = resp.getWriter();
               writer.write(generatedXML.toString());
  -	    writer.flush();
  -	} catch (Exception e) {
  +        writer.flush();
  +    } catch (Exception e) {
               e.printStackTrace();
  -	    throw new WebdavException(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
  -	}
  +        throw new WebdavException(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
  +    }
           */
           
       }
  @@ -412,18 +412,18 @@
       
       /**
        * Parse properties of an object.
  -     * 
  -     * @param object 
  -     * @param multistatus 
  -     * @exception WebdavException 
  +     *
  +     * @param object
  +     * @param multistatus
  +     * @exception WebdavException
        */
  -    protected void parsePropertiesOfObject(ObjectNode object, 
  +    protected void parsePropertiesOfObject(ObjectNode object,
                                              WebdavXMLPrinter generatedXML)
  -	throws WebdavException {
  +    throws WebdavException {
           
           generatedXML.writeElement(null, "response", WebdavXMLPrinter.OPENING);
           
  -        String status = new String("HTTP/1.1 " + WebdavStatus.SC_OK + " " 
  +        String status = new String("HTTP/1.1 " + WebdavStatus.SC_OK + " "
                                      + WebdavStatus.getStatusText
                                      (WebdavStatus.SC_OK));
           NodeRevisionDescriptors revisionDescriptors = null;
  @@ -435,12 +435,12 @@
           
           try {
               generatedXML.writeElement(null, "href", WebdavXMLPrinter.OPENING);
  -            revisionDescriptors = 
  +            revisionDescriptors =
                   content.retrieve(slideToken, object.getUri());
               
               try {
                   
  -                revisionDescriptor = content.retrieve(slideToken, 
  +                revisionDescriptor = content.retrieve(slideToken,
                                                         revisionDescriptors);
                   isCollection = isCollection(revisionDescriptor);
                   
  @@ -451,7 +451,7 @@
                   String toAppend = "";
                   if (relativePath.length() <= path.length()) {
                       toAppend = path.substring(relativePath.length());
  -                    if ((!absoluteUri.endsWith("/")) && 
  +                    if ((!absoluteUri.endsWith("/")) &&
                           (!toAppend.startsWith("/"))) {
                           toAppend = "/" + toAppend;
                       }
  @@ -464,7 +464,7 @@
                   
               } catch (RevisionDescriptorNotFoundException e) {
                   
  -                // The object doesn't have any revision, we create a dummy 
  +                // The object doesn't have any revision, we create a dummy
                   // NodeRevisionDescriptor object
                   isCollection = true;
                   revisionDescriptor = new NodeRevisionDescriptor(0);
  @@ -477,7 +477,7 @@
                   String toAppend = "";
                   if (relativePath.length() <= path.length()) {
                       toAppend = path.substring(relativePath.length());
  -                    if ((!absoluteUri.endsWith("/")) 
  +                    if ((!absoluteUri.endsWith("/"))
                           && (!toAppend.startsWith("/"))) {
                           toAppend = "/" + toAppend;
                       }
  @@ -489,7 +489,7 @@
               
               generatedXML.writeElement(null, "href", WebdavXMLPrinter.CLOSING);
               
  -            Enumeration lockTokens = lock.enumerateLocks(slideToken, 
  +            Enumeration lockTokens = lock.enumerateLocks(slideToken,
                                                            object.getUri());
               
               if (lockTokens.hasMoreElements()) {
  @@ -516,11 +516,11 @@
           case FIND_ALL_PROP :
               
               // Show properties / values for current object.
  -            generatedXML.writeElement(null, "propstat", 
  +            generatedXML.writeElement(null, "propstat",
                                         WebdavXMLPrinter.OPENING);
               generatedXML.writeElement(null, "prop", WebdavXMLPrinter.OPENING);
               
  -            status = new String("HTTP/1.1 " + WebdavStatus.SC_OK 
  +            status = new String("HTTP/1.1 " + WebdavStatus.SC_OK
                                   + " " + WebdavStatus.getStatusText
                                   (WebdavStatus.SC_OK));
               
  @@ -530,41 +530,41 @@
               }
               
               // Supported locks
  -            generatedXML.writeElement(null, "supportedlock", 
  +            generatedXML.writeElement(null, "supportedlock",
                                         WebdavXMLPrinter.OPENING);
               generatedXML.writeText(SUPPORTED_LOCK);
  -            generatedXML.writeElement(null, "supportedlock", 
  +            generatedXML.writeElement(null, "supportedlock",
                                         WebdavXMLPrinter.CLOSING);
               
               // Other properties
  -            Enumeration propertyList = 
  +            Enumeration propertyList =
                   revisionDescriptor.enumerateProperties();
               
               while (propertyList.hasMoreElements()) {
  -                NodeProperty currentProperty = 
  +                NodeProperty currentProperty =
                       (NodeProperty) propertyList.nextElement();
                   if (currentProperty != null) {
                       String namespace = currentProperty.getNamespace();
                       generateNamespaceAbbreviation(namespace);
  -                    String namespaceAbbrev = 
  +                    String namespaceAbbrev =
                           (String) namespaceAbbrevs.get(namespace);
                       Object currentPropertyValue = currentProperty.getValue();
  -                    if ((currentPropertyValue == null) || 
  +                    if ((currentPropertyValue == null) ||
                           (currentPropertyValue.toString().equals(""))) {
                           generatedXML.writeElement
                               (namespaceAbbrev, namespace,
  -                             currentProperty.getName(), 
  +                             currentProperty.getName(),
                                WebdavXMLPrinter.NO_CONTENT);
                       } else {
                           generatedXML.writeElement
                               (namespaceAbbrev, namespace,
  -                             currentProperty.getName(), 
  +                             currentProperty.getName(),
                                WebdavXMLPrinter.OPENING);
                           generatedXML.writeText
                               (currentPropertyValue.toString());
                           generatedXML.writeElement
                               (namespaceAbbrev, namespace,
  -                             currentProperty.getName(), 
  +                             currentProperty.getName(),
                                WebdavXMLPrinter.CLOSING);
                       }
                   }
  @@ -572,61 +572,61 @@
               
               generatedXML.writeElement(null, "prop", WebdavXMLPrinter.CLOSING);
               generatedXML.writeProperty(null, "status", status);
  -            generatedXML.writeElement(null, "propstat", 
  +            generatedXML.writeElement(null, "propstat",
                                         WebdavXMLPrinter.CLOSING);
               
  -	    break;
  -	case FIND_PROPERTY_NAMES :
  -	    // Show properties for current object.
  +        break;
  +    case FIND_PROPERTY_NAMES :
  +        // Show properties for current object.
               
  -            status = new String("HTTP/1.1 " + WebdavStatus.SC_OK 
  +            status = new String("HTTP/1.1 " + WebdavStatus.SC_OK
                                   + " " + WebdavStatus.getStatusText
                                   (WebdavStatus.SC_OK));
               
  -            generatedXML.writeElement(null, "propstat", 
  +            generatedXML.writeElement(null, "propstat",
                                         WebdavXMLPrinter.OPENING);
               generatedXML.writeElement(null, "prop", WebdavXMLPrinter.OPENING);
               
               // Lock information
               
  -            generatedXML.writeElement(null, "lockdiscovery", 
  +            generatedXML.writeElement(null, "lockdiscovery",
                                         WebdavXMLPrinter.NO_CONTENT);
  -            generatedXML.writeElement(null, "supportedlock", 
  +            generatedXML.writeElement(null, "supportedlock",
                                         WebdavXMLPrinter.NO_CONTENT);
               
               // Then, add this resource's custom properties
               propertyList = revisionDescriptor.enumerateProperties();
               
               while (propertyList.hasMoreElements()) {
  -                NodeProperty currentProperty = 
  +                NodeProperty currentProperty =
                       (NodeProperty) propertyList.nextElement();
                   if (currentProperty != null) {
                       String namespace = currentProperty.getNamespace();
  -                    String namespaceAbbrev = 
  +                    String namespaceAbbrev =
                           (String) namespaceAbbrevs.get(namespace);
                       generatedXML.writeElement
                           (namespaceAbbrev, namespace,
  -                         currentProperty.getName(), 
  +                         currentProperty.getName(),
                            WebdavXMLPrinter.NO_CONTENT);
                   }
               }
               
               generatedXML.writeElement(null, "prop", WebdavXMLPrinter.CLOSING);
               generatedXML.writeProperty(null, "status", status);
  -            generatedXML.writeElement(null, "propstat", 
  +            generatedXML.writeElement(null, "propstat",
                                         WebdavXMLPrinter.CLOSING);
               
  -	    break;
  -	case FIND_BY_PROPERTY :
  -	    // Show requested properties value.
  +        break;
  +    case FIND_BY_PROPERTY :
  +        // Show requested properties value.
               
               propertyList = propertyVector.elements();
               
  -            generatedXML.writeElement(null, "propstat", 
  +            generatedXML.writeElement(null, "propstat",
                                         WebdavXMLPrinter.OPENING);
               generatedXML.writeElement(null, "prop", WebdavXMLPrinter.OPENING);
               
  -            status = new String("HTTP/1.1 " + WebdavStatus.SC_OK 
  +            status = new String("HTTP/1.1 " + WebdavStatus.SC_OK
                                   + " " + WebdavStatus.getStatusText
                                   (WebdavStatus.SC_OK));
               
  @@ -639,48 +639,48 @@
                   
                   // Lock information, dynamically generated
                   
  -                if ((propertyName.equals("lockdiscovery")) && 
  +                if ((propertyName.equals("lockdiscovery")) &&
                       (propertyNamespace.equals
                        (NodeProperty.DEFAULT_NAMESPACE))) {
                       // Return list of active locks ...
                       if (objectLockToken != null) {
                           showLockDiscoveryInfo(objectLockToken, generatedXML);
                       }
  -                } else if ((propertyName.equals("supportedlock")) && 
  +                } else if ((propertyName.equals("supportedlock")) &&
                              (propertyNamespace.equals
                               (NodeProperty.DEFAULT_NAMESPACE))) {
                       // Supported locks
  -                    generatedXML.writeElement(null, "supportedlock", 
  +                    generatedXML.writeElement(null, "supportedlock",
                                                 WebdavXMLPrinter.OPENING);
                       generatedXML.writeText(SUPPORTED_LOCK);
  -                    generatedXML.writeElement(null, "supportedlock", 
  +                    generatedXML.writeElement(null, "supportedlock",
                                                 WebdavXMLPrinter.CLOSING);
                   } else {
                       
                       // Search in the custom properties
                       
  -                    NodeProperty currentProperty = 
  +                    NodeProperty currentProperty =
                           revisionDescriptor.getProperty(propertyName,
                                                          propertyNamespace);
                       if (currentProperty != null) {
  -                        Object currentPropertyValue = 
  +                        Object currentPropertyValue =
                               currentProperty.getValue();
  -                        if ((currentPropertyValue == null) || 
  +                        if ((currentPropertyValue == null) ||
                               (currentPropertyValue.toString().equals(""))) {
                               generatedXML.writeElement
                                   (property.namespaceAbbrev, null,
  -                                 currentProperty.getName(), 
  +                                 currentProperty.getName(),
                                    WebdavXMLPrinter.NO_CONTENT);
                           } else {
                               generatedXML.writeElement
                                   (property.namespaceAbbrev, null,
  -                                 currentProperty.getName(), 
  +                                 currentProperty.getName(),
                                    WebdavXMLPrinter.OPENING);
                               generatedXML.writeText
                                   (currentPropertyValue.toString());
                               generatedXML.writeElement
                                   (property.namespaceAbbrev, null,
  -                                 currentProperty.getName(), 
  +                                 currentProperty.getName(),
                                    WebdavXMLPrinter.CLOSING);
                           }
                       } else {
  @@ -692,33 +692,33 @@
               
               generatedXML.writeElement(null, "prop", WebdavXMLPrinter.CLOSING);
               generatedXML.writeProperty(null, "status", status);
  -            generatedXML.writeElement(null, "propstat", 
  +            generatedXML.writeElement(null, "propstat",
                                         WebdavXMLPrinter.CLOSING);
               
  -            Enumeration propertiesNotFoundList = 
  +            Enumeration propertiesNotFoundList =
                   propertiesNotFoundVector.elements();
               
               if (propertiesNotFoundList.hasMoreElements()) {
                   
  -                status = new String("HTTP/1.1 " + WebdavStatus.SC_NOT_FOUND 
  +                status = new String("HTTP/1.1 " + WebdavStatus.SC_NOT_FOUND
                                       + " " + WebdavStatus.getStatusText
                                       (WebdavStatus.SC_NOT_FOUND));
                   
  -                generatedXML.writeElement(null, "propstat", 
  +                generatedXML.writeElement(null, "propstat",
                                             WebdavXMLPrinter.OPENING);
  -                generatedXML.writeElement(null, "prop", 
  +                generatedXML.writeElement(null, "prop",
                                             WebdavXMLPrinter.OPENING);
                   
                   while (propertiesNotFoundList.hasMoreElements()) {
                       generatedXML.writeElement
  -                        (null, (String) propertiesNotFoundList.nextElement(), 
  +                        (null, (String) propertiesNotFoundList.nextElement(),
                            WebdavXMLPrinter.NO_CONTENT);
                   }
                   
  -                generatedXML.writeElement(null, "prop", 
  +                generatedXML.writeElement(null, "prop",
                                             WebdavXMLPrinter.CLOSING);
                   generatedXML.writeProperty(null, "status", status);
  -                generatedXML.writeElement(null, "propstat", 
  +                generatedXML.writeElement(null, "propstat",
                                             WebdavXMLPrinter.CLOSING);
                   
               }
  @@ -733,7 +733,7 @@
       
       /**
        * Parse a node for namespace declaration attributes.
  -     * 
  +     *
        * @param node DOM node
        */
       protected void parseNodeNamespaceDeclarations(Node node) {
  @@ -754,7 +754,7 @@
                           if (attributeName.startsWith("xmlns:")) {
                               String namespaceAbbreviation =
                                   attributeName.substring(6);
  -                            namespaces.put(namespaceAbbreviation, 
  +                            namespaces.put(namespaceAbbreviation,
                                              currentNode.getNodeValue());
                               namespaceAbbrevs.put(currentNode.getNodeValue(),
                                                    namespaceAbbreviation);
  @@ -772,7 +772,7 @@
       
       /**
        * Parse the namespace info of a node name.
  -     * 
  +     *
        * @param node The DOM node to parse
        * @return The corresponding Property object
        */
  @@ -785,7 +785,7 @@
           if (colon != -1) {
               property.name = nodeName.substring(colon + 1);
               property.namespaceAbbrev = nodeName.substring(0, colon);
  -            String namespace = 
  +            String namespace =
                   (String) namespaces.get(property.namespaceAbbrev);
               if ((namespace) != null) {
                   property.namespace = namespace;
  @@ -804,7 +804,7 @@
       
       /**
        * Generate a namespace abbreviation for the given namespace.
  -     * 
  +     *
        * @param namespaceName Name of the namespace
        */
       private void generateNamespaceAbbreviation(String namespaceName) {
  @@ -826,7 +826,7 @@
       
       /**
        * Generate namespace declaration attributes.
  -     * 
  +     *
        * @return String namespace attributes
        */
       private String generateNamespaceDeclarations() {
  @@ -852,17 +852,17 @@
       
       /**
        * Show lockdiscovery info.
  -     * 
  +     *
        * @exception WebdavException Something is wrong with the servlet container
        */
  -    private void showLockDiscoveryInfo(NodeLock token, 
  -                                       WebdavXMLPrinter generatedXML) 
  +    private void showLockDiscoveryInfo(NodeLock token,
  +                                       WebdavXMLPrinter generatedXML)
           throws WebdavException {
           
  -        generatedXML.writeElement(null, "lockdiscovery", 
  +        generatedXML.writeElement(null, "lockdiscovery",
                                     WebdavXMLPrinter.OPENING);
           
  -        generatedXML.writeElement(null, "activelock", 
  +        generatedXML.writeElement(null, "activelock",
                                     WebdavXMLPrinter.OPENING);
           
           generatedXML.writeElement(null, "locktype", WebdavXMLPrinter.OPENING);
  @@ -871,10 +871,10 @@
           
           generatedXML.writeElement(null, "lockscope", WebdavXMLPrinter.OPENING);
           if (token.isExclusive()) {
  -            generatedXML.writeElement(null, "exclusive", 
  +            generatedXML.writeElement(null, "exclusive",
                                         WebdavXMLPrinter.NO_CONTENT);
           } else {
  -            generatedXML.writeElement(null, "shared", 
  +            generatedXML.writeElement(null, "shared",
                                         WebdavXMLPrinter.NO_CONTENT);
           }
           generatedXML.writeElement(null, "lockscope", WebdavXMLPrinter.CLOSING);
  @@ -894,7 +894,7 @@
           generatedXML.writeElement(null, "owner", WebdavXMLPrinter.CLOSING);
           
           generatedXML.writeElement(null, "timeout", WebdavXMLPrinter.OPENING);
  -        generatedXML.writeText("Second-" 
  +        generatedXML.writeText("Second-"
                                  + (new Long((token.getExpirationDate().getTime()
                                               - (new Date()).getTime())/1000))
                                  .toString());
  @@ -907,10 +907,10 @@
           generatedXML.writeElement(null, "href", WebdavXMLPrinter.CLOSING);
           generatedXML.writeElement(null, "locktoken", WebdavXMLPrinter.CLOSING);
           
  -        generatedXML.writeElement(null, "activelock", 
  +        generatedXML.writeElement(null, "activelock",
                                     WebdavXMLPrinter.CLOSING);
           
  -        generatedXML.writeElement(null, "lockdiscovery", 
  +        generatedXML.writeElement(null, "lockdiscovery",
                                     WebdavXMLPrinter.CLOSING);
           
       }
  @@ -931,3 +931,4 @@
       
       
   }
  +
  
  
  
  1.5       +24 -24    jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/PropPatchMethod.java
  
  Index: PropPatchMethod.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/PropPatchMethod.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- PropPatchMethod.java	2001/01/22 18:47:17	1.4
  +++ PropPatchMethod.java	2001/01/29 12:18:06	1.5
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/PropPatchMethod.java,v 1.4 2001/01/22 18:47:17 remm Exp $
  - * $Revision: 1.4 $
  - * $Date: 2001/01/22 18:47:17 $
  + * $Header: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/PropPatchMethod.java,v 1.5 2001/01/29 12:18:06 juergen Exp $
  + * $Revision: 1.5 $
  + * $Date: 2001/01/29 12:18:06 $
    *
    * ====================================================================
    *
  @@ -159,13 +159,13 @@
           
           propertiesToRemove = new Vector();
           
  -        if (requestBody.length != 0) {
  +        if (requestBody.length() != 0) {
               try {
                   Node setNode = null;
                   Node removeNode = null;
                   
                   Document document = documentBuilder.parse(new InputSource(
  -                    (new StringReader(new String(requestBody)))));
  +                    (new StringReader(requestBody))));
                   
                   // Get the root element of the document
                   Element rootElement = document.getDocumentElement();
  @@ -299,15 +299,15 @@
               content.create(slideToken, resourcePath, revisionDescriptor, null);
               
           } catch(RevisionAlreadyExistException e) {
  -	    // 500 - Internal server error
  +        // 500 - Internal server error
               System.out.println(e.getMessage());
               resp.setStatus(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
  -	    throw new WebdavException(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
  +        throw new WebdavException(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
           } catch (LinkedObjectNotFoundException e) {
               // 404 - Not found
               System.out.println(e.getMessage());
               resp.setStatus(WebdavStatus.SC_NOT_FOUND);
  -	} catch (ObjectNotFoundException e) {
  +    } catch (ObjectNotFoundException e) {
               // 404 - Not found
               System.out.println(e.getMessage());
               resp.setStatus(WebdavStatus.SC_NOT_FOUND);
  @@ -315,21 +315,21 @@
               // 403 - Forbidden
               System.out.println(e.getMessage());
               resp.setStatus(WebdavStatus.SC_FORBIDDEN);
  -	} catch (ObjectLockedException e) {
  +    } catch (ObjectLockedException e) {
               // Locked
               System.out.println(e.getMessage());
               resp.setStatus(WebdavStatus.SC_LOCKED);
           } catch (ServiceAccessException e) {
  -	    // 500 - Internal server error
  +        // 500 - Internal server error
               System.out.println(e.getMessage());
               resp.setStatus(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
  -	    throw new WebdavException(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
  -	} catch (RuntimeException e) {
  -	    // 500 - Internal server error
  +        throw new WebdavException(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
  +    } catch (RuntimeException e) {
  +        // 500 - Internal server error
               e.printStackTrace();
               resp.setStatus(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
  -	    throw new WebdavException(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
  -	}
  +        throw new WebdavException(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
  +    }
           
           // No serious errors. Printing the XML report.
           resp.setStatus(WebdavStatus.SC_MULTI_STATUS);
  @@ -546,14 +546,14 @@
           generatedXML.writeElement("d", "multistatus",
                                     WebdavXMLPrinter.CLOSING);
           
  -	try {
  +    try {
               Writer writer = resp.getWriter();
               writer.write(generatedXML.toString());
  -	    writer.flush();
  -	} catch (Exception e) {
  +        writer.flush();
  +    } catch (Exception e) {
               e.printStackTrace();
  -	    throw new WebdavException(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
  -	}
  +        throw new WebdavException(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
  +    }
           
       }
       
  @@ -571,13 +571,13 @@
           
       }
      
  -	
  -	
  +    
  +    
       /**
        * Returns true
        */
  -	protected boolean methodNeedsTransactionSupport() {
  -		return true;
  +    protected boolean methodNeedsTransactionSupport() {
  +        return true;
       }
       
       
  
  
  
  1.8       +74 -77    jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/WebdavMethod.java
  
  Index: WebdavMethod.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/WebdavMethod.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- WebdavMethod.java	2001/01/25 05:48:11	1.7
  +++ WebdavMethod.java	2001/01/29 12:18:07	1.8
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/WebdavMethod.java,v 1.7 2001/01/25 05:48:11 remm Exp $
  - * $Revision: 1.7 $
  - * $Date: 2001/01/25 05:48:11 $
  + * $Header: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/WebdavMethod.java,v 1.8 2001/01/29 12:18:07 juergen Exp $
  + * $Revision: 1.8 $
  + * $Date: 2001/01/29 12:18:07 $
    *
    * ====================================================================
    *
  @@ -140,7 +140,7 @@
       /**
        * Request body.
        */
  -    protected char[] requestBody;
  +    protected String requestBody;
       
       
       /**
  @@ -302,7 +302,7 @@
           }
           
       }
  -	    
  +        
       
       /**
        * Exceute method.
  @@ -334,7 +334,7 @@
                   // something went wrong, we are here and the TA is still open
                   try {
                       token.rollback();
  -                } catch (Exception e) { 
  +                } catch (Exception e) {
                       e.printStackTrace();
                   }
               }
  @@ -353,7 +353,7 @@
        * methods get, propfind would not need transaction support.
        */
       protected boolean methodNeedsTransactionSupport() {
  -        return true;   
  +        return true;
           // this method should return false and e.g. PutMethod should
           // overwrite it to true, but PropFind creates a RevisionDescriptors
           // on the fly
  @@ -427,31 +427,28 @@
               return;
           
           // TODO : Modify this and make it chunking aware
  -        
  -        int contentLength = req.getContentLength();
  -        
  -        char[] result = null;
           
  -        if (contentLength > 0) {
  -            try {
  -                BufferedReader reader = null;
  -                requestBody = new char[contentLength];
  -                int position = 0;
  -                reader = req.getReader();
  -                while (position < contentLength) {
  -                    int nChar = reader.read(requestBody, position,
  -                                            contentLength - position);
  -                    position = position + nChar;
  -                }
  -                reader.close();
  -            } catch (IOException e) {
  -                System.out.println(e.getMessage());
  -            } catch (RuntimeException e) {
  -                e.printStackTrace();
  -            }
  +        try {
  +            requestBody = new String(NodeRevisionContent.readFromStream(req.getInputStream()),
  +                                     getEncodingString(req.getCharacterEncoding()));
           }
  +        catch (Exception e) { e.printStackTrace();}
  +
           
       }
  +
  +    
  +    
  +    /**
  +     * Translate the encoding string into a proper Java encoding String.
  +     */
  +    public static String getEncodingString(String httpEncoding) {
  +        String result = httpEncoding;
  +        if (result == null) result = System.getProperty("file.encoding");
  +        if (result.startsWith("\"")) result = result.substring(1, result.length());
  +        if (result.endsWith("\""))   result = result.substring(0, result.length()-1);
  +        return result;
  +    }
       
       
       /**
  @@ -566,57 +563,57 @@
        * by a valid 2-digit hexadecimal number
        */
       protected static String URLDecode(String str)
  -	throws IllegalArgumentException {
  +    throws IllegalArgumentException {
   
  -	if (str == null)
  -	    return (null);
  +    if (str == null)
  +        return (null);
   
  -	StringBuffer dec = new StringBuffer();
  -	int pos = 0;
  -	int len = str.length();
  -	dec.ensureCapacity(str.length());
  -
  -	while (pos < len) {
  -	    int lookahead;	// Look-ahead position
  -
  -	    // Look ahead to the next URLencoded metacharacter, if any
  -	    for (lookahead = pos; lookahead < len; lookahead++) {
  -		char ch = str.charAt(lookahead);
  -		if ((ch == '+') || (ch == '%'))
  -		    break;
  -	    }
  -
  -	    // If there were non-metacharacters, copy them as a block
  -	    if (lookahead > pos) {
  -		dec.append(str.substring(pos, lookahead));
  -		pos = lookahead;
  -	    }
  -
  -	    // Shortcut out if we are at the end of the string
  -	    if (pos >= len)
  -		break;
  -
  -	    // Process the next metacharacter
  -	    char meta = str.charAt(pos);
  -	    if (meta == '+') {
  -		dec.append(' ');
  -		pos++;
  -	    } else if (meta == '%') {
  -		try {
  -		    dec.append((char) Integer.parseInt
  -			       (str.substring(pos+1, pos+3), 16));
  -		} catch (NumberFormatException e) {
  -		    throw new IllegalArgumentException
  -			("Invalid hexadecimal '" + str.substring(pos+1, pos+3)
  -			 + " in URLencoded string");
  -		} catch (StringIndexOutOfBoundsException e) {
  -		    throw new IllegalArgumentException
  -			("Invalid unescaped '%' in URLcoded string");
  -		}
  -		pos += 3;
  -	    }
  -	}
  -	return (dec.toString());
  +    StringBuffer dec = new StringBuffer();
  +    int pos = 0;
  +    int len = str.length();
  +    dec.ensureCapacity(str.length());
  +
  +    while (pos < len) {
  +        int lookahead;  // Look-ahead position
  +
  +        // Look ahead to the next URLencoded metacharacter, if any
  +        for (lookahead = pos; lookahead < len; lookahead++) {
  +        char ch = str.charAt(lookahead);
  +        if ((ch == '+') || (ch == '%'))
  +            break;
  +        }
  +
  +        // If there were non-metacharacters, copy them as a block
  +        if (lookahead > pos) {
  +        dec.append(str.substring(pos, lookahead));
  +        pos = lookahead;
  +        }
  +
  +        // Shortcut out if we are at the end of the string
  +        if (pos >= len)
  +        break;
  +
  +        // Process the next metacharacter
  +        char meta = str.charAt(pos);
  +        if (meta == '+') {
  +        dec.append(' ');
  +        pos++;
  +        } else if (meta == '%') {
  +        try {
  +            dec.append((char) Integer.parseInt
  +                   (str.substring(pos+1, pos+3), 16));
  +        } catch (NumberFormatException e) {
  +            throw new IllegalArgumentException
  +            ("Invalid hexadecimal '" + str.substring(pos+1, pos+3)
  +             + " in URLencoded string");
  +        } catch (StringIndexOutOfBoundsException e) {
  +            throw new IllegalArgumentException
  +            ("Invalid unescaped '%' in URLcoded string");
  +        }
  +        pos += 3;
  +        }
  +    }
  +    return (dec.toString());
   
       }
   
  
  
  

Re: cvs commit: jakarta-slide/src/webdav/server/org/apache/slide/webdav/method LockMethod.java PropFindMethod.java PropPatchMethod.java WebdavMethod.java

Posted by Martin Gronberg <ma...@everest.com>.
In WebdavMethod.readRequestContent(), the old version used to use reader 
and catch IOException - new version uses static 
NodeRevisionContent.readFromStream() method.  In the case where an 
IOException is thrown within the readFromStream() method, it catches it 
and returns 'null'.  I was using Enhydra 3.1 to test this release (we 
have some patches that make it work with the previous code) and now I'm 
getting 'java.lang.NullPointerException' because there is no checking 
for the null case within WebdavMethod.readRequestContent().

Is there a reason readFromStream() doesn't just throw the IOException?  
I can submit a patch for this by just updating readRequestContent() to 
check for the null case and report it as a likely IOException, however, 
the exception information is lost.   Seems like it would be better to 
have readFromStream() go ahead and throw the exception or at least 
report it.  Any thoughts? 

   Marty

juergen@apache.org wrote:

> juergen     01/01/29 04:18:11
> 
>   Modified:    src/webdav/server/org/apache/slide/webdav/method
>                         LockMethod.java PropFindMethod.java
>                         PropPatchMethod.java WebdavMethod.java
>   Log:
>   if the body of a propfind method was coded in utf-8, the body was not properly decoded by the Reader wrapper.. Now a Stream is used and the bytes are converted to a String using the right encoding. Remy, isn't this a reader bug in Tomcat? The encoding stays quoted in speachmarks, do we want to change this?
> [...]
>   @@ -427,31 +427,28 @@
>                return;
>            
>            // TODO : Modify this and make it chunking aware
>   -        
>   -        int contentLength = req.getContentLength();
>   -        
>   -        char[] result = null;
>            
>   -        if (contentLength > 0) {
>   -            try {
>   -                BufferedReader reader = null;
>   -                requestBody = new char[contentLength];
>   -                int position = 0;
>   -                reader = req.getReader();
>   -                while (position < contentLength) {
>   -                    int nChar = reader.read(requestBody, position,
>   -                                            contentLength - position);
>   -                    position = position + nChar;
>   -                }
>   -                reader.close();
>   -            } catch (IOException e) {
>   -                System.out.println(e.getMessage());
>   -            } catch (RuntimeException e) {
>   -                e.printStackTrace();
>   -            }
>   +        try {
>   +            requestBody = new String(NodeRevisionContent.readFromStream(req.getInputStream()),
>   +                                     getEncodingString(req.getCharacterEncoding()));
>            }
>   +        catch (Exception e) { e.printStackTrace();}
>   +
>            
>        }
>   +
>   +    
>   +    
>   +    /**
>   +     * Translate the encoding string into a proper Java encoding String.
>   +     */
>   +    public static String getEncodingString(String httpEncoding) {
>   +        String result = httpEncoding;
>   +        if (result == null) result = System.getProperty("file.encoding");
>   +        if (result.startsWith("\"")) result = result.substring(1, result.length());
>   +        if (result.endsWith("\""))   result = result.substring(0, result.length()-1);
>   +        return result;
>   +    }
>        
>        
>  [...]



Re: cvs commit: jakarta-slide/src/webdav/server/org/apache/slide/webdav/method LockMethod.java PropFindMethod.java PropPatchMethod.java WebdavMethod.java

Posted by Remy Maucherat <re...@apache.org>.
> juergen     01/01/29 04:18:11
>
>   Modified:    src/webdav/server/org/apache/slide/webdav/method
>                         LockMethod.java PropFindMethod.java
>                         PropPatchMethod.java WebdavMethod.java
>   Log:
>   if the body of a propfind method was coded in utf-8, the body was not
properly decoded by the Reader wrapper.. Now a Stream is used and the bytes
are converted to a String using the right encoding. Remy, isn't this a
reader bug in Tomcat? The encoding stays quoted in speachmarks, do we want
to change this?

I have some trouble reading the diff, actually ;)

I found the place where the encoding is used.
+1.

Do you mean Tomcat (4.0 ?) returns a quoted String when asking for the
encoding name ?
If so, I think it has been fixed since then.

Remy