You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by im...@apache.org on 2005/06/19 09:25:20 UTC

svn commit: r191323 [1/2] - in /jakarta/commons/proper/vfs/trunk: ./ src/java/org/apache/commons/vfs/ src/java/org/apache/commons/vfs/impl/ src/java/org/apache/commons/vfs/provider/ src/java/org/apache/commons/vfs/provider/ftp/ src/java/org/apache/commons/vfs/provider/http/ src/java/org/apache/commons/vfs/provider/jar/ src/java/org/apache/commons/vfs/provider/local/ src/java/org/apache/commons/vfs/provider/sftp/ src/java/org/apache/commons/vfs/provider/smb/ src/java/org/apache/commons/vfs/provider/tar/ src/java/org/apache/commons/vfs/provider/temp/ src/java/org/apache/commons/vfs/provider/url/ src/java/org/apache/commons/vfs/provider/webdav/ src/java/org/apache/commons/vfs/provider/zip/ src/test-data/ src/test-data/basedir/ src/test/org/apache/commons/vfs/ src/test/org/apache/commons/vfs/provider/smb/test/ src/test/org/apache/commons/vfs/provider/test/ src/test/org/apache/commons/vfs/test/ src/utils/ xdocs/

Author: imario
Date: Sun Jun 19 00:25:16 2005
New Revision: 191323

URL: http://svn.apache.org/viewcvs?rev=191323&view=rev
Log:
*) Again refactored the filename parsing stuff. Still room for improvements/cleanup but we are on the way.
Now VFS only escapes parts of the uri which are internally used. That is:
% - generally
! - sometimes e.g. archive base filesystems (jar/tar)
? - for http/webdav filesystems for special handling of the query string
*) FileObject.findFiles now returns null if the base file do not exist.
Submitted By: tcurdt -at- apache.org
*) SftpFileSystem now correctly handles files with space in its name
*) Moved on to commons-net 1.4 but still backward compatible to 1.2
*) src/utils: unix script to recreated the archive files used by some tests

Added:
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/VirtualFileName.java   (with props)
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/HostFileNameParser.java   (with props)
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/URLFileName.java   (with props)
    jakarta/commons/proper/vfs/trunk/src/test-data/basedir/file space.txt   (with props)
    jakarta/commons/proper/vfs/trunk/src/utils/
    jakarta/commons/proper/vfs/trunk/src/utils/create_archives.sh   (with props)
Removed:
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/BasicFileName.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/url/UrlFileName.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/webdav/WebdavFileNameParser.java
Modified:
    jakarta/commons/proper/vfs/trunk/build.xml
    jakarta/commons/proper/vfs/trunk/project.xml
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/FileName.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/Resources.properties
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DefaultFileSystemManager.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DefaultVfsComponentContext.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/StandardFileSystemManager.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/VirtualFileProvider.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileName.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileObject.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileProvider.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileSystem.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractLayeredFileProvider.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractOriginatingFileProvider.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/FileNameParser.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/FileProvider.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/GenericFileName.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/LayeredFileName.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/LayeredFileNameParser.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/URLFileNameParser.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/UriParser.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/VfsComponentContext.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/ftp/FtpFileNameParser.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/ftp/FtpRandomAccessContent.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/http/HttpFileNameParser.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/http/HttpFileObject.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/http/HttpRandomAccesContent.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/jar/JarFileProvider.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/DefaultLocalFileProvider.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/GenericFileNameParser.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/LocalFileName.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/LocalFileNameParser.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/LocalFileRandomAccessContent.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/LocalFileSystem.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/WindowsFileNameParser.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/sftp/SftpFileNameParser.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/sftp/SftpFileObject.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/smb/SmbFileName.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/smb/SmbFileNameParser.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/smb/SmbFileSystem.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/tar/TarFileProvider.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/temp/TemporaryFileProvider.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/url/UrlFileProvider.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/webdav/WebdavFileObject.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/webdav/WebdavFileProvider.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/zip/ZipFileProvider.java
    jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/zip/ZipFileSystem.java
    jakarta/commons/proper/vfs/trunk/src/test-data/nested.jar
    jakarta/commons/proper/vfs/trunk/src/test-data/nested.tar
    jakarta/commons/proper/vfs/trunk/src/test-data/nested.tbz2
    jakarta/commons/proper/vfs/trunk/src/test-data/nested.tgz
    jakarta/commons/proper/vfs/trunk/src/test-data/nested.zip
    jakarta/commons/proper/vfs/trunk/src/test-data/test.jar
    jakarta/commons/proper/vfs/trunk/src/test-data/test.tar
    jakarta/commons/proper/vfs/trunk/src/test-data/test.tbz2
    jakarta/commons/proper/vfs/trunk/src/test-data/test.tgz
    jakarta/commons/proper/vfs/trunk/src/test-data/test.zip
    jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/RunTest.java
    jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/provider/smb/test/FileNameTestCase.java
    jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/provider/test/GenericFileNameTestCase.java
    jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/AbstractProviderTestCase.java
    jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/test/NamingTests.java
    jakarta/commons/proper/vfs/trunk/xdocs/todo.xml

Modified: jakarta/commons/proper/vfs/trunk/build.xml
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/build.xml?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/build.xml (original)
+++ jakarta/commons/proper/vfs/trunk/build.xml Sun Jun 19 00:25:16 2005
@@ -185,7 +185,7 @@
         </get>
         <get dest="${libdir}/junit-3.8.1.jar" usetimestamp="true" ignoreerrors="true" src="http://www.ibiblio.org/maven/junit/jars/junit-3.8.1.jar">
         </get>
-        <get dest="${libdir}/commons-net-1.2.1.jar" usetimestamp="true" ignoreerrors="true" src="http://www.ibiblio.org/maven/commons-net/jars/commons-net-1.2.1.jar">
+        <get dest="${libdir}/commons-net-1.4.0.jar" usetimestamp="true" ignoreerrors="true" src="http://www.ibiblio.org/maven/commons-net/jars/commons-net-1.4.0.jar">
         </get>
         <get dest="${libdir}/commons-logging-1.0.4.jar" usetimestamp="true" ignoreerrors="true" src="http://www.ibiblio.org/maven/commons-logging/jars/commons-logging-1.0.4.jar">
         </get>

Modified: jakarta/commons/proper/vfs/trunk/project.xml
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/project.xml?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/project.xml (original)
+++ jakarta/commons/proper/vfs/trunk/project.xml Sun Jun 19 00:25:16 2005
@@ -97,7 +97,7 @@
         <dependency>
             <groupId>commons-net</groupId>
             <artifactId>commons-net</artifactId>
-            <version>1.2.1</version>
+            <version>1.4.0</version>
         </dependency>
 
         <dependency>

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/FileName.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/FileName.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/FileName.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/FileName.java Sun Jun 19 00:25:16 2005
@@ -110,6 +110,11 @@
     String getRootURI();
 
     /**
+     * find the root of the filesystem
+     */
+    public FileName getRoot();
+
+    /**
      * Returns the file name of the parent of this file.  The root of a
      * file system has no parent.
      *

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/Resources.properties
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/Resources.properties?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/Resources.properties (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/Resources.properties Sun Jun 19 00:25:16 2005
@@ -81,7 +81,7 @@
 
 # AbstractFileSystem
 vfs.provider/files-cache-missing.error=No files-cache implementation set.
-vfs.provider/mismatched-fs-for-name.error=Incorrect file system URI for in name "{0}", was expecting "{1}".
+vfs.provider/mismatched-fs-for-name.error=Incorrect file system URI "{2}" in name "{0}", was expecting "{1}".
 vfs.provider/junctions-not-supported.error=Junctions not supported for file system "{0}".
 vfs.provider/notify-listener.warn=Could not notify listener of change to "{0}".
 vfs.provider/replicate-missing-file.error=Could not replicate "{0}" as it does not exist.

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DefaultFileSystemManager.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DefaultFileSystemManager.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DefaultFileSystemManager.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DefaultFileSystemManager.java Sun Jun 19 00:25:16 2005
@@ -555,13 +555,13 @@
     /**
      * Resolves a name, relative to the root.
      *
-     * @param root the base filename
+     * @param base the base filename
      * @param name the name
      * @param scope the {@link NameScope}
      * @return
      * @throws FileSystemException
      */
-    public FileName resolveName(final FileName root,
+    public FileName resolveName(final FileName base,
                                 final String name,
                                 final NameScope scope)
         throws FileSystemException
@@ -576,7 +576,7 @@
         {
             // Supplied path is not absolute
             buffer.insert(0, FileName.SEPARATOR_CHAR);
-            buffer.insert(0, root.getPath());
+            buffer.insert(0, base.getPath());
         }
 
         //// UriParser.canonicalizePath(buffer, 0, name.length());
@@ -586,13 +586,27 @@
 
         // Check the name is ok
         final String resolvedPath = buffer.toString();
-        if (!AbstractFileName.checkName(root.getPath(), resolvedPath, scope))
+        if (!AbstractFileName.checkName(base.getPath(), resolvedPath, scope))
         {
             throw new FileSystemException("vfs.provider/invalid-descendent-name.error", name);
         }
 
-        // todo: pass this down to the fileProvider
-        return ((AbstractFileName) root).createName(resolvedPath);
+        String scheme = base.getScheme();
+        final FileProvider provider = (FileProvider) providers.get(scheme);
+        if (provider != null)
+        {
+            // todo: extend the filename parser to be able to parse
+            // only a pathname and take the missing informations from
+            // the base. Then we can get rid of the string operation.
+            //// String fullPath = base.getRootURI() + resolvedPath.substring(1);
+            String fullPath = base.getRootURI() + resolvedPath;
+
+            return provider.parseUri(base, fullPath);
+        }
+
+        // todo: avoid fallback to this point
+        // this happens if we have a virtual filesystem (no provider for scheme)
+        return ((AbstractFileName) base).createName(null, resolvedPath);
     }
 
     public FileName resolveURI(String uri) throws FileSystemException
@@ -612,7 +626,7 @@
             final FileProvider provider = (FileProvider) providers.get(scheme);
             if (provider != null)
             {
-                return provider.parseUri(scheme, uri);
+                return provider.parseUri(null, uri);
             }
 
 // Otherwise, assume a local file

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DefaultVfsComponentContext.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DefaultVfsComponentContext.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DefaultVfsComponentContext.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/DefaultVfsComponentContext.java Sun Jun 19 00:25:16 2005
@@ -15,11 +15,11 @@
  */
 package org.apache.commons.vfs.impl;
 
+import org.apache.commons.vfs.FileName;
 import org.apache.commons.vfs.FileObject;
 import org.apache.commons.vfs.FileSystemException;
 import org.apache.commons.vfs.FileSystemManager;
 import org.apache.commons.vfs.FileSystemOptions;
-import org.apache.commons.vfs.FileName;
 import org.apache.commons.vfs.provider.FileReplicator;
 import org.apache.commons.vfs.provider.TemporaryFileStore;
 import org.apache.commons.vfs.provider.VfsComponentContext;

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/StandardFileSystemManager.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/StandardFileSystemManager.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/StandardFileSystemManager.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/StandardFileSystemManager.java Sun Jun 19 00:25:16 2005
@@ -27,15 +27,15 @@
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
-import java.net.URL;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
 import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.StringTokenizer;
-import java.util.jar.JarFile;
 import java.util.jar.JarEntry;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
+import java.util.jar.JarFile;
 
 /**
  * A {@link org.apache.commons.vfs.FileSystemManager} that configures itself

Added: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/VirtualFileName.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/VirtualFileName.java?rev=191323&view=auto
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/VirtualFileName.java (added)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/VirtualFileName.java Sun Jun 19 00:25:16 2005
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2002-2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.vfs.impl;
+
+import org.apache.commons.vfs.FileName;
+import org.apache.commons.vfs.provider.AbstractFileName;
+
+/**
+ * A simple Filename to hold the scheme for to be created virtual filesytsem.
+ *
+ * @author imario@apache.org
+ * @version $Revision$ $Date$
+ */
+public class VirtualFileName extends AbstractFileName
+{
+    public VirtualFileName(final String rootUri, final String scheme, final String absPath)
+    {
+        super(rootUri, scheme, absPath);
+    }
+
+    public FileName createName(String rootURI, String absPath)
+    {
+        return new VirtualFileName(rootURI, getScheme(), absPath);
+    }
+
+    protected void appendRootUri(StringBuffer buffer)
+    {
+        buffer.append(getScheme());
+    }
+}

Propchange: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/VirtualFileName.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/VirtualFileName.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/VirtualFileName.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/VirtualFileProvider.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/VirtualFileProvider.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/VirtualFileProvider.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/impl/VirtualFileProvider.java Sun Jun 19 00:25:16 2005
@@ -19,7 +19,6 @@
 import org.apache.commons.vfs.FileObject;
 import org.apache.commons.vfs.FileSystemException;
 import org.apache.commons.vfs.provider.AbstractVfsContainer;
-import org.apache.commons.vfs.provider.BasicFileName;
 
 
 /**
@@ -38,7 +37,9 @@
         throws FileSystemException
     {
         final FileName rootName =
-            new BasicFileName(rootFile.getName(), FileName.ROOT_PATH);
+            getContext().getFileSystemManager().resolveName(rootFile.getName(), FileName.ROOT_PATH);
+        // final FileName rootName =
+        //    new BasicFileName(rootFile.getName(), FileName.ROOT_PATH);
         final VirtualFileSystem fs = new VirtualFileSystem(rootName, null);
         addComponent(fs);
         fs.addJunction(FileName.ROOT_PATH, rootFile);
@@ -51,7 +52,9 @@
     public FileObject createFileSystem(final String rootUri) throws FileSystemException
     {
         final FileName rootName =
-            new BasicFileName(rootUri, FileName.ROOT_PATH);
+            new VirtualFileName(null, rootUri, FileName.ROOT_PATH);
+        // final FileName rootName =
+        //    new BasicFileName(rootUri, FileName.ROOT_PATH);
         final VirtualFileSystem fs = new VirtualFileSystem(rootName, null);
         addComponent(fs);
         return fs.getRoot();

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileName.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileName.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileName.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileName.java Sun Jun 19 00:25:16 2005
@@ -34,13 +34,16 @@
     // Cached stuff
     private String uri;
     private String baseName;
-    private String rootUri;
+    // will be set by BasicFileName too
+    protected String rootUri;
     private String extension;
     private String decodedAbsPath;
 
-    public AbstractFileName(final String scheme,
+    public AbstractFileName(final String rootUri,
+                            final String scheme,
                             final String absPath)
     {
+        this.rootUri = rootUri;
         this.scheme = scheme;
         if (absPath != null && absPath.length() > 0)
         {
@@ -106,7 +109,7 @@
     /**
      * Factory method for creating name instances.
      */
-    public abstract FileName createName(String absPath);
+    public abstract FileName createName(String rootURI, String absPath);
 
     /**
      * Builds the root URI for this file name.  Note that the root URI must not
@@ -175,7 +178,21 @@
         {
             parentPath = getPath().substring(0, idx);
         }
-        return createName(parentPath);
+        return createName(getRootURI(), parentPath);
+    }
+
+    /**
+     * find the root of the filesystem
+     */
+    public FileName getRoot()
+    {
+        FileName root = this;
+        while (root.getParent() != null)
+        {
+            root = root.getParent();
+        }
+
+        return root;
     }
 
     /**
@@ -193,12 +210,17 @@
     {
         if (uri == null)
         {
-            final StringBuffer buffer = new StringBuffer();
-            appendRootUri(buffer);
-            buffer.append(getPath());
-            uri = buffer.toString();
+            uri = createURI();
         }
         return uri;
+    }
+
+    protected String createURI()
+    {
+        final StringBuffer buffer = new StringBuffer();
+        appendRootUri(buffer);
+        buffer.append(getPath());
+        return buffer.toString();
     }
 
     /**

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileObject.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileObject.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileObject.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileObject.java Sun Jun 19 00:25:16 2005
@@ -953,9 +953,16 @@
     /**
      * Finds the set of matching descendents of this file, in depthwise
      * order.
+     *
+     * @return list of files or null if the base file (this object) do not exist
      */
     public FileObject[] findFiles(final FileSelector selector) throws FileSystemException
     {
+        if (!exists())
+        {
+            return null;
+        }
+
         final ArrayList list = new ArrayList();
         findFiles(selector, true, list);
         return (FileObject[]) list.toArray(new FileObject[list.size()]);

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileProvider.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileProvider.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileProvider.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileProvider.java Sun Jun 19 00:25:16 2005
@@ -15,12 +15,12 @@
  */
 package org.apache.commons.vfs.provider;
 
+import org.apache.commons.vfs.FileName;
 import org.apache.commons.vfs.FileObject;
 import org.apache.commons.vfs.FileSystem;
 import org.apache.commons.vfs.FileSystemConfigBuilder;
 import org.apache.commons.vfs.FileSystemException;
 import org.apache.commons.vfs.FileSystemOptions;
-import org.apache.commons.vfs.FileName;
 import org.apache.commons.vfs.provider.local.GenericFileNameParser;
 
 import java.util.Iterator;
@@ -153,14 +153,14 @@
     /**
      * Parses an absolute URI.
      *
-     * @param schme
+     * @param base The base file - if null the <code>uri</code> needs to be absolute
      * @param uri The URI to parse.
      */
-    public FileName parseUri(String schme, String uri) throws FileSystemException
+    public FileName parseUri(FileName base, String uri) throws FileSystemException
     {
         if (getFileNameParser() != null)
         {
-            return getFileNameParser().parseUri(getContext(), uri);
+            return getFileNameParser().parseUri(getContext(), base, uri);
         }
 
         throw new FileSystemException("vfs.provider/filename-parser-missing.error");

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileSystem.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileSystem.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileSystem.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractFileSystem.java Sun Jun 19 00:25:16 2005
@@ -260,7 +260,9 @@
     {
         if (!rootName.getRootURI().equals(name.getRootURI()))
         {
-            throw new FileSystemException("vfs.provider/mismatched-fs-for-name.error", new Object[]{name, rootName});
+            throw new FileSystemException("vfs.provider/mismatched-fs-for-name.error",
+                new Object[]{
+                    name, rootName, name.getRootURI()});
         }
 
         // imario@apache.org ==> use getFileFromCache

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractLayeredFileProvider.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractLayeredFileProvider.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractLayeredFileProvider.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractLayeredFileProvider.java Sun Jun 19 00:25:16 2005
@@ -46,7 +46,7 @@
                                final FileSystemOptions properties) throws FileSystemException
     {
         // Split the URI up into its parts
-        final LayeredFileName name = (LayeredFileName) parseUri(baseFile!=null?baseFile.getName().getScheme():null, uri);
+        final LayeredFileName name = (LayeredFileName) parseUri(baseFile!=null?baseFile.getName():null, uri);
 
         // Make the URI canonical
 

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractOriginatingFileProvider.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractOriginatingFileProvider.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractOriginatingFileProvider.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/AbstractOriginatingFileProvider.java Sun Jun 19 00:25:16 2005
@@ -50,7 +50,7 @@
         final FileName name;
         try
         {
-            name = parseUri(baseFile!=null?baseFile.getName().getScheme():null, uri);
+            name = parseUri(baseFile!=null?baseFile.getName():null, uri);
         }
         catch (FileSystemException exc)
         {

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/FileNameParser.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/FileNameParser.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/FileNameParser.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/FileNameParser.java Sun Jun 19 00:25:16 2005
@@ -32,9 +32,10 @@
 
     /**
      * parses a String into a filename
+     * @param base
      * @param filename
      * @return
      * @throws org.apache.commons.vfs.FileSystemException
      */
-    public FileName parseUri(final VfsComponentContext context, final String filename) throws FileSystemException;
+    public FileName parseUri(final VfsComponentContext context, final FileName base, final String filename) throws FileSystemException;
 }

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/FileProvider.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/FileProvider.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/FileProvider.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/FileProvider.java Sun Jun 19 00:25:16 2005
@@ -15,11 +15,11 @@
  */
 package org.apache.commons.vfs.provider;
 
+import org.apache.commons.vfs.FileName;
 import org.apache.commons.vfs.FileObject;
 import org.apache.commons.vfs.FileSystemConfigBuilder;
 import org.apache.commons.vfs.FileSystemException;
 import org.apache.commons.vfs.FileSystemOptions;
-import org.apache.commons.vfs.FileName;
 
 import java.util.Collection;
 
@@ -68,5 +68,5 @@
      */
     public Collection getCapabilities();
 
-    public FileName parseUri(String schme, String uri) throws FileSystemException;
+    public FileName parseUri(FileName root, String uri) throws FileSystemException;
 }

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/GenericFileName.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/GenericFileName.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/GenericFileName.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/GenericFileName.java Sun Jun 19 00:25:16 2005
@@ -25,8 +25,7 @@
  * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
  * @version $Revision$ $Date$
  */
-public class GenericFileName
-    extends AbstractFileName
+public class GenericFileName extends AbstractFileName
 {
     private final String userName;
     private final String hostName;
@@ -36,7 +35,8 @@
     private static final char[] USERNAME_RESERVED = {':', '@'};
     private static final char[] PASSWORD_RESERVED = {'@'};
 
-    protected GenericFileName(final String scheme,
+    protected GenericFileName(final String rootUri,
+                              final String scheme,
                               final String hostName,
                               final int port,
                               final int defaultPort,
@@ -44,7 +44,7 @@
                               final String password,
                               final String path)
     {
-        super(scheme, path);
+        super(rootUri, scheme, path);
         this.hostName = hostName;
         this.defaultPort = defaultPort;
         this.password = password;
@@ -99,12 +99,10 @@
         return defaultPort;
     }
 
-    /**
-     * Factory method for creating name instances.
-     */
-    public FileName createName(final String absPath)
+    public FileName createName(String rootURI, String absPath)
     {
-        return new GenericFileName(getScheme(),
+        return new GenericFileName(rootURI,
+            getScheme(),
             hostName,
             port,
             defaultPort,

Added: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/HostFileNameParser.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/HostFileNameParser.java?rev=191323&view=auto
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/HostFileNameParser.java (added)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/HostFileNameParser.java Sun Jun 19 00:25:16 2005
@@ -0,0 +1,250 @@
+/*
+ * Copyright 2002-2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.vfs.provider;
+
+import org.apache.commons.vfs.FileName;
+import org.apache.commons.vfs.FileSystemException;
+
+/**
+ * Implementation for any url based filesystem.<br />
+ * Parses the url into user/password/host/port/path<br />
+ * Does not handle a query string (after ?)
+ *
+ * @see URLFileNameParser URLFileNameParser for the implementation which also handles the query string too
+ * @author imario@apache.org
+ * @version $Revision$ $Date$
+ */
+public class HostFileNameParser extends AbstractFileNameParser
+{
+    private final int defaultPort;
+
+    public HostFileNameParser(final int defaultPort)
+    {
+        this.defaultPort = defaultPort;
+    }
+
+    public int getDefaultPort()
+    {
+        return defaultPort;
+    }
+
+    public boolean encodeCharacter(char ch)
+    {
+        return super.encodeCharacter(ch);
+    }
+
+    public FileName parseUri(final VfsComponentContext context, FileName base, final String filename) throws FileSystemException
+    {
+        // FTP URI are generic URI (as per RFC 2396)
+        final StringBuffer name = new StringBuffer();
+
+        // Extract the scheme and authority parts
+        final Authority auth = extractToPath(filename, name);
+
+        // Decode and normalise the file name
+        final String path = normalizePath(name);
+
+        return new GenericFileName(
+            base!=null?base.getRootURI():null,
+            auth.scheme,
+            auth.hostName,
+            auth.port,
+            defaultPort,
+            auth.userName,
+            auth.password,
+            path);
+    }
+
+    protected String normalizePath(final StringBuffer name)
+        throws FileSystemException
+    {
+        UriParser.canonicalizePath(name, 0, name.length(), this);
+        UriParser.normalisePath(name);
+        final String path = name.toString();
+        return path;
+    }
+
+    /**
+     * 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 Authority extractToPath(final String uri,
+                                      final StringBuffer name)
+        throws FileSystemException
+    {
+        final Authority auth = new Authority();
+
+        // Extract the scheme
+        auth.scheme = UriParser.extractScheme(uri, name);
+
+        // 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, and split into username and password
+        final String userInfo = extractUserInfo(name);
+        final String userName;
+        final String password;
+        if (userInfo != null)
+        {
+            int idx = userInfo.indexOf(':');
+            if (idx == -1)
+            {
+                userName = userInfo;
+                password = null;
+            }
+            else
+            {
+                userName = userInfo.substring(0, idx);
+                password = userInfo.substring(idx + 1);
+            }
+        }
+        else
+        {
+            userName = null;
+            password = null;
+        }
+        auth.userName = UriParser.decode(userName);
+        auth.password = UriParser.decode(password);
+
+        // Extract hostname, and normalise (lowercase)
+        final String hostName = extractHostName(name);
+        if (hostName == null)
+        {
+            throw new FileSystemException("vfs.provider/missing-hostname.error", uri);
+        }
+        auth.hostName = hostName.toLowerCase();
+
+        // Extract port
+        auth.port = extractPort(name, uri);
+
+        // Expecting '/' or empty name
+        if (name.length() > 0 && name.charAt(0) != '/')
+        {
+            throw new FileSystemException("vfs.provider/missing-hostname-path-sep.error", uri);
+        }
+
+        return auth;
+    }
+
+    /**
+     * 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.
+     *
+     * @return The port, or -1 if the URI does not contain a port.
+     */
+    protected int extractPort(final StringBuffer name, final String uri) throws FileSystemException
+    {
+        if (name.length() < 1 || name.charAt(0) != ':')
+        {
+            return -1;
+        }
+
+        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);
+        if (port.length() == 0)
+        {
+            throw new FileSystemException("vfs.provider/missing-port.error", uri);
+        }
+
+        return Integer.parseInt(port);
+    }
+
+    /**
+     * Parsed authority info (scheme, hostname, userinfo, port)
+     */
+    protected static class Authority
+    {
+        public String scheme;
+        public String hostName;
+        public String userName;
+        public String password;
+        public int port;
+    }
+}

Propchange: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/HostFileNameParser.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/HostFileNameParser.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/HostFileNameParser.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/LayeredFileName.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/LayeredFileName.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/LayeredFileName.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/LayeredFileName.java Sun Jun 19 00:25:16 2005
@@ -15,7 +15,6 @@
  */
 package org.apache.commons.vfs.provider;
 
-import org.apache.commons.vfs.FileSystemException;
 import org.apache.commons.vfs.FileName;
 
 /**
@@ -32,7 +31,7 @@
                            final FileName outerUri,
                            final String path)
     {
-        super(scheme, path);
+        super(null, scheme, path);
         this.outerUri = outerUri;
     }
 
@@ -44,7 +43,7 @@
         return outerUri;
     }
 
-    public FileName createName(String path)
+    public FileName createName(String rootURI, String path)
     {
         return new LayeredFileName(getScheme(), getOuterName(), path);
     }

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/LayeredFileNameParser.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/LayeredFileNameParser.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/LayeredFileNameParser.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/LayeredFileNameParser.java Sun Jun 19 00:25:16 2005
@@ -37,7 +37,7 @@
         return super.encodeCharacter(ch) || ch == '!';
     }
 
-    public FileName parseUri(final VfsComponentContext context, final String filename) throws FileSystemException
+    public FileName parseUri(final VfsComponentContext context, FileName base, final String filename) throws FileSystemException
     {
         final StringBuffer name = new StringBuffer();
 

Added: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/URLFileName.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/URLFileName.java?rev=191323&view=auto
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/URLFileName.java (added)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/URLFileName.java Sun Jun 19 00:25:16 2005
@@ -0,0 +1,97 @@
+package org.apache.commons.vfs.provider;
+
+import org.apache.commons.httpclient.URIException;
+import org.apache.commons.httpclient.util.URIUtil;
+import org.apache.commons.vfs.FileName;
+import org.apache.commons.vfs.FileSystemException;
+
+public class URLFileName extends GenericFileName
+{
+    private final String queryString;
+
+    public URLFileName(final String rootUri,
+                       final String scheme,
+                       final String hostName,
+                       final int port,
+                       final int defaultPort,
+                       final String userName,
+                       final String password,
+                       final String path,
+                       final String queryString)
+    {
+        super(rootUri, scheme, hostName, port, defaultPort, userName, password, path);
+        this.queryString = queryString;
+    }
+
+    /**
+     * get the query string
+     * @return
+     */
+    public String getQueryString()
+    {
+        return queryString;
+    }
+
+    /**
+     * get the path and query string e.g. /path/servlet?param1=true
+     * @return
+     */
+    public String getPathQuery()
+    {
+        StringBuffer sb = new StringBuffer(250);
+        sb.append(getPath());
+        sb.append("?");
+        sb.append(getQueryString());
+
+        return sb.toString();
+    }
+
+    /**
+     * get the path encoded suitable for url like filesystem e.g. (http, webdav)
+     */
+    public String getPathQueryEncoded() throws URIException, FileSystemException
+    {
+        if (getQueryString() == null)
+        {
+            return URIUtil.encodePath(getPathDecoded());
+        }
+
+        StringBuffer sb = new StringBuffer(250);
+        sb.append(URIUtil.encodePath(getPathDecoded()));
+        sb.append("?");
+        sb.append(getQueryString());
+        return sb.toString();
+    }
+
+    public FileName createName(final String rootURI, final String absPath)
+    {
+        return new URLFileName(getRootURI(),
+            getScheme(),
+            getHostName(),
+            getPort(),
+            getDefaultPort(),
+            getUserName(),
+            getPassword(),
+            absPath,
+            getQueryString());
+    }
+
+    /**
+     * append query string to the uri
+     * @return
+     */
+    protected String createURI()
+    {
+        if (getQueryString() != null)
+        {
+            StringBuffer sb = new StringBuffer(250);
+            sb.append(super.createURI());
+            sb.append("?");
+            sb.append(getQueryString());
+
+            return sb.toString();
+        }
+
+        return super.createURI();
+    }
+}

Propchange: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/URLFileName.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/URLFileName.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/URLFileName.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/URLFileNameParser.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/URLFileNameParser.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/URLFileNameParser.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/URLFileNameParser.java Sun Jun 19 00:25:16 2005
@@ -19,25 +19,25 @@
 import org.apache.commons.vfs.FileSystemException;
 
 /**
- * Implementation for the webdav filesystem.
- * < p/>
- * Additionally encodes every character below space (' ')
+ * Implementation for any url based filesystem.<br />
+ * Parses the url into user/password/host/port/path/queryString<br />
+ *
+ * @author imario@apache.org
+ * @version $Revision$ $Date$
  */
-public class URLFileNameParser extends AbstractFileNameParser
+public class URLFileNameParser extends HostFileNameParser
 {
-    private final int defaultPort;
-
     public URLFileNameParser(final int defaultPort)
     {
-        this.defaultPort = defaultPort;
+        super(defaultPort);
     }
 
-    public int getDefaultPort()
+    public boolean encodeCharacter(char ch)
     {
-        return defaultPort;
+        return super.encodeCharacter(ch) || ch == '?';
     }
 
-    public FileName parseUri(final VfsComponentContext context, final String filename) throws FileSystemException
+    public FileName parseUri(final VfsComponentContext context, FileName base, final String filename) throws FileSystemException
     {
         // FTP URI are generic URI (as per RFC 2396)
         final StringBuffer name = new StringBuffer();
@@ -45,189 +45,21 @@
         // Extract the scheme and authority parts
         final Authority auth = extractToPath(filename, name);
 
+        // Extract the queryString
+        String queryString = UriParser.extractQueryString(name);
+
         // Decode and normalise the file name
-        UriParser.canonicalizePath(name, 0, name.length(), this);
-        UriParser.normalisePath(name);
-        final String path = name.toString();
+        final String path = normalizePath(name);
 
-        return new GenericFileName(
+        return new URLFileName(
+            base!=null?base.getRootURI():null,
             auth.scheme,
             auth.hostName,
             auth.port,
-            defaultPort,
+            getDefaultPort(),
             auth.userName,
             auth.password,
-            path);
-    }
-
-    /**
-     * 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 Authority extractToPath(final String uri,
-                                             final StringBuffer name)
-        throws FileSystemException
-    {
-        final Authority auth = new Authority();
-
-        // Extract the scheme
-        auth.scheme = UriParser.extractScheme(uri, name);
-
-        // 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, and split into username and password
-        final String userInfo = extractUserInfo(name);
-        final String userName;
-        final String password;
-        if (userInfo != null)
-        {
-            int idx = userInfo.indexOf(':');
-            if (idx == -1)
-            {
-                userName = userInfo;
-                password = null;
-            }
-            else
-            {
-                userName = userInfo.substring(0, idx);
-                password = userInfo.substring(idx + 1);
-            }
-        }
-        else
-        {
-            userName = null;
-            password = null;
-        }
-        auth.userName = UriParser.decode(userName);
-        auth.password = UriParser.decode(password);
-
-        // Extract hostname, and normalise (lowercase)
-        final String hostName = extractHostName(name);
-        if (hostName == null)
-        {
-            throw new FileSystemException("vfs.provider/missing-hostname.error", uri);
-        }
-        auth.hostName = hostName.toLowerCase();
-
-        // Extract port
-        auth.port = extractPort(name, uri);
-
-        // Expecting '/' or empty name
-        if (name.length() > 0 && name.charAt(0) != '/')
-        {
-            throw new FileSystemException("vfs.provider/missing-hostname-path-sep.error", uri);
-        }
-
-        return auth;
-    }
-
-    /**
-     * 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.
-     *
-     * @return The port, or -1 if the URI does not contain a port.
-     */
-    protected int extractPort(final StringBuffer name, final String uri) throws FileSystemException
-    {
-        if (name.length() < 1 || name.charAt(0) != ':')
-        {
-            return -1;
-        }
-
-        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);
-        if (port.length() == 0)
-        {
-            throw new FileSystemException("vfs.provider/missing-port.error", uri);
-        }
-
-        return Integer.parseInt(port);
-    }
-
-    /**
-     * Parsed authority info (scheme, hostname, userinfo, port)
-     */
-    protected static class Authority
-    {
-        public String scheme;
-        public String hostName;
-        public String userName;
-        public String password;
-        public int port;
+            path,
+            queryString);
     }
 }

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/UriParser.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/UriParser.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/UriParser.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/UriParser.java Sun Jun 19 00:25:16 2005
@@ -422,7 +422,7 @@
                 }
                 char value = (char) (dig1 << 4 | dig2);
 
-                boolean match = (ch == '%') || (fileNameParser != null && fileNameParser.encodeCharacter(ch));
+                boolean match = (value == '%') || (fileNameParser != null && fileNameParser.encodeCharacter(value));
 
                 if (match)
                 {
@@ -449,5 +449,20 @@
                 index += 2;
             }
         }
+    }
+
+    public static String extractQueryString(StringBuffer name)
+    {
+        for (int pos = 0; pos < name.length(); pos++)
+        {
+            if (name.charAt(pos) == '?')
+            {
+                String queryString = name.substring(pos+1);
+                name.delete(pos, name.length());
+                return queryString;
+            }
+        }
+
+        return null;
     }
 }

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/VfsComponentContext.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/VfsComponentContext.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/VfsComponentContext.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/VfsComponentContext.java Sun Jun 19 00:25:16 2005
@@ -15,11 +15,11 @@
  */
 package org.apache.commons.vfs.provider;
 
+import org.apache.commons.vfs.FileName;
 import org.apache.commons.vfs.FileObject;
 import org.apache.commons.vfs.FileSystemException;
 import org.apache.commons.vfs.FileSystemManager;
 import org.apache.commons.vfs.FileSystemOptions;
-import org.apache.commons.vfs.FileName;
 
 import java.io.File;
 

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/ftp/FtpFileNameParser.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/ftp/FtpFileNameParser.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/ftp/FtpFileNameParser.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/ftp/FtpFileNameParser.java Sun Jun 19 00:25:16 2005
@@ -16,27 +16,18 @@
 package org.apache.commons.vfs.provider.ftp;
 
 import org.apache.commons.vfs.provider.FileNameParser;
-import org.apache.commons.vfs.provider.URLFileNameParser;
-import org.apache.commons.vfs.provider.http.HttpFileNameParser;
-import org.apache.commons.vfs.provider.webdav.WebdavFileNameParser;
+import org.apache.commons.vfs.provider.HostFileNameParser;
 
 /**
- * Implementation for the webdav filesystem.
- * < p/>
- * Additionally encodes every character below space (' ')
+ * Implementation for ftp. set default port to 21
  */
-public class FtpFileNameParser extends URLFileNameParser
+public class FtpFileNameParser extends HostFileNameParser
 {
     private final static FtpFileNameParser INSTANCE = new FtpFileNameParser();
 
     public FtpFileNameParser()
     {
         super(21);
-    }
-
-    public boolean encodeCharacter(char ch)
-    {
-        return super.encodeCharacter(ch) || ch < ' ';
     }
 
     public static FileNameParser getInstance()

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/ftp/FtpRandomAccessContent.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/ftp/FtpRandomAccessContent.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/ftp/FtpRandomAccessContent.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/ftp/FtpRandomAccessContent.java Sun Jun 19 00:25:16 2005
@@ -17,13 +17,12 @@
 
 import org.apache.commons.vfs.FileSystemException;
 import org.apache.commons.vfs.provider.AbstractRandomAccessContent;
-import org.apache.commons.vfs.util.MonitorInputStream;
 import org.apache.commons.vfs.util.RandomAccessMode;
 
 import java.io.DataInputStream;
+import java.io.FilterInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.FilterInputStream;
 
 class FtpRandomAccessContent extends AbstractRandomAccessContent
 {

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/http/HttpFileNameParser.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/http/HttpFileNameParser.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/http/HttpFileNameParser.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/http/HttpFileNameParser.java Sun Jun 19 00:25:16 2005
@@ -19,9 +19,7 @@
 import org.apache.commons.vfs.provider.URLFileNameParser;
 
 /**
- * Implementation for the webdav filesystem.
- * < p/>
- * Additionally encodes every character below space (' ')
+ * Implementation for http. set default port to 80
  */
 public class HttpFileNameParser extends URLFileNameParser
 {
@@ -30,11 +28,6 @@
     public HttpFileNameParser()
     {
         super(80);
-    }
-
-    public boolean encodeCharacter(char ch)
-    {
-        return super.encodeCharacter(ch) || ch < ' ';
     }
 
     public static FileNameParser getInstance()

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/http/HttpFileObject.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/http/HttpFileObject.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/http/HttpFileObject.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/http/HttpFileObject.java Sun Jun 19 00:25:16 2005
@@ -18,15 +18,18 @@
 import org.apache.commons.httpclient.Header;
 import org.apache.commons.httpclient.HttpClient;
 import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.URIException;
 import org.apache.commons.httpclient.methods.GetMethod;
 import org.apache.commons.httpclient.methods.HeadMethod;
 import org.apache.commons.httpclient.util.DateParser;
+import org.apache.commons.httpclient.util.URIUtil;
 import org.apache.commons.vfs.FileContentInfoFactory;
 import org.apache.commons.vfs.FileName;
 import org.apache.commons.vfs.FileSystemException;
 import org.apache.commons.vfs.FileType;
 import org.apache.commons.vfs.RandomAccessContent;
 import org.apache.commons.vfs.provider.AbstractFileObject;
+import org.apache.commons.vfs.provider.URLFileName;
 import org.apache.commons.vfs.util.MonitorInputStream;
 import org.apache.commons.vfs.util.RandomAccessMode;
 
@@ -162,11 +165,18 @@
     /**
      * Prepares a Method object.
      */
-    void setupMethod(final HttpMethod method)
+    void setupMethod(final HttpMethod method) throws FileSystemException, URIException
     {
-        method.setPath(getName().getPath());
+        String pathEncoded = ((URLFileName) getName()).getPathQueryEncoded();
+        method.setPath(pathEncoded);
         method.setFollowRedirects(true);
         method.setRequestHeader("User-Agent", "Jakarta-Commons-VFS");
+    }
+
+    protected String encodePath(final String decodedPath) throws URIException
+    {
+        String pathEncoded = URIUtil.encodePath(decodedPath);
+        return pathEncoded;
     }
 
     /**

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/http/HttpRandomAccesContent.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/http/HttpRandomAccesContent.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/http/HttpRandomAccesContent.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/http/HttpRandomAccesContent.java Sun Jun 19 00:25:16 2005
@@ -22,9 +22,9 @@
 import org.apache.commons.vfs.util.RandomAccessMode;
 
 import java.io.DataInputStream;
+import java.io.FilterInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.FilterInputStream;
 import java.net.HttpURLConnection;
 
 class HttpRandomAccesContent extends AbstractRandomAccessContent

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/jar/JarFileProvider.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/jar/JarFileProvider.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/jar/JarFileProvider.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/jar/JarFileProvider.java Sun Jun 19 00:25:16 2005
@@ -21,8 +21,8 @@
 import org.apache.commons.vfs.FileSystem;
 import org.apache.commons.vfs.FileSystemException;
 import org.apache.commons.vfs.FileSystemOptions;
-import org.apache.commons.vfs.provider.zip.ZipFileProvider;
 import org.apache.commons.vfs.provider.LayeredFileName;
+import org.apache.commons.vfs.provider.zip.ZipFileProvider;
 
 import java.util.ArrayList;
 import java.util.Arrays;

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/DefaultLocalFileProvider.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/DefaultLocalFileProvider.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/DefaultLocalFileProvider.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/DefaultLocalFileProvider.java Sun Jun 19 00:25:16 2005
@@ -90,7 +90,7 @@
         StringBuffer uri = new StringBuffer(name.length() + 5);
         uri.append("file:");
         uri.append(name);
-        FileName filename = parseUri("file", uri.toString());
+        FileName filename = parseUri(null, uri.toString());
         return findFile(filename, null);
     }
 

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/GenericFileNameParser.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/GenericFileNameParser.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/GenericFileNameParser.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/GenericFileNameParser.java Sun Jun 19 00:25:16 2005
@@ -15,8 +15,8 @@
  */
 package org.apache.commons.vfs.provider.local;
 
-import org.apache.commons.vfs.FileSystemException;
 import org.apache.commons.vfs.FileName;
+import org.apache.commons.vfs.FileSystemException;
 
 /**
  * A general-purpose file name parser.
@@ -62,8 +62,8 @@
      * here the rootFilename can only be "/" (see above) put this "/" is also in the pathname
      * so its of no value for the LocalFileName instance
      */
-    protected FileName createFileName(String scheme, final String rootFile, final String path)
+    protected FileName createFileName(String rootURI, String scheme, final String rootFile, final String path)
     {
-        return new LocalFileName(scheme, "", path);
+        return new LocalFileName(rootURI, scheme, "", path);
     }
 }

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/LocalFileName.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/LocalFileName.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/LocalFileName.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/LocalFileName.java Sun Jun 19 00:25:16 2005
@@ -16,10 +16,7 @@
 package org.apache.commons.vfs.provider.local;
 
 import org.apache.commons.vfs.FileName;
-import org.apache.commons.vfs.FileSystemException;
 import org.apache.commons.vfs.provider.AbstractFileName;
-import org.apache.commons.vfs.provider.UriParser;
-import org.apache.commons.vfs.provider.FileNameParser;
 
 /**
  * A local file URI.
@@ -27,16 +24,16 @@
  * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
  * @version $Revision$ $Date$
  */
-public class LocalFileName
-    extends AbstractFileName
+public class LocalFileName extends AbstractFileName
 {
     private final String rootFile;
 
-    protected LocalFileName(final String scheme,
+    protected LocalFileName(final String rootUri,
+                            final String scheme,
                             final String rootFile,
                             final String path)
     {
-        super(scheme, path);
+        super(rootUri, scheme, path);
         this.rootFile = rootFile;
     }
 
@@ -51,9 +48,9 @@
     /**
      * Factory method for creating name instances.
      */
-    public FileName createName(final String path)
+    public FileName createName(final String rootURI, final String path)
     {
-        return new LocalFileName(getScheme(), rootFile, path);
+        return new LocalFileName(rootURI, getScheme(), rootFile, path);
     }
 
     /**

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/LocalFileNameParser.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/LocalFileNameParser.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/LocalFileNameParser.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/LocalFileNameParser.java Sun Jun 19 00:25:16 2005
@@ -56,7 +56,7 @@
         throws FileSystemException;
 
 
-    public FileName parseUri(final VfsComponentContext context, final String filename) throws FileSystemException
+    public FileName parseUri(final VfsComponentContext context, FileName base, final String filename) throws FileSystemException
     {
         final StringBuffer name = new StringBuffer();
 
@@ -78,8 +78,12 @@
         UriParser.normalisePath(name);
         final String path = name.toString();
 
-        return createFileName(scheme, rootFile, path);
+        return createFileName(
+            base!=null?base.getRootURI():null,
+            scheme,
+            rootFile,
+            path);
     }
 
-    protected abstract FileName createFileName(String scheme, final String rootFile, final String path);
+    protected abstract FileName createFileName(String rootURI, String scheme, final String rootFile, final String path);
 }

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/LocalFileRandomAccessContent.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/LocalFileRandomAccessContent.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/LocalFileRandomAccessContent.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/LocalFileRandomAccessContent.java Sun Jun 19 00:25:16 2005
@@ -19,12 +19,12 @@
 import org.apache.commons.vfs.provider.AbstractRandomAccessContent;
 import org.apache.commons.vfs.util.RandomAccessMode;
 
+import java.io.EOFException;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
-import java.io.RandomAccessFile;
 import java.io.InputStream;
-import java.io.EOFException;
+import java.io.RandomAccessFile;
 
 /**
  * RandomAccess for local files

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/LocalFileSystem.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/LocalFileSystem.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/LocalFileSystem.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/LocalFileSystem.java Sun Jun 19 00:25:16 2005
@@ -21,7 +21,6 @@
 import org.apache.commons.vfs.FileSystem;
 import org.apache.commons.vfs.FileSystemException;
 import org.apache.commons.vfs.provider.AbstractFileSystem;
-import org.apache.commons.vfs.provider.UriParser;
 
 import java.io.File;
 import java.io.FilePermission;

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/WindowsFileNameParser.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/WindowsFileNameParser.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/WindowsFileNameParser.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/local/WindowsFileNameParser.java Sun Jun 19 00:25:16 2005
@@ -15,8 +15,8 @@
  */
 package org.apache.commons.vfs.provider.local;
 
-import org.apache.commons.vfs.FileSystemException;
 import org.apache.commons.vfs.FileName;
+import org.apache.commons.vfs.FileSystemException;
 
 /**
  * A parser for Windows file names.
@@ -37,9 +37,9 @@
         return extractWindowsRootPrefix(uri, name);
     }
 
-    protected FileName createFileName(String scheme, final String rootFile, final String path)
+    protected FileName createFileName(String rootURI, String scheme, final String rootFile, final String path)
     {
-        return new LocalFileName(scheme, rootFile, path);
+        return new LocalFileName(rootURI, scheme, rootFile, path);
     }
 
     /**

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/sftp/SftpFileNameParser.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/sftp/SftpFileNameParser.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/sftp/SftpFileNameParser.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/sftp/SftpFileNameParser.java Sun Jun 19 00:25:16 2005
@@ -17,14 +17,10 @@
 
 import org.apache.commons.vfs.provider.FileNameParser;
 import org.apache.commons.vfs.provider.URLFileNameParser;
-import org.apache.commons.vfs.provider.ftp.FtpFileNameParser;
-import org.apache.commons.vfs.provider.http.HttpFileNameParser;
-import org.apache.commons.vfs.provider.webdav.WebdavFileNameParser;
+
 
 /**
- * Implementation for the webdav filesystem.
- * < p/>
- * Additionally encodes every character below space (' ')
+ * Implementation for sftp. set default port to 22
  */
 public class SftpFileNameParser extends URLFileNameParser
 {
@@ -34,12 +30,7 @@
     {
         super(22);
     }
-
-    public boolean encodeCharacter(char ch)
-    {
-        return super.encodeCharacter(ch) || ch < ' ';
-    }
-
+    
     public static FileNameParser getInstance()
     {
         return INSTANCE;

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/sftp/SftpFileObject.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/sftp/SftpFileObject.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/sftp/SftpFileObject.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/sftp/SftpFileObject.java Sun Jun 19 00:25:16 2005
@@ -35,7 +35,6 @@
 import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.Iterator;
-import java.util.StringTokenizer;
 import java.util.Vector;
 
 /**
@@ -243,13 +242,30 @@
         {
             // Each entry is in unix ls format <perms> <?> <user> <group> <size> <date> <name>
             final String stat = (String) iterator.next();
-            final StringTokenizer tokens = new StringTokenizer(stat);
-            // TODO - check there are the correct number of tokens
-            // TODO - handle names with spaces in 'em
-            for (int i = 0; i < 8; tokens.nextToken(), i++)
+
+            // parse entry ==> 2005-06-19 imario@apache.org
+            // we can get rid of it as soon as jsch releases the next version
+            // which allows access to the raw stat object.
+            boolean trigger = true;
+            int state = 0;
+            StringBuffer nameBuf = new StringBuffer(stat.length());
+            for (int i = 0; i<stat.length(); i++)
             {
+                char c = stat.charAt(i);
+                if (state == 16)
+                {
+                    nameBuf.append(c);
+                    continue;
+                }
+                if ((c != ' ' && trigger) || (c == ' ' && !trigger))
+                {
+                    state++;
+                    trigger=!trigger;
+                }
             }
-            final String name = tokens.nextToken();
+            // <==
+
+            final String name = nameBuf.toString();
             if (name.equals(".") || name.equals(".."))
             {
                 continue;

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/smb/SmbFileName.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/smb/SmbFileName.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/smb/SmbFileName.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/smb/SmbFileName.java Sun Jun 19 00:25:16 2005
@@ -16,11 +16,7 @@
 package org.apache.commons.vfs.provider.smb;
 
 import org.apache.commons.vfs.FileName;
-import org.apache.commons.vfs.FileSystemException;
 import org.apache.commons.vfs.provider.GenericFileName;
-import org.apache.commons.vfs.provider.UriParser;
-import org.apache.commons.vfs.provider.AbstractFileProvider;
-import org.apache.commons.vfs.provider.FileNameParser;
 
 /**
  * An SMB URI.  Adds a share name to the generic URI.
@@ -35,15 +31,17 @@
 
     private final String share;
 
-    protected SmbFileName(final String scheme,
-                        final String hostName,
-                        final int port,
-                        final String userName,
-                        final String password,
-                        final String share,
-                        final String path)
+    protected SmbFileName(
+        final String rootUri,
+        final String scheme,
+        final String hostName,
+        final int port,
+        final String userName,
+        final String password,
+        final String share,
+        final String path)
     {
-        super(scheme, hostName, port, DEFAULT_PORT, userName, password, path);
+        super(rootUri, scheme, hostName, port, DEFAULT_PORT, userName, password, path);
         this.share = share;
     }
 
@@ -68,9 +66,10 @@
     /**
      * Factory method for creating name instances.
      */
-    public FileName createName(final String path)
+    public FileName createName(final String rootURI, final String path)
     {
-        return new SmbFileName(getScheme(),
+        return new SmbFileName(getRootURI(),
+            getScheme(),
             getHostName(),
             getPort(),
             getUserName(),

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/smb/SmbFileNameParser.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/smb/SmbFileNameParser.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/smb/SmbFileNameParser.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/smb/SmbFileNameParser.java Sun Jun 19 00:25:16 2005
@@ -23,9 +23,7 @@
 import org.apache.commons.vfs.provider.VfsComponentContext;
 
 /**
- * Implementation for the webdav filesystem.
- * < p/>
- * Additionally encodes every character below space (' ')
+ * Implementation for sftp. set default port to 139
  */
 public class SmbFileNameParser extends URLFileNameParser
 {
@@ -41,7 +39,7 @@
         return INSTANCE;
     }
 
-    public FileName parseUri(final VfsComponentContext context, final String filename) throws FileSystemException
+    public FileName parseUri(final VfsComponentContext context, FileName base, final String filename) throws FileSystemException
     {
         final StringBuffer name = new StringBuffer();
 
@@ -64,7 +62,9 @@
         UriParser.normalisePath(name);
         final String path = name.toString();
 
-        return new SmbFileName(auth.scheme,
+        return new SmbFileName(
+            base!=null?base.getRootURI():null,
+            auth.scheme,
             auth.hostName,
             auth.port,
             auth.userName,

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/smb/SmbFileSystem.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/smb/SmbFileSystem.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/smb/SmbFileSystem.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/smb/SmbFileSystem.java Sun Jun 19 00:25:16 2005
@@ -18,8 +18,8 @@
 import org.apache.commons.vfs.FileName;
 import org.apache.commons.vfs.FileObject;
 import org.apache.commons.vfs.FileSystem;
-import org.apache.commons.vfs.FileSystemOptions;
 import org.apache.commons.vfs.FileSystemException;
+import org.apache.commons.vfs.FileSystemOptions;
 import org.apache.commons.vfs.provider.AbstractFileSystem;
 
 import java.util.Collection;

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/tar/TarFileProvider.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/tar/TarFileProvider.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/tar/TarFileProvider.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/tar/TarFileProvider.java Sun Jun 19 00:25:16 2005
@@ -23,7 +23,6 @@
 import org.apache.commons.vfs.FileSystemOptions;
 import org.apache.commons.vfs.provider.AbstractLayeredFileProvider;
 import org.apache.commons.vfs.provider.FileProvider;
-import org.apache.commons.vfs.provider.UriParser;
 import org.apache.commons.vfs.provider.LayeredFileName;
 
 import java.util.Arrays;

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/temp/TemporaryFileProvider.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/temp/TemporaryFileProvider.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/temp/TemporaryFileProvider.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/temp/TemporaryFileProvider.java Sun Jun 19 00:25:16 2005
@@ -21,7 +21,6 @@
 import org.apache.commons.vfs.FileSystemException;
 import org.apache.commons.vfs.FileSystemOptions;
 import org.apache.commons.vfs.provider.AbstractFileProvider;
-import org.apache.commons.vfs.provider.BasicFileName;
 import org.apache.commons.vfs.provider.FileProvider;
 import org.apache.commons.vfs.provider.UriParser;
 import org.apache.commons.vfs.provider.local.DefaultLocalFileProvider;
@@ -106,7 +105,9 @@
                 rootFile = getContext().getTemporaryFileStore().allocateFile("tempfs");
             }
             final FileName rootName =
-                new BasicFileName(scheme, scheme + ":", FileName.ROOT_PATH);
+                getContext().parseURI(scheme + ":" + FileName.ROOT_PATH);
+            // final FileName rootName =
+            //    new LocalFileName(scheme, scheme + ":", FileName.ROOT_PATH);
             filesystem = new LocalFileSystem(rootName, rootFile.getAbsolutePath());
             addFileSystem(this, filesystem);
         }

Modified: jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/url/UrlFileProvider.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/url/UrlFileProvider.java?rev=191323&r1=191322&r2=191323&view=diff
==============================================================================
--- jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/url/UrlFileProvider.java (original)
+++ jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/url/UrlFileProvider.java Sun Jun 19 00:25:16 2005
@@ -23,7 +23,6 @@
 import org.apache.commons.vfs.FileSystemException;
 import org.apache.commons.vfs.FileSystemOptions;
 import org.apache.commons.vfs.provider.AbstractFileProvider;
-import org.apache.commons.vfs.provider.BasicFileName;
 
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -70,7 +69,9 @@
             if (fs == null)
             {
                 final FileName rootName =
-                    new BasicFileName(rootUrl, FileName.ROOT_PATH);
+                    getContext().parseURI(rootUrl.getProtocol() + ":" + FileName.ROOT_PATH);
+                // final FileName rootName =
+                //    new BasicFileName(rootUrl, FileName.ROOT_PATH);
                 fs = new UrlFileSystem(rootName, fileSystemOptions);
                 addFileSystem(key, fs);
             }



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org