adammurdoch 2003/02/23 23:28:20 Modified: vfs/src/java/org/apache/commons/vfs FileSystemManager.java vfs/src/java/org/apache/commons/vfs/impl DefaultFileSystemManager.java vfs/src/test/org/apache/commons/vfs/provider/jar/test NestedJarTestCase.java vfs/src/test/org/apache/commons/vfs/provider/test JunctionProviderConfig.java JunctionTests.java VirtualProviderTestCase.java vfs/src/test/org/apache/commons/vfs/provider/zip/test NestedZipTestCase.java Added: vfs/src/java/org/apache/commons/vfs/impl FileTypeMap.java Log: FileSystemManager: - Renamed createFileSystem() to createVirtualFileSystem(). - Added createFileSystem() that guesses the file-system type from the file's mime type and name. Changed tests to use this. Revision Changes Path 1.11 +45 -42 jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/FileSystemManager.java Index: FileSystemManager.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/FileSystemManager.java,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- FileSystemManager.java 12 Feb 2003 07:56:09 -0000 1.10 +++ FileSystemManager.java 24 Feb 2003 07:28:19 -0000 1.11 @@ -113,13 +113,11 @@ * Locates a file by name. Equivalent to calling * <code>resolveFile(uri, getBaseName())</code>. * - * @param name - * The name of the file. + * @param name The name of the file. * * @return The file. Never returns null. * - * @throws FileSystemException - * On error parsing the file name. + * @throws FileSystemException On error parsing the file name. */ FileObject resolveFile( String name ) throws FileSystemException; @@ -132,16 +130,14 @@ * * <p>Note that the file does not have to exist when this method is called. * - * @param name - * The name of the file. + * @param name The name of the file. * - * @param baseFile - * The base file to use to resolve relative paths. May be null. + * @param baseFile The base file to use to resolve relative paths. + * May be null. * * @return The file. Never returns null. * - * @throws FileSystemException - * On error parsing the file name. + * @throws FileSystemException On error parsing the file name. */ FileObject resolveFile( FileObject baseFile, String name ) throws FileSystemException; @@ -150,16 +146,14 @@ * Locates a file by name. See [EMAIL PROTECTED] #resolveFile(FileObject, String)} * for details. * - * @param baseFile - * The base file to use to resolve relative paths. May be null. + * @param baseFile The base file to use to resolve relative paths. + * May be null. * - * @param name - * The name of the file. + * @param name The name of the file. * * @return The file. Never returns null. * - * @throws FileSystemException - * On error parsing the file name. + * @throws FileSystemException On error parsing the file name. * */ FileObject resolveFile( File baseFile, String name ) @@ -168,51 +162,54 @@ /** * Converts a local file into a [EMAIL PROTECTED] FileObject}. * - * @param file - * The file to convert. + * @param file The file to convert. * - * @return - * The [EMAIL PROTECTED] FileObject} that represents the local file. Never - * returns null. + * @return The [EMAIL PROTECTED] FileObject} that represents the local file. Never + * returns null. * - * @throws FileSystemException - * On error converting the file. + * @throws FileSystemException On error converting the file. */ FileObject toFileObject( File file ) throws FileSystemException; /** * Creates a layered file system. A layered file system is a file system - * that is created from the contents of another file, such as a zip - * or tar file. + * that is created from the contents of a file, such as a zip or tar file. * - * @param provider - * The name of the file system provider to use. This name is - * the same as the scheme used in URI to identify the provider. + * @param provider The name of the file system provider to use. This name + * is the same as the scheme used in URI to identify the provider. * - * @param file - * The file to use to create the file system. + * @param file The file to use to create the file system. * - * @return - * The root file of the new file system. + * @return The root file of the new file system. * - * @throws FileSystemException - * On error creating the file system. + * @throws FileSystemException On error creating the file system. */ FileObject createFileSystem( String provider, FileObject file ) throws FileSystemException; /** + * Creates a layered file system. A layered file system is a file system + * that is created from the contents of a file, such as a zip or tar file. + * + * @param file The file to use to create the file system. + * + * @return The root file of the new file system. + * + * @throws FileSystemException On error creating the file system. + */ + FileObject createFileSystem( FileObject file ) + throws FileSystemException; + + /** * Creates an empty virtual file system. Can be populated by adding * junctions to it. * - * @param rootUri - * The root URI to use for the new file system. Can be null. + * @param rootUri The root URI to use for the new file system. Can be null. * - * @return - * The root file of the new file system. + * @return The root file of the new file system. */ - FileObject createFileSystem( String rootUri ) + FileObject createVirtualFileSystem( String rootUri ) throws FileSystemException; /** @@ -221,10 +218,9 @@ * * @param rootFile The root file to backs the file system. * - * @return - * The root of the new file system. + * @return The root of the new file system. */ - FileObject createFileSystem( FileObject rootFile ) + FileObject createVirtualFileSystem( FileObject rootFile ) throws FileSystemException; /** @@ -232,4 +228,11 @@ * FileSystemManager. */ URLStreamHandlerFactory getURLStreamHandlerFactory(); + + /** + * Determines if a layered file system can be created for a given file. + * + * @param file The file to check for. + */ + boolean canCreateFileSystem( FileObject file ) throws FileSystemException; } 1.21 +51 -9 jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/impl/DefaultFileSystemManager.java Index: DefaultFileSystemManager.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/impl/DefaultFileSystemManager.java,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- DefaultFileSystemManager.java 21 Feb 2003 05:13:58 -0000 1.20 +++ DefaultFileSystemManager.java 24 Feb 2003 07:28:19 -0000 1.21 @@ -110,7 +110,7 @@ new DefaultVfsComponentContext( this ); private TemporaryFileStore tempFileStore; - + private final FileTypeMap map = new FileTypeMap(); private final VirtualFileProvider vfsProvider = new VirtualFileProvider(); private boolean init; @@ -128,8 +128,7 @@ /** * Registers a file system provider. The manager takes care of all - * lifecycle management. A provider may be registered multiple times - * with different schemes. + * lifecycle management. A provider may be registered multiple times. * * @param urlScheme The scheme the provider will handle. * @param provider The provider. @@ -143,8 +142,7 @@ /** * Registers a file system provider. The manager takes care of all - * lifecycle management. A provider may be registered multiple times - * with different schemes. + * lifecycle management. A provider may be registered multiple times. * * @param urlSchemes The schemes the provider will handle. * @param provider The provider. @@ -188,6 +186,26 @@ } /** + * Adds an filename extension mapping. + * @param extension The file name extension. + * @param scheme The scheme to use for files with this extension. + */ + public void addExtensionMap( final String extension, final String scheme ) + { + map.addExtension( extension, scheme ); + } + + /** + * Adds a mime type mapping. + * @param mimeType The mime type. + * @param scheme The scheme to use for files with this mime type. + */ + public void addMimeTypeMap( final String mimeType, final String scheme ) + { + map.addMimeType( mimeType, scheme ); + } + + /** * Sets the default provider. This is the provider that will handle URI * with unknown schemes. The manager takes care of all lifecycle * management. @@ -442,18 +460,42 @@ final FileObject file ) throws FileSystemException { - FileProvider provider = (FileProvider)providers.get( scheme ); + final FileProvider provider = (FileProvider)providers.get( scheme ); if ( provider == null ) { - throw new FileSystemException( "vfs.impl/unknown-provider.error", scheme ); + throw new FileSystemException( "vfs.impl/unknown-provider.error", new Object[] { scheme, file } ); } return provider.createFileSystem( scheme, file ); } /** + * Creates a layered file system. + */ + public FileObject createFileSystem( final FileObject file ) + throws FileSystemException + { + final String scheme = map.getScheme( file ); + if ( scheme == null ) + { + throw new FileSystemException( "vfs.impl/no-provider-for-file.error", file ); + } + return createFileSystem( scheme, file ); + } + + /** + * Determines if a layered file system can be created for a given file. + * + * @param file The file to check for. + */ + public boolean canCreateFileSystem( final FileObject file ) throws FileSystemException + { + return ( map.getScheme( file ) != null ); + } + + /** * Creates a virtual file system. */ - public FileObject createFileSystem( final FileObject rootFile ) + public FileObject createVirtualFileSystem( final FileObject rootFile ) throws FileSystemException { return vfsProvider.createFileSystem( rootFile ); @@ -462,7 +504,7 @@ /** * Creates an empty virtual file system. */ - public FileObject createFileSystem( final String rootUri ) + public FileObject createVirtualFileSystem( final String rootUri ) throws FileSystemException { return vfsProvider.createFileSystem( rootUri ); 1.1 jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/impl/FileTypeMap.java Index: FileTypeMap.java =================================================================== /* ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Commons", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * */ package org.apache.commons.vfs.impl; import java.util.HashMap; import java.util.Map; import org.apache.commons.vfs.FileContent; import org.apache.commons.vfs.FileObject; import org.apache.commons.vfs.FileSystemException; /** * A helper class that determines the provider to use for a file. * * @author <a href="mailto:[EMAIL PROTECTED]">Adam Murdoch</a> * @version $Revision: 1.1 $ $Date: 2003/02/24 07:28:19 $ */ class FileTypeMap { private final Map mimeTypeMap = new HashMap(); private final Map extensionMap = new HashMap(); /** * Adds a MIME type mapping. */ public void addMimeType( final String mimeType, final String scheme ) { mimeTypeMap.put( mimeType, scheme ); } /** * Adds a filename extension mapping. */ public void addExtension( final String extension, final String scheme ) { extensionMap.put( extension, scheme ); } /** * Finds the provider to use to create a filesystem from a given file. */ public String getScheme( final FileObject file ) throws FileSystemException { // Check the file's mime type for a match final FileContent content = file.getContent(); final String mimeType = (String)content.getAttribute( "content-type" ); if ( mimeType != null ) { final String scheme = (String)mimeTypeMap.get( mimeType ); if ( scheme != null ) { return scheme; } } // Check the file's extension for a match final String extension = file.getName().getExtension(); return (String)extensionMap.get( extension ); } } 1.8 +2 -1 jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/jar/test/NestedJarTestCase.java Index: NestedJarTestCase.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/jar/test/NestedJarTestCase.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- NestedJarTestCase.java 17 Feb 2003 09:22:15 -0000 1.7 +++ NestedJarTestCase.java 24 Feb 2003 07:28:19 -0000 1.8 @@ -90,6 +90,7 @@ throws Exception { manager.addProvider( "jar", new JarFileProvider() ); + manager.addExtensionMap( "jar", "jar" ); } /** @@ -103,7 +104,7 @@ final FileObject jarFile = manager.resolveFile( uri ); // Now build the nested file system - final FileObject nestedFS = manager.createFileSystem( "jar", jarFile ); + final FileObject nestedFS = manager.createFileSystem( jarFile ); return nestedFS.resolveFile( "/" ); } } 1.6 +2 -2 jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/test/JunctionProviderConfig.java Index: JunctionProviderConfig.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/test/JunctionProviderConfig.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- JunctionProviderConfig.java 23 Feb 2003 00:40:37 -0000 1.5 +++ JunctionProviderConfig.java 24 Feb 2003 07:28:19 -0000 1.6 @@ -94,7 +94,7 @@ final FileObject baseFolder = config.getBaseTestFolder( manager ); // Create an empty file system, then link in the base folder - final FileSystem newFs = manager.createFileSystem( "vfs:" ).getFileSystem(); + final FileSystem newFs = manager.createVirtualFileSystem( "vfs:" ).getFileSystem(); final String junctionPoint = "/some/dir"; newFs.addJunction( junctionPoint, baseFolder ); 1.5 +3 -3 jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/test/JunctionTests.java Index: JunctionTests.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/test/JunctionTests.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- JunctionTests.java 21 Feb 2003 13:18:17 -0000 1.4 +++ JunctionTests.java 24 Feb 2003 07:28:19 -0000 1.5 @@ -83,7 +83,7 @@ */ public void testNestedJunction() throws Exception { - final FileSystem fs = getManager().createFileSystem( "vfs:" ).getFileSystem(); + final FileSystem fs = getManager().createVirtualFileSystem( "vfs:" ).getFileSystem(); final FileObject baseDir = getBaseDir(); fs.addJunction( "/a", baseDir ); @@ -115,7 +115,7 @@ */ public void testAncestors() throws Exception { - final FileSystem fs = getManager().createFileSystem( "vfs://" ).getFileSystem(); + final FileSystem fs = getManager().createVirtualFileSystem( "vfs://" ).getFileSystem(); final FileObject baseDir = getBaseDir(); // Make sure the file at the junction point and its ancestors do not exist 1.5 +2 -2 jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/test/VirtualProviderTestCase.java Index: VirtualProviderTestCase.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/test/VirtualProviderTestCase.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- VirtualProviderTestCase.java 12 Feb 2003 07:56:19 -0000 1.4 +++ VirtualProviderTestCase.java 24 Feb 2003 07:28:19 -0000 1.5 @@ -86,6 +86,6 @@ { final File baseDir = AbstractVfsTestCase.getTestDirectory(); final FileObject baseFile = manager.toFileObject( baseDir ); - return manager.createFileSystem( baseFile ); + return manager.createVirtualFileSystem( baseFile ); } } 1.6 +2 -1 jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/zip/test/NestedZipTestCase.java Index: NestedZipTestCase.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/zip/test/NestedZipTestCase.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- NestedZipTestCase.java 17 Feb 2003 09:22:16 -0000 1.5 +++ NestedZipTestCase.java 24 Feb 2003 07:28:20 -0000 1.6 @@ -89,6 +89,7 @@ throws Exception { manager.addProvider( "zip", new ZipFileProvider() ); + manager.addExtensionMap( "zip", "zip" ); } /** @@ -102,7 +103,7 @@ final FileObject zipFile = manager.resolveFile( uri ); // Now build the nested file system - final FileObject nestedFS = manager.createFileSystem( "zip", zipFile ); + final FileObject nestedFS = manager.createFileSystem( zipFile ); return nestedFS.resolveFile( "/" ); } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]