DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUGĀ·
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://issues.apache.org/bugzilla/show_bug.cgi?id=32886>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED ANDĀ·
INSERTED IN THE BUG DATABASE.

http://issues.apache.org/bugzilla/show_bug.cgi?id=32886





------- Additional Comments From [EMAIL PROTECTED]  2006-05-18 22:34 -------
(In reply to comment #14)
> I bumped into the problem as well. 2.1 didn't work for me.
> A solution was to change a part of WebdavResource.setWebdavProperties after
> 
> if (!itself) {
> String myURI = httpURL.getEscapedURI();
> 
> ...
> 
> to
> 
> if (!itself) {
>                 String myURI = httpURL.getEscapedURI();
>                 final String adjustedHref = href.endsWith("/") ?
> href.substring(0, href.length() - 1) : href;
>                 final String name = URIUtil.getName(adjustedHref);
>                 char[] childURI = (myURI + (myURI.endsWith("/") ? "" : "/")
>                                    + name).toCharArray();
> 
> the problem is that children's hrefs can end with '/' and in this case
> URIUtil.getName returns empty string. Because of that childURI is the same as
> myURI (bug!!!)


Thanks Igor!  Everything works fine now.  Also thanks to Robert and Philip.  For
those who want a fast cut-and-paste solution, simply replace the entire

    protected void setWebdavProperties(Enumeration responses)

method in org.apache.webdav.lib.WebdavResource with the following code:

// START: FIX /////////////////////////////////////////////////////
    /**
     * Set WebDAV properties following to the given http URL.
     * This method is fundamental for getting information of a collection.
     *
     * @param responses An enumeration over [EMAIL PROTECTED] ResponseEntity} 
items, one
     * for each resource for which information was returned via PROPFIND.
     *
     * @exception HttpException
     * @exception IOException The socket error with a server.
     */
    protected void setWebdavProperties(Enumeration responses)
        throws HttpException, IOException {
    
        // Make the resources in the collection empty.
        childResources.removeAll();
        while (responses.hasMoreElements()) {
    
            ResponseEntity response =
                (ResponseEntity) responses.nextElement();
    
            boolean itself = false;
            String href = response.getHref();
            if (!href.startsWith("/"))
                href = URIUtil.getPath(href);
            href = decodeMarks(href);

            /*
             * Decode URIs to common (unescaped) format for comparison 
             * as HttpClient.URI.setPath() doesn't escape $ and : chars.
             */
            String httpURLPath = httpURL.getPath();
            String escapedHref = URIUtil.decode(href);
            
            // Normalize them to both have trailing slashes if they differ by
one in length.
            int lenDiff = escapedHref.length() - httpURLPath.length();
            int compareLen = 0;
            
            if ( lenDiff == -1 && !escapedHref.endsWith("/")) {
                compareLen = escapedHref.length();
                lenDiff = 0;
            }
            else
            if ( lenDiff == 1 && !httpURLPath.endsWith("/")) {
                compareLen = httpURLPath.length();
                lenDiff = 0;
            }

            // if they are the same length then compare them.
            if (lenDiff == 0) {
                if ((compareLen == 0 && httpURLPath.equals(escapedHref))
                    || httpURLPath.regionMatches(0, escapedHref, 0, compareLen))
                {
                    // escaped href and http path are the same
                    // Set the status code for this resource.
                    if (response.getStatusCode() > 0)
                        setStatusCode(response.getStatusCode());
                    setExistence(true);
                    itself = true;
                }
            }
    
            // Get to know each resource.
            WebdavResource workingResource = null;
            if (itself) {
                workingResource = this;
            }
            else {
                workingResource = createWebdavResource(client);
                workingResource.setDebug(debug);
            }
    
            // clear the current lock set
            workingResource.setLockDiscovery(null);
    
            // Process the resource's properties
            Enumeration properties = response.getProperties();
            while (properties.hasMoreElements()) {
    
                Property property = (Property) properties.nextElement();
    
                // ------------------------------  Checking WebDAV properties
                workingResource.processProperty(property);
            }
    
            String displayName = workingResource.getDisplayName();
    
            if (displayName == null || displayName.trim().equals("")) {
                displayName = getName(href);
            }

            /** BUGGY CODE
            if (!itself) {
                String myURI = httpURL.getEscapedURI();
                char[] childURI = (myURI + (myURI.endsWith("/") ? "" : "/")
                                   + URIUtil.getName(href)).toCharArray();
                HttpURL childURL = httpURL instanceof HttpsURL
                                   ? new HttpsURL(childURI)
                                   : new HttpURL(childURI);
                childURL.setRawAuthority(httpURL.getRawAuthority());
                workingResource.setHttpURL(childURL, NOACTION, defaultDepth);
                workingResource.setExistence(true);
                workingResource.setOverwrite(getOverwrite());
            }
            */
            
            /** FIX ********/
            if (!itself) {                
                String myURI = httpURL.getEscapedURI();
                
                /**
                        Checks if href contains trailing '/', and if so removes 
it.
                        This ensures URIUtil.getName does not return an empty
                        String when we don't want it to.
                        
                        See 
http://issues.apache.org/bugzilla/show_bug.cgi?id=32886
                        for more information.
                */
                String fixedHref = href.endsWith("/") ?
                    href.substring(0, href.length() - 1) : href;
                
                char[] childURI = (myURI + (myURI.endsWith("/") ? "" : "/")
                                   + URIUtil.getName(fixedHref)).toCharArray();
                
                HttpURL childURL = httpURL instanceof HttpsURL
                                   ? new HttpsURL(childURI)
                                   : new HttpURL(childURI);
                childURL.setRawAuthority(httpURL.getRawAuthority());
                workingResource.setHttpURL(childURL, NOACTION, defaultDepth);
                workingResource.setExistence(true);
                workingResource.setOverwrite(getOverwrite());
            }            
            /**************/
            
            
            workingResource.setDisplayName(displayName);
    
            if (!itself)
                childResources.addResource(workingResource);
        }
    }
// END: FIX /////////////////////////////////////////////////////

The code is based on Igor's solution and should work fine.  Please post here if
you stumble upon any issues the fix causes.  In the meantime however, its
working perfectly for me.

Cheers!

Mike N. Christoff

-- 
Configure bugmail: http://issues.apache.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.

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

Reply via email to