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