adammurdoch 2002/10/31 02:35:18 Modified: vfs/src/java/org/apache/commons/vfs/provider AbstractFileObject.java AbstractFileSystem.java vfs/src/java/org/apache/commons/vfs FileListener.java FileSystem.java Resources.properties Log: - Added FileSystem.addJunction() and removeJunction(). Doesn' do anything yet. - FileListeners can throw Exceptions. - Made AbstractFileObject.handleCreate() and handleDelete() protected, so that subclass can notify that the file it has been created or deleted. Revision Changes Path 1.17 +16 -10 jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/AbstractFileObject.java Index: AbstractFileObject.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/AbstractFileObject.java,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- AbstractFileObject.java 27 Oct 2002 08:16:20 -0000 1.16 +++ AbstractFileObject.java 31 Oct 2002 10:35:18 -0000 1.17 @@ -122,7 +122,7 @@ * <p>Called when this file is closed, or its type changes. Note that * the file object may be reused later, so should be able to be reattached. */ - protected void doDetach() + protected void doDetach() throws FileSystemException { } @@ -137,7 +137,7 @@ * Determines if this file can be read. Is only called if {@link #doGetType} * does not return null. This implementation always returns true. */ - protected boolean doIsReadable() throws FileSystemException + protected boolean doIsReadable() throws Exception { return true; } @@ -147,7 +147,7 @@ * {@link #doGetType} does not return null. This implementation always * returns true. */ - protected boolean doIsWriteable() throws FileSystemException + protected boolean doIsWriteable() throws Exception { return true; } @@ -910,14 +910,20 @@ * Detaches this file, invaliating all cached info. This will force * a call to {@link #doAttach} next time this file is used. */ - protected void detach() + protected void detach() throws FileSystemException { if ( attached ) { - doDetach(); - attached = false; - type = null; - children = null; + try + { + doDetach(); + } + finally + { + attached = false; + type = null; + children = null; + } } } @@ -968,7 +974,7 @@ * Called when this file is created. Updates cached info and notifies * the parent and file system. */ - private void handleCreate( final FileType newType ) + protected void handleCreate( final FileType newType ) { // Fix up state type = newType; @@ -985,7 +991,7 @@ * Called when this file is deleted. Updates cached info and notifies * subclasses, parent and file system. */ - private void handleDelete() + protected void handleDelete() { // Fix up state type = null; 1.12 +77 -13 jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/AbstractFileSystem.java Index: AbstractFileSystem.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/AbstractFileSystem.java,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- AbstractFileSystem.java 25 Oct 2002 03:59:09 -0000 1.11 +++ AbstractFileSystem.java 31 Oct 2002 10:35:18 -0000 1.12 @@ -64,6 +64,7 @@ import org.apache.commons.vfs.FileSystem; import org.apache.commons.vfs.FileListener; import org.apache.commons.vfs.FileChangeEvent; +import org.apache.commons.vfs.util.Messages; /** * A partial {@link org.apache.commons.vfs.FileSystem} implementation. @@ -186,6 +187,24 @@ } /** + * Adds a junction to this file system. + */ + public void addJunction( final FileName junctionPoint, + final FileObject targetFile ) + throws FileSystemException + { + throw new FileSystemException( "vfs.provider/junctions-not-supported.error", rootName ); + } + + /** + * Removes a junction from this file system. + */ + public void removeJuntion( final FileName junctionPoint ) throws FileSystemException + { + throw new FileSystemException( "vfs.provider/junctions-not-supported.error", rootName ); + } + + /** * Adds a listener on a file in this file system. */ public void addListener( final FileObject file, @@ -218,17 +237,7 @@ */ protected void fireFileCreated( final FileObject file ) { - final FileChangeEvent event = new FileChangeEvent( file ); - final ArrayList listeners = (ArrayList)listenerMap.get( file.getName() ); - if ( listeners != null ) - { - final int count = listeners.size(); - for ( int i = 0; i < count; i++ ) - { - final FileListener listener = (FileListener)listeners.get( i ); - listener.fileCreated( event ); - } - } + fireEvent( new CreateEvent( file ) ); } /** @@ -236,7 +245,15 @@ */ protected void fireFileDeleted( final FileObject file ) { - final FileChangeEvent event = new FileChangeEvent( file ); + fireEvent( new DeleteEvent( file ) ); + } + + /** + * Fires an event. + */ + private void fireEvent( final ChangeEvent event ) + { + final FileObject file = event.getFile(); final ArrayList listeners = (ArrayList)listenerMap.get( file.getName() ); if ( listeners != null ) { @@ -244,8 +261,55 @@ for ( int i = 0; i < count; i++ ) { final FileListener listener = (FileListener)listeners.get( i ); - listener.fileDeleted( event ); + try + { + event.notify( listener ); + } + catch ( final Exception e ) + { + final String message = Messages.getString( "vfs.provider/notify-listener.warn", file ); + getLogger().warn( message, e ); + } } + } + } + + /** A change event that knows how to notify a listener. */ + private abstract static class ChangeEvent extends FileChangeEvent + { + public ChangeEvent( final FileObject file ) + { + super( file ); + } + + public abstract void notify( final FileListener listener ) throws Exception; + } + + /** File creation event. */ + private static class CreateEvent extends ChangeEvent + { + public CreateEvent( final FileObject file ) + { + super( file ); + } + + public void notify( final FileListener listener ) throws Exception + { + listener.fileCreated( this ); + } + } + + /** File deletion event. */ + private static class DeleteEvent extends ChangeEvent + { + public DeleteEvent( final FileObject file ) + { + super( file ); + } + + public void notify( final FileListener listener ) throws Exception + { + listener.fileDeleted( this ); } } } 1.2 +3 -3 jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/FileListener.java Index: FileListener.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/FileListener.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- FileListener.java 25 Oct 2002 03:59:09 -0000 1.1 +++ FileListener.java 31 Oct 2002 10:35:18 -0000 1.2 @@ -66,10 +66,10 @@ /** * Called when a file is created. */ - void fileCreated( FileChangeEvent event ); + void fileCreated( FileChangeEvent event ) throws Exception; /** * Called when a file is deleted. */ - void fileDeleted( FileChangeEvent event ); + void fileDeleted( FileChangeEvent event ) throws Exception; } 1.6 +28 -4 jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/FileSystem.java Index: FileSystem.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/FileSystem.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- FileSystem.java 25 Oct 2002 03:59:09 -0000 1.5 +++ FileSystem.java 31 Oct 2002 10:35:18 -0000 1.6 @@ -56,9 +56,7 @@ package org.apache.commons.vfs; /** - * A file system. - * - * <p>A file system can also implement {@link org.apache.commons.vfs.provider.VfsComponent}. + * A file system, made up of a hierarchy of files. * * @author <a href="mailto:adammurdoch@;apache.org">Adam Murdoch</a> * @version $Revision$ $Date$ @@ -152,4 +150,30 @@ * @param listener The listener to remove. */ void removeListener( FileObject file, FileListener listener ); + + /** + * Adds a junction to this file system. A junction is a link that attaches + * the supplied file to a point in this file system, making it look like + * part of the file system. + * + * @param junctionPoint The point in this file system to add the junction. + * @param targetFile The file to link to. + * + * @throws FileSystemException + * If this file system does not support junctions, or the junction + * point or target file is invalid (the file system may not support + * nested junctions, for example). + */ + void addJunction( FileName junctionPoint, FileObject targetFile ) + throws FileSystemException; + + /** + * Removes a junction from this file system. + * + * @param junctionPoint The junction to remove. + * + * @throws FileSystemException + * On error removing the junction. + */ + void removeJuntion( FileName junctionPoint ) throws FileSystemException; } 1.10 +1 -0 jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/Resources.properties Index: Resources.properties =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/Resources.properties,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- Resources.properties 27 Oct 2002 08:16:20 -0000 1.9 +++ Resources.properties 31 Oct 2002 10:35:18 -0000 1.10 @@ -56,6 +56,7 @@ # AbstractFileSystem vfs.provider/junctions-not-supported.error=Junctions not supported for file system "{0}". +vfs.provider/notify-listener.warn=Could not notify listener of change to "{0}". # UriParser vfs.provider/missing-double-slashes.error=Expecting // to follow the scheme in URI "{0}".
-- To unsubscribe, e-mail: <mailto:commons-dev-unsubscribe@;jakarta.apache.org> For additional commands, e-mail: <mailto:commons-dev-help@;jakarta.apache.org>