You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by an...@apache.org on 2005/12/16 07:37:00 UTC

svn commit: r357131 - in /ant/core/trunk: docs/ src/main/org/apache/tools/ant/ src/main/org/apache/tools/ant/launch/ src/main/org/apache/tools/ant/taskdefs/optional/ src/main/org/apache/tools/ant/taskdefs/optional/depend/ src/main/org/apache/tools/ant/...

Author: antoine
Date: Thu Dec 15 22:36:28 2005
New Revision: 357131

URL: http://svn.apache.org/viewcvs?rev=357131&view=rev
Log:
more systematic handling of URIs, delegation of work to the JDK
for toURI and fromURI
patches prepared by Jesse Glick, Bugzilla 8031

Modified:
    ant/core/trunk/docs/faq.html
    ant/core/trunk/src/main/org/apache/tools/ant/AntClassLoader.java
    ant/core/trunk/src/main/org/apache/tools/ant/launch/Locator.java
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/Depend.java
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLResultAggregator.java
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/sitraka/CovReport.java
    ant/core/trunk/src/main/org/apache/tools/ant/util/FileUtils.java
    ant/core/trunk/src/testcases/org/apache/tools/ant/util/FileUtilsTest.java
    ant/core/trunk/src/testcases/org/apache/tools/ant/util/JAXPUtilsTest.java
    ant/core/trunk/xdocs/faq.xml

Modified: ant/core/trunk/docs/faq.html
URL: http://svn.apache.org/viewcvs/ant/core/trunk/docs/faq.html?rev=357131&r1=357130&r2=357131&view=diff
==============================================================================
--- ant/core/trunk/docs/faq.html (original)
+++ ant/core/trunk/docs/faq.html Thu Dec 15 22:36:28 2005
@@ -1390,7 +1390,7 @@
 <?xml version="1.0"?>
 
 <!DOCTYPE project [
-    <!ENTITY common SYSTEM "file:./common.xml">
+       <!ENTITY common SYSTEM "common.xml">
 ]>
 
 <project name="test" default="test" basedir=".">
@@ -1407,10 +1407,13 @@
 </pre>
                         <p>will literally include the contents of <code>common.xml</code> where
         you've placed the <code>&amp;common;</code> entity.</p>
+                        <p>(The filename <code>common.xml</code> in this example is resolved
+        relative to the containing XML file by the XML parser. You may also use
+        an absolute <code>file:</code> protocol URI.)</p>
                         <p>In combination with a DTD, this would look like this:</p>
                         <pre class="code">
-&lt;!DOCTYPE project PUBLIC &quot;-//ANT//DTD project//EN&quot; &quot;file:./ant.dtd&quot; [
-   &lt;!ENTITY include SYSTEM &quot;file:./header.xml&quot;&gt;
+&lt;!DOCTYPE project PUBLIC &quot;-//ANT//DTD project//EN&quot; &quot;ant.dtd&quot; [
+   &lt;!ENTITY include SYSTEM &quot;header.xml&quot;&gt;
 ]&gt;
 </pre>
                         <p>Starting with Ant 1.6, there is a new

Modified: ant/core/trunk/src/main/org/apache/tools/ant/AntClassLoader.java
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/AntClassLoader.java?rev=357131&r1=357130&r2=357131&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/AntClassLoader.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/AntClassLoader.java Thu Dec 15 22:36:28 2005
@@ -1217,8 +1217,7 @@
 
         if (sealedString != null && sealedString.equalsIgnoreCase("true")) {
             try {
-                // XXX should be using FileUtils!
-                sealBase = new URL("file:" + container.getPath());
+                sealBase = new URL(FileUtils.getFileUtils().toURI(container.getAbsolutePath()));
             } catch (MalformedURLException e) {
                 // ignore
             }

Modified: ant/core/trunk/src/main/org/apache/tools/ant/launch/Locator.java
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/launch/Locator.java?rev=357131&r1=357130&r2=357131&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/launch/Locator.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/launch/Locator.java Thu Dec 15 22:36:28 2005
@@ -130,8 +130,8 @@
      *
      * <p>Will be an absolute path if the given URI is absolute.</p>
      *
-     * <p>Swallows '%' that are not followed by two characters,
-     * doesn't deal with non-ASCII characters.</p>
+     * <p>Prior to Java 1.4,
+     * swallows '%' that are not followed by two characters.</p>
      *
      * @see <a href="http://www.w3.org/TR/xml11/#dt-sysid">dt-sysid</a>
      * which makes some mention of how
@@ -139,9 +139,45 @@
      *
      * @param uri the URI designating a file in the local filesystem.
      * @return the local file system path for the file.
+     * @throws IllegalArgumentException if the URI is malformed or not a legal file: URL
      * @since Ant 1.6
      */
     public static String fromURI(String uri) {
+        // #8031: first try Java 1.4.
+        Class uriClazz = null;
+        try {
+            uriClazz = Class.forName("java.net.URI");
+        } catch (ClassNotFoundException cnfe) {
+            // Fine, Java 1.3 or earlier, do it by hand.
+        }
+        // Also check for properly formed URIs. Ant formerly recommended using
+        // nonsense URIs such as "file:./foo.xml" in XML includes. You shouldn't
+        // do that (just "foo.xml" is correct) but for compatibility we special-case
+        // things when the path is not absolute, and fall back to the old parsing behavior.
+        if (uriClazz != null && uri.startsWith("file:/")) {
+            try {
+                java.lang.reflect.Method createMethod = uriClazz.getMethod("create", new Class[] {String.class});
+                Object uriObj = createMethod.invoke(null, new Object[] {uri});
+                java.lang.reflect.Constructor fileConst = File.class.getConstructor(new Class[] {uriClazz});
+                File f = (File)fileConst.newInstance(new Object[] {uriObj});
+                return f.getAbsolutePath();
+            } catch (java.lang.reflect.InvocationTargetException e) {
+                Throwable e2 = e.getTargetException();
+                if (e2 instanceof IllegalArgumentException) {
+                    // Bad URI, pass this on.
+                    throw (IllegalArgumentException)e2;
+                } else {
+                    // Unexpected target exception? Should not happen.
+                    e2.printStackTrace();
+                }
+            } catch (Exception e) {
+                // Reflection problems? Should not happen, debug.
+                e.printStackTrace();
+            }
+        }
+
+        // Fallback method for Java 1.3 or earlier.
+
         URL url = null;
         try {
             url = new URL(uri);

Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java?rev=357131&r1=357130&r2=357131&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java Thu Dec 15 22:36:28 2005
@@ -47,6 +47,7 @@
 import org.apache.tools.ant.taskdefs.XSLTLogger;
 import org.apache.tools.ant.taskdefs.XSLTLoggerAware;
 import org.apache.tools.ant.types.XMLCatalog;
+import org.apache.tools.ant.util.FileUtils;
 import org.apache.tools.ant.util.JAXPUtils;
 import org.xml.sax.EntityResolver;
 import org.xml.sax.InputSource;
@@ -401,8 +402,8 @@
             String systemid = locator.getSystemId();
             if (systemid != null) {
                 String url = systemid;
-                if (url.startsWith("file:///")) {
-                    url = url.substring(8);
+                if (url.startsWith("file:")) {
+                    url = FileUtils.newFileUtils().fromURI(url);
                 }
                 msg.append(url);
             } else {

Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/Depend.java
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/Depend.java?rev=357131&r1=357130&r2=357131&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/Depend.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/Depend.java Thu Dec 15 22:36:28 2005
@@ -35,6 +35,7 @@
 import org.apache.tools.ant.taskdefs.rmic.WLRmic;
 import org.apache.tools.ant.types.Path;
 import org.apache.tools.ant.types.Reference;
+import org.apache.tools.ant.util.FileUtils;
 import org.apache.tools.ant.util.depend.DependencyAnalyzer;
 
 /**
@@ -393,14 +394,15 @@
                             if (classURL != null) {
                                 if (classURL.getProtocol().equals("jar")) {
                                     String jarFilePath = classURL.getFile();
+                                    int classMarker = jarFilePath.indexOf('!');
+                                    jarFilePath = jarFilePath.substring(0, classMarker);
                                     if (jarFilePath.startsWith("file:")) {
-                                        int classMarker = jarFilePath.indexOf('!');
-                                        jarFilePath = jarFilePath.substring(5, classMarker);
+                                        classpathFileObject = new File(FileUtils.getFileUtils().fromURI(jarFilePath));
+                                    } else {
+                                        throw new IOException("Bizarre nested path in jar: protocol: " + jarFilePath);
                                     }
-                                    classpathFileObject = new File(jarFilePath);
                                 } else if (classURL.getProtocol().equals("file")) {
-                                    String classFilePath = classURL.getFile();
-                                    classpathFileObject = new File(classFilePath);
+                                    classpathFileObject = new File(FileUtils.getFileUtils().fromURI(classURL.toExternalForm()));
                                 }
                                 log("Class " + className
                                     + " depends on " + classpathFileObject
@@ -544,9 +546,9 @@
 
     /**
      * test for being an RMI stub
-     * @param affectedClass
-     * @param className
-     * @return
+     * @param affectedClass  class being tested
+     * @param className      possible origin of the RMI stub
+     * @return whether the class affectedClass is a RMI stub
      */
     private boolean isRmiStub(String affectedClass, String className) {
         return isStub(affectedClass, className, DefaultRmicAdapter.RMI_STUB_SUFFIX)

Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLResultAggregator.java
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLResultAggregator.java?rev=357131&r1=357130&r2=357131&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLResultAggregator.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLResultAggregator.java Thu Dec 15 22:36:28 2005
@@ -33,6 +33,7 @@
 import org.apache.tools.ant.Task;
 import org.apache.tools.ant.types.FileSet;
 import org.apache.tools.ant.util.DOMElementWriter;
+import org.apache.tools.ant.util.FileUtils;
 import org.apache.tools.ant.util.StringUtils;
 import org.apache.tools.ant.util.FileUtils;
 import org.w3c.dom.Document;
@@ -246,7 +247,7 @@
                 log("Parsing file: '" + file + "'", Project.MSG_VERBOSE);
                 if(file.length()>0) {
                     Document testsuiteDoc
-                            = builder.parse("file:///" + file.getAbsolutePath());
+                            = builder.parse(FileUtils.getFileUtils().toURI(files[i].getAbsolutePath()));
                     Element elem = testsuiteDoc.getDocumentElement();
                     // make sure that this is REALLY a testsuite.
                     if (TESTSUITE.equals(elem.getNodeName())) {

Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/sitraka/CovReport.java
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/sitraka/CovReport.java?rev=357131&r1=357130&r2=357131&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/sitraka/CovReport.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/sitraka/CovReport.java Thu Dec 15 22:36:28 2005
@@ -399,7 +399,7 @@
                 transformer.setOutputProperty(OutputKeys.INDENT, "yes");
                 transformer.setOutputProperty(OutputKeys.METHOD, "xml");
                 Source src = new DOMSource(doc);
-                Result res = new StreamResult("file:///" + tofile.toString());
+                Result res = new StreamResult(tofile);
                 transformer.transform(src, res);
             } catch (Exception e) {
                 throw new BuildException("Error while performing enhanced XML "

Modified: ant/core/trunk/src/main/org/apache/tools/ant/util/FileUtils.java
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/util/FileUtils.java?rev=357131&r1=357130&r2=357131&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/util/FileUtils.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/util/FileUtils.java Thu Dec 15 22:36:28 2005
@@ -1006,6 +1006,25 @@
      * @since Ant 1.6
      */
     public String toURI(String path) {
+        // #8031: first try Java 1.4.
+        Class uriClazz = null;
+        try {
+            uriClazz = Class.forName("java.net.URI");
+        } catch (ClassNotFoundException e) {
+            // OK, Java 1.3.
+        }
+        if (uriClazz != null) {
+            try {
+                File f = new File(path).getAbsoluteFile();
+                java.lang.reflect.Method toURIMethod = File.class.getMethod("toURI", new Class[0]);
+                Object uriObj = toURIMethod.invoke(f, new Object[] {});
+                java.lang.reflect.Method toASCIIStringMethod = uriClazz.getMethod("toASCIIString", new Class[0]);
+                return (String) toASCIIStringMethod.invoke(uriObj, new Object[] {});
+            } catch (Exception e) {
+                // Reflection problems? Should not happen, debug.
+                e.printStackTrace();
+            }
+        }
         boolean isDir = new File(path).isDirectory();
 
         StringBuffer sb = new StringBuffer("file:");

Modified: ant/core/trunk/src/testcases/org/apache/tools/ant/util/FileUtilsTest.java
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/testcases/org/apache/tools/ant/util/FileUtilsTest.java?rev=357131&r1=357130&r2=357131&view=diff
==============================================================================
--- ant/core/trunk/src/testcases/org/apache/tools/ant/util/FileUtilsTest.java (original)
+++ ant/core/trunk/src/testcases/org/apache/tools/ant/util/FileUtilsTest.java Thu Dec 15 22:36:28 2005
@@ -452,45 +452,66 @@
             dosRoot = "";
         }
         if (Os.isFamily("dos")) {
-            assertEquals("file:///C:/foo", FILE_UTILS.toURI("c:\\foo"));
+            assertEquals("file:/c:/foo", removeExtraneousAuthority(FILE_UTILS.toURI("c:\\foo")));
         }
         if (Os.isFamily("netware")) {
-            assertEquals("file:///SYS:/foo", FILE_UTILS.toURI("sys:\\foo"));
+            assertEquals("file:/SYS:/foo", removeExtraneousAuthority(FILE_UTILS.toURI("sys:\\foo")));
+        }
+        if (File.pathSeparatorChar == '/') {
+            assertEquals("file:/foo", removeExtraneousAuthority(FILE_UTILS.toURI("/foo")));
+            assertTrue("file: URIs must name absolute paths", FILE_UTILS.toURI("./foo").startsWith("file:/"));
+            assertTrue(FILE_UTILS.toURI("./foo").endsWith("/foo"));
+            assertEquals("file:/" + dosRoot + "foo%20bar", removeExtraneousAuthority(FILE_UTILS.toURI("/foo bar")));
+            assertEquals("file:/" + dosRoot + "foo%23bar", removeExtraneousAuthority(FILE_UTILS.toURI("/foo#bar")));
+        } else if (File.pathSeparatorChar == '\\') {
+            assertEquals("file:/" + dosRoot + "foo", removeExtraneousAuthority(FILE_UTILS.toURI("\\foo")));
+            assertTrue("file: URIs must name absolute paths", FILE_UTILS.toURI(".\\foo").startsWith("file:/"));
+            assertTrue(FILE_UTILS.toURI(".\\foo").endsWith("/foo"));
+            assertEquals("file:/" + dosRoot + "foo%20bar", removeExtraneousAuthority(FILE_UTILS.toURI("\\foo bar")));
+            assertEquals("file:/" + dosRoot + "foo%23bar", removeExtraneousAuthority(FILE_UTILS.toURI("\\foo#bar")));
         }
-        assertEquals("file:///" + dosRoot + "foo", FILE_UTILS.toURI("/foo"));
-        /* May fail if the directory ${user.dir}/foo/ exists
-         * (and anyway is the tested behavior actually desirable?):
-        assertEquals("file:./foo",  fu.toURI("./foo"));
-         */
-        assertEquals("file:///" + dosRoot + "foo", FILE_UTILS.toURI("\\foo"));
-        /* See above:
-        assertEquals("file:./foo",  fu.toURI(".\\foo"));
-         */
-        assertEquals("file:///" + dosRoot + "foo%20bar", FILE_UTILS.toURI("/foo bar"));
-        assertEquals("file:///" + dosRoot + "foo%20bar", FILE_UTILS.toURI("\\foo bar"));
-        assertEquals("file:///" + dosRoot + "foo%23bar", FILE_UTILS.toURI("/foo#bar"));
-        assertEquals("file:///" + dosRoot + "foo%23bar", FILE_UTILS.toURI("\\foo#bar"));
         // a test with ant for germans
-        // i would expect here %E4NT ???
-        // anyway, this is the fix for the bug 37348wh
-        assertEquals("file:///" + dosRoot + "%C3%A4nt", FILE_UTILS.toURI("/\u00E4nt"));
+        // the escaped character used for the test is the "a umlaut"
+        // this is the fix for the bug 37348
+        assertEquals("file:/" + dosRoot + "%C3%A4nt", removeExtraneousAuthority(FILE_UTILS.toURI("/\u00E4nt")));
     }
 
     /**
+     * Authority field is unnecessary, but harmless, in file: URIs.
+     * Java 1.4 does not produce it when using File.toURI.
+     */
+    private static String removeExtraneousAuthority(String uri) {
+        String prefix = "file:///";
+        if (uri.startsWith(prefix)) {
+            return "file:/" + uri.substring(prefix.length());
+        } else {
+            return uri;
+        }
+    }
+    /**
      * test fromUri
      */
     public void testFromURI() {
+        String dosRoot = null;
+        if (Os.isFamily("dos") || Os.isFamily("netware")) {
+            dosRoot = Character.toUpperCase(
+                System.getProperty("user.dir").charAt(0)) + ":";
+        }
+        else
+        {
+            dosRoot = "";
+        }
         if (Os.isFamily("netware")) {
             assertEqualsIgnoreDriveCase("SYS:\\foo", FILE_UTILS.fromURI("file:///sys:/foo"));
         }
         if (Os.isFamily("dos")) {
             assertEqualsIgnoreDriveCase("C:\\foo", FILE_UTILS.fromURI("file:///c:/foo"));
         }
-        assertEqualsIgnoreDriveCase(File.separator + "foo", FILE_UTILS.fromURI("file:///foo"));
+        assertEqualsIgnoreDriveCase(dosRoot + File.separator + "foo", FILE_UTILS.fromURI("file:///foo"));
         assertEquals("." + File.separator + "foo",
                      FILE_UTILS.fromURI("file:./foo"));
-        assertEquals(File.separator + "foo bar", FILE_UTILS.fromURI("file:///foo%20bar"));
-        assertEquals(File.separator + "foo#bar", FILE_UTILS.fromURI("file:///foo%23bar"));
+        assertEquals(dosRoot + File.separator + "foo bar", FILE_UTILS.fromURI("file:///foo%20bar"));
+        assertEquals(dosRoot + File.separator + "foo#bar", FILE_UTILS.fromURI("file:///foo%23bar"));
     }
 
     public void testModificationTests() {

Modified: ant/core/trunk/src/testcases/org/apache/tools/ant/util/JAXPUtilsTest.java
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/testcases/org/apache/tools/ant/util/JAXPUtilsTest.java?rev=357131&r1=357130&r2=357131&view=diff
==============================================================================
--- ant/core/trunk/src/testcases/org/apache/tools/ant/util/JAXPUtilsTest.java (original)
+++ ant/core/trunk/src/testcases/org/apache/tools/ant/util/JAXPUtilsTest.java Thu Dec 15 22:36:28 2005
@@ -36,7 +36,7 @@
             file = new File("/user/local/bin");
         }
         String systemid = JAXPUtils.getSystemId(file);
-        assertTrue("SystemIDs should start by file:///", systemid.startsWith("file:///"));
+        assertTrue("SystemIDs should start by file:/", systemid.startsWith("file:/"));
         assertTrue("SystemIDs should not start with file:////", !systemid.startsWith("file:////"));
     }
 }

Modified: ant/core/trunk/xdocs/faq.xml
URL: http://svn.apache.org/viewcvs/ant/core/trunk/xdocs/faq.xml?rev=357131&r1=357130&r2=357131&view=diff
==============================================================================
--- ant/core/trunk/xdocs/faq.xml (original)
+++ ant/core/trunk/xdocs/faq.xml Thu Dec 15 22:36:28 2005
@@ -1067,7 +1067,7 @@
 <?xml version="1.0"?>
 
 <!DOCTYPE project [
-    <!ENTITY common SYSTEM "file:./common.xml">
+       <!ENTITY common SYSTEM "common.xml">
 ]>
 
 <project name="test" default="test" basedir=".">
@@ -1086,11 +1086,15 @@
         <p>will literally include the contents of <code>common.xml</code> where
         you&apos;ve placed the <code>&amp;common;</code> entity.</p>
 
+        <p>(The filename <code>common.xml</code> in this example is resolved
+        relative to the containing XML file by the XML parser. You may also use
+        an absolute <code>file:</code> protocol URI.)</p>
+
         <p>In combination with a DTD, this would look like this:</p>
 
         <source><![CDATA[
-<!DOCTYPE project PUBLIC "-//ANT//DTD project//EN" "file:./ant.dtd" [
-   <!ENTITY include SYSTEM "file:./header.xml">
+<!DOCTYPE project PUBLIC "-//ANT//DTD project//EN" "ant.dtd" [
+   <!ENTITY include SYSTEM "header.xml">
 ]>
 ]]></source>
 



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