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 Paul Hussein <pa...@jrc.it> on 2004/06/11 14:50:23 UTC

org.apache.webdav.lib.WebdavException when calling WebdavFIle.isDirectory ( )

Hi,


COuld someone explain why i get

org.apache.webdav.lib.WebdavException: Address already in use: connect

When a multithreaded program ( JFIleChooser ) tries to query the same
directory simultaneously ( I am guessing ).


Cheers


Paul.


package it.jrc.compass.webdav;

import java.io.File;
import java.io.IOException;
/*
 * WebDAVFileSystemView.java
 *
 * Created on May 13, 2004, 8:55 AM
 */

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.filechooser.FileSystemView;
import org.apache.commons.httpclient.HttpURL;
import org.apache.commons.httpclient.HttpsURL;
import org.apache.commons.httpclient.URIException;
import org.apache.webdav.lib.WebdavResource;

/**
 *
 * @author  hussepa
 */
public class WebDAVFileSystemView extends FileSystemView {


    /** The WebDAV resource. */
    private WebdavResource webdavResource = null;
    private HttpURL rootURL = null;
    private WebdavFile homedir = null;
    private String username = null;
    private String password = null;
    private String uri = null;
    private String rootPath = null;

    private static final String newFolderString =
UIManager.getString("FileChooser.other.newFolder");
    static FileSystemView fsv = null;


    public WebDAVFileSystemView( String uri, String rootPath, String
username, String password ) throws java.lang.IllegalAccessError,
URIException {
        try {
            this.rootURL = this.uriToHttpURL( uri + rootPath );
            this.uri = uri;
            this.rootURL.setUserinfo( username, password );
            this.username = username;
            this.password = password;
            this.rootPath = rootPath;


            this.connect();
            System.out.println( "Connected successfully to  : " +
this.rootURL );
            this.disconnect( );

            // Create home directory object
            this.homedir = new WebdavFile( this.rootURL );
            System.out.println( "Homedir : " + this.homedir );
        }
        catch ( java.lang.IllegalAccessError e ) {
            System.err.println( e.toString() );
            e.printStackTrace( );
            throw e;
        }

    }

    private static HttpURL uriToHttpURL(String uri) throws URIException {
        HttpURL url = null;
        if (uri.startsWith("http://")) {
            url = new HttpURL(uri);
        }else if (uri.startsWith("https://")) {
            url = new HttpsURL(uri);
        } else {
            throw new URIException("Unknown protocol in URL " + uri);
        }
        return url;
    }

    public void disconnect() throws java.lang.UnknownError {
        try {
            this.webdavResource.close();
        }
        catch ( Exception e ) {
            System.out.println( e.toString() );
            throw new UnknownError( );
        }
    }
    public void connect( ) throws java.lang.IllegalAccessError {
        try {

            this.webdavResource = new WebdavResource( this.rootURL );
        }
        catch ( Exception e ) {
            System.err.println( e.toString() );
            throw new IllegalAccessError( );
        }
    }

    public static FileSystemView getFileSystemView() {
        try {
            if(fsv == null) {
                fsv = new WebDAVFileSystemView( "http://127.0.0.1",
"/WebDAV", "",  "");
            }
            return fsv;
        }
        catch ( Exception e ) {
            System.err.println( e.toString() );
            return null;
        }

    }

    /**
     * Returns a File object constructed in dir from the given filename.
     */
    public File createFileObject(File dir, String filename) {
        File file = null;
        if(dir == null) {
            file = new File(filename);
        } else {
            file = new File(dir, filename);
        }
        return file;
    }

    /**
     * Returns a File object constructed from the given path string.
     */
    public File createFileObject(String path) {
        File f = new File(path);
        if (isFileSystemRoot(f)) {
            f = createFileSystemRoot(f);
        }
        return f;
    }


    /**
     * Creates a new folder with a default folder name.
     */
    public File createNewFolder(File containingDir) throws IOException {
        try {
            if(containingDir == null) {
                throw new IOException("Containing directory is null:");
            }
            WebdavFile newFolder = null;
            HttpURL url = null;

            url = this.uriToHttpURL( containingDir.getPath() +
WebdavFile.davSeparator + newFolderString );
            // Need to add user info so has access for queries
            url.setUserinfo( username, password );
            newFolder = new WebdavFile( url );
            System.out.println( "new folder : " + newFolder.toString( ) );

            this.connect( );
            if ( this.webdavResource.mkcolMethod(
newFolder.getAbsolutePath() ) ) {
                System.out.println("succeeded.");
                return newFolder;
            } else {
                System.err.println("failed.");
                System.err.println(this.webdavResource.getStatusMessage());
                throw new IOException(
this.webdavResource.getStatusMessage() );
            }
        }
        catch ( IOException e ) {
            throw e;
        }
        catch ( Exception e ) {
            System.err.println( e.toString() );
            e.printStackTrace( );
            return null;
        }
        finally {
            this.disconnect();
        }
    }
    /**
     * Returns all root partitions on this system. For example, on
     * Windows, this would be the "Desktop" folder, while on DOS this
     * would be the A: through Z: drives.
     */
    public File[] getRoots() {
        try {
            return new WebdavFile[] { this.homedir };
        }
        catch ( Exception e ) {
            System.err.println( e.toString() );
            e.printStackTrace( );
            return null;
        }
    }


    /**
     * Returns true if the file (directory) can be visited.
     * Returns false if the directory cannot be traversed.
     *
     * @param f the <code>File</code>
     * @return <code>true</code> if the file/directory can be traversed,
otherwise <code>false</code>
     * @see JFileChooser#isTraversable
     * @see FileView#isTraversable
     */
    public Boolean isTraversable(File f) {
        try {
//            System.out.println( "isTraversable : " + f.getPath( ) );
//            WebdavFile webdavFile = null;
//            this.connect();
//            webdavFile = ( WebdavFile ) f;
//            this.webdavResource.setHttpURL( new HttpURL(
 f.getPath( ) ) );
//            System.out.println( this.webdavResource.getPath( ) + " :
collection : " + this.webdavResource.isCollection() );
//            return Boolean.valueOf( this.webdavResource.isCollection() );
            return Boolean.valueOf( f.isDirectory() );
        }
        catch ( Exception e ) {
            System.err.println( e.toString() );
            e.printStackTrace( );
            return Boolean.valueOf( false );
        }
        finally {
            this.disconnect();
        }
    }

    /**
     * Name of a file, directory, or folder as it would be displayed in
     * a system file browser. Example from Windows: the "M:\" directory
     * displays as "CD-ROM (M:)"
     *
     * The default implementation gets information from the ShellFolder
class.
     *
     * @param f a <code>File</code> object
     * @return the file name as it would be displayed by a native file
chooser
     * @see JFileChooser#getName
     */
    public String getSystemDisplayName(File f) {
        try {
            WebdavFile wdf = null;
            wdf = ( WebdavFile ) f;
            System.out.println( "getSystemDisplayName : getName          : "
+ f.getName() );
            System.out.println( "getSystemDisplayName : getAbsolutePath  : "
+ f.getAbsolutePath() );
            System.out.println( "getSystemDisplayName : getCanonicalPath : "
+ f.getCanonicalPath() );
            System.out.println( "getSystemDisplayName : getPath          : "
+ f.getPath( ) );
            return f.getName( );
        }
        catch ( Exception e ) {
            System.err.println( e.toString() );
            e.printStackTrace( );
            return null;
        }
        finally {
            this.disconnect();
        }
    }

    /**
     * Type description for a file, directory, or folder as it would be
displayed in
     * a system file browser. Example from Windows: the "Desktop" folder
     * is desribed as "Desktop".
     *
     * Override for platforms with native ShellFolder implementations.
     *
     * @param f a <code>File</code> object
     * @return the file type description as it would be displayed by a
native file chooser
     * or null if no native information is available.
     * @see JFileChooser#getTypeDescription
     */
    public String getSystemTypeDescription(File f) {
        return null;
    }



    /**
     * Checks if <code>f</code> represents a real directory or file as
opposed to a
     * special folder such as <code>"Desktop"</code>. Used by UI classes to
decide if
     * a folder is selectable when doing directory choosing.
     *
     * @param f a <code>File</code> object
     * @return <code>true</code> if <code>f</code> is a real file or
directory.
     */
    public boolean isFileSystem(File f) {
        return true;
    }


    /**
     * Returns whether a file is hidden or not.
     */
    public boolean isHiddenFile(File f) {
        return f.isHidden();
    }


    /**
     * Is dir the root of a tree in the file system, such as a drive
     * or partition. Example: Returns true for "C:\" on Windows 98.
     *
     * @param f a <code>File</code> object representing a directory
     * @return <code>true</code> if <code>f</code> is a root of a filesystem
     * @see #isRoot
     */
    public boolean isFileSystemRoot(File dir) {
        try {
            return ( rootURL.getPath().equals( dir.getPath( ) ) );
        }
        catch ( Exception e ) {
            System.out.println( "isFileSystemRoot" + e.toString( ) );
            e.printStackTrace( );
            return false;
        }
    }

    /**
     * Used by UI classes to decide whether to display a special icon
     * for drives or partitions, e.g. a "hard disk" icon.
     *
     * The default implementation has no way of knowing, so always returns
false.
     *
     * @param dir a directory
     * @return <code>false</code> always
     */
    public boolean isDrive(File dir) {
        return false;
    }

    /**
     * Used by UI classes to decide whether to display a special icon
     * for a floppy disk. Implies isDrive(dir).
     *
     * The default implementation has no way of knowing, so always returns
false.
     *
     * @param dir a directory
     * @return <code>false</code> always
     */
    public boolean isFloppyDrive(File dir) {
        return false;
    }

    /**
     * Used by UI classes to decide whether to display a special icon
     * for a computer node, e.g. "My Computer" or a network server.
     *
     * The default implementation has no way of knowing, so always returns
false.
     *
     * @param dir a directory
     * @return <code>false</code> always
     */
    public boolean isComputerNode(File dir) {
        return false;
    }

    // Providing default implementations for the remaining methods
    // because most OS file systems will likely be able to use this
    // code. If a given OS can't, override these methods in its
    // implementation.

    public File getHomeDirectory() {
        return this.homedir;
    }

    /**
     * Return the user's default starting directory for the file chooser.
     *
     * @return a <code>File</code> object representing the default
     *         starting folder
     */
    public File getDefaultDirectory() {
        return this.homedir;
    }


    /**
     * Gets the list of shown (i.e. not hidden) files.
     */
    public File[] getFiles(File dir, boolean useFileHiding) {
        try {

            String filenames[] = null;
            WebdavFile files[] = null;
            HttpURL url = null;
            String path = null;

            this.connect();
            // Now we try to list files

            path = dir.getPath( );
            System.out.println( "getFiles : RAW PATH : '" + path + "'" );

            // If path contains the server preamble, we need to extract that
            // and have the path only
            if ( path.startsWith( "http" ) ) {
                System.out.println( "getFiles : preample : " + this.uri );
                path = path.replaceAll(this.uri, "" );
            }
            if ( !path.endsWith("/") ) {
                path = path + "/";
            }

            System.out.println( "getFiles : path : " + path );







            this.webdavResource.setPath( path );
            filenames = this.webdavResource.list();
            files = new WebdavFile[filenames.length];
            for ( int i = 0; i < filenames.length; i++ ) {
                System.out.println( "file : " + filenames[i] );
                // Lets try to construct a uri from the dir
                // given and the current file

                String filepath = dir.getPath() + filenames[i];
                System.out.println( "getFiles : file fullpath : " +
filepath );
                url = this.uriToHttpURL( filepath );
                // Need to add user info so has access for queries
                url.setUserinfo( username, password );
                files[i] = new WebdavFile( url );
            }
            return files;
        }
        catch ( Exception e ) {
            System.err.println( e.toString() );
            e.printStackTrace( );
            return null;
        }
        finally {
            this.disconnect();
        }
    }



    /**
     * Returns the parent directory of <code>dir</code>.
     * @param dir the <code>File</code> being queried
     * @return the parent directory of <code>dir</code>, or
     *   <code>null</code> if <code>dir</code> is <code>null</code>
     */
    public File getParentDirectory(File dir) {
        System.out.println( "dir : " + dir );
        if ( dir == null ) {
            return null;
        }
        else if ( dir.equals(this.homedir) ) {
            return this.homedir;
        }
        else {
            System.out.println( "getParentFile : " + dir.getParentFile( ) );
            return dir.getParentFile();
        }
    }

    /**
     * Creates a new <code>File</code> object for <code>f</code> with
correct
     * behavior for a file system root directory.
     *
     * @param f a <code>File</code> object representing a file system root
     *		directory, for example "/" on Unix or "C:\" on Windows.
     * @return a new <code>File</code> object
     */
    protected File createFileSystemRoot(File f) {
        return new FileSystemRoot(f);
    }

    static class WebdavFile extends org.apache.webdav.lib.WebdavFile {
        public WebdavFile( HttpURL httpUrl ) throws URIException {
            super( httpUrl );
        }
        public String getName() {
            String name = null;

            // Get the base name
            name = super.getName( );

            // If is a directory, we need to add a trailing slash
            if ( this.isDirectory() ) {
                name = name + "/";
            }
            return name;
        }
        public boolean isDirectory ( )
        {
            System.out.println ( "isDirectory : " + this.getPath() );

            return super.isDirectory();
        }
//        public String getPath ( )
//        {
//            String path = null;
//
//            // Get the base name
//            path = super.getName( );
//
//            // If is a directory, we need to add a trailing slash
//            if ( this.isDirectory() ) {
//                path = path + "/";
//            }
//            System.out.println ( "WebdavFile getPath : " + path );
//            return path;
//        }

    }



    static class FileSystemRoot extends File {
        public FileSystemRoot(File f) {
            super(f,"");
        }

        public FileSystemRoot(String s) {
            super(s);
        }

        public boolean isDirectory() {
            return true;
        }

        public String getName() {
            return getPath();
        }
    }
    // Test code
    public static void main( String args[] ) throws Exception {
        JFrame frame = null;

        // Setup
        JFileChooser fc = new JFileChooser(new WebDAVFileSystemView(
"http://139.191.67.52:8080", "/slide/files", "root", "" ) );
        frame = new JFrame( );
        fc.showOpenDialog(frame);
    }

}


---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org


Re: org.apache.webdav.lib.WebdavException when calling WebdavFIle.isDirectory ( )

Posted by Ingo Brunberg <ib...@fiz-chemie.de>.
Yes, it's not that complicated. But we would additionally have to take
bug #19419 into account. That means releaseConnection() would have to
be called after executing any WebDAV method in WebdavResource.

The only problem is that there are some methods that return an
InputStream, so you cannot simply call releaseConnection() but would
have to wrap the InputStream so that one could release the connection
when the stream is closed.

Ingo

> I have had a quick look at
> 
> getSessionInstance in WebdavSession to change it to the
> MultiThreadedHttpConnectionManager connection manager
> 
> It looks like the only change required is to switch
> 
> client = new HttpClient();
> 
> to HttpClient client = new HttpClient(connectionManager);
> 
> 
> with the requisite change to the code to setup the connectionManager to be
> MultiThreadedHttpConnectionManager.
> 
> What sort of implications would this change have ?
> 
> 
> Is anyone familiar with the code hierachy. Would more changes than this have
> to be made ?
> 
> Cheers
> 
> 
> Paul.
> 
> > -----Original Message-----
> > From: Ingo Brunberg [mailto:ib@fiz-chemie.de]
> > Sent: Friday, June 11, 2004 4:12 PM
> > To: slide-dev@jakarta.apache.org
> > Subject: Re: org.apache.webdav.lib.WebdavException when calling
> > WebdavFIle.isDirectory ( )
> >
> >
> > WebdavResource (also WebdavFile) is using the
> > SimpleHttpConnectionManager of Httpclient, not the
> > MultithreadedConnectionManager. So you would run into a real problem
> > if you tried to use it in a multithreaded program with simultaneous
> > access.
> >
> > Are you sure that JFileChooser makes filesystem calls from multiple
> > threads on its own? That would be a strong reason to switch to
> > MultithreadedConnectionManager.
> >
> > Btw., I noticed that WebdavFile urgently needs some work. Against my
> > advice it creates a new WebdavResource and hence a new connection for
> > nearly every method call. So if you experience performance problems
> > you should know that there is room for optimizations.
> >
> > Ingo
> >
> > > Hi,
> > >
> > >
> > > COuld someone explain why i get
> > >
> > > org.apache.webdav.lib.WebdavException: Address already in use: connect
> > >
> > > When a multithreaded program ( JFIleChooser ) tries to query the same
> > > directory simultaneously ( I am guessing ).
> > >
> > >
> > > Cheers
> > >
> > >
> > > Paul.
> > >
> > >
> > > package it.jrc.compass.webdav;
> > >
> > > import java.io.File;
> > > import java.io.IOException;
> > > /*
> > >  * WebDAVFileSystemView.java
> > >  *
> > >  * Created on May 13, 2004, 8:55 AM
> > >  */
> > >
> > > import javax.swing.JFileChooser;
> > > import javax.swing.JFrame;
> > > import javax.swing.UIManager;
> > > import javax.swing.filechooser.FileSystemView;
> > > import org.apache.commons.httpclient.HttpURL;
> > > import org.apache.commons.httpclient.HttpsURL;
> > > import org.apache.commons.httpclient.URIException;
> > > import org.apache.webdav.lib.WebdavResource;
> > >
> > > /**
> > >  *
> > >  * @author  hussepa
> > >  */
> > > public class WebDAVFileSystemView extends FileSystemView {
> > >
> > >
> > >     /** The WebDAV resource. */
> > >     private WebdavResource webdavResource = null;
> > >     private HttpURL rootURL = null;
> > >     private WebdavFile homedir = null;
> > >     private String username = null;
> > >     private String password = null;
> > >     private String uri = null;
> > >     private String rootPath = null;
> > >
> > >     private static final String newFolderString =
> > > UIManager.getString("FileChooser.other.newFolder");
> > >     static FileSystemView fsv = null;
> > >
> > >
> > >     public WebDAVFileSystemView( String uri, String rootPath, String
> > > username, String password ) throws java.lang.IllegalAccessError,
> > > URIException {
> > >         try {
> > >             this.rootURL = this.uriToHttpURL( uri + rootPath );
> > >             this.uri = uri;
> > >             this.rootURL.setUserinfo( username, password );
> > >             this.username = username;
> > >             this.password = password;
> > >             this.rootPath = rootPath;
> > >
> > >
> > >             this.connect();
> > >             System.out.println( "Connected successfully to  : " +
> > > this.rootURL );
> > >             this.disconnect( );
> > >
> > >             // Create home directory object
> > >             this.homedir = new WebdavFile( this.rootURL );
> > >             System.out.println( "Homedir : " + this.homedir );
> > >         }
> > >         catch ( java.lang.IllegalAccessError e ) {
> > >             System.err.println( e.toString() );
> > >             e.printStackTrace( );
> > >             throw e;
> > >         }
> > >
> > >     }
> > >
> > >     private static HttpURL uriToHttpURL(String uri) throws
> > URIException {
> > >         HttpURL url = null;
> > >         if (uri.startsWith("http://")) {
> > >             url = new HttpURL(uri);
> > >         }else if (uri.startsWith("https://")) {
> > >             url = new HttpsURL(uri);
> > >         } else {
> > >             throw new URIException("Unknown protocol in URL " + uri);
> > >         }
> > >         return url;
> > >     }
> > >
> > >     public void disconnect() throws java.lang.UnknownError {
> > >         try {
> > >             this.webdavResource.close();
> > >         }
> > >         catch ( Exception e ) {
> > >             System.out.println( e.toString() );
> > >             throw new UnknownError( );
> > >         }
> > >     }
> > >     public void connect( ) throws java.lang.IllegalAccessError {
> > >         try {
> > >
> > >             this.webdavResource = new WebdavResource( this.rootURL );
> > >         }
> > >         catch ( Exception e ) {
> > >             System.err.println( e.toString() );
> > >             throw new IllegalAccessError( );
> > >         }
> > >     }
> > >
> > >     public static FileSystemView getFileSystemView() {
> > >         try {
> > >             if(fsv == null) {
> > >                 fsv = new WebDAVFileSystemView( "http://127.0.0.1",
> > > "/WebDAV", "",  "");
> > >             }
> > >             return fsv;
> > >         }
> > >         catch ( Exception e ) {
> > >             System.err.println( e.toString() );
> > >             return null;
> > >         }
> > >
> > >     }
> > >
> > >     /**
> > >      * Returns a File object constructed in dir from the given filename.
> > >      */
> > >     public File createFileObject(File dir, String filename) {
> > >         File file = null;
> > >         if(dir == null) {
> > >             file = new File(filename);
> > >         } else {
> > >             file = new File(dir, filename);
> > >         }
> > >         return file;
> > >     }
> > >
> > >     /**
> > >      * Returns a File object constructed from the given path string.
> > >      */
> > >     public File createFileObject(String path) {
> > >         File f = new File(path);
> > >         if (isFileSystemRoot(f)) {
> > >             f = createFileSystemRoot(f);
> > >         }
> > >         return f;
> > >     }
> > >
> > >
> > >     /**
> > >      * Creates a new folder with a default folder name.
> > >      */
> > >     public File createNewFolder(File containingDir) throws IOException {
> > >         try {
> > >             if(containingDir == null) {
> > >                 throw new IOException("Containing directory is null:");
> > >             }
> > >             WebdavFile newFolder = null;
> > >             HttpURL url = null;
> > >
> > >             url = this.uriToHttpURL( containingDir.getPath() +
> > > WebdavFile.davSeparator + newFolderString );
> > >             // Need to add user info so has access for queries
> > >             url.setUserinfo( username, password );
> > >             newFolder = new WebdavFile( url );
> > >             System.out.println( "new folder : " +
> > newFolder.toString( ) );
> > >
> > >             this.connect( );
> > >             if ( this.webdavResource.mkcolMethod(
> > > newFolder.getAbsolutePath() ) ) {
> > >                 System.out.println("succeeded.");
> > >                 return newFolder;
> > >             } else {
> > >                 System.err.println("failed.");
> > >
> > System.err.println(this.webdavResource.getStatusMessage());
> > >                 throw new IOException(
> > > this.webdavResource.getStatusMessage() );
> > >             }
> > >         }
> > >         catch ( IOException e ) {
> > >             throw e;
> > >         }
> > >         catch ( Exception e ) {
> > >             System.err.println( e.toString() );
> > >             e.printStackTrace( );
> > >             return null;
> > >         }
> > >         finally {
> > >             this.disconnect();
> > >         }
> > >     }
> > >     /**
> > >      * Returns all root partitions on this system. For example, on
> > >      * Windows, this would be the "Desktop" folder, while on DOS this
> > >      * would be the A: through Z: drives.
> > >      */
> > >     public File[] getRoots() {
> > >         try {
> > >             return new WebdavFile[] { this.homedir };
> > >         }
> > >         catch ( Exception e ) {
> > >             System.err.println( e.toString() );
> > >             e.printStackTrace( );
> > >             return null;
> > >         }
> > >     }
> > >
> > >
> > >     /**
> > >      * Returns true if the file (directory) can be visited.
> > >      * Returns false if the directory cannot be traversed.
> > >      *
> > >      * @param f the <code>File</code>
> > >      * @return <code>true</code> if the file/directory can be traversed,
> > > otherwise <code>false</code>
> > >      * @see JFileChooser#isTraversable
> > >      * @see FileView#isTraversable
> > >      */
> > >     public Boolean isTraversable(File f) {
> > >         try {
> > > //            System.out.println( "isTraversable : " + f.getPath( ) );
> > > //            WebdavFile webdavFile = null;
> > > //            this.connect();
> > > //            webdavFile = ( WebdavFile ) f;
> > > //            this.webdavResource.setHttpURL( new HttpURL(
> > >  f.getPath( ) ) );
> > > //            System.out.println( this.webdavResource.getPath( ) + " :
> > > collection : " + this.webdavResource.isCollection() );
> > > //            return Boolean.valueOf(
> > this.webdavResource.isCollection() );
> > >             return Boolean.valueOf( f.isDirectory() );
> > >         }
> > >         catch ( Exception e ) {
> > >             System.err.println( e.toString() );
> > >             e.printStackTrace( );
> > >             return Boolean.valueOf( false );
> > >         }
> > >         finally {
> > >             this.disconnect();
> > >         }
> > >     }
> > >
> > >     /**
> > >      * Name of a file, directory, or folder as it would be displayed in
> > >      * a system file browser. Example from Windows: the "M:\" directory
> > >      * displays as "CD-ROM (M:)"
> > >      *
> > >      * The default implementation gets information from the ShellFolder
> > > class.
> > >      *
> > >      * @param f a <code>File</code> object
> > >      * @return the file name as it would be displayed by a native file
> > > chooser
> > >      * @see JFileChooser#getName
> > >      */
> > >     public String getSystemDisplayName(File f) {
> > >         try {
> > >             WebdavFile wdf = null;
> > >             wdf = ( WebdavFile ) f;
> > >             System.out.println( "getSystemDisplayName : getName
> >          : "
> > > + f.getName() );
> > >             System.out.println( "getSystemDisplayName :
> > getAbsolutePath  : "
> > > + f.getAbsolutePath() );
> > >             System.out.println( "getSystemDisplayName :
> > getCanonicalPath : "
> > > + f.getCanonicalPath() );
> > >             System.out.println( "getSystemDisplayName : getPath
> >          : "
> > > + f.getPath( ) );
> > >             return f.getName( );
> > >         }
> > >         catch ( Exception e ) {
> > >             System.err.println( e.toString() );
> > >             e.printStackTrace( );
> > >             return null;
> > >         }
> > >         finally {
> > >             this.disconnect();
> > >         }
> > >     }
> > >
> > >     /**
> > >      * Type description for a file, directory, or folder as it would be
> > > displayed in
> > >      * a system file browser. Example from Windows: the "Desktop" folder
> > >      * is desribed as "Desktop".
> > >      *
> > >      * Override for platforms with native ShellFolder implementations.
> > >      *
> > >      * @param f a <code>File</code> object
> > >      * @return the file type description as it would be displayed by a
> > > native file chooser
> > >      * or null if no native information is available.
> > >      * @see JFileChooser#getTypeDescription
> > >      */
> > >     public String getSystemTypeDescription(File f) {
> > >         return null;
> > >     }
> > >
> > >
> > >
> > >     /**
> > >      * Checks if <code>f</code> represents a real directory or file as
> > > opposed to a
> > >      * special folder such as <code>"Desktop"</code>. Used by
> > UI classes to
> > > decide if
> > >      * a folder is selectable when doing directory choosing.
> > >      *
> > >      * @param f a <code>File</code> object
> > >      * @return <code>true</code> if <code>f</code> is a real file or
> > > directory.
> > >      */
> > >     public boolean isFileSystem(File f) {
> > >         return true;
> > >     }
> > >
> > >
> > >     /**
> > >      * Returns whether a file is hidden or not.
> > >      */
> > >     public boolean isHiddenFile(File f) {
> > >         return f.isHidden();
> > >     }
> > >
> > >
> > >     /**
> > >      * Is dir the root of a tree in the file system, such as a drive
> > >      * or partition. Example: Returns true for "C:\" on Windows 98.
> > >      *
> > >      * @param f a <code>File</code> object representing a directory
> > >      * @return <code>true</code> if <code>f</code> is a root of
> > a filesystem
> > >      * @see #isRoot
> > >      */
> > >     public boolean isFileSystemRoot(File dir) {
> > >         try {
> > >             return ( rootURL.getPath().equals( dir.getPath( ) ) );
> > >         }
> > >         catch ( Exception e ) {
> > >             System.out.println( "isFileSystemRoot" + e.toString( ) );
> > >             e.printStackTrace( );
> > >             return false;
> > >         }
> > >     }
> > >
> > >     /**
> > >      * Used by UI classes to decide whether to display a special icon
> > >      * for drives or partitions, e.g. a "hard disk" icon.
> > >      *
> > >      * The default implementation has no way of knowing, so
> > always returns
> > > false.
> > >      *
> > >      * @param dir a directory
> > >      * @return <code>false</code> always
> > >      */
> > >     public boolean isDrive(File dir) {
> > >         return false;
> > >     }
> > >
> > >     /**
> > >      * Used by UI classes to decide whether to display a special icon
> > >      * for a floppy disk. Implies isDrive(dir).
> > >      *
> > >      * The default implementation has no way of knowing, so
> > always returns
> > > false.
> > >      *
> > >      * @param dir a directory
> > >      * @return <code>false</code> always
> > >      */
> > >     public boolean isFloppyDrive(File dir) {
> > >         return false;
> > >     }
> > >
> > >     /**
> > >      * Used by UI classes to decide whether to display a special icon
> > >      * for a computer node, e.g. "My Computer" or a network server.
> > >      *
> > >      * The default implementation has no way of knowing, so
> > always returns
> > > false.
> > >      *
> > >      * @param dir a directory
> > >      * @return <code>false</code> always
> > >      */
> > >     public boolean isComputerNode(File dir) {
> > >         return false;
> > >     }
> > >
> > >     // Providing default implementations for the remaining methods
> > >     // because most OS file systems will likely be able to use this
> > >     // code. If a given OS can't, override these methods in its
> > >     // implementation.
> > >
> > >     public File getHomeDirectory() {
> > >         return this.homedir;
> > >     }
> > >
> > >     /**
> > >      * Return the user's default starting directory for the
> > file chooser.
> > >      *
> > >      * @return a <code>File</code> object representing the default
> > >      *         starting folder
> > >      */
> > >     public File getDefaultDirectory() {
> > >         return this.homedir;
> > >     }
> > >
> > >
> > >     /**
> > >      * Gets the list of shown (i.e. not hidden) files.
> > >      */
> > >     public File[] getFiles(File dir, boolean useFileHiding) {
> > >         try {
> > >
> > >             String filenames[] = null;
> > >             WebdavFile files[] = null;
> > >             HttpURL url = null;
> > >             String path = null;
> > >
> > >             this.connect();
> > >             // Now we try to list files
> > >
> > >             path = dir.getPath( );
> > >             System.out.println( "getFiles : RAW PATH : '" +
> > path + "'" );
> > >
> > >             // If path contains the server preamble, we need to
> > extract that
> > >             // and have the path only
> > >             if ( path.startsWith( "http" ) ) {
> > >                 System.out.println( "getFiles : preample : " +
> > this.uri );
> > >                 path = path.replaceAll(this.uri, "" );
> > >             }
> > >             if ( !path.endsWith("/") ) {
> > >                 path = path + "/";
> > >             }
> > >
> > >             System.out.println( "getFiles : path : " + path );
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >             this.webdavResource.setPath( path );
> > >             filenames = this.webdavResource.list();
> > >             files = new WebdavFile[filenames.length];
> > >             for ( int i = 0; i < filenames.length; i++ ) {
> > >                 System.out.println( "file : " + filenames[i] );
> > >                 // Lets try to construct a uri from the dir
> > >                 // given and the current file
> > >
> > >                 String filepath = dir.getPath() + filenames[i];
> > >                 System.out.println( "getFiles : file fullpath : " +
> > > filepath );
> > >                 url = this.uriToHttpURL( filepath );
> > >                 // Need to add user info so has access for queries
> > >                 url.setUserinfo( username, password );
> > >                 files[i] = new WebdavFile( url );
> > >             }
> > >             return files;
> > >         }
> > >         catch ( Exception e ) {
> > >             System.err.println( e.toString() );
> > >             e.printStackTrace( );
> > >             return null;
> > >         }
> > >         finally {
> > >             this.disconnect();
> > >         }
> > >     }
> > >
> > >
> > >
> > >     /**
> > >      * Returns the parent directory of <code>dir</code>.
> > >      * @param dir the <code>File</code> being queried
> > >      * @return the parent directory of <code>dir</code>, or
> > >      *   <code>null</code> if <code>dir</code> is <code>null</code>
> > >      */
> > >     public File getParentDirectory(File dir) {
> > >         System.out.println( "dir : " + dir );
> > >         if ( dir == null ) {
> > >             return null;
> > >         }
> > >         else if ( dir.equals(this.homedir) ) {
> > >             return this.homedir;
> > >         }
> > >         else {
> > >             System.out.println( "getParentFile : " +
> > dir.getParentFile( ) );
> > >             return dir.getParentFile();
> > >         }
> > >     }
> > >
> > >     /**
> > >      * Creates a new <code>File</code> object for <code>f</code> with
> > > correct
> > >      * behavior for a file system root directory.
> > >      *
> > >      * @param f a <code>File</code> object representing a file
> > system root
> > >      *		directory, for example "/" on Unix or "C:\"
> > on Windows.
> > >      * @return a new <code>File</code> object
> > >      */
> > >     protected File createFileSystemRoot(File f) {
> > >         return new FileSystemRoot(f);
> > >     }
> > >
> > >     static class WebdavFile extends org.apache.webdav.lib.WebdavFile {
> > >         public WebdavFile( HttpURL httpUrl ) throws URIException {
> > >             super( httpUrl );
> > >         }
> > >         public String getName() {
> > >             String name = null;
> > >
> > >             // Get the base name
> > >             name = super.getName( );
> > >
> > >             // If is a directory, we need to add a trailing slash
> > >             if ( this.isDirectory() ) {
> > >                 name = name + "/";
> > >             }
> > >             return name;
> > >         }
> > >         public boolean isDirectory ( )
> > >         {
> > >             System.out.println ( "isDirectory : " + this.getPath() );
> > >
> > >             return super.isDirectory();
> > >         }
> > > //        public String getPath ( )
> > > //        {
> > > //            String path = null;
> > > //
> > > //            // Get the base name
> > > //            path = super.getName( );
> > > //
> > > //            // If is a directory, we need to add a trailing slash
> > > //            if ( this.isDirectory() ) {
> > > //                path = path + "/";
> > > //            }
> > > //            System.out.println ( "WebdavFile getPath : " + path );
> > > //            return path;
> > > //        }
> > >
> > >     }
> > >
> > >
> > >
> > >     static class FileSystemRoot extends File {
> > >         public FileSystemRoot(File f) {
> > >             super(f,"");
> > >         }
> > >
> > >         public FileSystemRoot(String s) {
> > >             super(s);
> > >         }
> > >
> > >         public boolean isDirectory() {
> > >             return true;
> > >         }
> > >
> > >         public String getName() {
> > >             return getPath();
> > >         }
> > >     }
> > >     // Test code
> > >     public static void main( String args[] ) throws Exception {
> > >         JFrame frame = null;
> > >
> > >         // Setup
> > >         JFileChooser fc = new JFileChooser(new WebDAVFileSystemView(
> > > "http://139.191.67.52:8080", "/slide/files", "root", "" ) );
> > >         frame = new JFrame( );
> > >         fc.showOpenDialog(frame);
> > >     }
> > >
> > > }


---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org


RE: org.apache.webdav.lib.WebdavException when calling WebdavFIle.isDirectory ( )

Posted by Steve Vaughan <sn...@yahoo.com>.
Perhaps we should consider going one step further.  If
we can support the MultiThreadedHttpConnectionManager,
then we should think about pulling HttpClient out of
the Slide client all together.

1) To fully take advantage of the pooled connections
offered by the MultiThreadedHttpConnectionManager we
would really need to use the same client across
several WebdavResource instances.

2) The next version of HttpClient (3.x) includes
support for interactive logins, which could prove to
be very useful to application developers.

3) If we ever get around to support redirect reference
resources, then the client will potentially need to
have (or be able to obtain) credentials for multiple
servers.  This means that setting user information
within the HttpURL won't be sufficient.

-Steve 

--- Paul Hussein <pa...@jrc.it> wrote:
> I have had a quick look at
> 
> getSessionInstance in WebdavSession to change it to
> the
> MultiThreadedHttpConnectionManager connection
> manager
> 
> It looks like the only change required is to switch
> 
> client = new HttpClient();
> 
> to HttpClient client = new
> HttpClient(connectionManager);
> 
> 
> with the requisite change to the code to setup the
> connectionManager to be
> MultiThreadedHttpConnectionManager.
> 
> What sort of implications would this change have ?
> 
> 
> Is anyone familiar with the code hierachy. Would
> more changes than this have
> to be made ?
> 
> Cheers
> 
> 
> Paul.
> 
> > -----Original Message-----
> > From: Ingo Brunberg [mailto:ib@fiz-chemie.de]
> > Sent: Friday, June 11, 2004 4:12 PM
> > To: slide-dev@jakarta.apache.org
> > Subject: Re: org.apache.webdav.lib.WebdavException
> when calling
> > WebdavFIle.isDirectory ( )
> >
> >
> > WebdavResource (also WebdavFile) is using the
> > SimpleHttpConnectionManager of Httpclient, not the
> > MultithreadedConnectionManager. So you would run
> into a real problem
> > if you tried to use it in a multithreaded program
> with simultaneous
> > access.
> >
> > Are you sure that JFileChooser makes filesystem
> calls from multiple
> > threads on its own? That would be a strong reason
> to switch to
> > MultithreadedConnectionManager.
> >
> > Btw., I noticed that WebdavFile urgently needs
> some work. Against my
> > advice it creates a new WebdavResource and hence a
> new connection for
> > nearly every method call. So if you experience
> performance problems
> > you should know that there is room for
> optimizations.
> >
> > Ingo
> >
> > > Hi,
> > >
> > >
> > > COuld someone explain why i get
> > >
> > > org.apache.webdav.lib.WebdavException: Address
> already in use: connect
> > >
> > > When a multithreaded program ( JFIleChooser )
> tries to query the same
> > > directory simultaneously ( I am guessing ).
> > >
> > >
> > > Cheers
> > >
> > >
> > > Paul.
> > >
> > >
> > > package it.jrc.compass.webdav;
> > >
> > > import java.io.File;
> > > import java.io.IOException;
> > > /*
> > >  * WebDAVFileSystemView.java
> > >  *
> > >  * Created on May 13, 2004, 8:55 AM
> > >  */
> > >
> > > import javax.swing.JFileChooser;
> > > import javax.swing.JFrame;
> > > import javax.swing.UIManager;
> > > import javax.swing.filechooser.FileSystemView;
> > > import org.apache.commons.httpclient.HttpURL;
> > > import org.apache.commons.httpclient.HttpsURL;
> > > import
> org.apache.commons.httpclient.URIException;
> > > import org.apache.webdav.lib.WebdavResource;
> > >
> > > /**
> > >  *
> > >  * @author  hussepa
> > >  */
> > > public class WebDAVFileSystemView extends
> FileSystemView {
> > >
> > >
> > >     /** The WebDAV resource. */
> > >     private WebdavResource webdavResource =
> null;
> > >     private HttpURL rootURL = null;
> > >     private WebdavFile homedir = null;
> > >     private String username = null;
> > >     private String password = null;
> > >     private String uri = null;
> > >     private String rootPath = null;
> > >
> > >     private static final String newFolderString
> =
> > >
> UIManager.getString("FileChooser.other.newFolder");
> > >     static FileSystemView fsv = null;
> > >
> > >
> > >     public WebDAVFileSystemView( String uri,
> String rootPath, String
> > > username, String password ) throws
> java.lang.IllegalAccessError,
> > > URIException {
> > >         try {
> > >             this.rootURL = this.uriToHttpURL(
> uri + rootPath );
> > >             this.uri = uri;
> > >             this.rootURL.setUserinfo( username,
> password );
> > >             this.username = username;
> > >             this.password = password;
> > >             this.rootPath = rootPath;
> > >
> > >
> > >             this.connect();
> > >             System.out.println( "Connected
> successfully to  : " +
> > > this.rootURL );
> > >             this.disconnect( );
> > >
> > >             // Create home directory object
> > >             this.homedir = new WebdavFile(
> this.rootURL );
> > >             System.out.println( "Homedir : " +
> this.homedir );
> > >         }
> > >         catch ( java.lang.IllegalAccessError e )
> {
> > >             System.err.println( e.toString() );
> > >             e.printStackTrace( );
> > >             throw e;
> > >         }
> > >
> > >     }
> > >
> > >     private static HttpURL uriToHttpURL(String
> uri) throws
> > URIException {
> > >         HttpURL url = null;
> > >         if (uri.startsWith("http://")) {
> > >             url = new HttpURL(uri);
> > >         }else if (uri.startsWith("https://")) {
> > >             url = new HttpsURL(uri);
> > >         } else {
> > >             throw new URIException("Unknown
> protocol in URL " + uri);
> > >         }
> > >         return url;
> > >     }
> > >
> > >     public void disconnect() throws
> java.lang.UnknownError {
> > >         try {
> > >             this.webdavResource.close();
> > >         }
> > >         catch ( Exception e ) {
> > >             System.out.println( e.toString() );
> > >             throw new UnknownError( );
> > >         }
> > >     }
> > >     public void connect( ) throws
> java.lang.IllegalAccessError {
> > >         try {
> > >
> > >             this.webdavResource = new
> WebdavResource( this.rootURL );
> > >         }
> > >         catch ( Exception e ) {
> > >             System.err.println( e.toString() );
> > >             throw new IllegalAccessError( );
> 
=== message truncated ===



	
		
__________________________________
Do you Yahoo!?
Friends.  Fun.  Try the all-new Yahoo! Messenger.
http://messenger.yahoo.com/ 

---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org


RE: org.apache.webdav.lib.WebdavException when calling WebdavFIle.isDirectory ( )

Posted by Paul Hussein <pa...@jrc.it>.
I have had a quick look at

getSessionInstance in WebdavSession to change it to the
MultiThreadedHttpConnectionManager connection manager

It looks like the only change required is to switch

client = new HttpClient();

to HttpClient client = new HttpClient(connectionManager);


with the requisite change to the code to setup the connectionManager to be
MultiThreadedHttpConnectionManager.

What sort of implications would this change have ?


Is anyone familiar with the code hierachy. Would more changes than this have
to be made ?

Cheers


Paul.

> -----Original Message-----
> From: Ingo Brunberg [mailto:ib@fiz-chemie.de]
> Sent: Friday, June 11, 2004 4:12 PM
> To: slide-dev@jakarta.apache.org
> Subject: Re: org.apache.webdav.lib.WebdavException when calling
> WebdavFIle.isDirectory ( )
>
>
> WebdavResource (also WebdavFile) is using the
> SimpleHttpConnectionManager of Httpclient, not the
> MultithreadedConnectionManager. So you would run into a real problem
> if you tried to use it in a multithreaded program with simultaneous
> access.
>
> Are you sure that JFileChooser makes filesystem calls from multiple
> threads on its own? That would be a strong reason to switch to
> MultithreadedConnectionManager.
>
> Btw., I noticed that WebdavFile urgently needs some work. Against my
> advice it creates a new WebdavResource and hence a new connection for
> nearly every method call. So if you experience performance problems
> you should know that there is room for optimizations.
>
> Ingo
>
> > Hi,
> >
> >
> > COuld someone explain why i get
> >
> > org.apache.webdav.lib.WebdavException: Address already in use: connect
> >
> > When a multithreaded program ( JFIleChooser ) tries to query the same
> > directory simultaneously ( I am guessing ).
> >
> >
> > Cheers
> >
> >
> > Paul.
> >
> >
> > package it.jrc.compass.webdav;
> >
> > import java.io.File;
> > import java.io.IOException;
> > /*
> >  * WebDAVFileSystemView.java
> >  *
> >  * Created on May 13, 2004, 8:55 AM
> >  */
> >
> > import javax.swing.JFileChooser;
> > import javax.swing.JFrame;
> > import javax.swing.UIManager;
> > import javax.swing.filechooser.FileSystemView;
> > import org.apache.commons.httpclient.HttpURL;
> > import org.apache.commons.httpclient.HttpsURL;
> > import org.apache.commons.httpclient.URIException;
> > import org.apache.webdav.lib.WebdavResource;
> >
> > /**
> >  *
> >  * @author  hussepa
> >  */
> > public class WebDAVFileSystemView extends FileSystemView {
> >
> >
> >     /** The WebDAV resource. */
> >     private WebdavResource webdavResource = null;
> >     private HttpURL rootURL = null;
> >     private WebdavFile homedir = null;
> >     private String username = null;
> >     private String password = null;
> >     private String uri = null;
> >     private String rootPath = null;
> >
> >     private static final String newFolderString =
> > UIManager.getString("FileChooser.other.newFolder");
> >     static FileSystemView fsv = null;
> >
> >
> >     public WebDAVFileSystemView( String uri, String rootPath, String
> > username, String password ) throws java.lang.IllegalAccessError,
> > URIException {
> >         try {
> >             this.rootURL = this.uriToHttpURL( uri + rootPath );
> >             this.uri = uri;
> >             this.rootURL.setUserinfo( username, password );
> >             this.username = username;
> >             this.password = password;
> >             this.rootPath = rootPath;
> >
> >
> >             this.connect();
> >             System.out.println( "Connected successfully to  : " +
> > this.rootURL );
> >             this.disconnect( );
> >
> >             // Create home directory object
> >             this.homedir = new WebdavFile( this.rootURL );
> >             System.out.println( "Homedir : " + this.homedir );
> >         }
> >         catch ( java.lang.IllegalAccessError e ) {
> >             System.err.println( e.toString() );
> >             e.printStackTrace( );
> >             throw e;
> >         }
> >
> >     }
> >
> >     private static HttpURL uriToHttpURL(String uri) throws
> URIException {
> >         HttpURL url = null;
> >         if (uri.startsWith("http://")) {
> >             url = new HttpURL(uri);
> >         }else if (uri.startsWith("https://")) {
> >             url = new HttpsURL(uri);
> >         } else {
> >             throw new URIException("Unknown protocol in URL " + uri);
> >         }
> >         return url;
> >     }
> >
> >     public void disconnect() throws java.lang.UnknownError {
> >         try {
> >             this.webdavResource.close();
> >         }
> >         catch ( Exception e ) {
> >             System.out.println( e.toString() );
> >             throw new UnknownError( );
> >         }
> >     }
> >     public void connect( ) throws java.lang.IllegalAccessError {
> >         try {
> >
> >             this.webdavResource = new WebdavResource( this.rootURL );
> >         }
> >         catch ( Exception e ) {
> >             System.err.println( e.toString() );
> >             throw new IllegalAccessError( );
> >         }
> >     }
> >
> >     public static FileSystemView getFileSystemView() {
> >         try {
> >             if(fsv == null) {
> >                 fsv = new WebDAVFileSystemView( "http://127.0.0.1",
> > "/WebDAV", "",  "");
> >             }
> >             return fsv;
> >         }
> >         catch ( Exception e ) {
> >             System.err.println( e.toString() );
> >             return null;
> >         }
> >
> >     }
> >
> >     /**
> >      * Returns a File object constructed in dir from the given filename.
> >      */
> >     public File createFileObject(File dir, String filename) {
> >         File file = null;
> >         if(dir == null) {
> >             file = new File(filename);
> >         } else {
> >             file = new File(dir, filename);
> >         }
> >         return file;
> >     }
> >
> >     /**
> >      * Returns a File object constructed from the given path string.
> >      */
> >     public File createFileObject(String path) {
> >         File f = new File(path);
> >         if (isFileSystemRoot(f)) {
> >             f = createFileSystemRoot(f);
> >         }
> >         return f;
> >     }
> >
> >
> >     /**
> >      * Creates a new folder with a default folder name.
> >      */
> >     public File createNewFolder(File containingDir) throws IOException {
> >         try {
> >             if(containingDir == null) {
> >                 throw new IOException("Containing directory is null:");
> >             }
> >             WebdavFile newFolder = null;
> >             HttpURL url = null;
> >
> >             url = this.uriToHttpURL( containingDir.getPath() +
> > WebdavFile.davSeparator + newFolderString );
> >             // Need to add user info so has access for queries
> >             url.setUserinfo( username, password );
> >             newFolder = new WebdavFile( url );
> >             System.out.println( "new folder : " +
> newFolder.toString( ) );
> >
> >             this.connect( );
> >             if ( this.webdavResource.mkcolMethod(
> > newFolder.getAbsolutePath() ) ) {
> >                 System.out.println("succeeded.");
> >                 return newFolder;
> >             } else {
> >                 System.err.println("failed.");
> >
> System.err.println(this.webdavResource.getStatusMessage());
> >                 throw new IOException(
> > this.webdavResource.getStatusMessage() );
> >             }
> >         }
> >         catch ( IOException e ) {
> >             throw e;
> >         }
> >         catch ( Exception e ) {
> >             System.err.println( e.toString() );
> >             e.printStackTrace( );
> >             return null;
> >         }
> >         finally {
> >             this.disconnect();
> >         }
> >     }
> >     /**
> >      * Returns all root partitions on this system. For example, on
> >      * Windows, this would be the "Desktop" folder, while on DOS this
> >      * would be the A: through Z: drives.
> >      */
> >     public File[] getRoots() {
> >         try {
> >             return new WebdavFile[] { this.homedir };
> >         }
> >         catch ( Exception e ) {
> >             System.err.println( e.toString() );
> >             e.printStackTrace( );
> >             return null;
> >         }
> >     }
> >
> >
> >     /**
> >      * Returns true if the file (directory) can be visited.
> >      * Returns false if the directory cannot be traversed.
> >      *
> >      * @param f the <code>File</code>
> >      * @return <code>true</code> if the file/directory can be traversed,
> > otherwise <code>false</code>
> >      * @see JFileChooser#isTraversable
> >      * @see FileView#isTraversable
> >      */
> >     public Boolean isTraversable(File f) {
> >         try {
> > //            System.out.println( "isTraversable : " + f.getPath( ) );
> > //            WebdavFile webdavFile = null;
> > //            this.connect();
> > //            webdavFile = ( WebdavFile ) f;
> > //            this.webdavResource.setHttpURL( new HttpURL(
> >  f.getPath( ) ) );
> > //            System.out.println( this.webdavResource.getPath( ) + " :
> > collection : " + this.webdavResource.isCollection() );
> > //            return Boolean.valueOf(
> this.webdavResource.isCollection() );
> >             return Boolean.valueOf( f.isDirectory() );
> >         }
> >         catch ( Exception e ) {
> >             System.err.println( e.toString() );
> >             e.printStackTrace( );
> >             return Boolean.valueOf( false );
> >         }
> >         finally {
> >             this.disconnect();
> >         }
> >     }
> >
> >     /**
> >      * Name of a file, directory, or folder as it would be displayed in
> >      * a system file browser. Example from Windows: the "M:\" directory
> >      * displays as "CD-ROM (M:)"
> >      *
> >      * The default implementation gets information from the ShellFolder
> > class.
> >      *
> >      * @param f a <code>File</code> object
> >      * @return the file name as it would be displayed by a native file
> > chooser
> >      * @see JFileChooser#getName
> >      */
> >     public String getSystemDisplayName(File f) {
> >         try {
> >             WebdavFile wdf = null;
> >             wdf = ( WebdavFile ) f;
> >             System.out.println( "getSystemDisplayName : getName
>          : "
> > + f.getName() );
> >             System.out.println( "getSystemDisplayName :
> getAbsolutePath  : "
> > + f.getAbsolutePath() );
> >             System.out.println( "getSystemDisplayName :
> getCanonicalPath : "
> > + f.getCanonicalPath() );
> >             System.out.println( "getSystemDisplayName : getPath
>          : "
> > + f.getPath( ) );
> >             return f.getName( );
> >         }
> >         catch ( Exception e ) {
> >             System.err.println( e.toString() );
> >             e.printStackTrace( );
> >             return null;
> >         }
> >         finally {
> >             this.disconnect();
> >         }
> >     }
> >
> >     /**
> >      * Type description for a file, directory, or folder as it would be
> > displayed in
> >      * a system file browser. Example from Windows: the "Desktop" folder
> >      * is desribed as "Desktop".
> >      *
> >      * Override for platforms with native ShellFolder implementations.
> >      *
> >      * @param f a <code>File</code> object
> >      * @return the file type description as it would be displayed by a
> > native file chooser
> >      * or null if no native information is available.
> >      * @see JFileChooser#getTypeDescription
> >      */
> >     public String getSystemTypeDescription(File f) {
> >         return null;
> >     }
> >
> >
> >
> >     /**
> >      * Checks if <code>f</code> represents a real directory or file as
> > opposed to a
> >      * special folder such as <code>"Desktop"</code>. Used by
> UI classes to
> > decide if
> >      * a folder is selectable when doing directory choosing.
> >      *
> >      * @param f a <code>File</code> object
> >      * @return <code>true</code> if <code>f</code> is a real file or
> > directory.
> >      */
> >     public boolean isFileSystem(File f) {
> >         return true;
> >     }
> >
> >
> >     /**
> >      * Returns whether a file is hidden or not.
> >      */
> >     public boolean isHiddenFile(File f) {
> >         return f.isHidden();
> >     }
> >
> >
> >     /**
> >      * Is dir the root of a tree in the file system, such as a drive
> >      * or partition. Example: Returns true for "C:\" on Windows 98.
> >      *
> >      * @param f a <code>File</code> object representing a directory
> >      * @return <code>true</code> if <code>f</code> is a root of
> a filesystem
> >      * @see #isRoot
> >      */
> >     public boolean isFileSystemRoot(File dir) {
> >         try {
> >             return ( rootURL.getPath().equals( dir.getPath( ) ) );
> >         }
> >         catch ( Exception e ) {
> >             System.out.println( "isFileSystemRoot" + e.toString( ) );
> >             e.printStackTrace( );
> >             return false;
> >         }
> >     }
> >
> >     /**
> >      * Used by UI classes to decide whether to display a special icon
> >      * for drives or partitions, e.g. a "hard disk" icon.
> >      *
> >      * The default implementation has no way of knowing, so
> always returns
> > false.
> >      *
> >      * @param dir a directory
> >      * @return <code>false</code> always
> >      */
> >     public boolean isDrive(File dir) {
> >         return false;
> >     }
> >
> >     /**
> >      * Used by UI classes to decide whether to display a special icon
> >      * for a floppy disk. Implies isDrive(dir).
> >      *
> >      * The default implementation has no way of knowing, so
> always returns
> > false.
> >      *
> >      * @param dir a directory
> >      * @return <code>false</code> always
> >      */
> >     public boolean isFloppyDrive(File dir) {
> >         return false;
> >     }
> >
> >     /**
> >      * Used by UI classes to decide whether to display a special icon
> >      * for a computer node, e.g. "My Computer" or a network server.
> >      *
> >      * The default implementation has no way of knowing, so
> always returns
> > false.
> >      *
> >      * @param dir a directory
> >      * @return <code>false</code> always
> >      */
> >     public boolean isComputerNode(File dir) {
> >         return false;
> >     }
> >
> >     // Providing default implementations for the remaining methods
> >     // because most OS file systems will likely be able to use this
> >     // code. If a given OS can't, override these methods in its
> >     // implementation.
> >
> >     public File getHomeDirectory() {
> >         return this.homedir;
> >     }
> >
> >     /**
> >      * Return the user's default starting directory for the
> file chooser.
> >      *
> >      * @return a <code>File</code> object representing the default
> >      *         starting folder
> >      */
> >     public File getDefaultDirectory() {
> >         return this.homedir;
> >     }
> >
> >
> >     /**
> >      * Gets the list of shown (i.e. not hidden) files.
> >      */
> >     public File[] getFiles(File dir, boolean useFileHiding) {
> >         try {
> >
> >             String filenames[] = null;
> >             WebdavFile files[] = null;
> >             HttpURL url = null;
> >             String path = null;
> >
> >             this.connect();
> >             // Now we try to list files
> >
> >             path = dir.getPath( );
> >             System.out.println( "getFiles : RAW PATH : '" +
> path + "'" );
> >
> >             // If path contains the server preamble, we need to
> extract that
> >             // and have the path only
> >             if ( path.startsWith( "http" ) ) {
> >                 System.out.println( "getFiles : preample : " +
> this.uri );
> >                 path = path.replaceAll(this.uri, "" );
> >             }
> >             if ( !path.endsWith("/") ) {
> >                 path = path + "/";
> >             }
> >
> >             System.out.println( "getFiles : path : " + path );
> >
> >
> >
> >
> >
> >
> >
> >             this.webdavResource.setPath( path );
> >             filenames = this.webdavResource.list();
> >             files = new WebdavFile[filenames.length];
> >             for ( int i = 0; i < filenames.length; i++ ) {
> >                 System.out.println( "file : " + filenames[i] );
> >                 // Lets try to construct a uri from the dir
> >                 // given and the current file
> >
> >                 String filepath = dir.getPath() + filenames[i];
> >                 System.out.println( "getFiles : file fullpath : " +
> > filepath );
> >                 url = this.uriToHttpURL( filepath );
> >                 // Need to add user info so has access for queries
> >                 url.setUserinfo( username, password );
> >                 files[i] = new WebdavFile( url );
> >             }
> >             return files;
> >         }
> >         catch ( Exception e ) {
> >             System.err.println( e.toString() );
> >             e.printStackTrace( );
> >             return null;
> >         }
> >         finally {
> >             this.disconnect();
> >         }
> >     }
> >
> >
> >
> >     /**
> >      * Returns the parent directory of <code>dir</code>.
> >      * @param dir the <code>File</code> being queried
> >      * @return the parent directory of <code>dir</code>, or
> >      *   <code>null</code> if <code>dir</code> is <code>null</code>
> >      */
> >     public File getParentDirectory(File dir) {
> >         System.out.println( "dir : " + dir );
> >         if ( dir == null ) {
> >             return null;
> >         }
> >         else if ( dir.equals(this.homedir) ) {
> >             return this.homedir;
> >         }
> >         else {
> >             System.out.println( "getParentFile : " +
> dir.getParentFile( ) );
> >             return dir.getParentFile();
> >         }
> >     }
> >
> >     /**
> >      * Creates a new <code>File</code> object for <code>f</code> with
> > correct
> >      * behavior for a file system root directory.
> >      *
> >      * @param f a <code>File</code> object representing a file
> system root
> >      *		directory, for example "/" on Unix or "C:\"
> on Windows.
> >      * @return a new <code>File</code> object
> >      */
> >     protected File createFileSystemRoot(File f) {
> >         return new FileSystemRoot(f);
> >     }
> >
> >     static class WebdavFile extends org.apache.webdav.lib.WebdavFile {
> >         public WebdavFile( HttpURL httpUrl ) throws URIException {
> >             super( httpUrl );
> >         }
> >         public String getName() {
> >             String name = null;
> >
> >             // Get the base name
> >             name = super.getName( );
> >
> >             // If is a directory, we need to add a trailing slash
> >             if ( this.isDirectory() ) {
> >                 name = name + "/";
> >             }
> >             return name;
> >         }
> >         public boolean isDirectory ( )
> >         {
> >             System.out.println ( "isDirectory : " + this.getPath() );
> >
> >             return super.isDirectory();
> >         }
> > //        public String getPath ( )
> > //        {
> > //            String path = null;
> > //
> > //            // Get the base name
> > //            path = super.getName( );
> > //
> > //            // If is a directory, we need to add a trailing slash
> > //            if ( this.isDirectory() ) {
> > //                path = path + "/";
> > //            }
> > //            System.out.println ( "WebdavFile getPath : " + path );
> > //            return path;
> > //        }
> >
> >     }
> >
> >
> >
> >     static class FileSystemRoot extends File {
> >         public FileSystemRoot(File f) {
> >             super(f,"");
> >         }
> >
> >         public FileSystemRoot(String s) {
> >             super(s);
> >         }
> >
> >         public boolean isDirectory() {
> >             return true;
> >         }
> >
> >         public String getName() {
> >             return getPath();
> >         }
> >     }
> >     // Test code
> >     public static void main( String args[] ) throws Exception {
> >         JFrame frame = null;
> >
> >         // Setup
> >         JFileChooser fc = new JFileChooser(new WebDAVFileSystemView(
> > "http://139.191.67.52:8080", "/slide/files", "root", "" ) );
> >         frame = new JFrame( );
> >         fc.showOpenDialog(frame);
> >     }
> >
> > }
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: slide-dev-help@jakarta.apache.org
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org


RE: org.apache.webdav.lib.WebdavException when calling WebdavFIle.isDirectory ( )

Posted by Paul Hussein <pa...@jrc.it>.
Thanks for the prompt reply.

It must be the multithrteaded nature, as I have substituted for some thread
safe code in the call and its now ok.

I agree, WebdavFile does need some work, but its a useful starting point!


Cheers


Paul.

> -----Original Message-----
> From: Ingo Brunberg [mailto:ib@fiz-chemie.de]
> Sent: Friday, June 11, 2004 4:12 PM
> To: slide-dev@jakarta.apache.org
> Subject: Re: org.apache.webdav.lib.WebdavException when calling
> WebdavFIle.isDirectory ( )
>
>
> WebdavResource (also WebdavFile) is using the
> SimpleHttpConnectionManager of Httpclient, not the
> MultithreadedConnectionManager. So you would run into a real problem
> if you tried to use it in a multithreaded program with simultaneous
> access.
>
> Are you sure that JFileChooser makes filesystem calls from multiple
> threads on its own? That would be a strong reason to switch to
> MultithreadedConnectionManager.
>
> Btw., I noticed that WebdavFile urgently needs some work. Against my
> advice it creates a new WebdavResource and hence a new connection for
> nearly every method call. So if you experience performance problems
> you should know that there is room for optimizations.
>
> Ingo
>
> > Hi,
> >
> >
> > COuld someone explain why i get
> >
> > org.apache.webdav.lib.WebdavException: Address already in use: connect
> >
> > When a multithreaded program ( JFIleChooser ) tries to query the same
> > directory simultaneously ( I am guessing ).
> >
> >
> > Cheers
> >
> >
> > Paul.
> >
> >
> > package it.jrc.compass.webdav;
> >
> > import java.io.File;
> > import java.io.IOException;
> > /*
> >  * WebDAVFileSystemView.java
> >  *
> >  * Created on May 13, 2004, 8:55 AM
> >  */
> >
> > import javax.swing.JFileChooser;
> > import javax.swing.JFrame;
> > import javax.swing.UIManager;
> > import javax.swing.filechooser.FileSystemView;
> > import org.apache.commons.httpclient.HttpURL;
> > import org.apache.commons.httpclient.HttpsURL;
> > import org.apache.commons.httpclient.URIException;
> > import org.apache.webdav.lib.WebdavResource;
> >
> > /**
> >  *
> >  * @author  hussepa
> >  */
> > public class WebDAVFileSystemView extends FileSystemView {
> >
> >
> >     /** The WebDAV resource. */
> >     private WebdavResource webdavResource = null;
> >     private HttpURL rootURL = null;
> >     private WebdavFile homedir = null;
> >     private String username = null;
> >     private String password = null;
> >     private String uri = null;
> >     private String rootPath = null;
> >
> >     private static final String newFolderString =
> > UIManager.getString("FileChooser.other.newFolder");
> >     static FileSystemView fsv = null;
> >
> >
> >     public WebDAVFileSystemView( String uri, String rootPath, String
> > username, String password ) throws java.lang.IllegalAccessError,
> > URIException {
> >         try {
> >             this.rootURL = this.uriToHttpURL( uri + rootPath );
> >             this.uri = uri;
> >             this.rootURL.setUserinfo( username, password );
> >             this.username = username;
> >             this.password = password;
> >             this.rootPath = rootPath;
> >
> >
> >             this.connect();
> >             System.out.println( "Connected successfully to  : " +
> > this.rootURL );
> >             this.disconnect( );
> >
> >             // Create home directory object
> >             this.homedir = new WebdavFile( this.rootURL );
> >             System.out.println( "Homedir : " + this.homedir );
> >         }
> >         catch ( java.lang.IllegalAccessError e ) {
> >             System.err.println( e.toString() );
> >             e.printStackTrace( );
> >             throw e;
> >         }
> >
> >     }
> >
> >     private static HttpURL uriToHttpURL(String uri) throws
> URIException {
> >         HttpURL url = null;
> >         if (uri.startsWith("http://")) {
> >             url = new HttpURL(uri);
> >         }else if (uri.startsWith("https://")) {
> >             url = new HttpsURL(uri);
> >         } else {
> >             throw new URIException("Unknown protocol in URL " + uri);
> >         }
> >         return url;
> >     }
> >
> >     public void disconnect() throws java.lang.UnknownError {
> >         try {
> >             this.webdavResource.close();
> >         }
> >         catch ( Exception e ) {
> >             System.out.println( e.toString() );
> >             throw new UnknownError( );
> >         }
> >     }
> >     public void connect( ) throws java.lang.IllegalAccessError {
> >         try {
> >
> >             this.webdavResource = new WebdavResource( this.rootURL );
> >         }
> >         catch ( Exception e ) {
> >             System.err.println( e.toString() );
> >             throw new IllegalAccessError( );
> >         }
> >     }
> >
> >     public static FileSystemView getFileSystemView() {
> >         try {
> >             if(fsv == null) {
> >                 fsv = new WebDAVFileSystemView( "http://127.0.0.1",
> > "/WebDAV", "",  "");
> >             }
> >             return fsv;
> >         }
> >         catch ( Exception e ) {
> >             System.err.println( e.toString() );
> >             return null;
> >         }
> >
> >     }
> >
> >     /**
> >      * Returns a File object constructed in dir from the given filename.
> >      */
> >     public File createFileObject(File dir, String filename) {
> >         File file = null;
> >         if(dir == null) {
> >             file = new File(filename);
> >         } else {
> >             file = new File(dir, filename);
> >         }
> >         return file;
> >     }
> >
> >     /**
> >      * Returns a File object constructed from the given path string.
> >      */
> >     public File createFileObject(String path) {
> >         File f = new File(path);
> >         if (isFileSystemRoot(f)) {
> >             f = createFileSystemRoot(f);
> >         }
> >         return f;
> >     }
> >
> >
> >     /**
> >      * Creates a new folder with a default folder name.
> >      */
> >     public File createNewFolder(File containingDir) throws IOException {
> >         try {
> >             if(containingDir == null) {
> >                 throw new IOException("Containing directory is null:");
> >             }
> >             WebdavFile newFolder = null;
> >             HttpURL url = null;
> >
> >             url = this.uriToHttpURL( containingDir.getPath() +
> > WebdavFile.davSeparator + newFolderString );
> >             // Need to add user info so has access for queries
> >             url.setUserinfo( username, password );
> >             newFolder = new WebdavFile( url );
> >             System.out.println( "new folder : " +
> newFolder.toString( ) );
> >
> >             this.connect( );
> >             if ( this.webdavResource.mkcolMethod(
> > newFolder.getAbsolutePath() ) ) {
> >                 System.out.println("succeeded.");
> >                 return newFolder;
> >             } else {
> >                 System.err.println("failed.");
> >
> System.err.println(this.webdavResource.getStatusMessage());
> >                 throw new IOException(
> > this.webdavResource.getStatusMessage() );
> >             }
> >         }
> >         catch ( IOException e ) {
> >             throw e;
> >         }
> >         catch ( Exception e ) {
> >             System.err.println( e.toString() );
> >             e.printStackTrace( );
> >             return null;
> >         }
> >         finally {
> >             this.disconnect();
> >         }
> >     }
> >     /**
> >      * Returns all root partitions on this system. For example, on
> >      * Windows, this would be the "Desktop" folder, while on DOS this
> >      * would be the A: through Z: drives.
> >      */
> >     public File[] getRoots() {
> >         try {
> >             return new WebdavFile[] { this.homedir };
> >         }
> >         catch ( Exception e ) {
> >             System.err.println( e.toString() );
> >             e.printStackTrace( );
> >             return null;
> >         }
> >     }
> >
> >
> >     /**
> >      * Returns true if the file (directory) can be visited.
> >      * Returns false if the directory cannot be traversed.
> >      *
> >      * @param f the <code>File</code>
> >      * @return <code>true</code> if the file/directory can be traversed,
> > otherwise <code>false</code>
> >      * @see JFileChooser#isTraversable
> >      * @see FileView#isTraversable
> >      */
> >     public Boolean isTraversable(File f) {
> >         try {
> > //            System.out.println( "isTraversable : " + f.getPath( ) );
> > //            WebdavFile webdavFile = null;
> > //            this.connect();
> > //            webdavFile = ( WebdavFile ) f;
> > //            this.webdavResource.setHttpURL( new HttpURL(
> >  f.getPath( ) ) );
> > //            System.out.println( this.webdavResource.getPath( ) + " :
> > collection : " + this.webdavResource.isCollection() );
> > //            return Boolean.valueOf(
> this.webdavResource.isCollection() );
> >             return Boolean.valueOf( f.isDirectory() );
> >         }
> >         catch ( Exception e ) {
> >             System.err.println( e.toString() );
> >             e.printStackTrace( );
> >             return Boolean.valueOf( false );
> >         }
> >         finally {
> >             this.disconnect();
> >         }
> >     }
> >
> >     /**
> >      * Name of a file, directory, or folder as it would be displayed in
> >      * a system file browser. Example from Windows: the "M:\" directory
> >      * displays as "CD-ROM (M:)"
> >      *
> >      * The default implementation gets information from the ShellFolder
> > class.
> >      *
> >      * @param f a <code>File</code> object
> >      * @return the file name as it would be displayed by a native file
> > chooser
> >      * @see JFileChooser#getName
> >      */
> >     public String getSystemDisplayName(File f) {
> >         try {
> >             WebdavFile wdf = null;
> >             wdf = ( WebdavFile ) f;
> >             System.out.println( "getSystemDisplayName : getName
>          : "
> > + f.getName() );
> >             System.out.println( "getSystemDisplayName :
> getAbsolutePath  : "
> > + f.getAbsolutePath() );
> >             System.out.println( "getSystemDisplayName :
> getCanonicalPath : "
> > + f.getCanonicalPath() );
> >             System.out.println( "getSystemDisplayName : getPath
>          : "
> > + f.getPath( ) );
> >             return f.getName( );
> >         }
> >         catch ( Exception e ) {
> >             System.err.println( e.toString() );
> >             e.printStackTrace( );
> >             return null;
> >         }
> >         finally {
> >             this.disconnect();
> >         }
> >     }
> >
> >     /**
> >      * Type description for a file, directory, or folder as it would be
> > displayed in
> >      * a system file browser. Example from Windows: the "Desktop" folder
> >      * is desribed as "Desktop".
> >      *
> >      * Override for platforms with native ShellFolder implementations.
> >      *
> >      * @param f a <code>File</code> object
> >      * @return the file type description as it would be displayed by a
> > native file chooser
> >      * or null if no native information is available.
> >      * @see JFileChooser#getTypeDescription
> >      */
> >     public String getSystemTypeDescription(File f) {
> >         return null;
> >     }
> >
> >
> >
> >     /**
> >      * Checks if <code>f</code> represents a real directory or file as
> > opposed to a
> >      * special folder such as <code>"Desktop"</code>. Used by
> UI classes to
> > decide if
> >      * a folder is selectable when doing directory choosing.
> >      *
> >      * @param f a <code>File</code> object
> >      * @return <code>true</code> if <code>f</code> is a real file or
> > directory.
> >      */
> >     public boolean isFileSystem(File f) {
> >         return true;
> >     }
> >
> >
> >     /**
> >      * Returns whether a file is hidden or not.
> >      */
> >     public boolean isHiddenFile(File f) {
> >         return f.isHidden();
> >     }
> >
> >
> >     /**
> >      * Is dir the root of a tree in the file system, such as a drive
> >      * or partition. Example: Returns true for "C:\" on Windows 98.
> >      *
> >      * @param f a <code>File</code> object representing a directory
> >      * @return <code>true</code> if <code>f</code> is a root of
> a filesystem
> >      * @see #isRoot
> >      */
> >     public boolean isFileSystemRoot(File dir) {
> >         try {
> >             return ( rootURL.getPath().equals( dir.getPath( ) ) );
> >         }
> >         catch ( Exception e ) {
> >             System.out.println( "isFileSystemRoot" + e.toString( ) );
> >             e.printStackTrace( );
> >             return false;
> >         }
> >     }
> >
> >     /**
> >      * Used by UI classes to decide whether to display a special icon
> >      * for drives or partitions, e.g. a "hard disk" icon.
> >      *
> >      * The default implementation has no way of knowing, so
> always returns
> > false.
> >      *
> >      * @param dir a directory
> >      * @return <code>false</code> always
> >      */
> >     public boolean isDrive(File dir) {
> >         return false;
> >     }
> >
> >     /**
> >      * Used by UI classes to decide whether to display a special icon
> >      * for a floppy disk. Implies isDrive(dir).
> >      *
> >      * The default implementation has no way of knowing, so
> always returns
> > false.
> >      *
> >      * @param dir a directory
> >      * @return <code>false</code> always
> >      */
> >     public boolean isFloppyDrive(File dir) {
> >         return false;
> >     }
> >
> >     /**
> >      * Used by UI classes to decide whether to display a special icon
> >      * for a computer node, e.g. "My Computer" or a network server.
> >      *
> >      * The default implementation has no way of knowing, so
> always returns
> > false.
> >      *
> >      * @param dir a directory
> >      * @return <code>false</code> always
> >      */
> >     public boolean isComputerNode(File dir) {
> >         return false;
> >     }
> >
> >     // Providing default implementations for the remaining methods
> >     // because most OS file systems will likely be able to use this
> >     // code. If a given OS can't, override these methods in its
> >     // implementation.
> >
> >     public File getHomeDirectory() {
> >         return this.homedir;
> >     }
> >
> >     /**
> >      * Return the user's default starting directory for the
> file chooser.
> >      *
> >      * @return a <code>File</code> object representing the default
> >      *         starting folder
> >      */
> >     public File getDefaultDirectory() {
> >         return this.homedir;
> >     }
> >
> >
> >     /**
> >      * Gets the list of shown (i.e. not hidden) files.
> >      */
> >     public File[] getFiles(File dir, boolean useFileHiding) {
> >         try {
> >
> >             String filenames[] = null;
> >             WebdavFile files[] = null;
> >             HttpURL url = null;
> >             String path = null;
> >
> >             this.connect();
> >             // Now we try to list files
> >
> >             path = dir.getPath( );
> >             System.out.println( "getFiles : RAW PATH : '" +
> path + "'" );
> >
> >             // If path contains the server preamble, we need to
> extract that
> >             // and have the path only
> >             if ( path.startsWith( "http" ) ) {
> >                 System.out.println( "getFiles : preample : " +
> this.uri );
> >                 path = path.replaceAll(this.uri, "" );
> >             }
> >             if ( !path.endsWith("/") ) {
> >                 path = path + "/";
> >             }
> >
> >             System.out.println( "getFiles : path : " + path );
> >
> >
> >
> >
> >
> >
> >
> >             this.webdavResource.setPath( path );
> >             filenames = this.webdavResource.list();
> >             files = new WebdavFile[filenames.length];
> >             for ( int i = 0; i < filenames.length; i++ ) {
> >                 System.out.println( "file : " + filenames[i] );
> >                 // Lets try to construct a uri from the dir
> >                 // given and the current file
> >
> >                 String filepath = dir.getPath() + filenames[i];
> >                 System.out.println( "getFiles : file fullpath : " +
> > filepath );
> >                 url = this.uriToHttpURL( filepath );
> >                 // Need to add user info so has access for queries
> >                 url.setUserinfo( username, password );
> >                 files[i] = new WebdavFile( url );
> >             }
> >             return files;
> >         }
> >         catch ( Exception e ) {
> >             System.err.println( e.toString() );
> >             e.printStackTrace( );
> >             return null;
> >         }
> >         finally {
> >             this.disconnect();
> >         }
> >     }
> >
> >
> >
> >     /**
> >      * Returns the parent directory of <code>dir</code>.
> >      * @param dir the <code>File</code> being queried
> >      * @return the parent directory of <code>dir</code>, or
> >      *   <code>null</code> if <code>dir</code> is <code>null</code>
> >      */
> >     public File getParentDirectory(File dir) {
> >         System.out.println( "dir : " + dir );
> >         if ( dir == null ) {
> >             return null;
> >         }
> >         else if ( dir.equals(this.homedir) ) {
> >             return this.homedir;
> >         }
> >         else {
> >             System.out.println( "getParentFile : " +
> dir.getParentFile( ) );
> >             return dir.getParentFile();
> >         }
> >     }
> >
> >     /**
> >      * Creates a new <code>File</code> object for <code>f</code> with
> > correct
> >      * behavior for a file system root directory.
> >      *
> >      * @param f a <code>File</code> object representing a file
> system root
> >      *		directory, for example "/" on Unix or "C:\"
> on Windows.
> >      * @return a new <code>File</code> object
> >      */
> >     protected File createFileSystemRoot(File f) {
> >         return new FileSystemRoot(f);
> >     }
> >
> >     static class WebdavFile extends org.apache.webdav.lib.WebdavFile {
> >         public WebdavFile( HttpURL httpUrl ) throws URIException {
> >             super( httpUrl );
> >         }
> >         public String getName() {
> >             String name = null;
> >
> >             // Get the base name
> >             name = super.getName( );
> >
> >             // If is a directory, we need to add a trailing slash
> >             if ( this.isDirectory() ) {
> >                 name = name + "/";
> >             }
> >             return name;
> >         }
> >         public boolean isDirectory ( )
> >         {
> >             System.out.println ( "isDirectory : " + this.getPath() );
> >
> >             return super.isDirectory();
> >         }
> > //        public String getPath ( )
> > //        {
> > //            String path = null;
> > //
> > //            // Get the base name
> > //            path = super.getName( );
> > //
> > //            // If is a directory, we need to add a trailing slash
> > //            if ( this.isDirectory() ) {
> > //                path = path + "/";
> > //            }
> > //            System.out.println ( "WebdavFile getPath : " + path );
> > //            return path;
> > //        }
> >
> >     }
> >
> >
> >
> >     static class FileSystemRoot extends File {
> >         public FileSystemRoot(File f) {
> >             super(f,"");
> >         }
> >
> >         public FileSystemRoot(String s) {
> >             super(s);
> >         }
> >
> >         public boolean isDirectory() {
> >             return true;
> >         }
> >
> >         public String getName() {
> >             return getPath();
> >         }
> >     }
> >     // Test code
> >     public static void main( String args[] ) throws Exception {
> >         JFrame frame = null;
> >
> >         // Setup
> >         JFileChooser fc = new JFileChooser(new WebDAVFileSystemView(
> > "http://139.191.67.52:8080", "/slide/files", "root", "" ) );
> >         frame = new JFrame( );
> >         fc.showOpenDialog(frame);
> >     }
> >
> > }
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: slide-dev-help@jakarta.apache.org
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org


Re: org.apache.webdav.lib.WebdavException when calling WebdavFIle.isDirectory ( )

Posted by Ingo Brunberg <ib...@fiz-chemie.de>.
WebdavResource (also WebdavFile) is using the
SimpleHttpConnectionManager of Httpclient, not the
MultithreadedConnectionManager. So you would run into a real problem
if you tried to use it in a multithreaded program with simultaneous
access.

Are you sure that JFileChooser makes filesystem calls from multiple
threads on its own? That would be a strong reason to switch to
MultithreadedConnectionManager.

Btw., I noticed that WebdavFile urgently needs some work. Against my
advice it creates a new WebdavResource and hence a new connection for
nearly every method call. So if you experience performance problems
you should know that there is room for optimizations.

Ingo

> Hi,
> 
> 
> COuld someone explain why i get
> 
> org.apache.webdav.lib.WebdavException: Address already in use: connect
> 
> When a multithreaded program ( JFIleChooser ) tries to query the same
> directory simultaneously ( I am guessing ).
> 
> 
> Cheers
> 
> 
> Paul.
> 
> 
> package it.jrc.compass.webdav;
> 
> import java.io.File;
> import java.io.IOException;
> /*
>  * WebDAVFileSystemView.java
>  *
>  * Created on May 13, 2004, 8:55 AM
>  */
> 
> import javax.swing.JFileChooser;
> import javax.swing.JFrame;
> import javax.swing.UIManager;
> import javax.swing.filechooser.FileSystemView;
> import org.apache.commons.httpclient.HttpURL;
> import org.apache.commons.httpclient.HttpsURL;
> import org.apache.commons.httpclient.URIException;
> import org.apache.webdav.lib.WebdavResource;
> 
> /**
>  *
>  * @author  hussepa
>  */
> public class WebDAVFileSystemView extends FileSystemView {
> 
> 
>     /** The WebDAV resource. */
>     private WebdavResource webdavResource = null;
>     private HttpURL rootURL = null;
>     private WebdavFile homedir = null;
>     private String username = null;
>     private String password = null;
>     private String uri = null;
>     private String rootPath = null;
> 
>     private static final String newFolderString =
> UIManager.getString("FileChooser.other.newFolder");
>     static FileSystemView fsv = null;
> 
> 
>     public WebDAVFileSystemView( String uri, String rootPath, String
> username, String password ) throws java.lang.IllegalAccessError,
> URIException {
>         try {
>             this.rootURL = this.uriToHttpURL( uri + rootPath );
>             this.uri = uri;
>             this.rootURL.setUserinfo( username, password );
>             this.username = username;
>             this.password = password;
>             this.rootPath = rootPath;
> 
> 
>             this.connect();
>             System.out.println( "Connected successfully to  : " +
> this.rootURL );
>             this.disconnect( );
> 
>             // Create home directory object
>             this.homedir = new WebdavFile( this.rootURL );
>             System.out.println( "Homedir : " + this.homedir );
>         }
>         catch ( java.lang.IllegalAccessError e ) {
>             System.err.println( e.toString() );
>             e.printStackTrace( );
>             throw e;
>         }
> 
>     }
> 
>     private static HttpURL uriToHttpURL(String uri) throws URIException {
>         HttpURL url = null;
>         if (uri.startsWith("http://")) {
>             url = new HttpURL(uri);
>         }else if (uri.startsWith("https://")) {
>             url = new HttpsURL(uri);
>         } else {
>             throw new URIException("Unknown protocol in URL " + uri);
>         }
>         return url;
>     }
> 
>     public void disconnect() throws java.lang.UnknownError {
>         try {
>             this.webdavResource.close();
>         }
>         catch ( Exception e ) {
>             System.out.println( e.toString() );
>             throw new UnknownError( );
>         }
>     }
>     public void connect( ) throws java.lang.IllegalAccessError {
>         try {
> 
>             this.webdavResource = new WebdavResource( this.rootURL );
>         }
>         catch ( Exception e ) {
>             System.err.println( e.toString() );
>             throw new IllegalAccessError( );
>         }
>     }
> 
>     public static FileSystemView getFileSystemView() {
>         try {
>             if(fsv == null) {
>                 fsv = new WebDAVFileSystemView( "http://127.0.0.1",
> "/WebDAV", "",  "");
>             }
>             return fsv;
>         }
>         catch ( Exception e ) {
>             System.err.println( e.toString() );
>             return null;
>         }
> 
>     }
> 
>     /**
>      * Returns a File object constructed in dir from the given filename.
>      */
>     public File createFileObject(File dir, String filename) {
>         File file = null;
>         if(dir == null) {
>             file = new File(filename);
>         } else {
>             file = new File(dir, filename);
>         }
>         return file;
>     }
> 
>     /**
>      * Returns a File object constructed from the given path string.
>      */
>     public File createFileObject(String path) {
>         File f = new File(path);
>         if (isFileSystemRoot(f)) {
>             f = createFileSystemRoot(f);
>         }
>         return f;
>     }
> 
> 
>     /**
>      * Creates a new folder with a default folder name.
>      */
>     public File createNewFolder(File containingDir) throws IOException {
>         try {
>             if(containingDir == null) {
>                 throw new IOException("Containing directory is null:");
>             }
>             WebdavFile newFolder = null;
>             HttpURL url = null;
> 
>             url = this.uriToHttpURL( containingDir.getPath() +
> WebdavFile.davSeparator + newFolderString );
>             // Need to add user info so has access for queries
>             url.setUserinfo( username, password );
>             newFolder = new WebdavFile( url );
>             System.out.println( "new folder : " + newFolder.toString( ) );
> 
>             this.connect( );
>             if ( this.webdavResource.mkcolMethod(
> newFolder.getAbsolutePath() ) ) {
>                 System.out.println("succeeded.");
>                 return newFolder;
>             } else {
>                 System.err.println("failed.");
>                 System.err.println(this.webdavResource.getStatusMessage());
>                 throw new IOException(
> this.webdavResource.getStatusMessage() );
>             }
>         }
>         catch ( IOException e ) {
>             throw e;
>         }
>         catch ( Exception e ) {
>             System.err.println( e.toString() );
>             e.printStackTrace( );
>             return null;
>         }
>         finally {
>             this.disconnect();
>         }
>     }
>     /**
>      * Returns all root partitions on this system. For example, on
>      * Windows, this would be the "Desktop" folder, while on DOS this
>      * would be the A: through Z: drives.
>      */
>     public File[] getRoots() {
>         try {
>             return new WebdavFile[] { this.homedir };
>         }
>         catch ( Exception e ) {
>             System.err.println( e.toString() );
>             e.printStackTrace( );
>             return null;
>         }
>     }
> 
> 
>     /**
>      * Returns true if the file (directory) can be visited.
>      * Returns false if the directory cannot be traversed.
>      *
>      * @param f the <code>File</code>
>      * @return <code>true</code> if the file/directory can be traversed,
> otherwise <code>false</code>
>      * @see JFileChooser#isTraversable
>      * @see FileView#isTraversable
>      */
>     public Boolean isTraversable(File f) {
>         try {
> //            System.out.println( "isTraversable : " + f.getPath( ) );
> //            WebdavFile webdavFile = null;
> //            this.connect();
> //            webdavFile = ( WebdavFile ) f;
> //            this.webdavResource.setHttpURL( new HttpURL(
>  f.getPath( ) ) );
> //            System.out.println( this.webdavResource.getPath( ) + " :
> collection : " + this.webdavResource.isCollection() );
> //            return Boolean.valueOf( this.webdavResource.isCollection() );
>             return Boolean.valueOf( f.isDirectory() );
>         }
>         catch ( Exception e ) {
>             System.err.println( e.toString() );
>             e.printStackTrace( );
>             return Boolean.valueOf( false );
>         }
>         finally {
>             this.disconnect();
>         }
>     }
> 
>     /**
>      * Name of a file, directory, or folder as it would be displayed in
>      * a system file browser. Example from Windows: the "M:\" directory
>      * displays as "CD-ROM (M:)"
>      *
>      * The default implementation gets information from the ShellFolder
> class.
>      *
>      * @param f a <code>File</code> object
>      * @return the file name as it would be displayed by a native file
> chooser
>      * @see JFileChooser#getName
>      */
>     public String getSystemDisplayName(File f) {
>         try {
>             WebdavFile wdf = null;
>             wdf = ( WebdavFile ) f;
>             System.out.println( "getSystemDisplayName : getName          : "
> + f.getName() );
>             System.out.println( "getSystemDisplayName : getAbsolutePath  : "
> + f.getAbsolutePath() );
>             System.out.println( "getSystemDisplayName : getCanonicalPath : "
> + f.getCanonicalPath() );
>             System.out.println( "getSystemDisplayName : getPath          : "
> + f.getPath( ) );
>             return f.getName( );
>         }
>         catch ( Exception e ) {
>             System.err.println( e.toString() );
>             e.printStackTrace( );
>             return null;
>         }
>         finally {
>             this.disconnect();
>         }
>     }
> 
>     /**
>      * Type description for a file, directory, or folder as it would be
> displayed in
>      * a system file browser. Example from Windows: the "Desktop" folder
>      * is desribed as "Desktop".
>      *
>      * Override for platforms with native ShellFolder implementations.
>      *
>      * @param f a <code>File</code> object
>      * @return the file type description as it would be displayed by a
> native file chooser
>      * or null if no native information is available.
>      * @see JFileChooser#getTypeDescription
>      */
>     public String getSystemTypeDescription(File f) {
>         return null;
>     }
> 
> 
> 
>     /**
>      * Checks if <code>f</code> represents a real directory or file as
> opposed to a
>      * special folder such as <code>"Desktop"</code>. Used by UI classes to
> decide if
>      * a folder is selectable when doing directory choosing.
>      *
>      * @param f a <code>File</code> object
>      * @return <code>true</code> if <code>f</code> is a real file or
> directory.
>      */
>     public boolean isFileSystem(File f) {
>         return true;
>     }
> 
> 
>     /**
>      * Returns whether a file is hidden or not.
>      */
>     public boolean isHiddenFile(File f) {
>         return f.isHidden();
>     }
> 
> 
>     /**
>      * Is dir the root of a tree in the file system, such as a drive
>      * or partition. Example: Returns true for "C:\" on Windows 98.
>      *
>      * @param f a <code>File</code> object representing a directory
>      * @return <code>true</code> if <code>f</code> is a root of a filesystem
>      * @see #isRoot
>      */
>     public boolean isFileSystemRoot(File dir) {
>         try {
>             return ( rootURL.getPath().equals( dir.getPath( ) ) );
>         }
>         catch ( Exception e ) {
>             System.out.println( "isFileSystemRoot" + e.toString( ) );
>             e.printStackTrace( );
>             return false;
>         }
>     }
> 
>     /**
>      * Used by UI classes to decide whether to display a special icon
>      * for drives or partitions, e.g. a "hard disk" icon.
>      *
>      * The default implementation has no way of knowing, so always returns
> false.
>      *
>      * @param dir a directory
>      * @return <code>false</code> always
>      */
>     public boolean isDrive(File dir) {
>         return false;
>     }
> 
>     /**
>      * Used by UI classes to decide whether to display a special icon
>      * for a floppy disk. Implies isDrive(dir).
>      *
>      * The default implementation has no way of knowing, so always returns
> false.
>      *
>      * @param dir a directory
>      * @return <code>false</code> always
>      */
>     public boolean isFloppyDrive(File dir) {
>         return false;
>     }
> 
>     /**
>      * Used by UI classes to decide whether to display a special icon
>      * for a computer node, e.g. "My Computer" or a network server.
>      *
>      * The default implementation has no way of knowing, so always returns
> false.
>      *
>      * @param dir a directory
>      * @return <code>false</code> always
>      */
>     public boolean isComputerNode(File dir) {
>         return false;
>     }
> 
>     // Providing default implementations for the remaining methods
>     // because most OS file systems will likely be able to use this
>     // code. If a given OS can't, override these methods in its
>     // implementation.
> 
>     public File getHomeDirectory() {
>         return this.homedir;
>     }
> 
>     /**
>      * Return the user's default starting directory for the file chooser.
>      *
>      * @return a <code>File</code> object representing the default
>      *         starting folder
>      */
>     public File getDefaultDirectory() {
>         return this.homedir;
>     }
> 
> 
>     /**
>      * Gets the list of shown (i.e. not hidden) files.
>      */
>     public File[] getFiles(File dir, boolean useFileHiding) {
>         try {
> 
>             String filenames[] = null;
>             WebdavFile files[] = null;
>             HttpURL url = null;
>             String path = null;
> 
>             this.connect();
>             // Now we try to list files
> 
>             path = dir.getPath( );
>             System.out.println( "getFiles : RAW PATH : '" + path + "'" );
> 
>             // If path contains the server preamble, we need to extract that
>             // and have the path only
>             if ( path.startsWith( "http" ) ) {
>                 System.out.println( "getFiles : preample : " + this.uri );
>                 path = path.replaceAll(this.uri, "" );
>             }
>             if ( !path.endsWith("/") ) {
>                 path = path + "/";
>             }
> 
>             System.out.println( "getFiles : path : " + path );
> 
> 
> 
> 
> 
> 
> 
>             this.webdavResource.setPath( path );
>             filenames = this.webdavResource.list();
>             files = new WebdavFile[filenames.length];
>             for ( int i = 0; i < filenames.length; i++ ) {
>                 System.out.println( "file : " + filenames[i] );
>                 // Lets try to construct a uri from the dir
>                 // given and the current file
> 
>                 String filepath = dir.getPath() + filenames[i];
>                 System.out.println( "getFiles : file fullpath : " +
> filepath );
>                 url = this.uriToHttpURL( filepath );
>                 // Need to add user info so has access for queries
>                 url.setUserinfo( username, password );
>                 files[i] = new WebdavFile( url );
>             }
>             return files;
>         }
>         catch ( Exception e ) {
>             System.err.println( e.toString() );
>             e.printStackTrace( );
>             return null;
>         }
>         finally {
>             this.disconnect();
>         }
>     }
> 
> 
> 
>     /**
>      * Returns the parent directory of <code>dir</code>.
>      * @param dir the <code>File</code> being queried
>      * @return the parent directory of <code>dir</code>, or
>      *   <code>null</code> if <code>dir</code> is <code>null</code>
>      */
>     public File getParentDirectory(File dir) {
>         System.out.println( "dir : " + dir );
>         if ( dir == null ) {
>             return null;
>         }
>         else if ( dir.equals(this.homedir) ) {
>             return this.homedir;
>         }
>         else {
>             System.out.println( "getParentFile : " + dir.getParentFile( ) );
>             return dir.getParentFile();
>         }
>     }
> 
>     /**
>      * Creates a new <code>File</code> object for <code>f</code> with
> correct
>      * behavior for a file system root directory.
>      *
>      * @param f a <code>File</code> object representing a file system root
>      *		directory, for example "/" on Unix or "C:\" on Windows.
>      * @return a new <code>File</code> object
>      */
>     protected File createFileSystemRoot(File f) {
>         return new FileSystemRoot(f);
>     }
> 
>     static class WebdavFile extends org.apache.webdav.lib.WebdavFile {
>         public WebdavFile( HttpURL httpUrl ) throws URIException {
>             super( httpUrl );
>         }
>         public String getName() {
>             String name = null;
> 
>             // Get the base name
>             name = super.getName( );
> 
>             // If is a directory, we need to add a trailing slash
>             if ( this.isDirectory() ) {
>                 name = name + "/";
>             }
>             return name;
>         }
>         public boolean isDirectory ( )
>         {
>             System.out.println ( "isDirectory : " + this.getPath() );
> 
>             return super.isDirectory();
>         }
> //        public String getPath ( )
> //        {
> //            String path = null;
> //
> //            // Get the base name
> //            path = super.getName( );
> //
> //            // If is a directory, we need to add a trailing slash
> //            if ( this.isDirectory() ) {
> //                path = path + "/";
> //            }
> //            System.out.println ( "WebdavFile getPath : " + path );
> //            return path;
> //        }
> 
>     }
> 
> 
> 
>     static class FileSystemRoot extends File {
>         public FileSystemRoot(File f) {
>             super(f,"");
>         }
> 
>         public FileSystemRoot(String s) {
>             super(s);
>         }
> 
>         public boolean isDirectory() {
>             return true;
>         }
> 
>         public String getName() {
>             return getPath();
>         }
>     }
>     // Test code
>     public static void main( String args[] ) throws Exception {
>         JFrame frame = null;
> 
>         // Setup
>         JFileChooser fc = new JFileChooser(new WebDAVFileSystemView(
> "http://139.191.67.52:8080", "/slide/files", "root", "" ) );
>         frame = new JFrame( );
>         fc.showOpenDialog(frame);
>     }
> 
> }


---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org