Author: imario
Date: Wed Jun 29 01:30:32 2005
New Revision: 202335

URL: http://svn.apache.org/viewcvs?rev=202335&view=rev
Log:
PR35520
Reported By: Jacob Kjome <hoju -at- visi.com>

Need special handling of FileNames for URLFileProvider. We need to dispatch the 
url to the corresponding FileNameParser to correctly handle urls with host 
names (http://) and those withouth (file:/)

Added:
    
jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/url/UrlFileName.java
   (with props)
    
jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/url/UrlFileNameParser.java
   (with props)
    
jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/provider/url/test/UrlHttpProviderTestCase.java
   (with props)
Modified:
    
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/provider/URLFileName.java
    
jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/url/UrlFileProvider.java

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=202335&r1=202334&r2=202335&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
 Wed Jun 29 01:30:32 2005
@@ -592,6 +592,7 @@
         }
 
         String scheme = base.getScheme();
+        String fullPath = base.getRootURI() + resolvedPath;
         final FileProvider provider = (FileProvider) providers.get(scheme);
         if (provider != null)
         {
@@ -599,11 +600,19 @@
             // 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);
         }
 
+        if (scheme != null)
+        {
+// An unknown scheme - hand it to the default provider - if possible
+            if (defaultProvider != null)
+            {
+                return defaultProvider.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(resolvedPath);
@@ -611,7 +620,7 @@
 
     /**
      * resolve the uri to a filename
-     * 
+     *
      * @throws FileSystemException
      */
     public FileName resolveURI(String uri) throws FileSystemException

Modified: 
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=202335&r1=202334&r2=202335&view=diff
==============================================================================
--- 
jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/URLFileName.java
 (original)
+++ 
jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/URLFileName.java
 Wed Jun 29 01:30:32 2005
@@ -24,7 +24,7 @@
 
     /**
      * get the query string
-     * @return
+     * @return the query string part of the filename
      */
     public String getQueryString()
     {
@@ -33,7 +33,7 @@
 
     /**
      * get the path and query string e.g. /path/servlet?param1=true
-     * @return
+     * @return the path and its query string
      */
     public String getPathQuery()
     {
@@ -91,7 +91,7 @@
 
     /**
      * append query string to the uri
-     * @return
+     * @return the uri
      */
     protected String createURI()
     {

Added: 
jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/url/UrlFileName.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/url/UrlFileName.java?rev=202335&view=auto
==============================================================================
--- 
jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/url/UrlFileName.java
 (added)
+++ 
jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/url/UrlFileName.java
 Wed Jun 29 01:30:32 2005
@@ -0,0 +1,31 @@
+package org.apache.commons.vfs.provider.url;
+
+import org.apache.commons.vfs.provider.URLFileName;
+import org.apache.commons.vfs.provider.UriParser;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: im
+ * Date: 28.06.2005
+ * Time: 16:00:19
+ * To change this template use File | Settings | File Templates.
+ */
+public class UrlFileName extends URLFileName
+{
+    public UrlFileName(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(scheme, hostName, port, defaultPort, userName, password, path, 
queryString);
+    }
+
+    protected void appendRootUri(final StringBuffer buffer)
+    {
+        if (getHostName() != null && !"".equals(getHostName()))
+        {
+            super.appendRootUri(buffer);
+            return;
+        }
+
+        buffer.append(getScheme());
+        buffer.append(":");
+    }
+}

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

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

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

Added: 
jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/url/UrlFileNameParser.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/url/UrlFileNameParser.java?rev=202335&view=auto
==============================================================================
--- 
jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/url/UrlFileNameParser.java
 (added)
+++ 
jakarta/commons/proper/vfs/trunk/src/java/org/apache/commons/vfs/provider/url/UrlFileNameParser.java
 Wed Jun 29 01:30:32 2005
@@ -0,0 +1,120 @@
+/*
+ * 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.url;
+
+import org.apache.commons.vfs.FileName;
+import org.apache.commons.vfs.FileSystemException;
+import org.apache.commons.vfs.provider.AbstractFileNameParser;
+import org.apache.commons.vfs.provider.URLFileName;
+import org.apache.commons.vfs.provider.UriParser;
+import org.apache.commons.vfs.provider.VfsComponentContext;
+import org.apache.commons.vfs.provider.URLFileNameParser;
+import org.apache.commons.vfs.provider.local.LocalFileNameParser;
+import org.apache.commons.vfs.provider.local.GenericFileNameParser;
+
+import java.net.URL;
+import java.net.MalformedURLException;
+
+/**
+ * Implementation for any java.net.url based filesystem.<br />
+ * Composite of URLFilenameParser and GenericFilenameParser
+ *
+ * @author [EMAIL PROTECTED]
+ * @version $Revision$ $Date$
+ */
+public class UrlFileNameParser extends AbstractFileNameParser
+{
+    private URLFileNameParser url = new URLFileNameParser(80);
+    private GenericFileNameParser generic = new GenericFileNameParser();
+
+    public UrlFileNameParser()
+    {
+        super();
+    }
+
+    public boolean encodeCharacter(char ch)
+    {
+        return super.encodeCharacter(ch) || ch == '?';
+    }
+
+    public FileName parseUri(final VfsComponentContext context, final FileName 
base, final String filename) throws FileSystemException
+    {
+        if (isUrlBased(base, filename))
+        {
+            return url.parseUri(context, base, filename);
+        }
+
+        return generic.parseUri(context, base, filename);
+    }
+
+    /**
+     * Guess is the given filename is a url with host or not. VFS treats such 
urls differently.<br />
+     * A filename is url-based if the base is a <code>URLFileName</code> or 
there are only 2 slashes
+     * after the scheme.<br/>
+     * e.g: http://host/path, file:/path/to/file, file:///path/to/file
+     *
+     */
+    protected boolean isUrlBased(final FileName base, final String filename)
+    {
+        if (base instanceof URLFileName)
+        {
+            return true;
+        }
+
+        int nuofSlash = countSlashes(filename);
+        return nuofSlash == 2;
+    }
+
+    /**
+     * This method counts the slashes after the scheme.
+     *
+     * @param filename
+     * @return nuof slashes
+     */
+    protected int countSlashes(final String filename)
+    {
+        int state = 0;
+        int nuofSlash = 0;
+        for (int pos = 0; pos<filename.length(); pos++)
+        {
+            char c = filename.charAt(pos);
+            if (state == 0)
+            {
+                if (c >= 'a' && c <= 'z')
+                {
+                    continue;
+                }
+                if (c == ':')
+                {
+                    state++;
+                    continue;
+                }
+            }
+            else if (state == 1)
+            {
+                if (c == '/')
+                {
+                    nuofSlash++;
+                }
+                else
+                {
+                    return nuofSlash;
+                }
+            }
+        }
+        return nuofSlash;
+    }
+}

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

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

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

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=202335&r1=202334&r2=202335&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
 Wed Jun 29 01:30:32 2005
@@ -23,6 +23,7 @@
 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.URLFileNameParser;
 
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -49,6 +50,7 @@
     public UrlFileProvider()
     {
         super();
+        setFileNameParser(new UrlFileNameParser());
     }
 
     /**
@@ -68,8 +70,9 @@
             FileSystem fs = findFileSystem(key, fileSystemOptions);
             if (fs == null)
             {
+                String extForm = rootUrl.toExternalForm();
                 final FileName rootName =
-                    getContext().parseURI(rootUrl.getProtocol() + ":" + 
FileName.ROOT_PATH);
+                    getContext().parseURI(extForm);
                 // final FileName rootName =
                 //    new BasicFileName(rootUrl, FileName.ROOT_PATH);
                 fs = new UrlFileSystem(rootName, fileSystemOptions);

Added: 
jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/provider/url/test/UrlHttpProviderTestCase.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/provider/url/test/UrlHttpProviderTestCase.java?rev=202335&view=auto
==============================================================================
--- 
jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/provider/url/test/UrlHttpProviderTestCase.java
 (added)
+++ 
jakarta/commons/proper/vfs/trunk/src/test/org/apache/commons/vfs/provider/url/test/UrlHttpProviderTestCase.java
 Wed Jun 29 01:30:32 2005
@@ -0,0 +1,63 @@
+/*
+ * 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.url.test;
+
+import junit.framework.Test;
+import org.apache.commons.AbstractVfsTestCase;
+import org.apache.commons.vfs.FileObject;
+import org.apache.commons.vfs.FileSystemManager;
+import org.apache.commons.vfs.impl.DefaultFileSystemManager;
+import org.apache.commons.vfs.provider.url.UrlFileProvider;
+import org.apache.commons.vfs.test.AbstractProviderTestConfig;
+import org.apache.commons.vfs.test.ProviderTestSuite;
+
+import java.io.File;
+import java.net.URL;
+
+/**
+ * Test cases for the generic provider.
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Adam Murdoch</a>
+ * @version $Revision$ $Date$
+ */
+public class UrlHttpProviderTestCase
+    extends AbstractProviderTestConfig
+{
+    public static Test suite() throws Exception
+    {
+        return new ProviderTestSuite(new UrlHttpProviderTestCase());
+    }
+
+    /**
+     * Prepares the file system manager.  This implementation does nothing.
+     */
+    public void prepare(final DefaultFileSystemManager manager)
+        throws Exception
+    {
+        manager.addProvider("http", new UrlFileProvider());
+    }
+
+    /**
+     * Returns the base folder for tests.
+     */
+    public FileObject getBaseTestFolder(final FileSystemManager manager)
+        throws Exception
+    {
+        final File baseDir = AbstractVfsTestCase.getTestDirectoryFile();
+        final URL url = baseDir.toURL();
+        return manager.resolveFile(url.toExternalForm());
+    }
+}

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

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

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



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

Reply via email to