Author: antoine
Date: Mon Nov 28 15:14:24 2005
New Revision: 349552
URL: http://svn.apache.org/viewcvs?rev=349552&view=rev
Log:
properly convert URIs back to file paths when non ascii characters are
percent-encoded
matches with the change in FileUtils.toURI recently done
Modified:
ant/core/trunk/src/etc/testcases/core/antclassloader.xml
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/util/FileUtils.java
ant/core/trunk/src/testcases/org/apache/tools/ant/AntClassLoaderTest.java
Modified: ant/core/trunk/src/etc/testcases/core/antclassloader.xml
URL:
http://svn.apache.org/viewcvs/ant/core/trunk/src/etc/testcases/core/antclassloader.xml?rev=349552&r1=349551&r2=349552&view=diff
==============================================================================
--- ant/core/trunk/src/etc/testcases/core/antclassloader.xml (original)
+++ ant/core/trunk/src/etc/testcases/core/antclassloader.xml Mon Nov 28
15:14:24 2005
@@ -1,13 +1,18 @@
<project name="antclassloader-test" basedir=".">
<property name="tmp.dir" location="tmp space"/>
+ <!-- ant for germans -->
+ <property name="tmp.dir.nonascii" value="ãnt"/>
<property name="ext.dir.relative" value="ext"/>
<property name="main.jar" location="${tmp.dir}/main.jar"/>
<property name="ext.jar.relative" value="${ext.dir.relative}/ext.jar"/>
<property name="ext.jar" location="${tmp.dir}/${ext.jar.relative}"/>
<property name="build.sysclasspath" value="first"/>
+ <property name="main.jar.nonascii"
location="${tmp.dir.nonascii}/main.jar"/>
+ <property name="ext.jar.nonascii"
location="${tmp.dir.nonascii}/${ext.jar.relative}"/>
+ <target name="setup" depends="setup.withspace,setup.nonascii"/>
- <target name="setup">
+ <target name="setup.withspace">
<mkdir dir="${tmp.dir}/${ext.dir.relative}"/>
<jar destfile="${main.jar}" whenempty="create">
<manifest>
@@ -16,10 +21,20 @@
</jar>
<jar destfile="${ext.jar}"/>
</target>
+ <target name="setup.nonascii">
+ <mkdir dir="${tmp.dir.nonascii}/${ext.dir.relative}"/>
+ <jar destfile="${main.jar.nonascii}" whenempty="create">
+ <manifest>
+ <attribute name="Class-Path" value="${ext.jar.relative}"/>
+ </manifest>
+ </jar>
+ <jar destfile="${ext.jar.nonascii}"/>
+ </target>
<target name="cleanup">
<delete dir="${tmp.dir}" quiet="true"/>
+ <delete dir="${tmp.dir.nonascii}" quiet="true"/>
</target>
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=349552&r1=349551&r2=349552&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 Mon Nov 28
15:14:24 2005
@@ -46,6 +46,7 @@
import org.apache.tools.ant.util.FileUtils;
import org.apache.tools.ant.util.JavaEnvUtils;
import org.apache.tools.ant.util.LoaderUtils;
+import org.apache.tools.ant.launch.Locator;
/**
* Used to load classes within ant with a different classpath from
@@ -500,14 +501,7 @@
+ " loader", Project.MSG_VERBOSE);
continue;
}
- String decodedPath = null;
- // try catch block required because URLDecoder.decode throws
- // exception on JDK 1.2
- try {
- decodedPath = URLDecoder.decode(libraryURL.getFile());
- } catch (Exception exc) {
- throw new BuildException(exc);
- }
+ String decodedPath = Locator.decodeUri(libraryURL.getFile());
File libraryFile = new File(decodedPath);
if (libraryFile.exists() && !isInPath(libraryFile)) {
addPathFile(libraryFile);
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=349552&r1=349551&r2=349552&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 Mon Nov 28
15:14:24 2005
@@ -21,6 +21,8 @@
import java.net.URL;
import java.io.File;
import java.io.FilenameFilter;
+import java.io.ByteArrayOutputStream;
+import java.io.UnsupportedEncodingException;
import java.text.CharacterIterator;
import java.text.StringCharacterIterator;
import java.util.Locale;
@@ -33,6 +35,10 @@
*/
public final class Locator {
/**
+ * encoding used to represent URIs
+ */
+ public static String URI_ENCODING = "UTF-8";
+ /**
* Not instantiable
*/
private Locator() {
@@ -96,6 +102,10 @@
* <p>Swallows '%' that are not followed by two characters,
* doesn't deal with non-ASCII characters.</p>
*
+ * @see <a href="http://www.w3.org/TR/xml11/#dt-sysid">dt-sysid</a>
+ * which makes some mention of how
+ * characters not supported by URI Reference syntax should be escaped.
+ *
* @param uri the URI designating a file in the local filesystem.
* @return the local file system path for the file.
* @since Ant 1.6
@@ -124,21 +134,30 @@
&& Character.isLetter(uri.charAt(1)) && uri.lastIndexOf(':') > -1)
{
uri = uri.substring(1);
}
- String path = decodeUri(uri);
+ String path = null;
+ try {
+ path = decodeUri(uri);
+ } catch (UnsupportedEncodingException exc) {
+ // not sure whether this is clean, but this method is declared not
to throw exceptions.
+ throw new IllegalStateException("Could not convert URI to path",
exc);
+ }
return path;
}
/**
* Decodes an Uri with % characters.
+ * The URI is escaped
* @param uri String with the uri possibly containing % characters.
* @return The decoded Uri
+ * @throws UnsupportedEncodingException if UTF-8 is not available
+ * @since Ant 1.7
*/
- private static String decodeUri(String uri) {
+ public static String decodeUri(String uri) throws
UnsupportedEncodingException{
if (uri.indexOf('%') == -1)
{
return uri;
}
- StringBuffer sb = new StringBuffer();
+ ByteArrayOutputStream sb = new ByteArrayOutputStream(uri.length());
CharacterIterator iter = new StringCharacterIterator(uri);
for (char c = iter.first(); c != CharacterIterator.DONE;
c = iter.next()) {
@@ -149,14 +168,14 @@
char c2 = iter.next();
if (c2 != CharacterIterator.DONE) {
int i2 = Character.digit(c2, 16);
- sb.append((char) ((i1 << 4) + i2));
+ sb.write((char) ((i1 << 4) + i2));
}
}
} else {
- sb.append(c);
+ sb.write(c);
}
}
- String path = sb.toString();
+ String path = sb.toString("UTF-8");
return path;
}
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=349552&r1=349551&r2=349552&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 Mon Nov 28
15:14:24 2005
@@ -1026,6 +1026,11 @@
* <p>This code encodes non ASCII characters too.</p>
*
* <p>The coding of the output is the same as what
File.toURI().toASCIIString() produces</p>
+ *
+ * @see <a href="http://www.w3.org/TR/xml11/#dt-sysid">dt-sysid</a>
+ * which makes some mention of how
+ * characters not supported by URI Reference syntax should be escaped.
+ *
* @param path the path in the local file system.
* @return the URI version of the local path.
* @since Ant 1.6
@@ -1067,7 +1072,7 @@
byte[] bytes = null;
byte b;
try {
- bytes = path.substring(i).getBytes("UTF-8");
+ bytes = path.substring(i).getBytes(Locator.URI_ENCODING);
} catch (java.io.UnsupportedEncodingException e) {
// should never happen
throw new BuildException(e);
Modified:
ant/core/trunk/src/testcases/org/apache/tools/ant/AntClassLoaderTest.java
URL:
http://svn.apache.org/viewcvs/ant/core/trunk/src/testcases/org/apache/tools/ant/AntClassLoaderTest.java?rev=349552&r1=349551&r2=349552&view=diff
==============================================================================
--- ant/core/trunk/src/testcases/org/apache/tools/ant/AntClassLoaderTest.java
(original)
+++ ant/core/trunk/src/testcases/org/apache/tools/ant/AntClassLoaderTest.java
Mon Nov 28 15:14:24 2005
@@ -53,6 +53,16 @@
String path = myLoader.getClasspath();
assertEquals(mainjarstring + File.pathSeparator + extjarstring, path);
}
+ public void testJarWithManifestInNonAsciiDir() {
+ String mainjarstring = getProject().getProperty("main.jar.nonascii");
+ String extjarstring = getProject().getProperty("ext.jar.nonascii");
+ Path myPath = new Path(getProject());
+ myPath.setLocation(new File(mainjarstring));
+ getProject().setUserProperty("build.sysclasspath","ignore");
+ AntClassLoader myLoader = getProject().createClassLoader(myPath);
+ String path = myLoader.getClasspath();
+ assertEquals(mainjarstring + File.pathSeparator + extjarstring, path);
+ }
public void testCleanup() throws BuildException {
Path path = new Path(p, ".");
AntClassLoader loader = new AntClassLoader(p, path);
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]