adammurdoch    2003/01/23 04:27:28

  Modified:    vfs/src/java/org/apache/commons/vfs FileName.java
               vfs/src/java/org/apache/commons/vfs/impl
                        VirtualFileProvider.java
               vfs/src/java/org/apache/commons/vfs/provider
                        AbstractLayeredFileProvider.java
                        AbstractOriginatingFileProvider.java
                        DefaultFileName.java GenericUri.java UriParser.java
               vfs/src/java/org/apache/commons/vfs/provider/ftp
                        FtpFileSystem.java FtpFileSystemProvider.java
                        FtpUri.java
               vfs/src/java/org/apache/commons/vfs/provider/jar
                        JarFileSystem.java JarFileSystemProvider.java
               vfs/src/java/org/apache/commons/vfs/provider/local
                        DefaultLocalFileSystemProvider.java
                        LocalFileNameParser.java LocalFileUri.java
               vfs/src/java/org/apache/commons/vfs/provider/smb
                        SmbFileSystemProvider.java SmbUri.java
               vfs/src/java/org/apache/commons/vfs/provider/temp
                        TemporaryFileProvider.java
               vfs/src/java/org/apache/commons/vfs/provider/url
                        UrlFileProvider.java
               vfs/src/java/org/apache/commons/vfs/provider/zip
                        ZipFileNameParser.java ZipFileSystem.java
                        ZipFileSystemProvider.java
  Added:       vfs/src/java/org/apache/commons/vfs/provider
                        LayeredFileName.java
  Removed:     vfs/src/java/org/apache/commons/vfs/provider Uri.java
               vfs/src/java/org/apache/commons/vfs/provider/ftp
                        FtpFileNameParser.java
               vfs/src/java/org/apache/commons/vfs/provider/smb
                        SmbFileNameParser.java
  Log:
  First pass at combining the FileName, Uri, and UriParser hierarchies.  Suggested by 
Jeff Barrett.
  
  - DefaultFileName now extends UriParser (temporarily).  Moved some methods
    down from UriParser.
  - Merged Uri into DefaultFileName.
  - GenericUri and LocalFileUri now extend DefaultFileName.
  - Merged FtpFileNameParser into FtpUri.
  - Merged SmbFileNameParser into SmbUri.
  
  Revision  Changes    Path
  1.9       +5 -0      
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/FileName.java
  
  Index: FileName.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/FileName.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- FileName.java     23 Jan 2003 04:33:34 -0000      1.8
  +++ FileName.java     23 Jan 2003 12:27:23 -0000      1.9
  @@ -110,6 +110,11 @@
       int getDepth();
   
       /**
  +     * Returns the URI scheme of this file.
  +     */
  +    String getScheme();
  +    
  +    /**
        * Returns the absolute URI of this file.
        */
       String getURI();
  
  
  
  1.3       +7 -6      
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/impl/VirtualFileProvider.java
  
  Index: VirtualFileProvider.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/impl/VirtualFileProvider.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- VirtualFileProvider.java  23 Nov 2002 00:05:26 -0000      1.2
  +++ VirtualFileProvider.java  23 Jan 2003 12:27:23 -0000      1.3
  @@ -60,7 +60,6 @@
   import org.apache.commons.vfs.FileSystemException;
   import org.apache.commons.vfs.provider.AbstractVfsContainer;
   import org.apache.commons.vfs.provider.DefaultFileName;
  -import org.apache.commons.vfs.provider.UriParser;
   
   
   /**
  @@ -72,15 +71,16 @@
   public class VirtualFileProvider
       extends AbstractVfsContainer
   {
  -    private final UriParser parser = new UriParser();
  -
       /**
        * Creates a virtual file system, with the supplied file as its root.
        */
       public FileObject createFileSystem( final FileObject rootFile )
           throws FileSystemException
       {
  -        final FileName rootName = new DefaultFileName( parser, 
rootFile.getName().getURI(), FileName.ROOT_PATH );
  +        final FileName rootName =
  +            new DefaultFileName( rootFile.getName().getScheme(),
  +                                 rootFile.getName().getURI(),
  +                                 FileName.ROOT_PATH );
           final VirtualFileSystem fs = new VirtualFileSystem( rootName );
           addComponent( fs );
           fs.addJunction( FileName.ROOT_PATH, rootFile );
  @@ -92,7 +92,8 @@
        */
       public FileObject createFileSystem( final String rootUri ) throws 
FileSystemException
       {
  -        final FileName rootName = new DefaultFileName( parser, rootUri, 
FileName.ROOT_PATH );
  +        final FileName rootName =
  +            new DefaultFileName( rootUri, FileName.ROOT_PATH );
           final VirtualFileSystem fs = new VirtualFileSystem( rootName );
           addComponent( fs );
           return fs.getRoot();
  
  
  
  1.7       +6 -6      
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/AbstractLayeredFileProvider.java
  
  Index: AbstractLayeredFileProvider.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/AbstractLayeredFileProvider.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- AbstractLayeredFileProvider.java  23 Nov 2002 00:41:09 -0000      1.6
  +++ AbstractLayeredFileProvider.java  23 Jan 2003 12:27:23 -0000      1.7
  @@ -78,19 +78,19 @@
                                   final String uri ) throws FileSystemException
       {
           // Split the URI up into its parts
  -        final Uri parsedUri = parseUri( uri );
  +        final LayeredFileName name = (LayeredFileName)parseUri( uri );
   
           // Make the URI canonical
   
           // Resolve the outer file name
  -        final String fileName = parsedUri.getContainerUri();
  +        final String fileName = name.getOuterUri();
           final FileObject file = getContext().resolveFile( baseFile, fileName );
   
           // Create the file system
  -        final FileObject rootFile = createFileSystem( parsedUri.getScheme(), file );
  +        final FileObject rootFile = createFileSystem( name.getScheme(), file );
   
           // Resolve the file
  -        return rootFile.resolveFile( parsedUri.getPath() );
  +        return rootFile.resolveFile( name.getPath() );
       }
   
       /**
  @@ -128,6 +128,6 @@
        * Parses an absolute URI.
        * @param uri The URI to parse.
        */
  -    protected abstract Uri parseUri( String uri )
  +    protected abstract FileName parseUri( String uri )
           throws FileSystemException;
   }
  
  
  
  1.9       +19 -16    
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/AbstractOriginatingFileProvider.java
  
  Index: AbstractOriginatingFileProvider.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/AbstractOriginatingFileProvider.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- AbstractOriginatingFileProvider.java      23 Nov 2002 00:33:53 -0000      1.8
  +++ AbstractOriginatingFileProvider.java      23 Jan 2003 12:27:23 -0000      1.9
  @@ -58,6 +58,7 @@
   import org.apache.commons.vfs.FileObject;
   import org.apache.commons.vfs.FileSystem;
   import org.apache.commons.vfs.FileSystemException;
  +import org.apache.commons.vfs.FileName;
   
   /**
    * A {@link FileProvider} that handles physical files, such as the files in a
  @@ -80,54 +81,56 @@
                                   final String uri ) throws FileSystemException
       {
           // Parse the URI
  -        final Uri parsedUri;
  +        final FileName name;
           try
           {
  -            parsedUri = parseUri( uri );
  +            name = parseUri( uri );
           }
           catch ( FileSystemException exc )
           {
  -            throw new FileSystemException( 
"vfs.provider/invalid-absolute-uri.error", new Object[]{uri}, exc );
  +            throw new FileSystemException( 
"vfs.provider/invalid-absolute-uri.error", uri, exc );
           }
   
           // Locate the file
  -        return findFile( parsedUri );
  +        return findFile( name );
       }
   
       /**
        * Locates a file from its parsed URI.
        */
  -    private FileObject findFile( final Uri parsedUri )
  +    private FileObject findFile( final FileName name )
           throws FileSystemException
       {
           // Check in the cache for the file system
  -        final String rootUri = parsedUri.getContainerUri();
  +        final String rootUri = name.getRootURI();
           FileSystem fs = findFileSystem( rootUri );
           if ( fs == null )
           {
               // Need to create the file system, and cache it
  -            fs = doCreateFileSystem( parsedUri );
  +            fs = doCreateFileSystem( name );
               addFileSystem( rootUri, fs );
           }
   
           // Locate the file
  -        return fs.resolveFile( parsedUri.getPath() );
  +        return fs.resolveFile( name.getPath() );
       }
   
       /**
  -     * Parses a URI into its components.  The returned value is used to
  -     * locate the file system in the cache (using the root prefix).
  +     * Parses a URI.
        *
  -     * <p>The provider can annotate this object with any additional
  -     * information it requires to create a file system from the URI.
  +     * @return The name of the file.  This name is used to locate the file
  +     *         system in the cache, using the root URI.  This name is also
  +     *         passed to {@link #doCreateFileSystem} to create the file system.
        */
  -    protected abstract Uri parseUri( final String uri )
  +    protected abstract FileName parseUri( final String uri )
           throws FileSystemException;
   
       /**
  -     * Creates the filesystem.  The file system may implement {@link VfsComponent}.
  +     * Creates a filesystem.  The file system may implement {@link VfsComponent}.
  +     *
  +     * @param name The name of the file to create the file system for.
        */
  -    protected abstract FileSystem doCreateFileSystem( final Uri uri )
  +    protected abstract FileSystem doCreateFileSystem( final FileName name )
           throws FileSystemException;
   
   }
  
  
  
  1.7       +233 -23   
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/DefaultFileName.java
  
  Index: DefaultFileName.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/DefaultFileName.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- DefaultFileName.java      23 Jan 2003 04:33:34 -0000      1.6
  +++ DefaultFileName.java      23 Jan 2003 12:27:23 -0000      1.7
  @@ -65,32 +65,81 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Adam Murdoch</a>
    * @version $Revision$ $Date$
    */
  -public final class DefaultFileName
  +public class DefaultFileName
  +    extends UriParser
       implements FileName
   {
  -    private final UriParser parser;
  -    private final String rootPrefix;
  -    private final String absPath;
  +    private static final char separatorChar = '/';
  +    private static final String separator = "/";
  +
  +    private String scheme;
  +    private String rootUri;
  +    private String absPath;
   
       // Cached stuff
       private String uri;
       private String baseName;
   
  -    public DefaultFileName( final UriParser parser,
  +    public DefaultFileName( final String scheme,
                               final String rootPrefix,
                               final String absPath )
       {
  -        this.parser = parser;
  -        this.rootPrefix = rootPrefix;
  +        setScheme( scheme );
  +        setRootURI( rootPrefix );
  +        setPath( absPath );
  +    }
  +
  +    public DefaultFileName( final String rootUri,
  +                            final String absPath )
  +    {
  +        this( extractScheme( rootUri ), rootUri, absPath );
  +    }
  +
  +    /**
  +     * @todo Get rid of this and make fields final again.
  +     */
  +    protected DefaultFileName()
  +    {
  +    }
  +
  +    /**
  +     * Sets the scheme for this filename.
  +     */
  +    protected void setScheme( final String scheme )
  +    {
  +        this.scheme = scheme;
  +    }
  +
  +    /**
  +     * Sets the path for this filename.
  +     */
  +    protected void setPath( final String absPath )
  +    {
           this.absPath = absPath;
       }
   
       /**
  +     * Sets the root URI for this filename.
  +     */
  +    protected void setRootURI( final String uri )
  +    {
  +        // Remove trailing separator, if any
  +        if ( uri.endsWith( separator ) )
  +        {
  +            this.rootUri = uri.substring( 0, uri.length() - 1 );
  +        }
  +        else
  +        {
  +            this.rootUri = uri;
  +        }
  +    }
  +
  +    /**
        * Returns the hashcode for this name.
        */
       public int hashCode()
       {
  -        return ( rootPrefix.hashCode() ^ absPath.hashCode() );
  +        return ( rootUri.hashCode() ^ absPath.hashCode() );
       }
   
       /**
  @@ -99,7 +148,7 @@
       public boolean equals( final Object obj )
       {
           final DefaultFileName name = (DefaultFileName)obj;
  -        return ( rootPrefix.equals( name.rootPrefix ) && absPath.equals( absPath ) 
);
  +        return ( rootUri.equals( name.rootUri ) && absPath.equals( absPath ) );
       }
   
       /**
  @@ -111,14 +160,32 @@
       }
   
       /**
  +     * Factory method for creating name instances.  Can be overridden.
  +     * @param absPath
  +     */
  +    protected FileName createName( final String absPath )
  +    {
  +        return new DefaultFileName( scheme, rootUri, absPath );
  +    }
  +
  +    /**
        * Returns the base name of the file.
        */
       public String getBaseName()
       {
           if ( baseName == null )
           {
  -            baseName = parser.getBaseName( absPath );
  +            final int idx = absPath.lastIndexOf( separatorChar );
  +            if ( idx == -1 )
  +            {
  +                baseName = absPath;
  +            }
  +            else
  +            {
  +                baseName = absPath.substring( idx + 1 );
  +            }
           }
  +
           return baseName;
       }
   
  @@ -138,8 +205,13 @@
                                    final NameScope scope )
           throws FileSystemException
       {
  -        final String otherAbsPath = parser.resolvePath( absPath, name, scope );
  -        return new DefaultFileName( parser, rootPrefix, otherAbsPath );
  +        final String resolvedPath = resolvePath( absPath, name );
  +        if ( !checkName( absPath, resolvedPath, scope ) )
  +        {
  +            throw new FileSystemException( 
"vfs.provider/invalid-descendent-name.error", name );
  +        }
  +
  +        return createName( resolvedPath );
       }
   
       /**
  @@ -147,12 +219,23 @@
        */
       public FileName getParent()
       {
  -        final String parentPath = parser.getParentPath( absPath );
  -        if ( parentPath == null )
  +        final String parentPath;
  +        final int idx = absPath.lastIndexOf( separatorChar );
  +        if ( idx == -1 || idx == absPath.length() - 1 )
           {
  +            // No parent
               return null;
           }
  -        return new DefaultFileName( parser, rootPrefix, parentPath );
  +        else if ( idx == 0 )
  +        {
  +            // Root is the parent
  +            parentPath = separator;
  +        }
  +        else
  +        {
  +            parentPath = absPath.substring( 0, idx );
  +        }
  +        return createName( parentPath );
       }
   
       /**
  @@ -167,13 +250,21 @@
       }
   
       /**
  +     * Returns the URI scheme of this file.
  +     */
  +    public String getScheme()
  +    {
  +        return scheme;
  +    }
  +
  +    /**
        * Returns the absolute URI of the file.
        */
       public String getURI()
       {
           if ( uri == null )
           {
  -            uri = parser.getUri( rootPrefix, absPath );
  +            uri = rootUri + absPath;
           }
           return uri;
       }
  @@ -183,7 +274,59 @@
        */
       public String getRelativeName( final FileName name ) throws FileSystemException
       {
  -        return parser.makeRelative( absPath, name.getPath() );
  +        final String path = name.getPath();
  +
  +        // Calculate the common prefix
  +        final int basePathLen = absPath.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 && absPath.charAt( pos ) == path.charAt( pos ); pos++ )
  +        {
  +        }
  +
  +        if ( pos == basePathLen && pos == pathLen )
  +        {
  +            // Same names
  +            return ".";
  +        }
  +        else if ( pos == basePathLen && pos < pathLen && path.charAt( pos ) == 
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 || absPath.charAt( pos ) != 
separatorChar ) )
  +        {
  +            // Not a direct ancestor, need to back up
  +            pos = absPath.lastIndexOf( separatorChar, pos );
  +            buffer.append( path.substring( pos ) );
  +        }
  +
  +        // Prepend a '../' for each element in the base path past the common
  +        // prefix
  +        buffer.insert( 0, ".." );
  +        pos = absPath.indexOf( separatorChar, pos + 1 );
  +        while ( pos != -1 )
  +        {
  +            buffer.insert( 0, "../" );
  +            pos = absPath.indexOf( separatorChar, pos + 1 );
  +        }
  +
  +        return buffer.toString();
       }
   
       /**
  @@ -191,7 +334,7 @@
        */
       public String getRootURI()
       {
  -        return rootPrefix;
  +        return rootUri;
       }
   
       /**
  @@ -199,7 +342,17 @@
        */
       public int getDepth()
       {
  -        return parser.getDepth( absPath );
  +        final int len = absPath.length();
  +        if ( len == 0 || ( len == 1 && absPath.charAt( 0 ) == separatorChar ) )
  +        {
  +            return 0;
  +        }
  +        int depth = 1;
  +        for ( int pos = 0; pos > -1 && pos < len; depth++ )
  +        {
  +            pos = absPath.indexOf( separatorChar, pos + 1 );
  +        }
  +        return depth;
       }
   
       /**
  @@ -225,11 +378,11 @@
        */
       public boolean isAncestor( final FileName ancestor )
       {
  -        if ( !ancestor.getRootURI().equals( rootPrefix ) )
  +        if ( !ancestor.getRootURI().equals( rootUri ) )
           {
               return false;
           }
  -        return parser.checkName( ancestor.getPath(), absPath, NameScope.DESCENDENT 
);
  +        return checkName( ancestor.getPath(), absPath, NameScope.DESCENDENT );
       }
   
       /**
  @@ -246,10 +399,67 @@
       public boolean isDescendent( final FileName descendent,
                                    final NameScope scope )
       {
  -        if ( !descendent.getRootURI().equals( rootPrefix ) )
  +        if ( !descendent.getRootURI().equals( rootUri ) )
  +        {
  +            return false;
  +        }
  +        return checkName( absPath, descendent.getPath(), scope );
  +    }
  +
  +    /**
  +     * Checks whether a path fits in a particular scope of another path.
  +     *
  +     * @param basePath An absolute, normalised path.
  +     * @param path An absolute, normalised path.
  +     */
  +    private boolean checkName( final String basePath,
  +                               final String path,
  +                               final NameScope scope )
  +    {
  +        if ( scope == NameScope.FILE_SYSTEM )
  +        {
  +            // All good
  +            return true;
  +        }
  +
  +        if ( !path.startsWith( basePath ) )
           {
               return false;
           }
  -        return parser.checkName( absPath, descendent.getPath(), scope );
  +        final int baseLen = basePath.length();
  +
  +        if ( scope == NameScope.CHILD )
  +        {
  +            if ( path.length() == baseLen
  +                || ( baseLen > 1 && path.charAt( baseLen ) != separatorChar )
  +                || path.indexOf( separatorChar, baseLen + 1 ) != -1 )
  +            {
  +                return false;
  +            }
  +        }
  +        else if ( scope == NameScope.DESCENDENT )
  +        {
  +            if ( path.length() == baseLen
  +                || ( baseLen > 1 && path.charAt( baseLen ) != separatorChar ) )
  +            {
  +                return false;
  +            }
  +        }
  +        else if ( scope == NameScope.DESCENDENT_OR_SELF )
  +        {
  +            if ( baseLen > 1
  +                && path.length() > baseLen
  +                && path.charAt( baseLen ) != separatorChar )
  +            {
  +                return false;
  +            }
  +        }
  +        else if ( scope != NameScope.FILE_SYSTEM )
  +        {
  +            throw new IllegalArgumentException();
  +        }
  +
  +        return true;
       }
  +
   }
  
  
  
  1.2       +189 -2    
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/GenericUri.java
  
  Index: GenericUri.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/GenericUri.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- GenericUri.java   31 Oct 2002 10:40:57 -0000      1.1
  +++ GenericUri.java   23 Jan 2003 12:27:23 -0000      1.2
  @@ -55,6 +55,8 @@
    */
   package org.apache.commons.vfs.provider;
   
  +import org.apache.commons.vfs.FileSystemException;
  +
   /**
    * A 'generic' URI, as per RFC 2396.  Consists of a scheme, userinfo (typically
    * username and password), hostname, port, and path.
  @@ -63,7 +65,7 @@
    * @version $Revision$ $Date$
    */
   public class GenericUri
  -    extends Uri
  +    extends DefaultFileName
   {
       private String userInfo;
       private String hostName;
  @@ -104,4 +106,189 @@
       {
           this.port = port;
       }
  +
  +    /**
  +     * Parses a generic URI.  Briefly, a generic URI looks like:
  +     *
  +     * <pre>
  +     * &lt;scheme> '://' [ &lt;userinfo> '@' ] &lt;hostname> [ ':' &lt;port> ] '/' 
&lt;path>
  +     * </pre>
  +     *
  +     * <p>This method differs from the RFC, in that either / or \ is allowed
  +     * as a path separator.
  +     *
  +     * @param uri
  +     *          The URI to parse.
  +     */
  +    protected void parseGenericUri( final String uri )
  +        throws FileSystemException
  +    {
  +        final StringBuffer name = new StringBuffer();
  +
  +        // Extract the scheme and authority parts
  +        extractToPath( uri, name );
  +
  +        // Decode and normalise the file name
  +        decode( name, 0, name.length() );
  +        normalisePath( name );
  +        setPath( name.toString() );
  +    }
  +
  +    /**
  +     * Extracts the scheme, userinfo, hostname and port components of a
  +     * generic URI.
  +     *
  +     * @param uri
  +     *          The absolute URI to parse.
  +     *
  +     * @param name
  +     *          Used to return the remainder of the URI.
  +     */
  +    protected void extractToPath( final String uri,
  +                                  final StringBuffer name )
  +        throws FileSystemException
  +    {
  +        // Extract the scheme
  +        final String scheme = extractScheme( uri, name );
  +        setScheme( scheme );
  +
  +        // Expecting "//"
  +        if ( name.length() < 2 || name.charAt( 0 ) != '/' || name.charAt( 1 ) != 
'/' )
  +        {
  +            throw new FileSystemException( 
"vfs.provider/missing-double-slashes.error", uri );
  +        }
  +        name.delete( 0, 2 );
  +
  +        // Extract userinfo
  +        final String userInfo = extractUserInfo( name );
  +        setUserInfo( userInfo );
  +
  +        // Extract hostname, and normalise
  +        final String hostName = extractHostName( name );
  +        if ( hostName == null )
  +        {
  +            throw new FileSystemException( "vfs.provider/missing-hostname.error", 
uri );
  +        }
  +        setHostName( hostName.toLowerCase() );
  +
  +        // Extract port
  +        final String port = extractPort( name );
  +        if ( port != null && port.length() == 0 )
  +        {
  +            throw new FileSystemException( "vfs.provider/missing-port.error", uri );
  +        }
  +        setPort( port );
  +
  +        // Expecting '/' or empty name
  +        if ( name.length() > 0 && name.charAt( 0 ) != '/' )
  +        {
  +            throw new FileSystemException( 
"vfs.provider/missing-hostname-path-sep.error", uri );
  +        }
  +    }
  +
  +    /**
  +     * Extracts the user info from a URI.  The <scheme>:// part has been removed
  +     * already.
  +     */
  +    protected String extractUserInfo( final StringBuffer name )
  +    {
  +        final int maxlen = name.length();
  +        for ( int pos = 0; pos < maxlen; pos++ )
  +        {
  +            final char ch = name.charAt( pos );
  +            if ( ch == '@' )
  +            {
  +                // Found the end of the user info
  +                String userInfo = name.substring( 0, pos );
  +                name.delete( 0, pos + 1 );
  +                return userInfo;
  +            }
  +            if ( ch == '/' || ch == '?' )
  +            {
  +                // Not allowed in user info
  +                break;
  +            }
  +        }
  +
  +        // Not found
  +        return null;
  +    }
  +
  +    /**
  +     * Extracts the hostname from a URI.  The <scheme>://<userinfo>@ part has
  +     * been removed.
  +     */
  +    protected String extractHostName( final StringBuffer name )
  +    {
  +        final int maxlen = name.length();
  +        int pos = 0;
  +        for ( ; pos < maxlen; pos++ )
  +        {
  +            final char ch = name.charAt( pos );
  +            if ( ch == '/' || ch == ';' || ch == '?' || ch == ':'
  +                || ch == '@' || ch == '&' || ch == '=' || ch == '+'
  +                || ch == '$' || ch == ',' )
  +            {
  +                break;
  +            }
  +        }
  +        if ( pos == 0 )
  +        {
  +            return null;
  +        }
  +
  +        final String hostname = name.substring( 0, pos );
  +        name.delete( 0, pos );
  +        return hostname;
  +    }
  +
  +    /**
  +     * Extracts the port from a URI.  The <scheme>://<userinfo>@<hostname>
  +     * part has been removed.
  +     */
  +    protected String extractPort( final StringBuffer name )
  +    {
  +        if ( name.length() < 1 || name.charAt( 0 ) != ':' )
  +        {
  +            return null;
  +        }
  +
  +        final int maxlen = name.length();
  +        int pos = 1;
  +        for ( ; pos < maxlen; pos++ )
  +        {
  +            final char ch = name.charAt( pos );
  +            if ( ch < '0' || ch > '9' )
  +            {
  +                break;
  +            }
  +        }
  +
  +        final String port = name.substring( 1, pos );
  +        name.delete( 0, pos );
  +        return port;
  +    }
  +    
  +    /**
  +     * Assembles a generic URI, appending to the supplied StringBuffer.
  +     */
  +    protected void appendRootUri( final StringBuffer rootUri )
  +    {
  +        rootUri.append( getScheme() );
  +        rootUri.append( "://" );
  +        final String userInfo = getUserInfo();
  +        if ( userInfo != null && userInfo.length() != 0 )
  +        {
  +            rootUri.append( userInfo );
  +            rootUri.append( "@" );
  +        }
  +        rootUri.append( getHostName() );
  +        final String port = getPort();
  +        if ( port != null && port.length() > 0 )
  +        {
  +            rootUri.append( ":" );
  +            rootUri.append( port );
  +        }
  +    }
  +
   }
  
  
  
  1.11      +0 -448    
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/UriParser.java
  
  Index: UriParser.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/UriParser.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- UriParser.java    23 Nov 2002 00:41:09 -0000      1.10
  +++ UriParser.java    23 Jan 2003 12:27:23 -0000      1.11
  @@ -58,7 +58,6 @@
   import java.util.HashSet;
   import java.util.Iterator;
   import org.apache.commons.vfs.FileSystemException;
  -import org.apache.commons.vfs.NameScope;
   
   /**
    * A name parser which parses absolute URIs.  See RFC 2396 for details.
  @@ -70,7 +69,6 @@
   {
       /** The normalised separator to use. */
       private final char separatorChar;
  -    private final String separator;
   
       /**
        * The set of valid separators.  These are all converted to the normalised one.
  @@ -120,226 +118,6 @@
               final Character ch = (Character)iter.next();
               this.separators[ i ] = ch.charValue();
           }
  -
  -        separator = String.valueOf( separatorChar );
  -    }
  -
  -    /**
  -     * Parses an absolute URI, splitting it into its components.  This
  -     * implementation assumes a "generic URI", as defined by RFC 2396.  See
  -     * {@link #parseGenericUri} for more info.
  -     */
  -    public GenericUri parseUri( final String uriStr ) throws FileSystemException
  -    {
  -        // Parse the URI
  -        final GenericUri uri = new GenericUri();
  -        parseGenericUri( uriStr, uri );
  -
  -        // Build the root URI
  -        final StringBuffer rootUri = new StringBuffer();
  -        appendRootUri( uri, rootUri );
  -        uri.setContainerUri( rootUri.toString() );
  -
  -        return uri;
  -    }
  -
  -    /**
  -     * Assembles a generic URI, appending to the supplied StringBuffer.
  -     */
  -    protected void appendRootUri( final GenericUri uri, final StringBuffer rootUri )
  -    {
  -        rootUri.append( uri.getScheme() );
  -        rootUri.append( "://" );
  -        final String userInfo = uri.getUserInfo();
  -        if ( userInfo != null && userInfo.length() != 0 )
  -        {
  -            rootUri.append( userInfo );
  -            rootUri.append( "@" );
  -        }
  -        rootUri.append( uri.getHostName() );
  -        final String port = uri.getPort();
  -        if ( port != null && port.length() > 0 )
  -        {
  -            rootUri.append( ":" );
  -            rootUri.append( port );
  -        }
  -    }
  -
  -    /**
  -     * Parses a generic URI, as defined by RFC 2396.  Briefly, a generic URI
  -     * looks like:
  -     *
  -     * <pre>
  -     * &lt;scheme> '://' [ &lt;userinfo> '@' ] &lt;hostname> [ ':' &lt;port> ] '/' 
&lt;path>
  -     * </pre>
  -     *
  -     * <p>This method differs from the RFC, in that either / or \ is allowed
  -     * as a path separator.
  -     *
  -     * @param uriStr
  -     *          The URI to parse.
  -     * @param uri
  -     *          Used to return the parsed components of the URI.
  -     */
  -    protected void parseGenericUri( final String uriStr,
  -                                    final GenericUri uri )
  -        throws FileSystemException
  -    {
  -        final StringBuffer name = new StringBuffer();
  -
  -        // Extract the scheme and authority parts
  -        extractToPath( uriStr, name, uri );
  -
  -        // Decode and normalise the file name
  -        decode( name, 0, name.length() );
  -        normalisePath( name );
  -        uri.setPath( name.toString() );
  -
  -        // Build the root uri
  -        final StringBuffer rootUri = new StringBuffer();
  -        rootUri.append( uri.getScheme() );
  -        rootUri.append( "://" );
  -        rootUri.append( uri.getHostName() );
  -        uri.setContainerUri( rootUri.toString() );
  -    }
  -
  -    /**
  -     * Extracts the scheme, userinfo, hostname and port components of an
  -     * absolute "generic URI".
  -     *
  -     * @param uri
  -     *          The absolute URI to parse.
  -     *
  -     * @param name
  -     *          Used to return the remainder of the URI.
  -     *
  -     * @param genericUri
  -     *          Used to return the extracted components.
  -     */
  -    protected void extractToPath( final String uri,
  -                                  final StringBuffer name,
  -                                  final GenericUri genericUri )
  -        throws FileSystemException
  -    {
  -        // Extract the scheme
  -        final String scheme = extractScheme( uri, name );
  -        genericUri.setScheme( scheme );
  -
  -        // Expecting "//"
  -        if ( name.length() < 2 || name.charAt( 0 ) != '/' || name.charAt( 1 ) != 
'/' )
  -        {
  -            throw new FileSystemException( 
"vfs.provider/missing-double-slashes.error", uri );
  -        }
  -        name.delete( 0, 2 );
  -
  -        // Extract userinfo
  -        final String userInfo = extractUserInfo( name );
  -        genericUri.setUserInfo( userInfo );
  -
  -        // Extract hostname, and normalise
  -        final String hostName = extractHostName( name );
  -        if ( hostName == null )
  -        {
  -            throw new FileSystemException( "vfs.provider/missing-hostname.error", 
uri );
  -        }
  -        genericUri.setHostName( hostName.toLowerCase() );
  -
  -        // Extract port
  -        final String port = extractPort( name );
  -        if ( port != null && port.length() == 0 )
  -        {
  -            throw new FileSystemException( "vfs.provider/missing-port.error", uri );
  -        }
  -        genericUri.setPort( port );
  -
  -        // Expecting '/' or empty name
  -        if ( name.length() > 0 && name.charAt( 0 ) != '/' )
  -        {
  -            throw new FileSystemException( 
"vfs.provider/missing-hostname-path-sep.error", uri );
  -        }
  -    }
  -
  -    /**
  -     * Extracts the user info from a URI.  The <scheme>:// part has been removed
  -     * already.
  -     */
  -    protected String extractUserInfo( final StringBuffer name )
  -    {
  -        final int maxlen = name.length();
  -        for ( int pos = 0; pos < maxlen; pos++ )
  -        {
  -            final char ch = name.charAt( pos );
  -            if ( ch == '@' )
  -            {
  -                // Found the end of the user info
  -                String userInfo = name.substring( 0, pos );
  -                name.delete( 0, pos + 1 );
  -                return userInfo;
  -            }
  -            if ( ch == '/' || ch == '?' )
  -            {
  -                // Not allowed in user info
  -                break;
  -            }
  -        }
  -
  -        // Not found
  -        return null;
  -    }
  -
  -    /**
  -     * Extracts the hostname from a URI.  The <scheme>://<userinfo>@ part has
  -     * been removed.
  -     */
  -    protected String extractHostName( final StringBuffer name )
  -    {
  -        final int maxlen = name.length();
  -        int pos = 0;
  -        for ( ; pos < maxlen; pos++ )
  -        {
  -            final char ch = name.charAt( pos );
  -            if ( ch == '/' || ch == ';' || ch == '?' || ch == ':'
  -                || ch == '@' || ch == '&' || ch == '=' || ch == '+'
  -                || ch == '$' || ch == ',' )
  -            {
  -                break;
  -            }
  -        }
  -        if ( pos == 0 )
  -        {
  -            return null;
  -        }
  -
  -        final String hostname = name.substring( 0, pos );
  -        name.delete( 0, pos );
  -        return hostname;
  -    }
  -
  -    /**
  -     * Extracts the port from a URI.  The <scheme>://<userinfo>@<hostname>
  -     * part has been removed.
  -     */
  -    protected String extractPort( final StringBuffer name )
  -    {
  -        if ( name.length() < 1 || name.charAt( 0 ) != ':' )
  -        {
  -            return null;
  -        }
  -
  -        final int maxlen = name.length();
  -        int pos = 1;
  -        for ( ; pos < maxlen; pos++ )
  -        {
  -            final char ch = name.charAt( pos );
  -            if ( ch < '0' || ch > '9' )
  -            {
  -                break;
  -            }
  -        }
  -
  -        final String port = name.substring( 1, pos );
  -        name.delete( 0, pos );
  -        return port;
       }
   
       /**
  @@ -375,48 +153,6 @@
       }
   
       /**
  -     * Builds a URI from a root URI and path.
  -     *
  -     * @param rootUri
  -     *          The root URI.
  -     *
  -     * @param path
  -     *          A <i>normalised</i> path.
  -     */
  -    public String getUri( final String rootUri,
  -                          final String path )
  -    {
  -        final StringBuffer uri = new StringBuffer( rootUri );
  -        final int len = uri.length();
  -        if ( uri.charAt( len - 1 ) == separatorChar )
  -        {
  -            uri.delete( len - 1, len );
  -        }
  -        if ( !path.startsWith( separator ) )
  -        {
  -            uri.append( separatorChar );
  -        }
  -        uri.append( path );
  -        return uri.toString();
  -    }
  -
  -    /**
  -     * Returns the base name of a path.
  -     *
  -     * @param path
  -     *          A <i>normalised</i> path.
  -     */
  -    public String getBaseName( final String path )
  -    {
  -        final int idx = path.lastIndexOf( separatorChar );
  -        if ( idx == -1 )
  -        {
  -            return path;
  -        }
  -        return path.substring( idx + 1 );
  -    }
  -
  -    /**
        * Resolves a path, relative to a base path.  If the supplied path
        * is an absolute path, it is normalised and returned.  If the supplied
        * path is a relative path, it is resolved relative to the base path.
  @@ -451,190 +187,6 @@
           return buffer.toString();
       }
   
  -    /**
  -     * Resolved a name, relative to a base file.
  -     *
  -     * @param baseFile
  -     *          A <i>normalised</i> path.
  -     *
  -     * @param path
  -     *          The path to resolve.
  -     *
  -     * @param scope
  -     *          The scope to resolve and validate the name in.
  -     */
  -    public String resolvePath( final String baseFile,
  -                               final String path,
  -                               final NameScope scope )
  -        throws FileSystemException
  -    {
  -        final String resolvedPath = resolvePath( baseFile, path );
  -        if ( !checkName( baseFile, resolvedPath, scope ) )
  -        {
  -            throw new FileSystemException( 
"vfs.provider/invalid-descendent-name.error", path );
  -        }
  -
  -        return resolvedPath;
  -    }
  -
  -    /**
  -     * Checks whether a path fits in a particular scope of another path.
  -     *
  -     * @param basePath An absolute, normalised path.
  -     * @param path An absolute, normalised path.
  -     */
  -    public boolean checkName( final String basePath,
  -                              final String path,
  -                              final NameScope scope )
  -    {
  -        if ( scope == NameScope.FILE_SYSTEM )
  -        {
  -            // All good
  -            return true;
  -        }
  -
  -        if ( !path.startsWith( basePath ) )
  -        {
  -            return false;
  -        }
  -        final int baseLen = basePath.length();
  -
  -        if ( scope == NameScope.CHILD )
  -        {
  -            if ( path.length() == baseLen
  -                || ( baseLen > 1 && path.charAt( baseLen ) != separatorChar )
  -                || path.indexOf( separatorChar, baseLen + 1 ) != -1 )
  -            {
  -                return false;
  -            }
  -        }
  -        else if ( scope == NameScope.DESCENDENT )
  -        {
  -            if ( path.length() == baseLen
  -                || ( baseLen > 1 && path.charAt( baseLen ) != separatorChar ) )
  -            {
  -                return false;
  -            }
  -        }
  -        else if ( scope == NameScope.DESCENDENT_OR_SELF )
  -        {
  -            if ( baseLen > 1
  -                && path.length() > baseLen
  -                && path.charAt( baseLen ) != separatorChar )
  -            {
  -                return false;
  -            }
  -        }
  -        else if ( scope != NameScope.FILE_SYSTEM )
  -        {
  -            throw new IllegalArgumentException();
  -        }
  -
  -        return true;
  -    }
  -
  -    /**
  -     * Returns the depth of a path.
  -     *
  -     * @param path A normalised path.
  -     */
  -    public int getDepth( final String path )
  -    {
  -        final int len = path.length();
  -        if ( len == 0 || ( len == 1 && path.charAt( 0 ) == separatorChar ) )
  -        {
  -            return 0;
  -        }
  -        int depth = 1;
  -        for ( int pos = 0; pos > -1 && pos < len; depth++ )
  -        {
  -            pos = path.indexOf( separatorChar, pos + 1 );
  -        }
  -        return depth;
  -    }
  -
  -    /**
  -     * Returns a parent path, or null if the path has no parent.
  -     *
  -     * @param path
  -     *          A <i>normalised</i> path.
  -     */
  -    public String getParentPath( final String path )
  -    {
  -        final int idx = path.lastIndexOf( separatorChar );
  -        if ( idx == -1 || idx == path.length() - 1 )
  -        {
  -            // No parent
  -            return null;
  -        }
  -        if ( idx == 0 )
  -        {
  -            // Root is the parent
  -            return 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 ) == 
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 ) != 
separatorChar ) )
  -        {
  -            // Not a direct ancestor, need to back up
  -            pos = basePath.lastIndexOf( 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( separatorChar, pos + 1 );
  -        while ( pos != -1 )
  -        {
  -            buffer.insert( 0, "../" );
  -            pos = basePath.indexOf( separatorChar, pos + 1 );
  -        }
  -
  -        return buffer.toString();
  -    }
   
       /**
        * Normalises a path.  Does the following:
  
  
  
  1.1                  
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/LayeredFileName.java
  
  Index: LayeredFileName.java
  ===================================================================
  /* ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 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.provider;
  
  /**
   * A file name for layered files.
   *
   * @author <a href="mailto:[EMAIL PROTECTED]";>Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2003/01/23 12:27:23 $
   */
  public class LayeredFileName
      extends DefaultFileName
  {
      private String outerUri;
  
      /**
       * Returns the URI of the outer file.
       */
      public String getOuterUri()
      {
          return outerUri;
      }
  
      public void setOuterUri( final String outerUri )
      {
          this.outerUri = outerUri;
      }
  }
  
  
  
  1.16      +0 -1      
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/ftp/FtpFileSystem.java
  
  Index: FtpFileSystem.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/ftp/FtpFileSystem.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- FtpFileSystem.java        23 Jan 2003 04:37:22 -0000      1.15
  +++ FtpFileSystem.java        23 Jan 2003 12:27:23 -0000      1.16
  @@ -143,7 +143,6 @@
        */
       public FTPClient getClient() throws FileSystemException
       {
  -        // TODO - connect on demand, and garbage collect connections
           if ( idleClient == null )
           {
               return createConnection( hostname, username, password );
  
  
  
  1.9       +6 -10     
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/ftp/FtpFileSystemProvider.java
  
  Index: FtpFileSystemProvider.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/ftp/FtpFileSystemProvider.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- FtpFileSystemProvider.java        23 Nov 2002 00:05:26 -0000      1.8
  +++ FtpFileSystemProvider.java        23 Jan 2003 12:27:23 -0000      1.9
  @@ -59,8 +59,6 @@
   import org.apache.commons.vfs.FileSystem;
   import org.apache.commons.vfs.FileSystemException;
   import org.apache.commons.vfs.provider.AbstractOriginatingFileProvider;
  -import org.apache.commons.vfs.provider.DefaultFileName;
  -import org.apache.commons.vfs.provider.Uri;
   
   /**
    * A provider for FTP file systems.
  @@ -71,27 +69,25 @@
   public final class FtpFileSystemProvider
       extends AbstractOriginatingFileProvider
   {
  -    private final FtpFileNameParser parser = new FtpFileNameParser();
  -
       /**
  -     * Parses a URI into its components.
  +     * Parses a URI.
        */
  -    protected Uri parseUri( final String uri )
  +    protected FileName parseUri( final String uri )
           throws FileSystemException
       {
  -        return parser.parseFtpUri( uri );
  +        return new FtpUri( uri );
       }
   
       /**
        * Creates the filesystem.
        */
  -    protected FileSystem doCreateFileSystem( final Uri uri )
  +    protected FileSystem doCreateFileSystem( final FileName name )
           throws FileSystemException
       {
  -        final FtpUri ftpUri = (FtpUri)uri;
  +        final FtpUri ftpUri = (FtpUri)name;
   
           // Build the root name
  -        final FileName rootName = new DefaultFileName( parser, 
ftpUri.getContainerUri(), FileName.ROOT_PATH );
  +        final FileName rootName = ftpUri.resolveName( FileName.ROOT_PATH );
   
           // Determine the username and password to use
           String username = ftpUri.getUserName();
  
  
  
  1.2       +41 -2     
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/ftp/FtpUri.java
  
  Index: FtpUri.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/ftp/FtpUri.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- FtpUri.java       31 Oct 2002 10:40:57 -0000      1.1
  +++ FtpUri.java       23 Jan 2003 12:27:23 -0000      1.2
  @@ -56,6 +56,7 @@
   package org.apache.commons.vfs.provider.ftp;
   
   import org.apache.commons.vfs.provider.GenericUri;
  +import org.apache.commons.vfs.FileSystemException;
   
   /**
    * An FTP URI.  Splits userinfo (see {@link #getUserInfo}) into username and
  @@ -64,11 +65,49 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Adam Murdoch</a>
    * @version $Revision$ $Date$
    */
  -final class FtpUri
  +class FtpUri
       extends GenericUri
   {
       private String userName;
       private String password;
  +
  +    public FtpUri( final String uri )
  +        throws FileSystemException
  +    {
  +        // FTP URI are generic URI (as per RFC 2396)
  +        parseGenericUri( uri );
  +
  +        // Drop the port if it is 21
  +        final String port = getPort();
  +        if ( port != null && port.equals( "21" ) )
  +        {
  +            setPort( null );
  +        }
  +
  +        // Split up the userinfo into a username and password
  +        // TODO - push this into GenericUri
  +        final String userInfo = getUserInfo();
  +        if ( userInfo != null )
  +        {
  +            int idx = userInfo.indexOf( ':' );
  +            if ( idx == -1 )
  +            {
  +                setUserName( userInfo );
  +            }
  +            else
  +            {
  +                String userName = userInfo.substring( 0, idx );
  +                String password = userInfo.substring( idx + 1 );
  +                setUserName( userName );
  +                setPassword( password );
  +            }
  +        }
  +
  +        // Now build the root URI
  +        final StringBuffer rootUri = new StringBuffer();
  +        appendRootUri( rootUri );
  +        setRootURI( rootUri.toString() );
  +    }
   
       public String getUserName()
       {
  
  
  
  1.10      +2 -3      
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/jar/JarFileSystem.java
  
  Index: JarFileSystem.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/jar/JarFileSystem.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- JarFileSystem.java        25 Nov 2002 05:37:13 -0000      1.9
  +++ JarFileSystem.java        23 Jan 2003 12:27:23 -0000      1.10
  @@ -68,7 +68,6 @@
   import org.apache.commons.vfs.FileName;
   import org.apache.commons.vfs.FileObject;
   import org.apache.commons.vfs.FileSystemException;
  -import org.apache.commons.vfs.provider.DefaultFileName;
   import org.apache.commons.vfs.provider.zip.ZipFileObject;
   import org.apache.commons.vfs.provider.zip.ZipFileSystem;
   
  @@ -83,7 +82,7 @@
   {
       private Attributes attributes;
   
  -    public JarFileSystem( final DefaultFileName rootName,
  +    public JarFileSystem( final FileName rootName,
                             final FileObject file ) throws FileSystemException
       {
           super( rootName, file );
  
  
  
  1.8       +4 -4      
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/jar/JarFileSystemProvider.java
  
  Index: JarFileSystemProvider.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/jar/JarFileSystemProvider.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- JarFileSystemProvider.java        23 Nov 2002 00:33:53 -0000      1.7
  +++ JarFileSystemProvider.java        23 Jan 2003 12:27:24 -0000      1.8
  @@ -59,7 +59,7 @@
   import org.apache.commons.vfs.FileObject;
   import org.apache.commons.vfs.FileSystem;
   import org.apache.commons.vfs.FileSystemException;
  -import org.apache.commons.vfs.provider.DefaultFileName;
  +import org.apache.commons.vfs.provider.zip.ZipFileNameParser;
   import org.apache.commons.vfs.provider.zip.ZipFileSystemProvider;
   
   /**
  @@ -84,8 +84,8 @@
                                                FileObject file )
           throws FileSystemException
       {
  -        final String rootUri = getParser().buildRootUri( scheme, 
file.getName().getURI() );
  -        final DefaultFileName name = new DefaultFileName( getParser(), rootUri, 
FileName.ROOT_PATH );
  +        final FileName name =
  +            new ZipFileNameParser( scheme, file.getName().getURI(), 
FileName.ROOT_PATH );
           return new JarFileSystem( name, file );
       }
   }
  
  
  
  1.12      +6 -13     
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/local/DefaultLocalFileSystemProvider.java
  
  Index: DefaultLocalFileSystemProvider.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/local/DefaultLocalFileSystemProvider.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- DefaultLocalFileSystemProvider.java       23 Nov 2002 00:33:53 -0000      1.11
  +++ DefaultLocalFileSystemProvider.java       23 Jan 2003 12:27:24 -0000      1.12
  @@ -61,9 +61,7 @@
   import org.apache.commons.vfs.FileSystem;
   import org.apache.commons.vfs.FileSystemException;
   import org.apache.commons.vfs.provider.AbstractOriginatingFileProvider;
  -import org.apache.commons.vfs.provider.DefaultFileName;
   import org.apache.commons.vfs.provider.LocalFileProvider;
  -import org.apache.commons.vfs.provider.Uri;
   import org.apache.commons.vfs.util.Os;
   
   /**
  @@ -120,31 +118,26 @@
       }
   
       /**
  -     * 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 #doCreateFileSystem} 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.
  +     * Parses a URI.
        */
  -    protected Uri parseUri( final String uri )
  +    protected FileName parseUri( final String uri )
           throws FileSystemException
       {
  -        return parser.parseFileUri( uri );
  +        return new LocalFileUri( uri, parser );
       }
   
       /**
        * Creates the filesystem.
        */
  -    protected FileSystem doCreateFileSystem( final Uri uri )
  +    protected FileSystem doCreateFileSystem( final FileName name )
           throws FileSystemException
       {
           // Build the name of the root file.
  -        final LocalFileUri fileUri = (LocalFileUri)uri;
  +        final LocalFileUri fileUri = (LocalFileUri)name;
           final String rootFile = fileUri.getRootFile();
   
           // Create the file system
  -        final DefaultFileName rootName = new DefaultFileName( parser, 
fileUri.getContainerUri(), FileName.ROOT_PATH );
  +        final FileName rootName = fileUri.resolveName( FileName.ROOT_PATH );
           return new LocalFileSystem( rootName, rootFile );
       }
   }
  
  
  
  1.6       +0 -38     
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/local/LocalFileNameParser.java
  
  Index: LocalFileNameParser.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/local/LocalFileNameParser.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- LocalFileNameParser.java  23 Nov 2002 00:33:53 -0000      1.5
  +++ LocalFileNameParser.java  23 Jan 2003 12:27:24 -0000      1.6
  @@ -57,7 +57,6 @@
   
   import java.io.File;
   import org.apache.commons.vfs.FileSystemException;
  -import org.apache.commons.vfs.provider.Uri;
   import org.apache.commons.vfs.provider.UriParser;
   
   /**
  @@ -91,43 +90,6 @@
           {
               return false;
           }
  -    }
  -
  -    /**
  -     * Parses an absolute URI, splitting it into its components.
  -     *
  -     * @param uriStr The URI.
  -     */
  -    public Uri parseFileUri( final String uriStr )
  -        throws FileSystemException
  -    {
  -        final StringBuffer name = new StringBuffer();
  -        final LocalFileUri uri = new LocalFileUri();
  -
  -        // Extract the scheme
  -        final String scheme = extractScheme( uriStr, name );
  -        uri.setScheme( scheme );
  -
  -        // Remove encoding, and adjust the separators
  -        decode( name, 0, name.length() );
  -        fixSeparators( name );
  -
  -        // Extract the root prefix
  -        final String rootFile = extractRootPrefix( uriStr, name );
  -        uri.setRootFile( rootFile );
  -
  -        // Normalise the path
  -        normalisePath( name );
  -        uri.setPath( name.toString() );
  -
  -        // Build the root URI
  -        final StringBuffer rootUri = new StringBuffer();
  -        rootUri.append( scheme );
  -        rootUri.append( "://" );
  -        rootUri.append( rootFile );
  -        uri.setContainerUri( rootUri.toString() );
  -
  -        return uri;
       }
   
       /**
  
  
  
  1.2       +34 -4     
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/local/LocalFileUri.java
  
  Index: LocalFileUri.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/local/LocalFileUri.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- LocalFileUri.java 31 Oct 2002 10:40:57 -0000      1.1
  +++ LocalFileUri.java 23 Jan 2003 12:27:24 -0000      1.2
  @@ -55,7 +55,8 @@
    */
   package org.apache.commons.vfs.provider.local;
   
  -import org.apache.commons.vfs.provider.Uri;
  +import org.apache.commons.vfs.FileSystemException;
  +import org.apache.commons.vfs.provider.DefaultFileName;
   
   /**
    * A local file URI.
  @@ -63,10 +64,39 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Adam Murdoch</a>
    * @version $Revision$ $Date$
    */
  -final class LocalFileUri
  -    extends Uri
  +class LocalFileUri
  +    extends DefaultFileName
   {
       private String rootFile;
  +
  +    public LocalFileUri( final String uri, final LocalFileNameParser parser )
  +        throws FileSystemException
  +    {
  +        final StringBuffer name = new StringBuffer();
  +
  +        // Extract the scheme
  +        final String scheme = extractScheme( uri, name );
  +        setScheme( scheme );
  +
  +        // Remove encoding, and adjust the separators
  +        decode( name, 0, name.length() );
  +        fixSeparators( name );
  +
  +        // Extract the root prefix
  +        final String rootFile = parser.extractRootPrefix( uri, name );
  +        setRootFile( rootFile );
  +
  +        // Normalise the path
  +        normalisePath( name );
  +        setPath( name.toString() );
  +
  +        // Build the root URI
  +        final StringBuffer rootUri = new StringBuffer();
  +        rootUri.append( scheme );
  +        rootUri.append( "://" );
  +        rootUri.append( rootFile );
  +        setRootURI( rootUri.toString() );
  +    }
   
       public String getRootFile()
       {
  
  
  
  1.9       +6 -10     
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/smb/SmbFileSystemProvider.java
  
  Index: SmbFileSystemProvider.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/smb/SmbFileSystemProvider.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- SmbFileSystemProvider.java        23 Nov 2002 00:05:26 -0000      1.8
  +++ SmbFileSystemProvider.java        23 Jan 2003 12:27:24 -0000      1.9
  @@ -59,9 +59,7 @@
   import org.apache.commons.vfs.FileSystem;
   import org.apache.commons.vfs.FileSystemException;
   import org.apache.commons.vfs.provider.AbstractOriginatingFileProvider;
  -import org.apache.commons.vfs.provider.DefaultFileName;
   import org.apache.commons.vfs.provider.FileProvider;
  -import org.apache.commons.vfs.provider.Uri;
   
   /**
    * A provider for SMB (Samba, Windows share) file systems.
  @@ -73,25 +71,23 @@
       extends AbstractOriginatingFileProvider
       implements FileProvider
   {
  -    private final SmbFileNameParser parser = new SmbFileNameParser();
  -
       /**
  -     * Parses a URI into its components.
  +     * Parses a URI.
        */
  -    protected Uri parseUri( final String uri )
  +    protected FileName parseUri( final String uri )
           throws FileSystemException
       {
  -        return parser.parseSmbUri( uri );
  +        return new SmbUri( uri );
       }
   
       /**
        * Creates the filesystem.
        */
  -    protected FileSystem doCreateFileSystem( final Uri uri )
  +    protected FileSystem doCreateFileSystem( final FileName name )
           throws FileSystemException
       {
  -        final SmbUri smbUri = (SmbUri)uri;
  -        final FileName rootName = new DefaultFileName( parser, 
smbUri.getContainerUri(), FileName.ROOT_PATH );
  +        final SmbUri smbUri = (SmbUri)name;
  +        final FileName rootName = smbUri.resolveName( FileName.ROOT_PATH );
           return new SmbFileSystem( rootName );
       }
   }
  
  
  
  1.2       +39 -2     
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/smb/SmbUri.java
  
  Index: SmbUri.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/smb/SmbUri.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SmbUri.java       31 Oct 2002 10:40:57 -0000      1.1
  +++ SmbUri.java       23 Jan 2003 12:27:24 -0000      1.2
  @@ -56,6 +56,7 @@
   package org.apache.commons.vfs.provider.smb;
   
   import org.apache.commons.vfs.provider.GenericUri;
  +import org.apache.commons.vfs.FileSystemException;
   
   /**
    * An SMB URI.  Adds a share name to the generic URI.
  @@ -63,10 +64,46 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Adam Murdoch</a>
    * @version $Revision$ $Date$
    */
  -final class SmbUri
  +class SmbUri
       extends GenericUri
   {
       private String share;
  +
  +    public SmbUri( final String uri )
  +        throws FileSystemException
  +    {
  +        final StringBuffer name = new StringBuffer();
  +
  +        // Extract the scheme and authority parts
  +        extractToPath( uri, name );
  +
  +        // TODO - drop the default port
  +
  +        // Decode and adjust separators
  +        decode( name, 0, name.length() );
  +        fixSeparators( name );
  +
  +        // Extract the share
  +        final String share = extractFirstElement( name );
  +        if ( share == null )
  +        {
  +            throw new FileSystemException( 
"vfs.provider.smb/missing-share-name.error", uri );
  +        }
  +        setShare( share );
  +
  +        // Normalise the path
  +        normalisePath( name );
  +
  +        // Set the path
  +        setPath( name.toString() );
  +
  +        // Set the root URI
  +        StringBuffer rootUri = new StringBuffer();
  +        appendRootUri( rootUri );
  +        rootUri.append( '/' );
  +        rootUri.append( share );
  +        setRootURI( rootUri.toString() );
  +    }
   
       public String getShare()
       {
  
  
  
  1.4       +10 -20    
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/temp/TemporaryFileProvider.java
  
  Index: TemporaryFileProvider.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/temp/TemporaryFileProvider.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- TemporaryFileProvider.java        23 Nov 2002 00:05:27 -0000      1.3
  +++ TemporaryFileProvider.java        23 Jan 2003 12:27:26 -0000      1.4
  @@ -63,7 +63,6 @@
   import org.apache.commons.vfs.provider.AbstractFileSystemProvider;
   import org.apache.commons.vfs.provider.DefaultFileName;
   import org.apache.commons.vfs.provider.FileProvider;
  -import org.apache.commons.vfs.provider.Uri;
   import org.apache.commons.vfs.provider.UriParser;
   import org.apache.commons.vfs.provider.local.LocalFileSystem;
   
  @@ -96,9 +95,13 @@
           throws FileSystemException
       {
           // Parse the name
  -        final Uri parsedUri = parseUri( uri );
  +        final StringBuffer buffer = new StringBuffer( uri );
  +        final String scheme = parser.extractScheme( uri, buffer );
  +        parser.decode( buffer, 0, buffer.length() );
  +        parser.normalisePath( buffer );
  +        final String path = buffer.toString();
   
  -        // Create the temp file system
  +        // Create the temp file system if it does not exist
           FileSystem filesystem = findFileSystem( this );
           if ( filesystem == null )
           {
  @@ -106,26 +109,13 @@
               {
                   rootFile = getContext().getTemporaryFileStore().allocateFile( 
"tempfs" );
               }
  -            final FileName rootName = new DefaultFileName( parser, 
parsedUri.getContainerUri(), FileName.ROOT_PATH );
  +            final FileName rootName =
  +                new DefaultFileName( scheme, scheme + ":",  FileName.ROOT_PATH );
               filesystem = new LocalFileSystem( rootName, rootFile.getAbsolutePath() 
);
               addFileSystem( this, filesystem );
           }
   
           // Find the file
  -        return filesystem.resolveFile( parsedUri.getPath() );
  -    }
  -
  -    /** Parses an absolute URI into its parts. */
  -    private Uri parseUri( final String uri ) throws FileSystemException
  -    {
  -        final StringBuffer buffer = new StringBuffer( uri );
  -        final Uri parsedUri = new Uri();
  -        final String scheme = parser.extractScheme( uri, buffer );
  -        parsedUri.setScheme( scheme );
  -        parser.decode( buffer, 0, buffer.length() );
  -        parser.normalisePath( buffer );
  -        parsedUri.setPath( buffer.toString() );
  -        parsedUri.setContainerUri( scheme + ":" );
  -        return parsedUri;
  +        return filesystem.resolveFile( path );
       }
   }
  
  
  
  1.10      +8 -9      
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/url/UrlFileProvider.java
  
  Index: UrlFileProvider.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/url/UrlFileProvider.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- UrlFileProvider.java      25 Nov 2002 05:38:45 -0000      1.9
  +++ UrlFileProvider.java      23 Jan 2003 12:27:26 -0000      1.10
  @@ -55,16 +55,14 @@
    */
   package org.apache.commons.vfs.provider.url;
   
  +import java.net.MalformedURLException;
  +import java.net.URL;
   import org.apache.commons.vfs.FileName;
  +import org.apache.commons.vfs.FileObject;
   import org.apache.commons.vfs.FileSystem;
   import org.apache.commons.vfs.FileSystemException;
  -import org.apache.commons.vfs.FileObject;
   import org.apache.commons.vfs.provider.AbstractFileSystemProvider;
   import org.apache.commons.vfs.provider.DefaultFileName;
  -import org.apache.commons.vfs.provider.Uri;
  -import org.apache.commons.vfs.provider.UriParser;
  -import java.net.URL;
  -import java.net.MalformedURLException;
   
   /**
    * A file provider backed by Java's URL API.
  @@ -75,8 +73,6 @@
   public class UrlFileProvider
       extends AbstractFileSystemProvider
   {
  -    private final UriParser parser = new UriParser();
  -
       /**
        * Locates a file object, by absolute URI.
        */
  @@ -91,7 +87,10 @@
               FileSystem fs = findFileSystem( rootUrl );
               if ( fs == null )
               {
  -                final FileName rootName = new DefaultFileName( parser, 
rootUrl.toExternalForm(), FileName.ROOT_PATH );
  +                final FileName rootName =
  +                    new DefaultFileName( rootUrl.getProtocol(),
  +                                         rootUrl.toExternalForm(),
  +                                         FileName.ROOT_PATH );
                   fs = new UrlFileSystem( rootName );
                   addFileSystem( rootUrl, fs );
               }
  
  
  
  1.7       +16 -26    
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/zip/ZipFileNameParser.java
  
  Index: ZipFileNameParser.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/zip/ZipFileNameParser.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- ZipFileNameParser.java    31 Oct 2002 10:40:58 -0000      1.6
  +++ ZipFileNameParser.java    23 Jan 2003 12:27:27 -0000      1.7
  @@ -56,8 +56,7 @@
   package org.apache.commons.vfs.provider.zip;
   
   import org.apache.commons.vfs.FileSystemException;
  -import org.apache.commons.vfs.provider.Uri;
  -import org.apache.commons.vfs.provider.UriParser;
  +import org.apache.commons.vfs.provider.LayeredFileName;
   
   /**
    * A parser for Zip file names.
  @@ -66,55 +65,46 @@
    * @version $Revision$ $Date$
    */
   public class ZipFileNameParser
  -    extends UriParser
  +    extends LayeredFileName
   {
       private static final char[] ZIP_URL_RESERVED_CHARS = {'!'};
   
  -    /**
  -     * Parses an absolute URI, splitting it into its components.
  -     *
  -     * @param uriStr
  -     *          The URI.
  -     */
  -    public Uri parseZipUri( final String uriStr )
  +    public ZipFileNameParser( final String uri )
           throws FileSystemException
       {
           final StringBuffer name = new StringBuffer();
  -        final Uri uri = new Uri();
   
           // Extract the scheme
  -        final String scheme = extractScheme( uriStr, name );
  -        uri.setScheme( scheme );
  +        final String scheme = extractScheme( uri, name );
  +        setScheme( scheme );
   
  -        // Extract the Zip file name
  -        final String zipName = extractZipName( name );
  -        uri.setContainerUri( zipName );
  +        // Extract the Zip file URI
  +        final String zipUri = extractZipName( name );
  +        setOuterUri( zipUri );
   
  -        // Decode and normalise the file name
  +        // Decode and normalise the path
           decode( name, 0, name.length() );
           normalisePath( name );
  -        uri.setPath( name.toString() );
  -
  -        return uri;
  +        setPath( name.toString() );
       }
   
  -    /**
  -     * Assembles a root URI from the components of a parsed URI.
  -     */
  -    public String buildRootUri( final String scheme, final String outerFileUri )
  +    public ZipFileNameParser( final String scheme,
  +                              final String outerFileUri,
  +                              final String path )
       {
           final StringBuffer rootUri = new StringBuffer();
           rootUri.append( scheme );
           rootUri.append( ":" );
           appendEncoded( rootUri, outerFileUri, ZIP_URL_RESERVED_CHARS );
           rootUri.append( "!" );
  -        return rootUri.toString();
  +        setRootURI( rootUri.toString() );
  +        setPath( path );
       }
   
       /**
        * Pops the root prefix off a URI, which has had the scheme removed.
        */
  -    private String extractZipName( final StringBuffer uri )
  +    private static String extractZipName( final StringBuffer uri )
           throws FileSystemException
       {
           // Looking for <name>!<abspath>
  
  
  
  1.19      +1 -2      
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/zip/ZipFileSystem.java
  
  Index: ZipFileSystem.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/zip/ZipFileSystem.java,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- ZipFileSystem.java        23 Jan 2003 04:37:23 -0000      1.18
  +++ ZipFileSystem.java        23 Jan 2003 12:27:27 -0000      1.19
  @@ -68,7 +68,6 @@
   import org.apache.commons.vfs.FileSystemException;
   import org.apache.commons.vfs.Selectors;
   import org.apache.commons.vfs.provider.AbstractFileSystem;
  -import org.apache.commons.vfs.provider.DefaultFileName;
   
   /**
    * A read-only file system for Zip/Jar files.
  @@ -83,7 +82,7 @@
       private final File file;
       protected final ZipFile zipFile;
   
  -    public ZipFileSystem( final DefaultFileName rootName,
  +    public ZipFileSystem( final FileName rootName,
                             final FileObject parentLayer )
           throws FileSystemException
       {
  
  
  
  1.15      +5 -18     
jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/zip/ZipFileSystemProvider.java
  
  Index: ZipFileSystemProvider.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/zip/ZipFileSystemProvider.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- ZipFileSystemProvider.java        23 Nov 2002 00:33:54 -0000      1.14
  +++ ZipFileSystemProvider.java        23 Jan 2003 12:27:28 -0000      1.15
  @@ -60,9 +60,7 @@
   import org.apache.commons.vfs.FileSystem;
   import org.apache.commons.vfs.FileSystemException;
   import org.apache.commons.vfs.provider.AbstractLayeredFileProvider;
  -import org.apache.commons.vfs.provider.DefaultFileName;
   import org.apache.commons.vfs.provider.FileProvider;
  -import org.apache.commons.vfs.provider.Uri;
   
   /**
    * A file system provider for Zip files.  Provides read-only file systems.
  @@ -74,16 +72,14 @@
       extends AbstractLayeredFileProvider
       implements FileProvider
   {
  -    private final ZipFileNameParser parser = new ZipFileNameParser();
  -
       /**
        * Parses an absolute URI.
        * @param uri The URI to parse.
        */
  -    protected Uri parseUri( final String uri )
  +    protected FileName parseUri( final String uri )
           throws FileSystemException
       {
  -        return parser.parseZipUri( uri );
  +        return new ZipFileNameParser( uri );
       }
   
       /**
  @@ -97,17 +93,8 @@
                                                final FileObject file )
           throws FileSystemException
       {
  -        final String rootUri = parser.buildRootUri( scheme, file.getName().getURI() 
);
  -        final DefaultFileName name = new DefaultFileName( parser, rootUri, 
FileName.ROOT_PATH );
  -        return new ZipFileSystem( name, file );
  +        final FileName rootName =
  +            new ZipFileNameParser( scheme, file.getName().getURI(), 
FileName.ROOT_PATH );
  +        return new ZipFileSystem( rootName, file );
       }
  -
  -    /**
  -     * Returns the URI parser.
  -     */
  -    protected ZipFileNameParser getParser()
  -    {
  -        return parser;
  -    }
  -
   }
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to