You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by ad...@apache.org on 2002/04/07 04:27:58 UTC
cvs commit: jakarta-ant/proposal/myrmidon/src/test/org/apache/myrmidon/components/classloader/test DefaultClassLoaderManagerTestCase.java
adammurdoch 02/04/06 18:27:58
Modified: proposal/myrmidon build.xml
proposal/myrmidon/src/java/org/apache/antlib/vfile
CopyFilesTask.java
proposal/myrmidon/src/java/org/apache/aut/vfs
FileContent.java FileName.java FileObject.java
FileSystemException.java FileSystemManager.java
FileType.java NameScope.java
proposal/myrmidon/src/java/org/apache/aut/vfs/impl
DefaultFileSystemManager.java
DefaultProviderContext.java Resources.properties
proposal/myrmidon/src/java/org/apache/aut/vfs/provider
AbstractFileObject.java AbstractFileSystem.java
AbstractFileSystemProvider.java
DefaultFileContent.java DefaultFileName.java
FileSystem.java FileSystemProvider.java
FileSystemProviderContext.java ParsedUri.java
Resources.properties UriParser.java
proposal/myrmidon/src/java/org/apache/aut/vfs/provider/ftp
FtpFileNameParser.java FtpFileObject.java
FtpFileSystem.java FtpFileSystemProvider.java
ParsedFtpUri.java Resources.properties
proposal/myrmidon/src/java/org/apache/aut/vfs/provider/local
LocalFile.java LocalFileSystem.java
proposal/myrmidon/src/java/org/apache/aut/vfs/provider/smb
ParsedSmbUri.java SmbFileNameParser.java
SmbFileObject.java SmbFileSystem.java
SmbFileSystemProvider.java
proposal/myrmidon/src/java/org/apache/aut/vfs/provider/zip
ParsedZipUri.java Resources.properties
ZipFileNameParser.java ZipFileObject.java
ZipFileSystem.java ZipFileSystemProvider.java
proposal/myrmidon/src/java/org/apache/myrmidon/framework/factories
VfsManager.java
proposal/myrmidon/src/test/org/apache/aut/vfs/test
AbstractFileSystemTestCase.java
AbstractWritableFileSystemTestCase.java
proposal/myrmidon/src/test/org/apache/myrmidon
AbstractMyrmidonTest.java AbstractProjectTest.java
proposal/myrmidon/src/test/org/apache/myrmidon/components/classloader/test
DefaultClassLoaderManagerTestCase.java
Added: proposal/myrmidon/src/java/org/apache/aut/vfs
AllFileSelector.java FileConstants.java
FileDepthSelector.java FileSelectInfo.java
FileSelector.java
proposal/myrmidon/src/java/org/apache/aut/vfs/impl
DefaultFileReplicator.java
proposal/myrmidon/src/java/org/apache/aut/vfs/provider
DefaultFileSelectorInfo.java FileReplicator.java
LocalFileSystemProvider.java
proposal/myrmidon/src/java/org/apache/aut/vfs/provider/local
DefaultLocalFileSystemProvider.java
Removed: proposal/myrmidon/src/java/org/apache/aut/vfs/provider/local
LocalFileSystemProvider.java
Log:
VFS Additions:
* Added FileSelector, which allows files to be chosen when doing recursive
operations. Added a couple of implementations. Added a selector parameter
to FileObject.delete() and copy().
* Added FileObject.replicateFile(), which converts a FileObject into a local File.
* Moved replication code out of the Zip provider, into a shared FileReplicator
component. The implemenation is pretty brain-dead, but at very least should
properly clean up temporary files in ant_vfs_cache. Also, local files will
no longer be replicated, but used directly.
* Added FileName.getRelativeName(), and NameScope.DESCENDENT_OR_SELF.
* Now handles providers which are LogEnabled and Disposable.
* Made the local file provider pluggable.
* Providers are now responsible for thier own caching.
* FTP and Zip providers clean up properly. Fixed FTP directory delete.
Revision Changes Path
1.103 +1 -1 jakarta-ant/proposal/myrmidon/build.xml
Index: build.xml
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/build.xml,v
retrieving revision 1.102
retrieving revision 1.103
diff -u -r1.102 -r1.103
--- build.xml 3 Apr 2002 10:58:18 -0000 1.102
+++ build.xml 7 Apr 2002 02:27:55 -0000 1.103
@@ -682,7 +682,7 @@
<!-- Pass config to the tests -->
<sysproperty key="test.basedir" value="${test.working.dir}"/>
<sysproperty key="test.smb.uri" value="smb://${vfs.user}:${vfs.password}@${vfs.host}/${vfs.user}/vfs"/>
- <sysproperty key="test.ftp.uri" value="ftp://${vfs.user}:${vfs.password}@${vfs.host}/home/${vfs.user}/vfs"/>
+ <sysproperty key="test.ftp.uri" value="ftp://${vfs.user}:${vfs.password}@${vfs.host}/vfs"/>
<batchtest>
<fileset dir="${test.classes}">
1.10 +3 -2 jakarta-ant/proposal/myrmidon/src/java/org/apache/antlib/vfile/CopyFilesTask.java
Index: CopyFilesTask.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/antlib/vfile/CopyFilesTask.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- CopyFilesTask.java 29 Mar 2002 12:57:21 -0000 1.9
+++ CopyFilesTask.java 7 Apr 2002 02:27:55 -0000 1.10
@@ -13,6 +13,7 @@
import org.apache.aut.vfs.FileSystemException;
import org.apache.aut.vfs.FileType;
import org.apache.aut.vfs.NameScope;
+import org.apache.aut.vfs.FileConstants;
import org.apache.avalon.excalibur.i18n.ResourceManager;
import org.apache.avalon.excalibur.i18n.Resources;
import org.apache.myrmidon.api.AbstractTask;
@@ -114,7 +115,7 @@
}
getContext().verbose( "copy " + m_srcFile + " to " + m_destFile );
- m_destFile.copy( m_srcFile );
+ m_destFile.copyFrom( m_srcFile, FileConstants.SELECT_SELF );
}
// Copy the contents of the filesets across
@@ -142,7 +143,7 @@
// Copy the file across
getContext().verbose( "copy " + srcFile + " to " + destFile );
- destFile.copy( srcFile );
+ destFile.copyFrom( srcFile, FileConstants.SELECT_SELF );
}
}
}
1.3 +2 -1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/FileContent.java
Index: FileContent.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/FileContent.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- FileContent.java 6 Feb 2002 07:28:40 -0000 1.2
+++ FileContent.java 7 Apr 2002 02:27:55 -0000 1.3
@@ -25,7 +25,8 @@
*
* @see FileObject#getContent
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.3 $ $Date: 2002/04/07 02:27:55 $
*/
public interface FileContent
{
1.3 +31 -16 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/FileName.java
Index: FileName.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/FileName.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- FileName.java 2 Mar 2002 04:07:51 -0000 1.2
+++ FileName.java 7 Apr 2002 02:27:55 -0000 1.3
@@ -13,13 +13,14 @@
*
* @see FileObject
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.3 $ $Date: 2002/04/07 02:27:55 $
*/
public interface FileName
{
/**
- * Returns the base name of the file. The base name of a file is the
- * last element of its name. For example the base name of
+ * Returns the base name of this file. The base name is the last element
+ * of the file name. For example the base name of
* <code>/somefolder/somefile</code> is <code>somefile</code>.
*
* <p>The root file of a file system has an empty base name.
@@ -27,23 +28,23 @@
String getBaseName();
/**
- * Returns the absolute path of the file, within its file system. This
+ * Returns the absolute path of this file, within its file system. This
* path is normalised, so that <code>.</code> and <code>..</code> elements
* have been removed. Also, the path only contains <code>/</code> as its
* separator character. The path always starts with <code>/</code>
*
- * <p>The root of a file system has <code>/</code> as its path.
+ * <p>The root of a file system has <code>/</code> as its absolute path.
*/
String getPath();
/**
- * Returns the absolute URI of the file.
+ * Returns the absolute URI of this file.
*/
String getURI();
/**
- * Returns the name of the parent of the file. The root of a file system
- * has no parent.
+ * Returns the file name of the parent of this file. The root of a
+ * file system has no parent.
*
* @return
* A {@link FileName} object representing the parent name. Returns
@@ -52,35 +53,49 @@
FileName getParent();
/**
- * Resolves a name, relative to the file. Equivalent to calling
+ * Resolves a name, relative to this file name. Equivalent to calling
* <code>resolveName( path, NameScope.FILE_SYSTEM )</code>.
*
- * @param path
- * The path to resolve.
+ * @param name
+ * The name to resolve.
*
* @return
- * A {@link FileName} object representing the resolved name.
+ * A {@link FileName} object representing the resolved file name.
*
* @throws FileSystemException
* If the name is invalid.
*/
- FileName resolveName( String path ) throws FileSystemException;
+ FileName resolveName( String name ) throws FileSystemException;
/**
- * Resolves a name, relative to the file. Refer to {@link NameScope}
+ * Resolves a name, relative to this file name. Refer to {@link NameScope}
* for a description of how names are resolved.
*
* @param name
- * The path to resolve.
+ * The name to resolve.
*
* @param scope
* The scope to use when resolving the name.
*
* @return
- * A {@link FileName} object representing the resolved name.
+ * A {@link FileName} object representing the resolved file name.
*
* @throws FileSystemException
* If the name is invalid.
*/
FileName resolveName( String name, NameScope scope ) throws FileSystemException;
+
+ /**
+ * Converts a file name to a relative name, relative to this file name.
+ *
+ * @param name
+ * The name to convert to a relative path.
+ *
+ * @return
+ * The relative name.
+ *
+ * @throws FileSystemException
+ * On error.
+ */
+ String getRelativeName( FileName name ) throws FileSystemException;
}
1.4 +39 -10 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/FileObject.java
Index: FileObject.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/FileObject.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- FileObject.java 9 Mar 2002 10:31:30 -0000 1.3
+++ FileObject.java 7 Apr 2002 02:27:55 -0000 1.4
@@ -7,6 +7,8 @@
*/
package org.apache.aut.vfs;
+import java.io.File;
+
/**
* This interface represents a file, and is used to access the content and
* structure of the file.
@@ -53,7 +55,8 @@
* @see FileContent
* @see FileName
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.4 $ $Date: 2002/04/07 02:27:55 $
*/
public interface FileObject
{
@@ -154,17 +157,19 @@
FileObject resolveFile( String path ) throws FileSystemException;
/**
- * Deletes this file, and all children. Does nothing if the file
+ * Deletes this file, and all descendents. Does nothing if the file
* does not exist.
*
* <p>This method is not transactional. If it fails and throws an
- * exception, some of this file's descendents may have been deleted.
+ * exception, this file will potentially only be partially deleted.
+ *
+ * @param selector The selector to use to select which files to delete.
*
* @throws FileSystemException
* If this file or one of its descendents is read-only, or on error
* deleting this file or one of its descendents.
*/
- void delete() throws FileSystemException;
+ void delete( FileSelector selector ) throws FileSystemException;
/**
* Creates this file, if it does not exist. Also creates any ancestor
@@ -182,18 +187,42 @@
void create( FileType type ) throws FileSystemException;
/**
- * Copies the content of another file to this file.
+ * Copies another file, and all its descendents, to this file.
*
* If this file does not exist, it is created. Its parent folder is also
- * created, if necessary. If this file does exist, its content is replaced.
+ * created, if necessary. If this file does exist, it is deleted first.
+ *
+ * <p>This method is not transactional. If it fails and throws an
+ * exception, this file will potentially only be partially copied.
+ *
+ * @param srcFile The source file to copy.
+ * @param selector The selector to use to select which files to copy.
+ *
+ * @throws FileSystemException
+ * If this file is read-only, or if the source file does not exist,
+ * or on error copying the file.
+ */
+ void copyFrom( FileObject srcFile, FileSelector selector ) throws FileSystemException;
+
+ /**
+ * Creates a temporary local copy of this file, and its descendents. If
+ * this file is a local file, a copy is not made.
+ *
+ * <p>Note that the local copy may include additonal files, that were
+ * not selected by the given selector.
+ *
+ * @todo Add options to indicate whether the caller is happy to deal with
+ * extra files being present locally (eg if the file has been
+ * replicated previously), or whether the caller expects only
+ * the selected files to be present.
*
- * @param file The file to copy the content from.
+ * @param selector the selector to use to select the files to replicate.
+ * @return The local copy of this file.
*
* @throws FileSystemException
- * If this file is read-only, or is a folder, or if the supplied file
- * is not a file, or on error copying the content.
+ * If this file does not exist, or on error replicating the file.
*/
- void copy( FileObject file ) throws FileSystemException;
+ File replicateFile( FileSelector selector ) throws FileSystemException;
/**
* Returns this file's content. The {@link FileContent} returned by this
1.4 +2 -1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/FileSystemException.java
Index: FileSystemException.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/FileSystemException.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- FileSystemException.java 1 Mar 2002 10:33:37 -0000 1.3
+++ FileSystemException.java 7 Apr 2002 02:27:55 -0000 1.4
@@ -10,7 +10,8 @@
/**
* Thrown for file system errors.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.4 $ $Date: 2002/04/07 02:27:55 $
*/
public class FileSystemException
extends Exception
1.7 +4 -2 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/FileSystemManager.java
Index: FileSystemManager.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/FileSystemManager.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- FileSystemManager.java 9 Mar 2002 10:31:30 -0000 1.6
+++ FileSystemManager.java 7 Apr 2002 02:27:55 -0000 1.7
@@ -49,7 +49,9 @@
*
* </ul>
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.7 $ $Date: 2002/04/07 02:27:55 $
+ *
* @ant:role shorthand="file-system-manager"
*/
public interface FileSystemManager
@@ -128,7 +130,7 @@
/**
* Creates a layered file system. A layered file system is a file system
- * that is created from the contents of another file file, such as a zip
+ * that is created from the contents of another file, such as a zip
* or tar file.
*
* @param provider
1.5 +2 -1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/FileType.java
Index: FileType.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/FileType.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- FileType.java 29 Mar 2002 12:56:37 -0000 1.4
+++ FileType.java 7 Apr 2002 02:27:55 -0000 1.5
@@ -5,7 +5,8 @@
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.5 $ $Date: 2002/04/07 02:27:55 $
*/
package org.apache.aut.vfs;
1.6 +11 -2 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/NameScope.java
Index: NameScope.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/NameScope.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- NameScope.java 29 Mar 2002 12:56:37 -0000 1.5
+++ NameScope.java 7 Apr 2002 02:27:55 -0000 1.6
@@ -11,7 +11,8 @@
* An enumerated type for file name scope, used when resolving a name relative
* to a file.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.6 $ $Date: 2002/04/07 02:27:55 $
*/
public final class NameScope
{
@@ -30,6 +31,14 @@
public static final NameScope DESCENDENT = new NameScope( "descendent" );
/**
+ * Resolve against the descendents of the base file. The name is resolved
+ * as described by {@link #FILE_SYSTEM}. However, an exception is thrown
+ * if the resolved file is not a descendent of the base file, or the base
+ * files itself.
+ */
+ public static final NameScope DESCENDENT_OR_SELF = new NameScope( "descendent_or_self" );
+
+ /**
* Resolve against files in the same file system as the base file.
*
* <p>If the supplied name is an absolute path, then it is resolved
@@ -46,7 +55,7 @@
*/
public static final NameScope FILE_SYSTEM = new NameScope( "filesystem" );
- private String m_name;
+ private final String m_name;
private NameScope( final String name )
{
1.1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/AllFileSelector.java
Index: AllFileSelector.java
===================================================================
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.aut.vfs;
/**
* A {@link FileSelector} which selects everything.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision: 1.1 $ $Date: 2002/04/07 02:27:55 $
*/
public class AllFileSelector
implements FileSelector
{
/**
* Determines if a file or folder should be selected.
*/
public boolean includeFile( final FileSelectInfo fileInfo )
throws FileSystemException
{
return true;
}
/**
* Determines whether a folder should be traversed.
*/
public boolean traverseDescendents( final FileSelectInfo fileInfo )
throws FileSystemException
{
return true;
}
}
1.1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/FileConstants.java
Index: FileConstants.java
===================================================================
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.aut.vfs;
/**
* Several constants for use in the VFS API.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision: 1.1 $ $Date: 2002/04/07 02:27:55 $
*/
public interface FileConstants
{
/**
* A {@link FileSelector} which selects only the base file/folder.
*/
FileSelector SELECT_SELF = new FileDepthSelector( 0, 0 );
/**
* A {@link FileSelector} which selects the base file/folder and its
* direct children.
*/
FileSelector SELECT_SELF_AND_CHILDREN = new FileDepthSelector( 0, 1 );
/**
* A {@link FileSelector} which selects only the direct children
* of the base folder.
*/
FileSelector SELECT_CHILDREN = new FileDepthSelector( 1, 1 );
/**
* A {@link FileSelector} which selects all the descendents of the
* base folder, but does not select the base folder itself.
*/
FileSelector EXCLUDE_SELF = new FileDepthSelector( 1, Integer.MAX_VALUE );
/**
* A {@link FileSelector} which selects the base file/folder, plus all
* its descendents.
*/
FileSelector SELECT_ALL = new AllFileSelector();
}
1.1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/FileDepthSelector.java
Index: FileDepthSelector.java
===================================================================
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.aut.vfs;
/**
* A {@link FileSelector} which selects all files in a particular depth range.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision: 1.1 $ $Date: 2002/04/07 02:27:55 $
*/
public class FileDepthSelector
implements FileSelector
{
private final int m_minDepth;
private final int m_maxDepth;
public FileDepthSelector( int minDepth, int maxDepth )
{
m_minDepth = minDepth;
m_maxDepth = maxDepth;
}
/**
* Determines if a file or folder should be selected.
*/
public boolean includeFile( final FileSelectInfo fileInfo )
throws FileSystemException
{
final int depth = fileInfo.getDepth();
return m_minDepth <= depth && depth <= m_maxDepth;
}
/**
* Determines whether a folder should be traversed.
*/
public boolean traverseDescendents( final FileSelectInfo fileInfo )
throws FileSystemException
{
return fileInfo.getDepth() < m_maxDepth;
}
}
1.1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/FileSelectInfo.java
Index: FileSelectInfo.java
===================================================================
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.aut.vfs;
/**
* Information about a file, that is used to select files during the
* traversal of a hierarchy.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision: 1.1 $ $Date: 2002/04/07 02:27:55 $
*/
public interface FileSelectInfo
{
/**
* Returns the base folder of the traversal.
*/
FileObject getBaseFolder();
/**
* Returns the file (or folder) to be considered.
*/
FileObject getFile();
/**
* Returns the depth of the file relative to the base folder.
*/
int getDepth();
}
1.1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/FileSelector.java
Index: FileSelector.java
===================================================================
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.aut.vfs;
/**
* This interface is used to select files when traversing a file hierarchy.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision: 1.1 $ $Date: 2002/04/07 02:27:55 $
*/
public interface FileSelector
{
/**
* Determines if a file or folder should be selected.
*
* @param fileInfo the file or folder to select.
* @return true if the file should be selected.
*/
boolean includeFile( FileSelectInfo fileInfo )
throws FileSystemException;
/**
* Determines whether a folder should be traversed. If this method returns
* true, {@link #includeFile} is called for each of the children of
* the folder, and each of the child folders is recursively traversed.
*
* @param fileInfo the file or folder to select.
*
* @return true if the folder should be traversed.
*/
boolean traverseDescendents( FileSelectInfo fileInfo )
throws FileSystemException;
}
1.7 +87 -28 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/impl/DefaultFileSystemManager.java
Index: DefaultFileSystemManager.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/impl/DefaultFileSystemManager.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- DefaultFileSystemManager.java 29 Mar 2002 12:56:37 -0000 1.6
+++ DefaultFileSystemManager.java 7 Apr 2002 02:27:56 -0000 1.7
@@ -9,48 +9,50 @@
import java.io.File;
import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
import java.util.Map;
+import java.util.Set;
import org.apache.aut.vfs.FileObject;
import org.apache.aut.vfs.FileSystemException;
import org.apache.aut.vfs.FileSystemManager;
+import org.apache.aut.vfs.provider.FileReplicator;
import org.apache.aut.vfs.provider.FileSystemProvider;
+import org.apache.aut.vfs.provider.LocalFileSystemProvider;
import org.apache.aut.vfs.provider.UriParser;
-import org.apache.aut.vfs.provider.local.LocalFileSystemProvider;
import org.apache.avalon.excalibur.i18n.ResourceManager;
import org.apache.avalon.excalibur.i18n.Resources;
+import org.apache.avalon.framework.activity.Disposable;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.logger.Logger;
/**
* A default file system manager implementation.
*
+ * @todo - Extract an AbstractFileSystemManager super-class from this class.
+ *
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
- * @version $Revision: 1.6 $ $Date: 2002/03/29 12:56:37 $
+ * @version $Revision: 1.7 $ $Date: 2002/04/07 02:27:56 $
*/
public class DefaultFileSystemManager
- implements FileSystemManager
+ extends AbstractLogEnabled
+ implements FileSystemManager, Disposable
{
private static final Resources REZ
= ResourceManager.getPackageResources( DefaultFileSystemManager.class );
- /** The default provider. */
- private final LocalFileSystemProvider m_localFileProvider;
+ /** The provider for local files. */
+ private LocalFileSystemProvider m_localFileProvider;
+
+ /** The file replicator to use. */
+ private final DefaultFileReplicator m_fileReplicator = new DefaultFileReplicator( this );
/** Mapping from URI scheme to FileSystemProvider. */
private final Map m_providers = new HashMap();
- /** The provider context. */
- private final DefaultProviderContext m_context = new DefaultProviderContext( this );
-
/** The base file to use for relative URI. */
private FileObject m_baseFile;
- public DefaultFileSystemManager()
- {
- // Create the local provider
- m_localFileProvider = new LocalFileSystemProvider();
- m_providers.put( "file", m_localFileProvider );
- m_localFileProvider.setContext( m_context );
- }
-
/**
* Registers a file system provider.
*/
@@ -58,7 +60,7 @@
final FileSystemProvider provider )
throws FileSystemException
{
- addProvider( new String[] { urlScheme }, provider );
+ addProvider( new String[]{urlScheme}, provider );
}
/**
@@ -71,7 +73,7 @@
// Check for duplicates
for( int i = 0; i < urlSchemes.length; i++ )
{
- final String scheme = urlSchemes[i ];
+ final String scheme = urlSchemes[ i ];
if( m_providers.containsKey( scheme ) )
{
final String message = REZ.getString( "multiple-providers-for-scheme.error", scheme );
@@ -80,7 +82,8 @@
}
// Contextualise
- provider.setContext( m_context );
+ setupLogger( provider );
+ provider.setContext( new DefaultProviderContext( this ) );
// Add to map
for( int i = 0; i < urlSchemes.length; i++ )
@@ -88,14 +91,55 @@
final String scheme = urlSchemes[ i ];
m_providers.put( scheme, provider );
}
+
+ if( provider instanceof LocalFileSystemProvider )
+ {
+ m_localFileProvider = (LocalFileSystemProvider)provider;
+ }
}
/**
- * Closes all file systems created by this file system manager.
+ * Returns the file replicator.
+ *
+ * @return The file replicator. Never returns null.
*/
- public void close()
+ public FileReplicator getReplicator()
+ throws FileSystemException
{
- // TODO - implement this
+ return m_fileReplicator;
+ }
+
+ /**
+ * Enable logging.
+ */
+ public void enableLogging( final Logger logger )
+ {
+ super.enableLogging( logger );
+ setupLogger( m_fileReplicator );
+ }
+
+ /**
+ * Closes all files created by this manager, and cleans up any temporary
+ * files.
+ */
+ public void dispose()
+ {
+ // Dispose the providers (making sure we only dispose each provider
+ // once
+ final Set providers = new HashSet();
+ providers.addAll( m_providers.values() );
+ for( Iterator iterator = providers.iterator(); iterator.hasNext(); )
+ {
+ Object provider = iterator.next();
+ if( provider instanceof Disposable )
+ {
+ Disposable disposable = (Disposable)provider;
+ disposable.dispose();
+ }
+ }
+ m_providers.clear();
+
+ m_fileReplicator.dispose();
}
/**
@@ -111,7 +155,7 @@
*/
public void setBaseFile( final File baseFile ) throws FileSystemException
{
- m_baseFile = m_localFileProvider.findLocalFile( baseFile.getAbsolutePath() );
+ m_baseFile = getLocalFileProvider().findLocalFile( baseFile );
}
/**
@@ -136,7 +180,7 @@
public FileObject resolveFile( final File baseFile, final String uri )
throws FileSystemException
{
- final FileObject baseFileObj = m_localFileProvider.findLocalFile( baseFile );
+ final FileObject baseFileObj = getLocalFileProvider().findLocalFile( baseFile );
return resolveFile( baseFileObj, uri );
}
@@ -162,19 +206,20 @@
final String decodedUri = UriParser.decode( uri );
// Handle absolute file names
- if( m_localFileProvider.isAbsoluteLocalName( decodedUri ) )
+ if( m_localFileProvider != null
+ && m_localFileProvider.isAbsoluteLocalName( decodedUri ) )
{
return m_localFileProvider.findLocalFile( decodedUri );
}
- // Assume a bad scheme
if( scheme != null )
{
+ // Assume a bad scheme
final String message = REZ.getString( "unknown-scheme.error", scheme, uri );
throw new FileSystemException( message );
}
- // Use the supplied base file
+ // Assume a relative name - use the supplied base file
if( baseFile == null )
{
final String message = REZ.getString( "find-rel-file.error", uri );
@@ -189,7 +234,7 @@
public FileObject convert( final File file )
throws FileSystemException
{
- return m_localFileProvider.findLocalFile( file );
+ return getLocalFileProvider().findLocalFile( file );
}
/**
@@ -206,5 +251,19 @@
throw new FileSystemException( message );
}
return provider.createFileSystem( scheme, file );
+ }
+
+ /**
+ * Locates the local file provider.
+ */
+ private LocalFileSystemProvider getLocalFileProvider()
+ throws FileSystemException
+ {
+ if( m_localFileProvider == null )
+ {
+ final String message = REZ.getString( "no-local-file-provider.error" );
+ throw new FileSystemException( message );
+ }
+ return m_localFileProvider;
}
}
1.2 +5 -24 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/impl/DefaultProviderContext.java
Index: DefaultProviderContext.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/impl/DefaultProviderContext.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- DefaultProviderContext.java 9 Mar 2002 10:31:30 -0000 1.1
+++ DefaultProviderContext.java 7 Apr 2002 02:27:56 -0000 1.2
@@ -7,30 +7,22 @@
*/
package org.apache.aut.vfs.impl;
-import java.util.HashMap;
-import java.util.Map;
import org.apache.aut.vfs.FileObject;
import org.apache.aut.vfs.FileSystemException;
-import org.apache.aut.vfs.provider.FileSystem;
+import org.apache.aut.vfs.provider.FileReplicator;
import org.apache.aut.vfs.provider.FileSystemProviderContext;
/**
* A provider context implementation.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
- * @version $Revision: 1.1 $ $Date: 2002/03/09 10:31:30 $
+ * @version $Revision: 1.2 $ $Date: 2002/04/07 02:27:56 $
*/
final class DefaultProviderContext
implements FileSystemProviderContext
{
private final DefaultFileSystemManager m_manager;
- /**
- * The cached file systems. This is a mapping from root URI to
- * FileSystem object.
- */
- private final Map m_fileSystems = new HashMap();
-
public DefaultProviderContext( final DefaultFileSystemManager manager )
{
m_manager = manager;
@@ -46,21 +38,10 @@
}
/**
- * Locates a cached file system by root URI.
+ * Locates a file replicator for the provider to use.
*/
- public FileSystem getFileSystem( final String rootURI )
- {
- // TODO - need to have a per-fs uri comparator
- return (FileSystem)m_fileSystems.get( rootURI );
- }
-
- /**
- * Registers a file system for caching.
- */
- public void putFileSystem( final String rootURI, final FileSystem fs )
- throws FileSystemException
+ public FileReplicator getReplicator() throws FileSystemException
{
- // TODO - should really check that there's not one already cached
- m_fileSystems.put( rootURI, fs );
+ return m_manager.getReplicator();
}
}
1.4 +4 -1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/impl/Resources.properties
Index: Resources.properties
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/impl/Resources.properties,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- Resources.properties 9 Mar 2002 10:31:30 -0000 1.3
+++ Resources.properties 7 Apr 2002 02:27:56 -0000 1.4
@@ -2,4 +2,7 @@
unknown-scheme.error=Unknown scheme "{0}" in URI "{1}".
find-rel-file.error=Could not find file with URI "{0}" because it is a relative path, and no base URI was provided.
multiple-providers-for-scheme.error=Multiple file system providers registered for URL scheme "{0}".
-unknown-provider.error=Unknown file system provider "{0}".
\ No newline at end of file
+unknown-provider.error=No file system provider is registered for URI scheme "{0}".
+no-local-file-provider.error=Could not find a file system provider which can handle local files.
+replicate-file.error=Could not replicate "{0}" to "{1}".
+delete-temp.warn=Could not clean up temporary file "{0}".
\ No newline at end of file
1.1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/impl/DefaultFileReplicator.java
Index: DefaultFileReplicator.java
===================================================================
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.aut.vfs.impl;
import java.io.File;
import java.util.ArrayList;
import org.apache.aut.vfs.FileConstants;
import org.apache.aut.vfs.FileObject;
import org.apache.aut.vfs.FileSelector;
import org.apache.aut.vfs.FileSystemException;
import org.apache.aut.vfs.provider.FileReplicator;
import org.apache.avalon.excalibur.i18n.ResourceManager;
import org.apache.avalon.excalibur.i18n.Resources;
import org.apache.avalon.framework.activity.Disposable;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
/**
* A simple file replicator.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision: 1.1 $ $Date: 2002/04/07 02:27:56 $
*/
public class DefaultFileReplicator
extends AbstractLogEnabled
implements FileReplicator, Disposable
{
private static final Resources REZ =
ResourceManager.getPackageResources( DefaultFileReplicator.class );
private final DefaultFileSystemManager m_manager;
private final File m_tempDir;
private final ArrayList m_copies = new ArrayList();
private long m_filecount;
public DefaultFileReplicator( final DefaultFileSystemManager manager )
{
m_manager = manager;
m_tempDir = new File( "ant_vfs_cache" ).getAbsoluteFile();
}
/**
* Deletes the temporary files.
*/
public void dispose()
{
while( m_copies.size() > 0 )
{
final FileObject file = (FileObject)m_copies.remove( 0 );
try
{
file.delete( FileConstants.SELECT_ALL );
}
catch( final FileSystemException e )
{
final String message = REZ.getString( "delete-temp.warn", file.getName() );
getLogger().warn( message, e );
}
}
}
/**
* Creates a local copy of the file, and all its descendents.
*/
public File replicateFile( final FileObject srcFile,
final FileSelector selector )
throws FileSystemException
{
// TODO - this is awful
// Create a unique-ish file name
final String basename = m_filecount + "_" + srcFile.getName().getBaseName();
m_filecount++;
final File file = new File( m_tempDir, basename );
try
{
// Copy from the source file
final FileObject destFile = m_manager.convert( file );
destFile.copyFrom( srcFile, selector );
// Keep track of the copy
m_copies.add( destFile );
}
catch( final FileSystemException e )
{
final String message = REZ.getString( "replicate-file.error", srcFile.getName(), file );
throw new FileSystemException( message, e );
}
return file;
}
}
1.8 +175 -51 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/AbstractFileObject.java
Index: AbstractFileObject.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/AbstractFileObject.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- AbstractFileObject.java 29 Mar 2002 12:56:37 -0000 1.7
+++ AbstractFileObject.java 7 Apr 2002 02:27:56 -0000 1.8
@@ -7,15 +7,16 @@
*/
package org.apache.aut.vfs.provider;
+import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
-import java.util.HashSet;
import java.util.List;
-import java.util.Set;
+import org.apache.aut.vfs.FileConstants;
import org.apache.aut.vfs.FileContent;
import org.apache.aut.vfs.FileName;
import org.apache.aut.vfs.FileObject;
+import org.apache.aut.vfs.FileSelector;
import org.apache.aut.vfs.FileSystemException;
import org.apache.aut.vfs.FileType;
import org.apache.aut.vfs.NameScope;
@@ -26,7 +27,11 @@
/**
* A partial file object implementation.
*
- * @author Adam Murdoch
+ * @todo Chop this class up - move all the protected methods to several
+ * interfaces, so that structure and content can be separately overridden.
+ *
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.8 $ $Date: 2002/04/07 02:27:56 $
*/
public abstract class AbstractFileObject
implements FileObject
@@ -98,7 +103,7 @@
* <ul>
* <li>{@link #isReadOnly} returns false.
* <li>{@link #doGetType} does not return null.
- * <li>If this file is a folder, it has no children.
+ * <li>This file has no children.
* </ul>
*/
protected void doDelete() throws Exception
@@ -123,6 +128,15 @@
}
/**
+ * Creates a local copy of this file.
+ */
+ protected File doReplicateFile( final FileSelector selector ) throws FileSystemException
+ {
+ final FileReplicator replicator = m_fs.getContext().getReplicator();
+ return replicator.replicateFile( this, selector );
+ }
+
+ /**
* Called when the children of this file change.
*/
protected void onChildrenChanged()
@@ -321,9 +335,9 @@
* absolute path, which is resolved relative to the file system
* that contains this file.
*/
- public FileObject resolveFile( String path ) throws FileSystemException
+ public FileObject resolveFile( final String path ) throws FileSystemException
{
- FileName name = m_name.resolveName( path );
+ final FileName name = m_name.resolveName( path );
return m_fs.findFile( name );
}
@@ -356,7 +370,7 @@
/**
* Deletes this file, and all children.
*/
- public void delete() throws FileSystemException
+ public void delete( final FileSelector selector ) throws FileSystemException
{
attach();
if( m_type == null )
@@ -365,51 +379,27 @@
return;
}
- // Recursively delete this file and all its children
- List queue = new ArrayList();
- Set expanded = new HashSet();
- queue.add( this );
-
- // Recursively delete each file
- // TODO - recover from errors
- while( queue.size() > 0 )
+ // Locate all the files to delete
+ ArrayList files = new ArrayList();
+ findFiles( selector, true, files );
+
+ // Delete 'em
+ final int count = files.size();
+ for( int i = 0; i < count; i++ )
{
- AbstractFileObject file = (AbstractFileObject)queue.get( 0 );
+ final AbstractFileObject file = (AbstractFileObject)files.get( i );
file.attach();
- if( file.m_type == null )
- {
- // Shouldn't happen
- queue.remove( 0 );
- }
- else if( file.m_type == FileType.FILE )
- {
- // Delete the file
- file.deleteSelf();
- queue.remove( 0 );
- }
- else if( expanded.contains( file ) )
+ // If the file is a folder, make sure all its children have been deleted
+ if( file.m_type == FileType.FOLDER && file.getChildren().length != 0 )
{
- // Have already deleted all the children of this folder -
- // delete it
- file.deleteSelf();
- queue.remove( 0 );
+ // Skip
+ continue;
}
- else
- {
- // Delete the folder's children
- FileObject[] children = file.getChildren();
- for( int i = 0; i < children.length; i++ )
- {
- FileObject child = children[ i ];
- queue.add( 0, child );
- }
- expanded.add( file );
- }
- }
- // Update parent's child list
- notifyParent();
+ // Delete the file
+ file.deleteSelf();
+ }
}
/**
@@ -468,18 +458,87 @@
}
/**
+ * Copies another file to this file.
+ */
+ public void copyFrom( final FileObject file, final FileSelector selector )
+ throws FileSystemException
+ {
+ if( !file.exists() )
+ {
+ final String message = REZ.getString( "copy-missing-file.error", file.getName() );
+ throw new FileSystemException( message );
+ }
+ if( isReadOnly() )
+ {
+ final String message = REZ.getString( "copy-read-only.error", file.getType(), file.getName(), m_name );
+ throw new FileSystemException( message );
+ }
+
+ // Locate the files to copy across
+ final ArrayList files = new ArrayList();
+ ( (AbstractFileObject)file ).findFiles( selector, false, files );
+
+ // Copy everything across
+ final int count = files.size();
+ for( int i = 0; i < count; i++ )
+ {
+ final FileObject srcFile = (FileObject)files.get( i );
+
+ // Determine the destination file
+ final String relPath = file.getName().getRelativeName( srcFile.getName() );
+ final FileObject destFile = resolveFile( relPath, NameScope.DESCENDENT_OR_SELF );
+
+ // Clean up the destination file, if necessary
+ if( destFile.exists() && destFile.getType() != srcFile.getType() )
+ {
+ // The destination file exists, and is not of the same type,
+ // so delete it
+ // TODO - add a pluggable policy for deleting and overwriting existing files
+ destFile.delete( FileConstants.SELECT_ALL );
+ }
+
+ // Copy across
+ if( srcFile.getType() == FileType.FILE )
+ {
+ copyContent( srcFile, destFile );
+ }
+ else
+ {
+ destFile.create( FileType.FOLDER );
+ }
+ }
+ }
+
+ /**
+ * Creates a temporary local copy of this file, and its descendents.
+ */
+ public File replicateFile( final FileSelector selector )
+ throws FileSystemException
+ {
+ if( !exists() )
+ {
+ final String message = REZ.getString( "copy-missing-file.error", m_name );
+ throw new FileSystemException( message );
+ }
+
+ return doReplicateFile( selector );
+ }
+
+ /**
* Copies the content of another file to this file.
*/
- public void copy( final FileObject file ) throws FileSystemException
+ private static void copyContent( final FileObject srcFile,
+ final FileObject destFile )
+ throws FileSystemException
{
try
{
- final InputStream instr = file.getContent().getInputStream();
+ final InputStream instr = srcFile.getContent().getInputStream();
try
{
- // Create the output strea via getContent(), to pick up the
+ // Create the output stream via getContent(), to pick up the
// validation it does
- final OutputStream outstr = getContent().getOutputStream();
+ final OutputStream outstr = destFile.getContent().getOutputStream();
try
{
IOUtil.copy( instr, outstr );
@@ -496,7 +555,7 @@
}
catch( final Exception exc )
{
- final String message = REZ.getString( "copy-file.error", file.getName(), m_name );
+ final String message = REZ.getString( "copy-file.error", srcFile.getName(), destFile.getName() );
throw new FileSystemException( message, exc );
}
}
@@ -678,4 +737,69 @@
m_children = null;
onChildrenChanged();
}
+
+ /**
+ * Traverses the descendents of this file, and builds a list of selected
+ * files.
+ */
+ void findFiles( final FileSelector selector,
+ final boolean depthwise,
+ final List selected ) throws FileSystemException
+ {
+ if( exists() )
+ {
+ // Traverse starting at this file
+ final DefaultFileSelectorInfo info = new DefaultFileSelectorInfo();
+ info.setBaseFolder( this );
+ info.setDepth( 0 );
+ info.setFile( this );
+ traverse( info, selector, depthwise, selected );
+ }
+ }
+
+ /**
+ * Traverses a file.
+ */
+ private void traverse( final DefaultFileSelectorInfo fileInfo,
+ final FileSelector selector,
+ final boolean depthwise,
+ final List selected )
+ throws FileSystemException
+ {
+ // Check the file itself
+ final boolean includeFile = selector.includeFile( fileInfo );
+ final FileObject file = fileInfo.getFile();
+
+ // Add the file if not doing depthwise traversal
+ if( !depthwise && includeFile )
+ {
+ selected.add( file );
+ }
+
+ // If the file is a folder, traverse it
+ if( file.getType() == FileType.FOLDER && selector.traverseDescendents( fileInfo ) )
+ {
+ final int curDepth = fileInfo.getDepth();
+ fileInfo.setDepth( curDepth + 1 );
+
+ // Traverse the children
+ final FileObject[] children = file.getChildren();
+ for( int i = 0; i < children.length; i++ )
+ {
+ final FileObject child = children[ i ];
+ fileInfo.setFile( child );
+ traverse( fileInfo, selector, depthwise, selected );
+ }
+
+ fileInfo.setFile( file );
+ fileInfo.setDepth( curDepth );
+ }
+
+ // Add the file if doing depthwise traversal
+ if( depthwise && includeFile )
+ {
+ selected.add( file );
+ }
+ }
+
}
1.2 +38 -16 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/AbstractFileSystem.java
Index: AbstractFileSystem.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/AbstractFileSystem.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- AbstractFileSystem.java 2 Feb 2002 03:29:08 -0000 1.1
+++ AbstractFileSystem.java 7 Apr 2002 02:27:56 -0000 1.2
@@ -12,45 +12,67 @@
import org.apache.aut.vfs.FileName;
import org.apache.aut.vfs.FileObject;
import org.apache.aut.vfs.FileSystemException;
+import org.apache.avalon.framework.activity.Disposable;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
/**
* A partial file system implementation.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.2 $ $Date: 2002/04/07 02:27:56 $
*/
-public abstract class AbstractFileSystem implements FileSystem
+public abstract class AbstractFileSystem
+ extends AbstractLogEnabled
+ implements FileSystem, Disposable
{
private FileObject m_root;
- private FileName m_rootName;
+ private final FileName m_rootName;
+ private final FileSystemProviderContext m_context;
- /** Map from absolute file path to FileObject. */
- private Map m_files = new HashMap();
+ /** Map from FileName to FileObject. */
+ private final Map m_files = new HashMap();
- protected AbstractFileSystem( FileName rootName )
+ protected AbstractFileSystem( final FileSystemProviderContext context,
+ final FileName rootName )
{
m_rootName = rootName;
+ m_context = context;
+ }
+
+ public void dispose()
+ {
+ // Clean-up
+ m_files.clear();
}
/**
* Creates a file object. This method is called only if the requested
* file is not cached.
*/
- protected abstract FileObject createFile( FileName name ) throws FileSystemException;
+ protected abstract FileObject createFile( final FileName name ) throws FileSystemException;
/**
* Adds a file object to the cache.
*/
- protected void putFile( FileObject file )
+ protected void putFile( final FileObject file )
{
- m_files.put( file.getName().getPath(), file );
+ m_files.put( file.getName(), file );
}
/**
* Returns a cached file.
*/
- protected FileObject getFile( FileName name )
+ protected FileObject getFile( final FileName name )
+ {
+ return (FileObject)m_files.get( name );
+ }
+
+ /**
+ * Returns the context fir this file system.
+ */
+ public FileSystemProviderContext getContext()
{
- return (FileObject)m_files.get( name.getPath() );
+ return m_context;
}
/**
@@ -68,24 +90,24 @@
/**
* Finds a file in this file system.
*/
- public FileObject findFile( String nameStr ) throws FileSystemException
+ public FileObject findFile( final String nameStr ) throws FileSystemException
{
// Resolve the name, and create the file
- FileName name = m_rootName.resolveName( nameStr );
+ final FileName name = m_rootName.resolveName( nameStr );
return findFile( name );
}
/**
* Finds a file in this file system.
*/
- public FileObject findFile( FileName name ) throws FileSystemException
+ public FileObject findFile( final FileName name ) throws FileSystemException
{
// TODO - assert that name is from this file system
- FileObject file = (FileObject)m_files.get( name.getPath() );
+ FileObject file = (FileObject)m_files.get( name );
if( file == null )
{
file = createFile( name );
- m_files.put( name.getPath(), file );
+ m_files.put( name, file );
}
return file;
}
1.7 +35 -5 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/AbstractFileSystemProvider.java
Index: AbstractFileSystemProvider.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/AbstractFileSystemProvider.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- AbstractFileSystemProvider.java 29 Mar 2002 12:56:37 -0000 1.6
+++ AbstractFileSystemProvider.java 7 Apr 2002 02:27:56 -0000 1.7
@@ -7,18 +7,25 @@
*/
package org.apache.aut.vfs.provider;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
import org.apache.aut.vfs.FileObject;
import org.apache.aut.vfs.FileSystemException;
import org.apache.avalon.excalibur.i18n.ResourceManager;
import org.apache.avalon.excalibur.i18n.Resources;
+import org.apache.avalon.framework.activity.Disposable;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
/**
* A partial file system provider implementation.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.7 $ $Date: 2002/04/07 02:27:56 $
*/
public abstract class AbstractFileSystemProvider
- implements FileSystemProvider
+ extends AbstractLogEnabled
+ implements FileSystemProvider, Disposable
{
private static final Resources REZ =
ResourceManager.getPackageResources( AbstractFileSystemProvider.class );
@@ -26,6 +33,12 @@
private FileSystemProviderContext m_context;
/**
+ * The cached file systems. This is a mapping from root URI to
+ * FileSystem object.
+ */
+ private final Map m_fileSystems = new HashMap();
+
+ /**
* Returns the context for this provider.
*/
protected FileSystemProviderContext getContext()
@@ -43,6 +56,23 @@
}
/**
+ * Closes the file systems created by this provider.
+ */
+ public void dispose()
+ {
+ for( Iterator iterator = m_fileSystems.values().iterator(); iterator.hasNext(); )
+ {
+ FileSystem fileSystem = (FileSystem)iterator.next();
+ if( fileSystem instanceof Disposable )
+ {
+ Disposable disposable = (Disposable)fileSystem;
+ disposable.dispose();
+ }
+ }
+ m_fileSystems.clear();
+ }
+
+ /**
* Locates a file object, by absolute URI.
*
* @param uri
@@ -65,7 +95,6 @@
// Locate the file
return findFile( parsedUri );
-
}
/**
@@ -76,12 +105,13 @@
{
// Check in the cache for the file system
final String rootUri = parsedUri.getRootUri();
- FileSystem fs = m_context.getFileSystem( rootUri );
+ FileSystem fs = (FileSystem)m_fileSystems.get( rootUri );
if( fs == null )
{
// Need to create the file system, and cache it
fs = createFileSystem( parsedUri );
- m_context.putFileSystem( rootUri, fs );
+ setupLogger( fs );
+ m_fileSystems.put( rootUri, fs );
}
// Locate the file
1.5 +2 -1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/DefaultFileContent.java
Index: DefaultFileContent.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/DefaultFileContent.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- DefaultFileContent.java 29 Mar 2002 12:56:37 -0000 1.4
+++ DefaultFileContent.java 7 Apr 2002 02:27:56 -0000 1.5
@@ -21,7 +21,8 @@
/**
* The content of a file.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.5 $ $Date: 2002/04/07 02:27:56 $
*/
public class DefaultFileContent
implements FileContent
1.3 +10 -1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/DefaultFileName.java
Index: DefaultFileName.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/DefaultFileName.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- DefaultFileName.java 2 Mar 2002 04:07:51 -0000 1.2
+++ DefaultFileName.java 7 Apr 2002 02:27:56 -0000 1.3
@@ -14,7 +14,8 @@
/**
* A default file name implementation.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.3 $ $Date: 2002/04/07 02:27:56 $
*/
public class DefaultFileName implements FileName
{
@@ -126,5 +127,13 @@
m_uri = m_parser.getUri( m_rootPrefix, m_absPath );
}
return m_uri;
+ }
+
+ /**
+ * Converts a file name to a relative name, relative to this file name.
+ */
+ public String getRelativeName( final FileName name ) throws FileSystemException
+ {
+ return m_parser.makeRelative( m_absPath, name.getPath() );
}
}
1.2 +2 -1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/FileSystem.java
Index: FileSystem.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/FileSystem.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- FileSystem.java 2 Feb 2002 03:29:08 -0000 1.1
+++ FileSystem.java 7 Apr 2002 02:27:56 -0000 1.2
@@ -14,7 +14,8 @@
/**
* A file system.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.2 $ $Date: 2002/04/07 02:27:56 $
*/
public interface FileSystem
{
1.4 +4 -1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/FileSystemProvider.java
Index: FileSystemProvider.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/FileSystemProvider.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- FileSystemProvider.java 15 Mar 2002 02:48:20 -0000 1.3
+++ FileSystemProvider.java 7 Apr 2002 02:27:56 -0000 1.4
@@ -14,7 +14,7 @@
* A file system provider, or factory.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
- * @version $Revision: 1.3 $ $Date: 2002/03/15 02:48:20 $
+ * @version $Revision: 1.4 $ $Date: 2002/04/07 02:27:56 $
*
* @ant:role shorthand="file-system"
*/
@@ -25,6 +25,9 @@
/**
* Sets the context for this file system provider. This method is called
* before any of the other provider methods.
+ *
+ * @todo - move this to a lifecycle interface (this interface is accessable to
+ * other providers, so need to prevent this being called).
*/
void setContext( FileSystemProviderContext context );
1.3 +3 -8 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/FileSystemProviderContext.java
Index: FileSystemProviderContext.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/FileSystemProviderContext.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- FileSystemProviderContext.java 9 Mar 2002 10:31:30 -0000 1.2
+++ FileSystemProviderContext.java 7 Apr 2002 02:27:56 -0000 1.3
@@ -16,7 +16,7 @@
* as the file system cache or other file system providers.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
- * @version $Revision: 1.2 $ $Date: 2002/03/09 10:31:30 $
+ * @version $Revision: 1.3 $ $Date: 2002/04/07 02:27:56 $
*/
public interface FileSystemProviderContext
{
@@ -29,12 +29,7 @@
throws FileSystemException;
/**
- * Locates a cached file system by root URI.
+ * Locates a file replicator for the provider to use.
*/
- FileSystem getFileSystem( String rootURI );
-
- /**
- * Registers a file system for caching.
- */
- void putFileSystem( String rootURI, FileSystem fs ) throws FileSystemException;
+ FileReplicator getReplicator() throws FileSystemException;
}
1.3 +2 -1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/ParsedUri.java
Index: ParsedUri.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/ParsedUri.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ParsedUri.java 9 Mar 2002 10:31:30 -0000 1.2
+++ ParsedUri.java 7 Apr 2002 02:27:56 -0000 1.3
@@ -10,7 +10,8 @@
/**
* A data container for information parsed from an absolute URI.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.3 $ $Date: 2002/04/07 02:27:56 $
*/
public class ParsedUri
{
1.5 +2 -0 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/Resources.properties
Index: Resources.properties
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/Resources.properties,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- Resources.properties 9 Mar 2002 10:31:30 -0000 1.4
+++ Resources.properties 7 Apr 2002 02:27:56 -0000 1.5
@@ -18,6 +18,8 @@
write-in-use.error=Could not write to "{0}" because it is already in use.
write.error=Could not write to "{0}".
copy-file.error=Could not copy "{0}" to "{1}".
+copy-read-only.error=Could not copy {0} "{1}" to "{2}" because the destination file is read-only.
+copy-missing-file.error=Could not copy "{0}" because is does not exist.
# DefaultFileContent
get-size-no-exist.error=Could not determine the size of file "{0}" because it does not exist.
1.7 +74 -1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/UriParser.java
Index: UriParser.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/UriParser.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- UriParser.java 29 Mar 2002 12:56:37 -0000 1.6
+++ UriParser.java 7 Apr 2002 02:27:56 -0000 1.7
@@ -17,7 +17,8 @@
/**
* A name parser which parses absolute URIs. See RFC 2396 for details.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.7 $ $Date: 2002/04/07 02:27:56 $
*/
public class UriParser
{
@@ -452,6 +453,17 @@
throw new FileSystemException( message );
}
}
+ else if( scope == NameScope.DESCENDENT_OR_SELF )
+ {
+ final int baseLen = baseFile.length();
+ if( !resolvedPath.startsWith( baseFile )
+ || ( resolvedPath.length() != baseLen
+ && resolvedPath.charAt( baseLen ) != m_separatorChar ) )
+ {
+ final String message = REZ.getString( "invalid-descendent-name.error", path );
+ throw new FileSystemException( message );
+ }
+ }
else if( scope != NameScope.FILE_SYSTEM )
{
throw new IllegalArgumentException();
@@ -480,6 +492,67 @@
return m_separator;
}
return path.substring( 0, idx );
+ }
+
+ /**
+ * Converts an absolute path into a relative path.
+ *
+ * @param basePath The base path.
+ * @param path The path to convert.
+ */
+ public String makeRelative( final String basePath, final String path )
+ {
+ // Calculate the common prefix
+ final int basePathLen = basePath.length();
+ final int pathLen = path.length();
+
+ // Deal with root
+ if( basePathLen == 1 && pathLen == 1 )
+ {
+ return ".";
+ }
+ else if( basePathLen == 1 )
+ {
+ return path.substring( 1 );
+ }
+
+ final int maxlen = Math.min( basePathLen, pathLen );
+ int pos = 0;
+ for( ; pos < maxlen && basePath.charAt( pos ) == path.charAt( pos ); pos++ )
+ {
+ }
+
+ if( pos == basePathLen && pos == pathLen )
+ {
+ // Same names
+ return ".";
+ }
+ else if( pos == basePathLen && pos < pathLen && path.charAt( pos ) == m_separatorChar )
+ {
+ // A descendent of the base path
+ return path.substring( pos + 1 );
+ }
+
+ // Strip the common prefix off the path
+ final StringBuffer buffer = new StringBuffer();
+ if( pathLen > 1 && ( pos < pathLen || basePath.charAt( pos ) != m_separatorChar ) )
+ {
+ // Not a direct ancestor, need to back up
+ pos = basePath.lastIndexOf( m_separatorChar, pos );
+ buffer.append( path.substring( pos ) );
+ }
+
+ // Prepend a '../' for each element in the base path past the common
+ // prefix
+ buffer.insert( 0, ".." );
+ pos = basePath.indexOf( m_separatorChar, pos + 1 );
+ while( pos != -1 )
+ {
+ buffer.insert( 0, "../" );
+ pos = basePath.indexOf( m_separatorChar, pos + 1 );
+ }
+
+ return buffer.toString();
}
/**
1.1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/DefaultFileSelectorInfo.java
Index: DefaultFileSelectorInfo.java
===================================================================
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.aut.vfs.provider;
import org.apache.aut.vfs.FileObject;
import org.apache.aut.vfs.FileSelectInfo;
/**
* A default {@link FileSelectInfo} implementation.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision: 1.1 $ $Date: 2002/04/07 02:27:56 $
*/
class DefaultFileSelectorInfo
implements FileSelectInfo
{
private FileObject m_baseFolder;
private FileObject m_file;
private int m_depth;
public FileObject getBaseFolder()
{
return m_baseFolder;
}
public void setBaseFolder( final FileObject baseFolder )
{
m_baseFolder = baseFolder;
}
public FileObject getFile()
{
return m_file;
}
public void setFile( final FileObject file )
{
m_file = file;
}
public int getDepth()
{
return m_depth;
}
public void setDepth( final int depth )
{
m_depth = depth;
}
}
1.1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/FileReplicator.java
Index: FileReplicator.java
===================================================================
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.aut.vfs.provider;
import java.io.File;
import org.apache.aut.vfs.FileObject;
import org.apache.aut.vfs.FileSelector;
import org.apache.aut.vfs.FileSystemException;
/**
* Responsible for making local replicas of files.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision: 1.1 $ $Date: 2002/04/07 02:27:56 $
*/
public interface FileReplicator
{
/**
* Creates a local copy of the file, and all its descendents.
*
* @param srcFile The file to copy.
* @param selector Selects the files to copy.
*
* @return The local copy of the source file.
*
* @throws FileSystemException
* If the source files does not exist, or on error copying.
*/
File replicateFile( FileObject srcFile, FileSelector selector )
throws FileSystemException;
}
1.1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/LocalFileSystemProvider.java
Index: LocalFileSystemProvider.java
===================================================================
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.aut.vfs.provider;
import java.io.File;
import org.apache.aut.vfs.FileObject;
import org.apache.aut.vfs.FileSystemException;
/**
* A file system provider which handles local file systems.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision: 1.1 $ $Date: 2002/04/07 02:27:56 $
*/
public interface LocalFileSystemProvider
extends FileSystemProvider
{
/**
* Determines if a name is an absolute file name.
*
* @todo Move this to a general file name parser interface.
*
* @param name The name to test.
*/
boolean isAbsoluteLocalName( final String name );
/**
* Finds a local file, from its local name.
*/
FileObject findLocalFile( final String name )
throws FileSystemException;
/**
* Finds a local file.
*/
FileObject findLocalFile( final File file )
throws FileSystemException;
}
1.4 +2 -1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/ftp/FtpFileNameParser.java
Index: FtpFileNameParser.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/ftp/FtpFileNameParser.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- FtpFileNameParser.java 9 Mar 2002 10:31:30 -0000 1.3
+++ FtpFileNameParser.java 7 Apr 2002 02:27:57 -0000 1.4
@@ -13,7 +13,8 @@
/**
* A parser for FTP URI.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.4 $ $Date: 2002/04/07 02:27:57 $
*/
public class FtpFileNameParser extends UriParser
{
1.6 +14 -2 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/ftp/FtpFileObject.java
Index: FtpFileObject.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/ftp/FtpFileObject.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- FtpFileObject.java 29 Mar 2002 12:56:37 -0000 1.5
+++ FtpFileObject.java 7 Apr 2002 02:27:57 -0000 1.6
@@ -7,6 +7,7 @@
*/
package org.apache.aut.vfs.provider.ftp;
+import com.oroinc.net.ftp.FTPClient;
import com.oroinc.net.ftp.FTPFile;
import java.io.InputStream;
import java.io.OutputStream;
@@ -20,7 +21,8 @@
/**
* An FTP file.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.6 $ $Date: 2002/04/07 02:27:57 $
*/
class FtpFileObject
extends AbstractFileObject
@@ -160,7 +162,17 @@
*/
protected void doDelete() throws Exception
{
- if( !m_ftpFs.getClient().deleteFile( getName().getPath() ) )
+ final FTPClient ftpClient = m_ftpFs.getClient();
+ boolean ok;
+ if( m_fileInfo.isDirectory() )
+ {
+ ok = ftpClient.removeDirectory( getName().getPath() );
+ }
+ else
+ {
+ ok = ftpClient.deleteFile( getName().getPath() );
+ }
+ if( !ok )
{
final String message = REZ.getString( "delete-file.error", getName() );
throw new FileSystemException( message );
1.5 +35 -18 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/ftp/FtpFileSystem.java
Index: FtpFileSystem.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/ftp/FtpFileSystem.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- FtpFileSystem.java 29 Mar 2002 12:56:37 -0000 1.4
+++ FtpFileSystem.java 7 Apr 2002 02:27:57 -0000 1.5
@@ -15,13 +15,15 @@
import org.apache.aut.vfs.FileObject;
import org.apache.aut.vfs.FileSystemException;
import org.apache.aut.vfs.provider.AbstractFileSystem;
+import org.apache.aut.vfs.provider.FileSystemProviderContext;
import org.apache.avalon.excalibur.i18n.ResourceManager;
import org.apache.avalon.excalibur.i18n.Resources;
/**
* An FTP file system.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.5 $ $Date: 2002/04/07 02:27:57 $
*/
class FtpFileSystem
extends AbstractFileSystem
@@ -31,13 +33,14 @@
private FTPClient m_client;
- public FtpFileSystem( final FileName rootName,
+ public FtpFileSystem( final FileSystemProviderContext context,
+ final FileName rootName,
final String hostname,
final String username,
final String password )
throws FileSystemException
{
- super( rootName );
+ super( context, rootName );
try
{
m_client = new FTPClient();
@@ -64,26 +67,39 @@
throw new FileSystemException( message );
}
}
- catch( Exception exc )
+ catch( final Exception exc )
{
- try
- {
- // Clean up
- if( m_client.isConnected() )
- {
- m_client.disconnect();
- }
- }
- catch( IOException e )
- {
- // Ignore
- }
-
+ closeConnection();
final String message = REZ.getString( "connect.error", hostname );
throw new FileSystemException( message, exc );
}
+ }
- // TODO - close connection
+ public void dispose()
+ {
+ // Clean up the connection
+ super.dispose();
+ closeConnection();
+ }
+
+ /**
+ * Cleans up the connection to the server.
+ */
+ private void closeConnection()
+ {
+ try
+ {
+ // Clean up
+ if( m_client.isConnected() )
+ {
+ m_client.disconnect();
+ }
+ }
+ catch( final IOException e )
+ {
+ final String message = REZ.getString( "close-connection.error" );
+ getLogger().warn( message, e );
+ }
}
/**
@@ -91,6 +107,7 @@
*/
public FTPClient getClient()
{
+ // TODO - connect on demand, and garbage collect connections
return m_client;
}
1.4 +3 -2 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/ftp/FtpFileSystemProvider.java
Index: FtpFileSystemProvider.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/ftp/FtpFileSystemProvider.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- FtpFileSystemProvider.java 23 Mar 2002 04:01:26 -0000 1.3
+++ FtpFileSystemProvider.java 7 Apr 2002 02:27:57 -0000 1.4
@@ -18,7 +18,8 @@
/**
* A provider for FTP file systems.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.4 $ $Date: 2002/04/07 02:27:57 $
*
* @ant.type type="file-system" name="ftp"
*/
@@ -60,6 +61,6 @@
}
// Create the file system
- return new FtpFileSystem( rootName, ftpUri.getHostName(), username, password );
+ return new FtpFileSystem( getContext(), rootName, ftpUri.getHostName(), username, password );
}
}
1.2 +2 -1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/ftp/ParsedFtpUri.java
Index: ParsedFtpUri.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/ftp/ParsedFtpUri.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ParsedFtpUri.java 2 Feb 2002 03:29:08 -0000 1.1
+++ ParsedFtpUri.java 7 Apr 2002 02:27:57 -0000 1.2
@@ -12,7 +12,8 @@
/**
* A parsed FTP URI.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.2 $ $Date: 2002/04/07 02:27:57 $
*/
public class ParsedFtpUri extends ParsedUri
{
1.2 +2 -1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/ftp/Resources.properties
Index: Resources.properties
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/ftp/Resources.properties,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Resources.properties 2 Feb 2002 03:29:08 -0000 1.1
+++ Resources.properties 7 Apr 2002 02:27:57 -0000 1.2
@@ -6,4 +6,5 @@
connect-rejected.error=Connection to FTP server on "{0}" rejected.
login.error=Could not login to FTP server on "{0}" as user "{1}".
set-binary.error=Could not switch to binary transfer mode.
-connect.error=Could not connect to FTP server on "{0}".
\ No newline at end of file
+connect.error=Could not connect to FTP server on "{0}".
+close-connection.error=Could not close connection to FTP server.
\ No newline at end of file
1.6 +12 -2 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/local/LocalFile.java
Index: LocalFile.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/local/LocalFile.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- LocalFile.java 29 Mar 2002 12:56:37 -0000 1.5
+++ LocalFile.java 7 Apr 2002 02:27:57 -0000 1.6
@@ -14,6 +14,7 @@
import java.io.OutputStream;
import org.apache.aut.vfs.FileName;
import org.apache.aut.vfs.FileObject;
+import org.apache.aut.vfs.FileSelector;
import org.apache.aut.vfs.FileSystemException;
import org.apache.aut.vfs.FileType;
import org.apache.aut.vfs.provider.AbstractFileObject;
@@ -24,7 +25,7 @@
* A file object implementation which uses direct file access.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
- * @version $Revision: 1.5 $ $Date: 2002/03/29 12:56:37 $
+ * @version $Revision: 1.6 $ $Date: 2002/04/07 02:27:57 $
*/
final class LocalFile
extends AbstractFileObject
@@ -94,7 +95,7 @@
/**
* Deletes this file, and all children.
*/
- public void doDelete()
+ protected void doDelete()
throws Exception
{
if( !m_file.delete() )
@@ -142,5 +143,14 @@
throws Exception
{
return m_file.length();
+ }
+
+ /**
+ * Creates a temporary local copy of this file, and its descendents.
+ */
+ protected File doReplicateFile( final FileSelector selector )
+ throws FileSystemException
+ {
+ return m_file;
}
}
1.3 +8 -5 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/local/LocalFileSystem.java
Index: LocalFileSystem.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/local/LocalFileSystem.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- LocalFileSystem.java 2 Mar 2002 04:07:51 -0000 1.2
+++ LocalFileSystem.java 7 Apr 2002 02:27:57 -0000 1.3
@@ -13,30 +13,33 @@
import org.apache.aut.vfs.provider.AbstractFileSystem;
import org.apache.aut.vfs.provider.DefaultFileName;
import org.apache.aut.vfs.provider.FileSystem;
+import org.apache.aut.vfs.provider.FileSystemProviderContext;
/**
* A local file system.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
- * @version $Revision: 1.2 $ $Date: 2002/03/02 04:07:51 $
+ * @version $Revision: 1.3 $ $Date: 2002/04/07 02:27:57 $
*/
class LocalFileSystem extends AbstractFileSystem implements FileSystem
{
private String m_rootFile;
- public LocalFileSystem( DefaultFileName rootName, String rootFile )
+ public LocalFileSystem( final FileSystemProviderContext context,
+ final DefaultFileName rootName,
+ final String rootFile )
{
- super( rootName );
+ super( context, rootName );
m_rootFile = rootFile;
}
/**
* Creates a file object.
*/
- protected FileObject createFile( FileName name ) throws FileSystemException
+ protected FileObject createFile( final FileName name ) throws FileSystemException
{
// Create the file
- String fileName = m_rootFile + name.getPath();
+ final String fileName = m_rootFile + name.getPath();
return new LocalFile( this, fileName, name );
}
}
1.1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/local/DefaultLocalFileSystemProvider.java
Index: DefaultLocalFileSystemProvider.java
===================================================================
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE.txt file.
*/
package org.apache.aut.vfs.provider.local;
import java.io.File;
import org.apache.aut.nativelib.Os;
import org.apache.aut.vfs.FileObject;
import org.apache.aut.vfs.FileSystemException;
import org.apache.aut.vfs.provider.AbstractFileSystemProvider;
import org.apache.aut.vfs.provider.DefaultFileName;
import org.apache.aut.vfs.provider.FileSystem;
import org.apache.aut.vfs.provider.LocalFileSystemProvider;
import org.apache.aut.vfs.provider.ParsedUri;
/**
* A file system provider, which uses direct file access.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
* @version $Revision: 1.1 $ $Date: 2002/04/07 02:27:57 $
*
* @ant.type type="file-system" name="file"
*
*/
public class DefaultLocalFileSystemProvider
extends AbstractFileSystemProvider
implements LocalFileSystemProvider
{
private final LocalFileNameParser m_parser;
public DefaultLocalFileSystemProvider()
{
if( Os.isFamily( Os.OS_FAMILY_WINDOWS ) )
{
m_parser = new WindowsFileNameParser();
}
else
{
m_parser = new GenericFileNameParser();
}
}
/**
* Determines if a name is an absolute file name.
*/
public boolean isAbsoluteLocalName( final String name )
{
return m_parser.isAbsoluteName( name );
}
/**
* Finds a local file, from its local name.
*/
public FileObject findLocalFile( final String name )
throws FileSystemException
{
// TODO - tidy this up, no need to turn the name into an absolute URI,
// and then straight back again
return findFile( null, "file:" + name );
}
/**
* Finds a local file.
*/
public FileObject findLocalFile( final File file )
throws FileSystemException
{
// TODO - tidy this up, should build file object straight from the file
return findFile( null, "file:" + file.getAbsolutePath() );
}
/**
* Parses a URI into its components. The returned value is used to
* locate the file system in the cache (using the root prefix), and is
* passed to {@link #createFileSystem} to create the file system.
*
* <p>The provider can annotate this object with any additional
* information it requires to create a file system from the URI.
*/
protected ParsedUri parseUri( final FileObject baseFile,
final String uri )
throws FileSystemException
{
return m_parser.parseFileUri( uri );
}
/**
* Creates the filesystem.
*/
protected FileSystem createFileSystem( final ParsedUri uri )
throws FileSystemException
{
// Build the name of the root file.
final ParsedFileUri fileUri = (ParsedFileUri)uri;
final String rootFile = fileUri.getRootFile();
// Create the file system
final DefaultFileName rootName = new DefaultFileName( m_parser, fileUri.getRootUri(), "/" );
return new LocalFileSystem( getContext(), rootName, rootFile );
}
}
1.2 +2 -1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/smb/ParsedSmbUri.java
Index: ParsedSmbUri.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/smb/ParsedSmbUri.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ParsedSmbUri.java 2 Feb 2002 03:29:08 -0000 1.1
+++ ParsedSmbUri.java 7 Apr 2002 02:27:57 -0000 1.2
@@ -12,7 +12,8 @@
/**
* A parsed SMB URI.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.2 $ $Date: 2002/04/07 02:27:57 $
*/
public class ParsedSmbUri extends ParsedUri
{
1.6 +2 -1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/smb/SmbFileNameParser.java
Index: SmbFileNameParser.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/smb/SmbFileNameParser.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- SmbFileNameParser.java 29 Mar 2002 12:56:38 -0000 1.5
+++ SmbFileNameParser.java 7 Apr 2002 02:27:57 -0000 1.6
@@ -16,7 +16,8 @@
/**
* A parser for SMB URI.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.6 $ $Date: 2002/04/07 02:27:57 $
*/
public class SmbFileNameParser
extends UriParser
1.4 +2 -1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/smb/SmbFileObject.java
Index: SmbFileObject.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/smb/SmbFileObject.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- SmbFileObject.java 29 Mar 2002 12:56:38 -0000 1.3
+++ SmbFileObject.java 7 Apr 2002 02:27:57 -0000 1.4
@@ -23,7 +23,8 @@
/**
* A file in an SMB file system.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.4 $ $Date: 2002/04/07 02:27:57 $
*/
public class SmbFileObject
extends AbstractFileObject
1.2 +8 -5 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/smb/SmbFileSystem.java
Index: SmbFileSystem.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/smb/SmbFileSystem.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- SmbFileSystem.java 2 Feb 2002 03:29:08 -0000 1.1
+++ SmbFileSystem.java 7 Apr 2002 02:27:57 -0000 1.2
@@ -12,25 +12,28 @@
import org.apache.aut.vfs.FileSystemException;
import org.apache.aut.vfs.provider.AbstractFileSystem;
import org.apache.aut.vfs.provider.FileSystem;
+import org.apache.aut.vfs.provider.FileSystemProviderContext;
/**
* A SMB file system.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.2 $ $Date: 2002/04/07 02:27:57 $
*/
public class SmbFileSystem extends AbstractFileSystem implements FileSystem
{
- public SmbFileSystem( FileName rootName )
+ public SmbFileSystem( final FileSystemProviderContext context,
+ final FileName rootName )
{
- super( rootName );
+ super( context, rootName );
}
/**
* Creates a file object.
*/
- protected FileObject createFile( FileName name ) throws FileSystemException
+ protected FileObject createFile( final FileName name ) throws FileSystemException
{
- String fileName = name.getURI();
+ final String fileName = name.getURI();
return new SmbFileObject( fileName, name, this );
}
}
1.4 +3 -2 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/smb/SmbFileSystemProvider.java
Index: SmbFileSystemProvider.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/smb/SmbFileSystemProvider.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- SmbFileSystemProvider.java 23 Mar 2002 04:01:26 -0000 1.3
+++ SmbFileSystemProvider.java 7 Apr 2002 02:27:57 -0000 1.4
@@ -19,7 +19,8 @@
/**
* A provider for SMB (Samba, Windows share) file systems.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.4 $ $Date: 2002/04/07 02:27:57 $
*
* @ant.type type="file-system" name="smb"
*/
@@ -45,6 +46,6 @@
{
final ParsedSmbUri smbUri = (ParsedSmbUri)uri;
final FileName rootName = new DefaultFileName( m_parser, smbUri.getRootUri(), "/" );
- return new SmbFileSystem( rootName );
+ return new SmbFileSystem( getContext(), rootName );
}
}
1.3 +2 -1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/zip/ParsedZipUri.java
Index: ParsedZipUri.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/zip/ParsedZipUri.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ParsedZipUri.java 9 Mar 2002 10:31:31 -0000 1.2
+++ ParsedZipUri.java 7 Apr 2002 02:27:57 -0000 1.3
@@ -13,7 +13,8 @@
/**
* A parsed Zip URI.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.3 $ $Date: 2002/04/07 02:27:57 $
*/
public class ParsedZipUri extends ParsedUri
{
1.2 +1 -0 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/zip/Resources.properties
Index: Resources.properties
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/zip/Resources.properties,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Resources.properties 2 Feb 2002 03:29:09 -0000 1.1
+++ Resources.properties 7 Apr 2002 02:27:57 -0000 1.2
@@ -1 +1,2 @@
open-zip-file.error=Could not open Zip file "{0}".
+close-zip-file.error=Could not close Zip file "{0}".
1.3 +3 -2 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/zip/ZipFileNameParser.java
Index: ZipFileNameParser.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/zip/ZipFileNameParser.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ZipFileNameParser.java 9 Mar 2002 10:31:31 -0000 1.2
+++ ZipFileNameParser.java 7 Apr 2002 02:27:57 -0000 1.3
@@ -13,12 +13,13 @@
/**
* A parser for Zip file names.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.3 $ $Date: 2002/04/07 02:27:57 $
*/
public class ZipFileNameParser
extends UriParser
{
- private static final char[] ZIP_URL_RESERVED_CHARS = { '!' };
+ private static final char[] ZIP_URL_RESERVED_CHARS = {'!'};
/**
* Parses an absolute URI, splitting it into its components.
1.2 +2 -1 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/zip/ZipFileObject.java
Index: ZipFileObject.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/zip/ZipFileObject.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ZipFileObject.java 2 Feb 2002 03:29:09 -0000 1.1
+++ ZipFileObject.java 7 Apr 2002 02:27:57 -0000 1.2
@@ -19,7 +19,8 @@
/**
* A file in a Zip file system.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.2 $ $Date: 2002/04/07 02:27:57 $
*/
class ZipFileObject extends AbstractFileObject implements FileObject
{
1.5 +26 -4 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/zip/ZipFileSystem.java
Index: ZipFileSystem.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/zip/ZipFileSystem.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- ZipFileSystem.java 29 Mar 2002 12:56:38 -0000 1.4
+++ ZipFileSystem.java 7 Apr 2002 02:27:57 -0000 1.5
@@ -18,15 +18,19 @@
import org.apache.aut.vfs.provider.AbstractFileSystem;
import org.apache.aut.vfs.provider.DefaultFileName;
import org.apache.aut.vfs.provider.FileSystem;
+import org.apache.aut.vfs.provider.FileSystemProviderContext;
import org.apache.avalon.excalibur.i18n.ResourceManager;
import org.apache.avalon.excalibur.i18n.Resources;
/**
* A read-only file system for Zip/Jar files.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.5 $ $Date: 2002/04/07 02:27:57 $
*/
-public class ZipFileSystem extends AbstractFileSystem implements FileSystem
+public class ZipFileSystem
+ extends AbstractFileSystem
+ implements FileSystem
{
private static final Resources REZ =
ResourceManager.getPackageResources( ZipFileSystem.class );
@@ -34,9 +38,11 @@
private File m_file;
private ZipFile m_zipFile;
- public ZipFileSystem( DefaultFileName rootName, File file ) throws FileSystemException
+ public ZipFileSystem( final FileSystemProviderContext context,
+ final DefaultFileName rootName,
+ final File file ) throws FileSystemException
{
- super( rootName );
+ super( context, rootName );
m_file = file;
// Open the Zip file
@@ -98,6 +104,22 @@
// Attach child to parent
parent.attachChild( fileObj.getName() );
}
+ }
+ }
+
+ public void dispose()
+ {
+ super.dispose();
+
+ // Release the zip file
+ try
+ {
+ m_zipFile.close();
+ }
+ catch( final IOException e )
+ {
+ final String message = REZ.getString( "close-zip-file.error", m_file );
+ getLogger().warn( message, e );
}
}
1.4 +6 -18 jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/zip/ZipFileSystemProvider.java
Index: ZipFileSystemProvider.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/aut/vfs/provider/zip/ZipFileSystemProvider.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ZipFileSystemProvider.java 23 Mar 2002 04:01:27 -0000 1.3
+++ ZipFileSystemProvider.java 7 Apr 2002 02:27:57 -0000 1.4
@@ -8,7 +8,7 @@
package org.apache.aut.vfs.provider.zip;
import java.io.File;
-import java.io.IOException;
+import org.apache.aut.vfs.FileConstants;
import org.apache.aut.vfs.FileObject;
import org.apache.aut.vfs.FileSystemException;
import org.apache.aut.vfs.provider.AbstractFileSystemProvider;
@@ -21,7 +21,8 @@
* A file system provider for Zip/Jar files. Provides read-only file
* systems, for local Zip files only.
*
- * @author Adam Murdoch
+ * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
+ * @version $Revision: 1.4 $ $Date: 2002/04/07 02:27:57 $
*
* @ant.type type="file-system" name="zip"
*/
@@ -80,25 +81,12 @@
final ParsedZipUri zipUri = (ParsedZipUri)uri;
final FileObject file = zipUri.getZipFile();
- // TODO - temporary hack; need to use a converter
- File destFile = null;
- try
- {
- final File cacheDir = new File( "ant_vfs_cache" );
- cacheDir.mkdirs();
- destFile = File.createTempFile( "cache_", "_" + file.getName().getBaseName(), cacheDir );
- destFile.deleteOnExit();
- }
- catch( IOException e )
- {
- throw new FileSystemException( "Could not replicate file", e );
- }
- FileObject destFileObj = getContext().resolveFile( null, destFile.getAbsolutePath() );
- destFileObj.copy( file );
+ // Make a local copy of the file
+ final File zipFile = file.replicateFile( FileConstants.SELECT_SELF );
// Create the file system
DefaultFileName name = new DefaultFileName( m_parser, zipUri.getRootUri(), "/" );
- return new ZipFileSystem( name, destFile );
+ return new ZipFileSystem( getContext(), name, zipFile );
}
}
1.4 +3 -12 jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/framework/factories/VfsManager.java
Index: VfsManager.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/framework/factories/VfsManager.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- VfsManager.java 29 Mar 2002 12:56:04 -0000 1.3
+++ VfsManager.java 7 Apr 2002 02:27:57 -0000 1.4
@@ -12,7 +12,6 @@
import org.apache.aut.vfs.provider.FileSystemProvider;
import org.apache.avalon.excalibur.i18n.ResourceManager;
import org.apache.avalon.excalibur.i18n.Resources;
-import org.apache.avalon.framework.activity.Disposable;
import org.apache.avalon.framework.activity.Initializable;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceManager;
@@ -24,11 +23,11 @@
* The myrmidon FileSystemManager implementation.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
- * @version $Revision: 1.3 $ $Date: 2002/03/29 12:56:04 $
+ * @version $Revision: 1.4 $ $Date: 2002/04/07 02:27:57 $
*/
public class VfsManager
extends DefaultFileSystemManager
- implements Serviceable, Initializable, Disposable
+ implements Serviceable, Initializable
{
private static final Resources REZ
= ResourceManager.getPackageResources( VfsManager.class );
@@ -53,20 +52,12 @@
// TODO - make this list configurable
// Required providers
+ addProvider( factory, new String[]{"file"}, "file", false );
addProvider( factory, new String[]{"zip", "jar"}, "zip", false );
// Optional providers
addProvider( factory, new String[]{"smb"}, "smb", true );
addProvider( factory, new String[]{"ftp"}, "ftp", true );
- }
-
- /**
- * Disposes this service.
- */
- public void dispose()
- {
- // Clean-up
- close();
}
/**
1.2 +103 -19 jakarta-ant/proposal/myrmidon/src/test/org/apache/aut/vfs/test/AbstractFileSystemTestCase.java
Index: AbstractFileSystemTestCase.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/test/org/apache/aut/vfs/test/AbstractFileSystemTestCase.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- AbstractFileSystemTestCase.java 17 Mar 2002 08:06:52 -0000 1.1
+++ AbstractFileSystemTestCase.java 7 Apr 2002 02:27:57 -0000 1.2
@@ -16,6 +16,8 @@
import java.util.Map;
import org.apache.aut.vfs.impl.DefaultFileSystemManager;
import org.apache.aut.vfs.provider.AbstractFileObject;
+import org.apache.aut.vfs.provider.LocalFileSystemProvider;
+import org.apache.aut.vfs.provider.local.DefaultLocalFileSystemProvider;
import org.apache.aut.vfs.FileObject;
import org.apache.aut.vfs.FileType;
import org.apache.aut.vfs.FileSystemException;
@@ -59,15 +61,15 @@
{
// Build the expected structure
final FileInfo base = new FileInfo( "test", FileType.FOLDER );
- base.addChild( new FileInfo( "file1.txt", FileType.FILE ) );
- base.addChild( new FileInfo( "empty.txt", FileType.FILE ) );
- base.addChild( new FileInfo( "emptydir", FileType.FOLDER ) );
+ base.addChild( "file1.txt", FileType.FILE );
+ base.addChild( "empty.txt", FileType.FILE );
+ base.addChild( "emptydir", FileType.FOLDER );
final FileInfo dir = new FileInfo( "dir1", FileType.FOLDER );
base.addChild( dir );
- dir.addChild( new FileInfo( "file1.txt", FileType.FILE ) );
- dir.addChild( new FileInfo( "file2.txt", FileType.FILE ) );
- dir.addChild( new FileInfo( "file3.txt", FileType.FILE ) );
+ dir.addChild( "file1.txt", FileType.FILE );
+ dir.addChild( "file2.txt", FileType.FILE );
+ dir.addChild( "file3.txt", FileType.FILE );
return base;
}
@@ -83,6 +85,8 @@
{
// Create the file system manager
m_manager = new DefaultFileSystemManager();
+ m_manager.enableLogging( getLogger() );
+ m_manager.addProvider( "file", new DefaultLocalFileSystemProvider() );
// Locate the base folder
m_baseFolder = getBaseFolder();
@@ -100,7 +104,7 @@
*/
protected void tearDown() throws Exception
{
- m_manager.close();
+ m_manager.dispose();
}
/**
@@ -466,6 +470,70 @@
}
/**
+ * Tests conversion from absolute to relative names.
+ */
+ public void testAbsoluteNameConvert() throws Exception
+ {
+ final FileName baseName = m_baseFolder.getName();
+
+ String path = "/test1/test2";
+ FileName name = baseName.resolveName( path );
+ assertEquals( path, name.getPath() );
+
+ // Try child and descendent names
+ testRelName( name, "child" );
+ testRelName( name, "child1/child2" );
+
+ // Try own name
+ testRelName( name, "." );
+
+ // Try parent, and root
+ testRelName( name, ".." );
+ testRelName( name, "../.." );
+
+ // Try sibling and descendent of sibling
+ testRelName( name, "../sibling" );
+ testRelName( name, "../sibling/child" );
+
+ // Try siblings with similar names
+ testRelName( name, "../test2_not" );
+ testRelName( name, "../test2_not/child" );
+ testRelName( name, "../test" );
+ testRelName( name, "../test/child" );
+
+ // Try unrelated
+ testRelName( name, "../../unrelated" );
+ testRelName( name, "../../test" );
+ testRelName( name, "../../test/child" );
+
+ // Test against root
+ path = "/";
+ name = baseName.resolveName( path );
+ assertEquals( path, name.getPath() );
+
+ // Try child and descendent names (against root)
+ testRelName( name, "child" );
+ testRelName( name, "child1/child2" );
+
+ // Try own name (against root)
+ testRelName( name, "." );
+ }
+
+ /**
+ * Checks that a file name converts to an expected relative path
+ */
+ private void testRelName( final FileName baseName,
+ final String relPath )
+ throws Exception
+ {
+ final FileName expectedName = baseName.resolveName( relPath );
+
+ // Convert to relative path, and check
+ final String actualRelPath = baseName.getRelativeName( expectedName );
+ assertEquals( relPath, actualRelPath );
+ }
+
+ /**
* Walks the base folder structure, asserting it contains exactly the
* expected files and folders.
*/
@@ -496,9 +564,9 @@
final FileInfo info = (FileInfo)queueExpected.remove( 0 );
// Check the type is correct
- assertSame( file.getType(), info._type );
+ assertSame( file.getType(), info.m_type );
- if( info._type == FileType.FILE )
+ if( info.m_type == FileType.FILE )
{
continue;
}
@@ -508,13 +576,13 @@
// Make sure all children were found
assertNotNull( children );
- assertEquals( "count children of \"" + file.getName() + "\"", info._children.size(), children.length );
+ assertEquals( "count children of \"" + file.getName() + "\"", info.m_children.size(), children.length );
// Recursively check each child
for( int i = 0; i < children.length; i++ )
{
final FileObject child = children[ i ];
- final FileInfo childInfo = (FileInfo)info._children.get( child.getName().getBaseName() );
+ final FileInfo childInfo = (FileInfo)info.m_children.get( child.getName().getBaseName() );
// Make sure the child is expected
assertNotNull( childInfo );
@@ -776,20 +844,36 @@
*/
protected static final class FileInfo
{
- String _baseName;
- FileType _type;
- Map _children = new HashMap();
+ String m_baseName;
+ FileType m_type;
+ Map m_children = new HashMap();
+
+ public FileInfo( final String name, final FileType type )
+ {
+ m_baseName = name;
+ m_type = type;
+ }
- public FileInfo( String name, FileType type )
+ /** Adds a child. */
+ public void addChild( final FileInfo child )
{
- _baseName = name;
- _type = type;
+ m_children.put( child.m_baseName, child );
}
/** Adds a child. */
- public void addChild( FileInfo child )
+ public void addChild( final String baseName, final FileType type )
+ {
+ addChild( new FileInfo( baseName, type ) );
+ }
+
+ /** Adds a bunch of children. */
+ public void addChildren( final String[] baseNames, final FileType type )
{
- _children.put( child._baseName, child );
+ for( int i = 0; i < baseNames.length; i++ )
+ {
+ String baseName = baseNames[i ];
+ addChild( new FileInfo( baseName, type ) );
+ }
}
}
}
1.2 +18 -11 jakarta-ant/proposal/myrmidon/src/test/org/apache/aut/vfs/test/AbstractWritableFileSystemTestCase.java
Index: AbstractWritableFileSystemTestCase.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/test/org/apache/aut/vfs/test/AbstractWritableFileSystemTestCase.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- AbstractWritableFileSystemTestCase.java 17 Mar 2002 08:06:52 -0000 1.1
+++ AbstractWritableFileSystemTestCase.java 7 Apr 2002 02:27:57 -0000 1.2
@@ -14,6 +14,7 @@
import org.apache.aut.vfs.FileObject;
import org.apache.aut.vfs.FileType;
import org.apache.aut.vfs.FileSystemException;
+import org.apache.aut.vfs.FileConstants;
/**
* File system test that check that a file system can be modified.
@@ -41,7 +42,7 @@
FileObject scratchFolder = getWriteFolder();
// Make sure the test folder is empty
- scratchFolder.delete();
+ scratchFolder.delete( FileConstants.EXCLUDE_SELF );
scratchFolder.create( FileType.FOLDER );
return scratchFolder;
@@ -59,6 +60,7 @@
assertTrue( !folder.exists() );
folder.create( FileType.FOLDER );
assertTrue( folder.exists() );
+ assertSame( FileType.FOLDER, folder.getType() );
assertEquals( 0, folder.getChildren().length );
// Create a descendant, where the intermediate folders don't exist
@@ -68,11 +70,13 @@
assertTrue( !folder.getParent().getParent().exists() );
folder.create( FileType.FOLDER );
assertTrue( folder.exists() );
+ assertSame( FileType.FOLDER, folder.getType() );
assertEquals( 0, folder.getChildren().length );
assertTrue( folder.getParent().exists() );
assertTrue( folder.getParent().getParent().exists() );
// Test creating a folder that already exists
+ assertTrue( folder.exists() );
folder.create( FileType.FOLDER );
}
@@ -88,6 +92,7 @@
assertTrue( !file.exists() );
file.create( FileType.FILE );
assertTrue( file.exists() );
+ assertSame( FileType.FILE, file.getType() );
assertEquals( 0, file.getContent().getSize() );
// Create a descendant, where the intermediate folders don't exist
@@ -97,11 +102,13 @@
assertTrue( !file.getParent().getParent().exists() );
file.create( FileType.FILE );
assertTrue( file.exists() );
+ assertSame( FileType.FILE, file.getType() );
assertEquals( 0, file.getContent().getSize() );
assertTrue( file.getParent().exists() );
assertTrue( file.getParent().getParent().exists() );
// Test creating a file that already exists
+ assertTrue( file.exists() );
file.create( FileType.FILE );
}
@@ -125,7 +132,7 @@
try
{
folder.create( FileType.FILE );
- assertTrue( false );
+ fail();
}
catch( FileSystemException exc )
{
@@ -135,7 +142,7 @@
try
{
file.create( FileType.FOLDER );
- assertTrue( false );
+ fail();
}
catch( FileSystemException exc )
{
@@ -146,7 +153,7 @@
try
{
folder2.create( FileType.FOLDER );
- assertTrue( false );
+ fail();
}
catch( FileSystemException exc )
{
@@ -168,13 +175,13 @@
// Delete a file
FileObject file = folder.resolveFile( "file1.txt" );
assertTrue( file.exists() );
- file.delete();
+ file.delete( FileConstants.SELECT_ALL );
assertTrue( !file.exists() );
// Delete an empty folder
file = folder.resolveFile( "emptydir" );
assertTrue( file.exists() );
- file.delete();
+ file.delete( FileConstants.SELECT_ALL );
assertTrue( !file.exists() );
// Recursive delete
@@ -182,14 +189,14 @@
FileObject file2 = file.resolveFile( "dir2/file2.txt" );
assertTrue( file.exists() );
assertTrue( file2.exists() );
- file.delete();
+ file.delete( FileConstants.SELECT_ALL );
assertTrue( !file.exists() );
assertTrue( !file2.exists() );
// Delete a file that does not exist
file = folder.resolveFile( "some-folder/some-file" );
assertTrue( !file.exists() );
- file.delete();
+ file.delete( FileConstants.SELECT_ALL );
assertTrue( !file.exists() );
}
@@ -226,17 +233,17 @@
assertSameFileSet( names, folder.getChildren() );
// Delete a child folder
- folder.resolveFile( "dir1" ).delete();
+ folder.resolveFile( "dir1" ).delete( FileConstants.SELECT_ALL );
names.remove( "dir1" );
assertSameFileSet( names, folder.getChildren() );
// Delete a child file
- folder.resolveFile( "file1.html" ).delete();
+ folder.resolveFile( "file1.html" ).delete( FileConstants.SELECT_ALL );
names.remove( "file1.html" );
assertSameFileSet( names, folder.getChildren() );
// Recreate the folder
- folder.delete();
+ folder.delete( FileConstants.SELECT_ALL );
folder.create( FileType.FOLDER );
assertEquals( 0, folder.getChildren().length );
}
1.13 +0 -6 jakarta-ant/proposal/myrmidon/src/test/org/apache/myrmidon/AbstractMyrmidonTest.java
Index: AbstractMyrmidonTest.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/test/org/apache/myrmidon/AbstractMyrmidonTest.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- AbstractMyrmidonTest.java 3 Apr 2002 10:58:20 -0000 1.12
+++ AbstractMyrmidonTest.java 7 Apr 2002 02:27:58 -0000 1.13
@@ -174,12 +174,6 @@
*/
protected void assertSameMessage( final String[] messages, final Throwable throwable )
{
- //System.out.println( "exception:" );
- //for( Throwable t = throwable; t != null; t = ExceptionUtil.getCause( t, true ) )
- //{
- // System.out.println( " " + t.getMessage() );
- //}
-
Throwable current = throwable;
for( int i = 0; i < messages.length; i++ )
{
1.8 +25 -17 jakarta-ant/proposal/myrmidon/src/test/org/apache/myrmidon/AbstractProjectTest.java
Index: AbstractProjectTest.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/test/org/apache/myrmidon/AbstractProjectTest.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- AbstractProjectTest.java 3 Apr 2002 10:58:20 -0000 1.7
+++ AbstractProjectTest.java 7 Apr 2002 02:27:58 -0000 1.8
@@ -10,12 +10,13 @@
import java.io.File;
import org.apache.myrmidon.frontends.EmbeddedAnt;
import org.apache.myrmidon.listeners.ProjectListener;
+import org.apache.avalon.framework.ExceptionUtil;
/**
* A base class for test cases which need to execute projects.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
- * @version $Revision: 1.7 $ $Date: 2002/04/03 10:58:20 $
+ * @version $Revision: 1.8 $ $Date: 2002/04/07 02:27:58 $
*/
public class AbstractProjectTest
extends AbstractMyrmidonTest
@@ -72,28 +73,35 @@
final ProjectListener listener )
throws Exception
{
- // Create the project and workspace
final EmbeddedAnt embeddor = new EmbeddedAnt();
- embeddor.setHomeDirectory( getInstallDirectory() );
- embeddor.enableLogging( getLogger() );
- embeddor.setSharedClassLoader( getClass().getClassLoader() );
- embeddor.setProjectFile( projectFile.getAbsolutePath() );
- embeddor.setProjectListener( null );
-
- // Add a listener to make sure all is good
final TrackingProjectListener tracker = new TrackingProjectListener();
- embeddor.addProjectListener( tracker );
- // Add supplied listener
- if( listener != null )
+ try
{
- embeddor.addProjectListener( listener );
- }
+ // Configure embeddor
+ embeddor.setHomeDirectory( getInstallDirectory() );
+ embeddor.enableLogging( getLogger() );
+ embeddor.setSharedClassLoader( getClass().getClassLoader() );
+ embeddor.setProjectFile( projectFile.getAbsolutePath() );
+ embeddor.setProjectListener( null );
+
+ // Add a listener to make sure all is good
+ embeddor.addProjectListener( tracker );
+
+ // Add supplied listener
+ if( listener != null )
+ {
+ embeddor.addProjectListener( listener );
+ }
- // Now execute the target
- embeddor.executeTargets( new String[] { targetName } );
+ // Now execute the target
+ embeddor.executeTargets( new String[] { targetName } );
+ }
+ finally
+ {
+ embeddor.stop();
+ }
- embeddor.stop();
// Make sure all expected events were delivered
tracker.assertComplete();
1.2 +2 -2 jakarta-ant/proposal/myrmidon/src/test/org/apache/myrmidon/components/classloader/test/DefaultClassLoaderManagerTestCase.java
Index: DefaultClassLoaderManagerTestCase.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/test/org/apache/myrmidon/components/classloader/test/DefaultClassLoaderManagerTestCase.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- DefaultClassLoaderManagerTestCase.java 3 Apr 2002 10:58:20 -0000 1.1
+++ DefaultClassLoaderManagerTestCase.java 7 Apr 2002 02:27:58 -0000 1.2
@@ -22,7 +22,7 @@
* Test cases for the DefaultClassLoaderManager.
*
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
- * @version $Revision: 1.1 $ $Date: 2002/04/03 10:58:20 $
+ * @version $Revision: 1.2 $ $Date: 2002/04/07 02:27:58 $
*/
public class DefaultClassLoaderManagerTestCase
extends AbstractComponentTest
@@ -335,7 +335,7 @@
* add some classes to common loader only.
*
* unknown extension
- * multiple versions of extensions
+ * multiple versions of the same extension
* extn with requirement on itself
*
* jar with 1 and 2 extns:
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>