Hi,

I am in the process of developing a FileSystemView for WebDAV using the
Slide Client API. This will give the JFileChosser the ability to browse a
WebDAV repository.


Would anyone else be interested in this ?



It would be nice to have a hand if anyone is interested in helping.


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.WebdavFile;
import org.apache.webdav.lib.WebdavResource;

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


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

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


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


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

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

    }

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

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

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

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

    }

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

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


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

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

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


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

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



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


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


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

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

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

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

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

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

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


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

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

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

            path = dir.getPath( );

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

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







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

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



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

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




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

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

        public boolean isDirectory() {
            return true;
        }

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

        // Setup
        JFileChooser fc = new JFileChooser(new WebDAVFileSystemView(
"http://139.191.67.52:80";, "/WebDAV", "compass", "compass" ) );
        frame = new JFrame( );
        fc.showOpenDialog(frame);
    }

}


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

Reply via email to