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