You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by sc...@apache.org on 2005/02/20 16:56:22 UTC

svn commit: r154517 - in jakarta/commons/proper/io/trunk/src: java/org/apache/commons/io/FileUtils.java test/org/apache/commons/io/FileUtilsTestCase.java

Author: scolebourne
Date: Sun Feb 20 07:56:21 2005
New Revision: 154517

URL: http://svn.apache.org/viewcvs?view=rev&rev=154517
Log:
Handle encodings in URL to File conversion
bug 32575, from Jason Madden

Modified:
    jakarta/commons/proper/io/trunk/src/java/org/apache/commons/io/FileUtils.java
    jakarta/commons/proper/io/trunk/src/test/org/apache/commons/io/FileUtilsTestCase.java

Modified: jakarta/commons/proper/io/trunk/src/java/org/apache/commons/io/FileUtils.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/io/trunk/src/java/org/apache/commons/io/FileUtils.java?view=diff&r1=154516&r2=154517
==============================================================================
--- jakarta/commons/proper/io/trunk/src/java/org/apache/commons/io/FileUtils.java (original)
+++ jakarta/commons/proper/io/trunk/src/java/org/apache/commons/io/FileUtils.java Sun Feb 20 07:56:21 2005
@@ -1,5 +1,5 @@
 /*
- * Copyright 2001-2004 The Apache Software Foundation.
+ * Copyright 2001-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.
@@ -64,7 +64,8 @@
  * @author <a href="mailto:jefft@apache.org">Jeff Turner</a>
  * @author Matthew Hawthorne
  * @author <a href="mailto:jeremias@apache.org">Jeremias Maerki</a>
- * @version $Id: FileUtils.java,v 1.39 2004/10/29 21:34:56 bayard Exp $
+ * @author Stephen Colebourne
+ * @version $Id$
  */
 public class FileUtils {
 
@@ -306,17 +307,29 @@
     //-----------------------------------------------------------------------
     /**
      * Convert from a <code>URL</code> to a <code>File</code>.
+     * <p>
+     * From version 1.1 this method will decode the URL.
+     * Syntax such as <code>file:///my%20docs/file.txt</code> will be
+     * correctly decoded to <code>/my docs/file.txt</code>.
      *
-     * @param url  the file URL to convert
+     * @param url  the file URL to convert, null returns null
      * @return the equivalent <code>File</code> object, or <code>null</code>
      *  if the URL's protocol is not <code>file</code>
+     * @throws IllegalArgumentException if the file is incorrectly encoded
      */
     public static File toFile(URL url) {
-        if (!url.getProtocol().equals("file")) {
+        if (url == null || !url.getProtocol().equals("file")) {
             return null;
         } else {
-            String filename =
-                url.getFile().replace('/', File.separatorChar);
+            String filename = url.getFile().replace('/', File.separatorChar);
+            int pos =0;
+            while ((pos = filename.indexOf('%', pos)) >= 0) {
+                if (pos + 2 < filename.length()) {
+                    String hexStr = filename.substring(pos + 1, pos + 3);
+                    char ch = (char) Integer.parseInt(hexStr, 16);
+                    filename = filename.substring(0, pos) + ch + filename.substring(pos + 3);
+                }
+            }
             return new File(filename);
         }
     }
@@ -328,10 +341,16 @@
      * If the input is null, an empty array is returned.
      * If the input contains null, the output array contains null at the same
      * index.
+     * <p>
+     * From version 1.1 this method will decode the URL.
+     * Syntax such as <code>file:///my%20docs/file.txt</code> will be
+     * correctly decoded to <code>/my docs/file.txt</code>.
      *
      * @param urls  the file URLs to convert, null returns empty array
      * @return a non-null array of Files matching the input, with a null item
      *  if there was a null at that index in the input array
+     * @throws IllegalArgumentException if any file is not a URL file
+     * @throws IllegalArgumentException if any file is incorrectly encoded
      */
     public static File[] toFiles(URL[] urls) {
         if (urls == null || urls.length == 0) {

Modified: jakarta/commons/proper/io/trunk/src/test/org/apache/commons/io/FileUtilsTestCase.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/io/trunk/src/test/org/apache/commons/io/FileUtilsTestCase.java?view=diff&r1=154516&r2=154517
==============================================================================
--- jakarta/commons/proper/io/trunk/src/test/org/apache/commons/io/FileUtilsTestCase.java (original)
+++ jakarta/commons/proper/io/trunk/src/test/org/apache/commons/io/FileUtilsTestCase.java Sun Feb 20 07:56:21 2005
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-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.
@@ -34,7 +34,8 @@
  *
  * @author Peter Donald
  * @author Matthew Hawthorne
- * @version $Id: FileUtilsTestCase.java,v 1.24 2004/07/24 09:58:40 scolebourne Exp $
+ * @author Stephen Colebourne
+ * @version $Id$
  * @see FileUtils
  */
 public class FileUtilsTestCase extends FileBasedTestCase {
@@ -106,6 +107,32 @@
         FileUtils.waitFor(new File(""), -1);
 
         FileUtils.waitFor(new File(""), 2);
+    }
+
+    //-----------------------------------------------------------------------
+    public void testToFile1() throws Exception {
+        URL url = new URL("file", null, "a/b/c/file.txt");
+        File file = FileUtils.toFile(url);
+        assertEquals(true, file.toString().indexOf("file.txt") >= 0);
+    }
+
+    public void testToFile2() throws Exception {
+        URL url = new URL("file", null, "a/b/c/file%20n%61me.tx%74");
+        File file = FileUtils.toFile(url);
+        assertEquals(true, file.toString().indexOf("file name.txt") >= 0);
+    }
+
+    public void testToFile3() throws Exception {
+        assertEquals(null, FileUtils.toFile((URL) null));
+        assertEquals(null, FileUtils.toFile(new URL("http://jakarta.apache.org")));
+    }
+
+    public void testToFile4() throws Exception {
+        URL url = new URL("file", null, "a/b/c/file%2Xn%61me.txt");
+        try {
+            FileUtils.toFile(url);
+            fail();
+        }  catch (IllegalArgumentException ex) {}
     }
 
     // toFiles



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