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/14 11:36:51 UTC

Working JFileChooser

I have finally got a working JFileChooser implementation.

I believe the major bugs associated with it come from the multithreaded
calls to WebdavFile.


How do I go about checking the source into the slide cvs.

Am I allowed to do this. Can someone do this for me  ? Do I have to become a
slide developer ???




Cheers


Paul.







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 IllegalAccessError, URIException,
IOException {
        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, this.rootURL );
            System.out.println( "Homedir : " + this.homedir );
        }
        catch ( IllegalAccessError e ) {
            System.err.println( e.toString() );
            e.printStackTrace( );
            throw e;
        }
        catch ( URIException e ) {
            System.err.println( e.toString() );
            e.printStackTrace( );
            throw e;
        }
        catch ( IOException 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, this.rootURL );
            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;
            String localDir = 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

                localDir = dir.getPath();
                if ( !localDir.endsWith("/") ) localDir = localDir + "/";

                String filepath =  localDir + 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, this.rootURL );
            }
            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( "getParentDirectory : calling getParentFile
" + dir );
            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) {
        try {
            return new FileSystemRoot( ( WebdavFile ) f );

        }
        catch ( Exception e ) {
            System.err.println( "createFileSystemRoot : " + e.toString( ) );
            return null;
        }
    }

    static class WebdavFile extends org.apache.webdav.lib.WebdavFile {
        protected WebdavResource webdavResource = null;
        protected HttpURL rootUrl = null;

        public WebdavFile( HttpURL pathUrl, HttpURL rootUrl ) throws
URIException, IOException {
            super( pathUrl );
            this.webdavResource = new WebdavResource( pathUrl );
            this.rootUrl = rootUrl;
        }


        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 isRoot( ) {
            try {
                String path = null;
                String root = null;
                root =  this.rootUrl.getPath( );
                path = this.webdavResource.getHttpURL( ).getPath( );
                System.out.println( "isRoot : root : " + root );
                System.out.println( "isRoot : path : " + path );

                // If we are at the root already
                if ( root .equalsIgnoreCase( path ) ) {
                    System.out.println( "isRoot : we are at root" );
                    return true;
                } // otherwise call original
                else {
                    return false;
                }
            }
            catch ( Exception e ) {
                System.err.println( e.toString() );
                e.printStackTrace( );
                return false;
            }
        }
        public String getParent() {
            try {
                // If we are at the root already
                if ( this.isRoot( ) ) {
                    System.out.println( "getParentFile : we are at root" );
                    return null;
                } // otherwise call original
                else {

                    String escapedPath =
this.webdavResource.getHttpURL().getPath();
                    String parent = escapedPath.substring(
                    0, escapedPath.lastIndexOf('/', escapedPath.length() -
2) + 1);
                    System.out.println( "getParent : escapedPath : " +
escapedPath );
                    return super.getParent( );
                }
            }
            catch ( Exception e ) {
                System.err.println( e.toString() );
                e.printStackTrace( );
                return null;
            }
        }
        public File getParentFile( ) {
            try {
                HttpURL httpURL = null;
                String parent = null;
                parent = this.getParent();
                if ( parent == null ) {
                    System.out.println( "getParentFile : at root so return
null" );
                    return null;
                }
                else {
                    httpURL = this.rootUrl;
                    httpURL.setPath( parent );
                    System.out.println( "getParentFile : set path to " +
parent );
                    return new WebdavFile( httpURL, this.rootUrl );
                }
            }
            catch ( Exception e ) {
                System.err.println( e.toString() );
                e.printStackTrace( );
                return null;
            }

        }
        public boolean exists( ) {
            System.out.println( "exists : " + this.getPath() );
            return this.webdavResource.exists();
        }
        public boolean isDirectory( ) {
            System.out.println( "isDirectory : " + this.getPath()  + " : " +
this.webdavResource.isCollection( ) );
            return this.webdavResource.isCollection( );
        }
    }



    static class FileSystemRoot extends WebdavFile {

        public FileSystemRoot( HttpURL rootUrl ) throws URIException,
IOException {
            super( rootUrl, rootUrl );
        }
        public FileSystemRoot( WebdavFile webdavFile ) throws URIException,
IOException {
            super( webdavFile.rootUrl, webdavFile.rootUrl );
        }

    }
    // 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: Working JFileChooser

Posted by Paul Hussein <pa...@jrc.it>.
Hi,

Could you checkin this new version of the code. I fixed the multithreaded
problem in the chooser itself.


This should be the last version.


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 IllegalAccessError, URIException,
IOException {
        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, this.rootURL );
            System.out.println( "Homedir : " + this.homedir );
        }
        catch ( IllegalAccessError e ) {
            System.err.println( e.toString() );
            e.printStackTrace( );
            throw e;
        }
        catch ( URIException e ) {
            System.err.println( e.toString() );
            e.printStackTrace( );
            throw e;
        }
        catch ( IOException 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, this.rootURL );
            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 synchronized File[] getFiles(File dir, boolean useFileHiding) {
        try {

            String filenames[] = null;
            WebdavFile files[] = null;
            HttpURL url = null;
            String path = null;
            String localDir = 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();
            System.out.println( "filenames : " + filenames.length );
            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

                localDir = dir.getPath();
                if ( !localDir.endsWith("/") ) localDir = localDir + "/";

                String filepath =  localDir + 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, this.rootURL );
            }
            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( "getParentDirectory : calling getParentFile
" + dir );
            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) {
        try {
            return new FileSystemRoot( ( WebdavFile ) f );

        }
        catch ( Exception e ) {
            System.err.println( "createFileSystemRoot : " + e.toString( ) );
            return null;
        }
    }

    public static class WebdavFile extends org.apache.webdav.lib.WebdavFile
{
        protected WebdavResource webdavResource = null;
        protected HttpURL rootUrl = null;

        public WebdavFile( HttpURL pathUrl, HttpURL rootUrl ) throws
URIException, IOException {
            super( pathUrl );
            this.webdavResource = new WebdavResource( pathUrl );
            this.rootUrl = rootUrl;
        }


        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 isRoot( ) {
            try {
                String path = null;
                String root = null;
                root =  this.rootUrl.getPath( );
                path = this.webdavResource.getHttpURL( ).getPath( );
                System.out.println( "isRoot : root : " + root );
                System.out.println( "isRoot : path : " + path );

                // If we are at the root already
                if ( root .equalsIgnoreCase( path ) ) {
                    System.out.println( "isRoot : we are at root" );
                    return true;
                } // otherwise call original
                else {
                    return false;
                }
            }
            catch ( Exception e ) {
                System.err.println( e.toString() );
                e.printStackTrace( );
                return false;
            }
        }
        public String getParent() {
            try {
                // If we are at the root already
                if ( this.isRoot( ) ) {
                    System.out.println( "getParentFile : we are at root" );
                    return null;
                } // otherwise call original
                else {

                    String escapedPath =
this.webdavResource.getHttpURL().getPath();
                    String parent = escapedPath.substring(
                    0, escapedPath.lastIndexOf('/', escapedPath.length() -
2) + 1);
                    System.out.println( "getParent : escapedPath : " +
escapedPath );
                    return super.getParent( );
                }
            }
            catch ( Exception e ) {
                System.err.println( e.toString() );
                e.printStackTrace( );
                return null;
            }
        }
        public File getParentFile( ) {
            try {
                HttpURL httpURL = null;
                String parent = null;
                parent = this.getParent();
                if ( parent == null ) {
                    System.out.println( "getParentFile : at root so return
null" );
                    return null;
                }
                else {
                    httpURL = this.rootUrl;
                    httpURL.setPath( parent );
                    System.out.println( "getParentFile : set path to " +
parent );
                    return new WebdavFile( httpURL, this.rootUrl );
                }
            }
            catch ( Exception e ) {
                System.err.println( e.toString() );
                e.printStackTrace( );
                return null;
            }

        }
        public boolean exists( ) {
            System.out.println( "exists : " + this.getPath() );
            return this.webdavResource.exists();
        }
        public boolean isDirectory( ) {
            System.out.println( "isDirectory : " + this.getPath()  + " : " +
this.webdavResource.isCollection( ) );
            return this.webdavResource.isCollection( );
        }
    }



    static class FileSystemRoot extends WebdavFile {

        public FileSystemRoot( HttpURL rootUrl ) throws URIException,
IOException {
            super( rootUrl, rootUrl );
        }
        public FileSystemRoot( WebdavFile webdavFile ) throws URIException,
IOException {
            super( webdavFile.rootUrl, webdavFile.rootUrl );
        }

    }
    // 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", "root" ) );
        frame = new JFrame( );
        int returnVal = fc.showOpenDialog(frame);
        if(returnVal == JFileChooser.APPROVE_OPTION) {
            System.out.println("You chose to open this file: " +
fc.getSelectedFile().getPath());
        }
    }

}


> -----Original Message-----
> From: Ingo Brunberg [mailto:ib@fiz-chemie.de]
> Sent: Monday, June 14, 2004 12:21 PM
> To: slide-dev@jakarta.apache.org
> Subject: Re: Working JFileChooser
>
>
> Great news. I will take care of checking it in.
>
> Perhaps we should put it at org.apache.webdav.ui.WebdavSystemView
> because that was the name of a former attempt and it sounds quite
> reasonable in my opinion.
>
> I hope you don't mind if I comment out the println statements.
>
> Regards,
> Ingo
>
> > I have finally got a working JFileChooser implementation.
> >
> > I believe the major bugs associated with it come from the multithreaded
> > calls to WebdavFile.
> >
> >
> > How do I go about checking the source into the slide cvs.
> >
> > Am I allowed to do this. Can someone do this for me  ? Do I
> have to become a
> > slide developer ???
> >
> >
> >
> >
> > Cheers
> >
> >
> > Paul.
> >
> >
> >
> >
> >
> >
> >
> > 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 IllegalAccessError, URIException,
> > IOException {
> >         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, this.rootURL );
> >             System.out.println( "Homedir : " + this.homedir );
> >         }
> >         catch ( IllegalAccessError e ) {
> >             System.err.println( e.toString() );
> >             e.printStackTrace( );
> >             throw e;
> >         }
> >         catch ( URIException e ) {
> >             System.err.println( e.toString() );
> >             e.printStackTrace( );
> >             throw e;
> >         }
> >         catch ( IOException 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, this.rootURL );
> >             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;
> >             String localDir = 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
> >
> >                 localDir = dir.getPath();
> >                 if ( !localDir.endsWith("/") ) localDir =
> localDir + "/";
> >
> >                 String filepath =  localDir + 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, this.rootURL );
> >             }
> >             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( "getParentDirectory : calling
> getParentFile
> > " + dir );
> >             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) {
> >         try {
> >             return new FileSystemRoot( ( WebdavFile ) f );
> >
> >         }
> >         catch ( Exception e ) {
> >             System.err.println( "createFileSystemRoot : " +
> e.toString( ) );
> >             return null;
> >         }
> >     }
> >
> >     static class WebdavFile extends org.apache.webdav.lib.WebdavFile {
> >         protected WebdavResource webdavResource = null;
> >         protected HttpURL rootUrl = null;
> >
> >         public WebdavFile( HttpURL pathUrl, HttpURL rootUrl ) throws
> > URIException, IOException {
> >             super( pathUrl );
> >             this.webdavResource = new WebdavResource( pathUrl );
> >             this.rootUrl = rootUrl;
> >         }
> >
> >
> >         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 isRoot( ) {
> >             try {
> >                 String path = null;
> >                 String root = null;
> >                 root =  this.rootUrl.getPath( );
> >                 path = this.webdavResource.getHttpURL( ).getPath( );
> >                 System.out.println( "isRoot : root : " + root );
> >                 System.out.println( "isRoot : path : " + path );
> >
> >                 // If we are at the root already
> >                 if ( root .equalsIgnoreCase( path ) ) {
> >                     System.out.println( "isRoot : we are at root" );
> >                     return true;
> >                 } // otherwise call original
> >                 else {
> >                     return false;
> >                 }
> >             }
> >             catch ( Exception e ) {
> >                 System.err.println( e.toString() );
> >                 e.printStackTrace( );
> >                 return false;
> >             }
> >         }
> >         public String getParent() {
> >             try {
> >                 // If we are at the root already
> >                 if ( this.isRoot( ) ) {
> >                     System.out.println( "getParentFile : we are
> at root" );
> >                     return null;
> >                 } // otherwise call original
> >                 else {
> >
> >                     String escapedPath =
> > this.webdavResource.getHttpURL().getPath();
> >                     String parent = escapedPath.substring(
> >                     0, escapedPath.lastIndexOf('/',
> escapedPath.length() -
> > 2) + 1);
> >                     System.out.println( "getParent : escapedPath : " +
> > escapedPath );
> >                     return super.getParent( );
> >                 }
> >             }
> >             catch ( Exception e ) {
> >                 System.err.println( e.toString() );
> >                 e.printStackTrace( );
> >                 return null;
> >             }
> >         }
> >         public File getParentFile( ) {
> >             try {
> >                 HttpURL httpURL = null;
> >                 String parent = null;
> >                 parent = this.getParent();
> >                 if ( parent == null ) {
> >                     System.out.println( "getParentFile : at
> root so return
> > null" );
> >                     return null;
> >                 }
> >                 else {
> >                     httpURL = this.rootUrl;
> >                     httpURL.setPath( parent );
> >                     System.out.println( "getParentFile : set path to " +
> > parent );
> >                     return new WebdavFile( httpURL, this.rootUrl );
> >                 }
> >             }
> >             catch ( Exception e ) {
> >                 System.err.println( e.toString() );
> >                 e.printStackTrace( );
> >                 return null;
> >             }
> >
> >         }
> >         public boolean exists( ) {
> >             System.out.println( "exists : " + this.getPath() );
> >             return this.webdavResource.exists();
> >         }
> >         public boolean isDirectory( ) {
> >             System.out.println( "isDirectory : " +
> this.getPath()  + " : " +
> > this.webdavResource.isCollection( ) );
> >             return this.webdavResource.isCollection( );
> >         }
> >     }
> >
> >
> >
> >     static class FileSystemRoot extends WebdavFile {
> >
> >         public FileSystemRoot( HttpURL rootUrl ) throws URIException,
> > IOException {
> >             super( rootUrl, rootUrl );
> >         }
> >         public FileSystemRoot( WebdavFile webdavFile ) throws
> URIException,
> > IOException {
> >             super( webdavFile.rootUrl, webdavFile.rootUrl );
> >         }
> >
> >     }
> >     // 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: Working JFileChooser

Posted by Paul Hussein <pa...@jrc.it>.
No, go for it.

Can you give me a nod when its done so I can check the latest source out and
have a play with a MultiThreaded fix.

Cheers


Paul.


> -----Original Message-----
> From: Ingo Brunberg [mailto:ib@fiz-chemie.de]
> Sent: Monday, June 14, 2004 12:21 PM
> To: slide-dev@jakarta.apache.org
> Subject: Re: Working JFileChooser
>
>
> Great news. I will take care of checking it in.
>
> Perhaps we should put it at org.apache.webdav.ui.WebdavSystemView
> because that was the name of a former attempt and it sounds quite
> reasonable in my opinion.
>
> I hope you don't mind if I comment out the println statements.
>
> Regards,
> Ingo
>
> > I have finally got a working JFileChooser implementation.
> >
> > I believe the major bugs associated with it come from the multithreaded
> > calls to WebdavFile.
> >
> >
> > How do I go about checking the source into the slide cvs.
> >
> > Am I allowed to do this. Can someone do this for me  ? Do I
> have to become a
> > slide developer ???
> >
> >
> >
> >
> > Cheers
> >
> >
> > Paul.
> >
> >
> >
> >
> >
> >
> >
> > 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 IllegalAccessError, URIException,
> > IOException {
> >         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, this.rootURL );
> >             System.out.println( "Homedir : " + this.homedir );
> >         }
> >         catch ( IllegalAccessError e ) {
> >             System.err.println( e.toString() );
> >             e.printStackTrace( );
> >             throw e;
> >         }
> >         catch ( URIException e ) {
> >             System.err.println( e.toString() );
> >             e.printStackTrace( );
> >             throw e;
> >         }
> >         catch ( IOException 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, this.rootURL );
> >             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;
> >             String localDir = 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
> >
> >                 localDir = dir.getPath();
> >                 if ( !localDir.endsWith("/") ) localDir =
> localDir + "/";
> >
> >                 String filepath =  localDir + 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, this.rootURL );
> >             }
> >             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( "getParentDirectory : calling
> getParentFile
> > " + dir );
> >             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) {
> >         try {
> >             return new FileSystemRoot( ( WebdavFile ) f );
> >
> >         }
> >         catch ( Exception e ) {
> >             System.err.println( "createFileSystemRoot : " +
> e.toString( ) );
> >             return null;
> >         }
> >     }
> >
> >     static class WebdavFile extends org.apache.webdav.lib.WebdavFile {
> >         protected WebdavResource webdavResource = null;
> >         protected HttpURL rootUrl = null;
> >
> >         public WebdavFile( HttpURL pathUrl, HttpURL rootUrl ) throws
> > URIException, IOException {
> >             super( pathUrl );
> >             this.webdavResource = new WebdavResource( pathUrl );
> >             this.rootUrl = rootUrl;
> >         }
> >
> >
> >         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 isRoot( ) {
> >             try {
> >                 String path = null;
> >                 String root = null;
> >                 root =  this.rootUrl.getPath( );
> >                 path = this.webdavResource.getHttpURL( ).getPath( );
> >                 System.out.println( "isRoot : root : " + root );
> >                 System.out.println( "isRoot : path : " + path );
> >
> >                 // If we are at the root already
> >                 if ( root .equalsIgnoreCase( path ) ) {
> >                     System.out.println( "isRoot : we are at root" );
> >                     return true;
> >                 } // otherwise call original
> >                 else {
> >                     return false;
> >                 }
> >             }
> >             catch ( Exception e ) {
> >                 System.err.println( e.toString() );
> >                 e.printStackTrace( );
> >                 return false;
> >             }
> >         }
> >         public String getParent() {
> >             try {
> >                 // If we are at the root already
> >                 if ( this.isRoot( ) ) {
> >                     System.out.println( "getParentFile : we are
> at root" );
> >                     return null;
> >                 } // otherwise call original
> >                 else {
> >
> >                     String escapedPath =
> > this.webdavResource.getHttpURL().getPath();
> >                     String parent = escapedPath.substring(
> >                     0, escapedPath.lastIndexOf('/',
> escapedPath.length() -
> > 2) + 1);
> >                     System.out.println( "getParent : escapedPath : " +
> > escapedPath );
> >                     return super.getParent( );
> >                 }
> >             }
> >             catch ( Exception e ) {
> >                 System.err.println( e.toString() );
> >                 e.printStackTrace( );
> >                 return null;
> >             }
> >         }
> >         public File getParentFile( ) {
> >             try {
> >                 HttpURL httpURL = null;
> >                 String parent = null;
> >                 parent = this.getParent();
> >                 if ( parent == null ) {
> >                     System.out.println( "getParentFile : at
> root so return
> > null" );
> >                     return null;
> >                 }
> >                 else {
> >                     httpURL = this.rootUrl;
> >                     httpURL.setPath( parent );
> >                     System.out.println( "getParentFile : set path to " +
> > parent );
> >                     return new WebdavFile( httpURL, this.rootUrl );
> >                 }
> >             }
> >             catch ( Exception e ) {
> >                 System.err.println( e.toString() );
> >                 e.printStackTrace( );
> >                 return null;
> >             }
> >
> >         }
> >         public boolean exists( ) {
> >             System.out.println( "exists : " + this.getPath() );
> >             return this.webdavResource.exists();
> >         }
> >         public boolean isDirectory( ) {
> >             System.out.println( "isDirectory : " +
> this.getPath()  + " : " +
> > this.webdavResource.isCollection( ) );
> >             return this.webdavResource.isCollection( );
> >         }
> >     }
> >
> >
> >
> >     static class FileSystemRoot extends WebdavFile {
> >
> >         public FileSystemRoot( HttpURL rootUrl ) throws URIException,
> > IOException {
> >             super( rootUrl, rootUrl );
> >         }
> >         public FileSystemRoot( WebdavFile webdavFile ) throws
> URIException,
> > IOException {
> >             super( webdavFile.rootUrl, webdavFile.rootUrl );
> >         }
> >
> >     }
> >     // 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: Working JFileChooser

Posted by Ingo Brunberg <ib...@fiz-chemie.de>.
Great news. I will take care of checking it in.

Perhaps we should put it at org.apache.webdav.ui.WebdavSystemView
because that was the name of a former attempt and it sounds quite
reasonable in my opinion.

I hope you don't mind if I comment out the println statements.

Regards,
Ingo

> I have finally got a working JFileChooser implementation.
> 
> I believe the major bugs associated with it come from the multithreaded
> calls to WebdavFile.
> 
> 
> How do I go about checking the source into the slide cvs.
> 
> Am I allowed to do this. Can someone do this for me  ? Do I have to become a
> slide developer ???
> 
> 
> 
> 
> Cheers
> 
> 
> Paul.
> 
> 
> 
> 
> 
> 
> 
> 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 IllegalAccessError, URIException,
> IOException {
>         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, this.rootURL );
>             System.out.println( "Homedir : " + this.homedir );
>         }
>         catch ( IllegalAccessError e ) {
>             System.err.println( e.toString() );
>             e.printStackTrace( );
>             throw e;
>         }
>         catch ( URIException e ) {
>             System.err.println( e.toString() );
>             e.printStackTrace( );
>             throw e;
>         }
>         catch ( IOException 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, this.rootURL );
>             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;
>             String localDir = 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
> 
>                 localDir = dir.getPath();
>                 if ( !localDir.endsWith("/") ) localDir = localDir + "/";
> 
>                 String filepath =  localDir + 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, this.rootURL );
>             }
>             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( "getParentDirectory : calling getParentFile
> " + dir );
>             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) {
>         try {
>             return new FileSystemRoot( ( WebdavFile ) f );
> 
>         }
>         catch ( Exception e ) {
>             System.err.println( "createFileSystemRoot : " + e.toString( ) );
>             return null;
>         }
>     }
> 
>     static class WebdavFile extends org.apache.webdav.lib.WebdavFile {
>         protected WebdavResource webdavResource = null;
>         protected HttpURL rootUrl = null;
> 
>         public WebdavFile( HttpURL pathUrl, HttpURL rootUrl ) throws
> URIException, IOException {
>             super( pathUrl );
>             this.webdavResource = new WebdavResource( pathUrl );
>             this.rootUrl = rootUrl;
>         }
> 
> 
>         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 isRoot( ) {
>             try {
>                 String path = null;
>                 String root = null;
>                 root =  this.rootUrl.getPath( );
>                 path = this.webdavResource.getHttpURL( ).getPath( );
>                 System.out.println( "isRoot : root : " + root );
>                 System.out.println( "isRoot : path : " + path );
> 
>                 // If we are at the root already
>                 if ( root .equalsIgnoreCase( path ) ) {
>                     System.out.println( "isRoot : we are at root" );
>                     return true;
>                 } // otherwise call original
>                 else {
>                     return false;
>                 }
>             }
>             catch ( Exception e ) {
>                 System.err.println( e.toString() );
>                 e.printStackTrace( );
>                 return false;
>             }
>         }
>         public String getParent() {
>             try {
>                 // If we are at the root already
>                 if ( this.isRoot( ) ) {
>                     System.out.println( "getParentFile : we are at root" );
>                     return null;
>                 } // otherwise call original
>                 else {
> 
>                     String escapedPath =
> this.webdavResource.getHttpURL().getPath();
>                     String parent = escapedPath.substring(
>                     0, escapedPath.lastIndexOf('/', escapedPath.length() -
> 2) + 1);
>                     System.out.println( "getParent : escapedPath : " +
> escapedPath );
>                     return super.getParent( );
>                 }
>             }
>             catch ( Exception e ) {
>                 System.err.println( e.toString() );
>                 e.printStackTrace( );
>                 return null;
>             }
>         }
>         public File getParentFile( ) {
>             try {
>                 HttpURL httpURL = null;
>                 String parent = null;
>                 parent = this.getParent();
>                 if ( parent == null ) {
>                     System.out.println( "getParentFile : at root so return
> null" );
>                     return null;
>                 }
>                 else {
>                     httpURL = this.rootUrl;
>                     httpURL.setPath( parent );
>                     System.out.println( "getParentFile : set path to " +
> parent );
>                     return new WebdavFile( httpURL, this.rootUrl );
>                 }
>             }
>             catch ( Exception e ) {
>                 System.err.println( e.toString() );
>                 e.printStackTrace( );
>                 return null;
>             }
> 
>         }
>         public boolean exists( ) {
>             System.out.println( "exists : " + this.getPath() );
>             return this.webdavResource.exists();
>         }
>         public boolean isDirectory( ) {
>             System.out.println( "isDirectory : " + this.getPath()  + " : " +
> this.webdavResource.isCollection( ) );
>             return this.webdavResource.isCollection( );
>         }
>     }
> 
> 
> 
>     static class FileSystemRoot extends WebdavFile {
> 
>         public FileSystemRoot( HttpURL rootUrl ) throws URIException,
> IOException {
>             super( rootUrl, rootUrl );
>         }
>         public FileSystemRoot( WebdavFile webdavFile ) throws URIException,
> IOException {
>             super( webdavFile.rootUrl, webdavFile.rootUrl );
>         }
> 
>     }
>     // 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