Hi Antoine.

The three methods of WebdavResource where this change needs to be made are:

        propfindMethod(String, int)
        propfindMethod(String, int, Vector)
        propfindMethod(String, Vector)

The code with the updates is below.  For what its worth, my Slide-client based 
code is working without a hitch with the changes.  Also, once I re-code 
sections of my app to take advantage of the now-working exists() function, my 
code should also run faster (since I can determine whether a file exists or not 
without possibly incurring exception throw/catch overhead).

Cheers!

Mike N. Christoff

---------------

    /**
     * Execute PROPFIND method with allprop for the given path.
     * Get list of all WebDAV properties on the given resource.
     *
     * <p>Once used this method, the the status code in the 207
     * reponse is need to be set for the method of WebdavResource.
     *
     * <p>The values of DepthSupport.DEPTH_0, DepthSupport.DEPTH_1,
     * DepthSupport.DEPTH_INFINITY is possbile for the depth.
     *
     * @param path the server relative path of the resource to request
     * @param depth
     * @return an enumeration of <code>ResponseEntity</code>
     * @exception HttpException
     * @exception IOException
     */
    public Enumeration propfindMethod(String path, int depth)
        throws HttpException, IOException {

        setClient();
        // Change the depth for allprop
        PropFindMethod method = new PropFindMethod(URIUtil.encodePath(path),
                                                   depth);

        method.setDebug(debug);

        // Default depth=infinity, type=allprop
        generateTransactionHeader(method);
        int status = client.executeMethod(method);

        // Set status code for this resource.
        if (thisResource == true) {
            setStatusCode(status);
        }
        // Also accept OK sent by buggy servers.
        
        /**
         * OLD CODE
        if (status != HttpStatus.SC_MULTI_STATUS
            && status != HttpStatus.SC_OK) {
            HttpException ex = new HttpException();
            ex.setReasonCode(status);
            throw ex;
        }
        */

        // FIX
        if (status != HttpStatus.SC_MULTI_STATUS
            
            && status != HttpStatus.SC_NOT_FOUND    // <---
            
            && status != HttpStatus.SC_OK
            ) {
            HttpException ex = new HttpException();
            ex.setReasonCode(status);
            throw ex;
        }        
       // END FIX
        
        thisResource = false;

        return method.getResponses();
    }
    
    
    public Enumeration propfindMethod(String path, int depth,
                                      Vector properties)
        throws HttpException, IOException {

        setClient();
        // Change the depth for prop
        PropFindMethod method = new PropFindMethod(URIUtil.encodePath(path),
                                                   depth,
                                                   properties.elements());

        method.setDebug(debug);
        method.setFollowRedirects(this.followRedirects);
        generateTransactionHeader(method);
        int status = client.executeMethod(method);

        // Set status code for this resource.
        if (thisResource == true) {
            // Set the status code.
            setStatusCode(method.getStatusLine().getStatusCode());
        }
        // Also accept OK sent by buggy servers.
        
        /*
         * OLD CODE
         *
        if (status != HttpStatus.SC_MULTI_STATUS
            && status != HttpStatus.SC_OK) {
            HttpException ex = new HttpException();
            ex.setReasonCode(status);
            throw ex;
        }
        */
        
        // FIX
        if (status != HttpStatus.SC_MULTI_STATUS
            
            && status != HttpStatus.SC_NOT_FOUND // <---
            
            && status != HttpStatus.SC_OK) {
            HttpException ex = new HttpException();
            ex.setReasonCode(status);
            throw ex;
        }
        // END FIX
        

        thisResource = false;

        return method.getResponses();
    }
    
    
    /**
     * Execute PROPFIND method for the given path and properties.
     * Get list of given WebDAV properties on the given resource.
     *
     * @param path the server relative path of the resource to request
     * @param properties the WebDAV properties to find.
     * @return Enumeration list of WebDAV properties on a resource.
     * @exception HttpException
     * @exception IOException
     */
    public Enumeration propfindMethod(String path, Vector properties)
        throws HttpException, IOException {

        setClient();
        // Default depth=0, type=by_name
        PropFindMethod method = new PropFindMethod(URIUtil.encodePath(path),
                                                   DepthSupport.DEPTH_0,
                                                   properties.elements());
        method.setDebug(debug);
        method.setFollowRedirects(this.followRedirects);
        generateTransactionHeader(method);
        int status = client.executeMethod(method);

        // Also accept OK sent by buggy servers.
        /*
         * OLD CODE
         *        
        if (status != HttpStatus.SC_MULTI_STATUS
            && status != HttpStatus.SC_OK) {
            HttpException ex = new HttpException();
            ex.setReasonCode(status);
            throw ex;
        }
        */
        
        // FIX
        if (status != HttpStatus.SC_MULTI_STATUS
            
            && status != HttpStatus.SC_NOT_FOUND        // <---
            
            && status != HttpStatus.SC_OK) {
            HttpException ex = new HttpException();
            ex.setReasonCode(status);
            throw ex;
        }
        // END FIX
        

        // It contains the results.
        Vector results = new Vector();

        Enumeration responses = method.getResponses();
        if (responses.hasMoreElements()) {
            ResponseEntity response =
                (ResponseEntity) responses.nextElement();
            String href = response.getHref();

            // Set status code for this resource.
            if ((thisResource == true) && (response.getStatusCode() > 0))
                setStatusCode(response.getStatusCode());
            thisResource = false;

            Enumeration responseProperties =
                method.getResponseProperties(href);
            while (responseProperties.hasMoreElements()) {
                Property property =
                    (Property) responseProperties.nextElement();
                results.addElement(property.getPropertyAsString());
            }
        }

        return results.elements();
    }    



Cheers!

-mike

-----Original Message-----
From: Antoine Levy-Lambert [mailto:[EMAIL PROTECTED]
Sent: February 13, 2007 10:37 PM
To: Slide Developers Mailing List
Subject: Re: Possible solutions to WebdavResource.exists() method


Hello Michael,

I like your solution of adding a test for NOT_FOUND.

I will work on this as soon as I can.

Best regards,

Antoine
On Feb 13, 2007, at 7:23 PM, Michael Christoff wrote:


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

Reply via email to