summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/java/com/jogamp/common/util/IOUtil.java86
-rw-r--r--src/java/com/jogamp/common/util/JarUtil.java2
-rw-r--r--src/junit/com/jogamp/common/util/TestIOUtilURIHandling.java184
3 files changed, 243 insertions, 29 deletions
diff --git a/src/java/com/jogamp/common/util/IOUtil.java b/src/java/com/jogamp/common/util/IOUtil.java
index c719310..d6ef87a 100644
--- a/src/java/com/jogamp/common/util/IOUtil.java
+++ b/src/java/com/jogamp/common/util/IOUtil.java
@@ -493,17 +493,26 @@ public class IOUtil {
}
/**
- * Converts an {@link URI} to an {@link URL} while using a non encoded path
- * for <i>file scheme</i>, i.e. <code>file:/</code>.
+ * Converts an {@link URI} to an {@link URL} while using a non encoded path.
+ * <p>
+ * A <i>file scheme</i> path, i.e. path following <code>file:</code>, is converted as follows:<br/>
+ * <code><br/>
+ File file = new File( {@link #decodeFromURI(String) decodeFromURI}( specificURI.getPath() ) );<br/>
+ String uriFilePath = {@link #encodeFilePathToURI(String) encodeFilePathToURI}( file.getPath() );<br/>
+ * </code><br/>
+ * above conversion results in a decoded <i>file path</i> appropriate to be used by subsequent file i/o operations (JarFile, zip, ..).
+ * </p>
+ * <p>
* Otherwise the default {@link URL} translation {@link URI#toURL()} is being used.
+ * </p>
* <p>
* The following cases are considered:
* <ul>
* <li><i>file schema</i> is converted via <code>new File(uri).getPath()</code>.</li>
* <li><i>jar scheme</i>
* <ul>
- * <li>sub-protocol is being converted as above, if <i>file scheme</i>.</li>
- * <li>JAR entry is not converted but preserved.</li>
+ * <li>sub-protocol <i>file scheme</i> is being converted as above, other schema are preserved</li>
+ * <li>JAR entry is preserved.</li>
* </ul></li>
* </ul>
* </p>
@@ -527,18 +536,19 @@ public class IOUtil {
"\t, uri "+uri+PlatformPropsImpl.NEWLINE+
"\t str -> "+specificURI.toString()+PlatformPropsImpl.NEWLINE+
"\t ascii -> "+specificURI.toASCIIString()+PlatformPropsImpl.NEWLINE+
+ "\t ssp -> "+specificURI.getSchemeSpecificPart()+PlatformPropsImpl.NEWLINE+
+ "\t frag -> "+specificURI.getFragment()+PlatformPropsImpl.NEWLINE+
"\t path -> "+specificURI.getPath()+PlatformPropsImpl.NEWLINE+
- "\t decoded.path -> "+decodeFromURI(specificURI.getPath())
- );
+ "\t path.decoded -> "+decodeFromURI( specificURI.getPath() ) );
}
int mode = 0;
if( IOUtil.FILE_SCHEME.equals( specificURI.getScheme() ) ) {
File f;
try {
- f = new File(specificURI);
+ f = new File( decodeFromURI( specificURI.getPath() ) ); // validates uri, uses decoded uri.getPath() and normalizes it
} catch(Exception iae) {
if( DEBUG ) {
- System.err.println("Catched "+iae.getClass().getSimpleName()+": new File("+decodeFromURI(specificURI.getPath())+") failed: "+iae.getMessage());
+ System.err.println("Catched "+iae.getClass().getSimpleName()+": new File("+decodeFromURI( specificURI.getPath() )+") failed: "+iae.getMessage());
iae.printStackTrace();
}
f = null;
@@ -861,17 +871,21 @@ public class IOUtil {
/**
* Reverses escaping of characters as performed via {@link #encodeToURI(String)}.
+ * <ul>
+ * <li>%20 -> SPACE</li>
+ * </ul>
*/
public static String decodeFromURI(String s) {
return patternSpaceEnc.matcher(s).replaceAll(" ");
}
private static final Pattern patternSingleBS = Pattern.compile("\\\\{1,}");
+ private static final Pattern patternSingleFS = Pattern.compile("/{1,}");
/**
- * Escapes file path characters not complying w/ RFC 2396 and the {@link URI#URI(String)} ctor.
+ * Encodes file path characters not complying w/ RFC 2396 and the {@link URI#URI(String)} ctor.
* <p>
- * Processes input filePath if {@link File#separatorChar} <code> != '/'</code>
+ * Implementation processes the <code>filePath</code> if {@link File#separatorChar} <code> != '/'</code>
* as follows:
* <ul>
* <li>backslash -> slash</li>
@@ -879,12 +893,17 @@ public class IOUtil {
* </ul>
* </p>
* <p>
+ * Note that this method does not perform <i>space</i> encoding,
+ * which can be utilized via {@link #encodeToURI(String)}.
+ * </p>
+ * <p>
* Even though Oracle's JarURLStreamHandler can handle backslashes and
* erroneous URIs w/ e.g. Windows file 'syntax', other may not (Netbeans).<br>
* See Bug 857 - http://jogamp.org/bugzilla/show_bug.cgi?id=857
* </p>
+ * @see #encodeToURI(String)
*/
- public static String encodeFilePathToURI(String filePath) {
+ public static String encodeFilePathToURI(final String filePath) {
if( !File.separator.equals("/") ) {
final String r = patternSingleBS.matcher(filePath).replaceAll("/");
if( !r.startsWith("/") ) {
@@ -897,6 +916,49 @@ public class IOUtil {
}
/**
+ * Decodes uri-file path characters complying w/ RFC 2396 to native file-path.
+ * <p>
+ * Implementation decodes the space-encoding <code>path={@link #decodeFromURI(String) decodeFromURI}(uriPath)</code>.
+ * </p>
+ * <p>
+ * Then it processes the <code>path</code> if {@link File#separatorChar} <code> != '/'</code>
+ * as follows:
+ * <ul>
+ * <li>drop a starting slash</li>
+ * <li>slash -> backslash</li>
+ * </ul>
+ * </p>
+ * @see #decodeFromURI(String)
+ */
+ public static String decodeURIToFilePath(final String uriPath) {
+ final String path = IOUtil.decodeFromURI(uriPath);
+ if( !File.separator.equals("/") ) {
+ final String r = patternSingleFS.matcher(path).replaceAll("\\\\");
+ if( r.startsWith("\\") ) {
+ return r.substring(1);
+ } else {
+ return r;
+ }
+ }
+ return path;
+ }
+
+ /**
+ * If <code>uri</code> is a <i>file scheme</i>,
+ * implementation returns the decoded {@link URI#getPath()} via {@link #decodeURIToFilePath(String)},
+ * otherwise it returns the {@link URI#toASCIIString()} encoded URI.
+ *
+ * @see #decodeFromURI(String)
+ * @see #decodeURIToFilePath(String)
+ */
+ public static String decodeURIIfFilePath(final URI uri) {
+ if( IOUtil.FILE_SCHEME.equals( uri.getScheme() ) ) {
+ return decodeURIToFilePath( uri.getPath() );
+ }
+ return uri.toASCIIString();
+ }
+
+ /**
* Returns the connected URLConnection, or null if not url is not available
*/
public static URLConnection openURL(URL url) {
@@ -1206,7 +1268,7 @@ public class IOUtil {
// 1) java.io.tmpdir/jogamp
if( null == tempRootExec && isStringSet(java_io_tmpdir) ) {
- if( Platform.OSType.MACOS == Platform.getOSType() ) {
+ if( Platform.OSType.MACOS == PlatformPropsImpl.OS_TYPE ) {
// Bug 865: Safari >= 6.1 [OSX] May employ xattr on 'com.apple.quarantine' on 'PluginProcess.app'
// We attempt to fix this issue _after_ gluegen native lib is loaded, see JarUtil.fixNativeLibAttribs(File).
tempRootExec = getSubTempDir(new File(java_io_tmpdir), tmpSubDir, false /* executable */, "tempX1");
diff --git a/src/java/com/jogamp/common/util/JarUtil.java b/src/java/com/jogamp/common/util/JarUtil.java
index d22d441..77f1a84 100644
--- a/src/java/com/jogamp/common/util/JarUtil.java
+++ b/src/java/com/jogamp/common/util/JarUtil.java
@@ -287,7 +287,7 @@ public class JarUtil {
if(0 >= uriS1.lastIndexOf(".jar")) {
throw new IllegalArgumentException("No Jar name in <"+classJarURI+">");
}
- final String uriS2 = IOUtil.encodeToURI(uriS1);
+ final String uriS2 = IOUtil.encodeToURI(uriS1); // 'new URI(String)' will not encode space!
if(DEBUG) {
System.err.println("getJarSubURI res: "+classJarURI+" -> "+uriS0+" -> "+uriS1+" -> "+uriS2);
}
diff --git a/src/junit/com/jogamp/common/util/TestIOUtilURIHandling.java b/src/junit/com/jogamp/common/util/TestIOUtilURIHandling.java
index 73f6ce7..6103d9a 100644
--- a/src/junit/com/jogamp/common/util/TestIOUtilURIHandling.java
+++ b/src/junit/com/jogamp/common/util/TestIOUtilURIHandling.java
@@ -1,13 +1,18 @@
package com.jogamp.common.util;
import static com.jogamp.common.net.URIDumpUtil.showURX;
+import static com.jogamp.common.net.URIDumpUtil.showURI;
+import static com.jogamp.common.net.URIDumpUtil.showURL;
+import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLConnection;
+import jogamp.common.os.PlatformPropsImpl;
+
import org.junit.Assert;
import org.junit.Test;
@@ -25,6 +30,11 @@ public class TestIOUtilURIHandling extends JunitTracer {
new String[] {"http://localhost/gluegen/build-x86_64/gluegen-rt.jar",
"http://localhost/gluegen/build-x86_64/gluegen-rt.jar"},
+ new String[] {"http://localhost/gluegen/build-x86_64%20lala/gluegen-rt.jar",
+ "http://localhost/gluegen/build-x86_64%20lala/gluegen-rt.jar"
+ // "http://localhost/gluegen/build-x86_64 lala/gluegen-rt.jar"
+ },
+
new String[] {"http://localhost/gluegen/build-x86_64%20%c3%b6%c3%a4%20lala/gluegen-rt.jar",
"http://localhost/gluegen/build-x86_64%20%c3%b6%c3%a4%20lala/gluegen-rt.jar"
// "http://localhost/gluegen/build-x86_64 öä lala/gluegen-rt.jar"
@@ -45,12 +55,20 @@ public class TestIOUtilURIHandling extends JunitTracer {
"jar:http://localhost/gluegen/build-x86_64%20%c3%b6%c3%a4%20lala/gluegen-rt.jar!/com/jogamp/common/os/Platform.class"
// "jar:http://localhost/gluegen/build-x86_64 öä lala/gluegen-rt.jar!/com/jogamp/common/os/Platform.class"
},
+ /** Not possible, '#' is fragment in URI
+ new String[] {"jar:http://localhost/gluegen/%23/gluegen-rt.jar!/",
+ "jar:http://localhost/gluegen/%23/gluegen-rt.jar!/"
+ // "jar:http://localhost/gluegen/#/gluegen-rt.jar!/"
+ }, */
};
static final String[][] uriFileSArrayUnix = new String[][] {
new String[] {"file:/gluegen/build-x86_64/gluegen-rt.jar",
"file:/gluegen/build-x86_64/gluegen-rt.jar"},
+ new String[] {"file:/gluegen/build-x86_64%20lala/gluegen-rt.jar",
+ "file:/gluegen/build-x86_64 lala/gluegen-rt.jar"},
+
new String[] {"file:/gluegen/build-x86_64%20%c3%b6%c3%a4%20lala/gluegen-rt.jar",
"file:/gluegen/build-x86_64 öä lala/gluegen-rt.jar"},
@@ -65,12 +83,19 @@ public class TestIOUtilURIHandling extends JunitTracer {
new String[] {"jar:file:/gluegen/build-x86_64%20%c3%b6%c3%a4%20lala/gluegen-rt.jar!/com/jogamp/common/os/Platform.class",
"jar:file:/gluegen/build-x86_64 öä lala/gluegen-rt.jar!/com/jogamp/common/os/Platform.class" },
+
+ /** Not possible, '#' is fragment in URI
+ new String[] {"jar:file:/gluegen/%23/gluegen-rt.jar!/",
+ "jar:file:/gluegen/#/gluegen-rt.jar!/" }, */
};
static final String[][] uriFileSArrayWindows = new String[][] {
new String[] {"file:/C:/gluegen/build-x86_64/gluegen-rt.jar",
"file:/C:/gluegen/build-x86_64/gluegen-rt.jar"},
+ new String[] {"file:/C:/gluegen/build-x86_64%20lala/gluegen-rt.jar",
+ "file:/C:/gluegen/build-x86_64 lala/gluegen-rt.jar"},
+
new String[] {"file:/C:/gluegen/build-x86_64%20%c3%b6%c3%a4%20lala/gluegen-rt.jar",
"file:/C:/gluegen/build-x86_64 öä lala/gluegen-rt.jar"},
@@ -85,46 +110,172 @@ public class TestIOUtilURIHandling extends JunitTracer {
new String[] {"jar:file:/C:/gluegen/build-x86_64%20%c3%b6%c3%a4%20lala/gluegen-rt.jar!/com/jogamp/common/os/Platform.class",
"jar:file:/C:/gluegen/build-x86_64 öä lala/gluegen-rt.jar!/com/jogamp/common/os/Platform.class" },
+
+ /** Not possible, '#' is fragment in URI
+ new String[] {"jar:file:/C:/gluegen/%23/gluegen-rt.jar!/",
+ "jar:file:/C:/gluegen/#/gluegen-rt.jar!/" }, */
+ };
+
+ static final String[][] fileSArrayUnix = new String[][] {
+ new String[] {"/gluegen/build-x86_64/gluegen-rt.jar",
+ "file:/gluegen/build-x86_64/gluegen-rt.jar",
+ "file:/gluegen/build-x86_64/gluegen-rt.jar",
+ "/gluegen/build-x86_64/gluegen-rt.jar"},
+
+ new String[] {"/gluegen/build-x86_64 lala/gluegen-rt.jar",
+ "file:/gluegen/build-x86_64%20lala/gluegen-rt.jar",
+ "file:/gluegen/build-x86_64 lala/gluegen-rt.jar",
+ "/gluegen/build-x86_64 lala/gluegen-rt.jar"},
+
+ new String[] {"/gluegen/build-x86_64 öä lala/gluegen-rt.jar",
+ "file:/gluegen/build-x86_64%20%c3%b6%c3%a4%20lala/gluegen-rt.jar",
+ "file:/gluegen/build-x86_64 öä lala/gluegen-rt.jar",
+ "/gluegen/build-x86_64 öä lala/gluegen-rt.jar"},
+
+ /* No support for '#' fragment in URI path !
+ new String[] {"/gluegen/#/gluegen-rt.jar",
+ "file:/gluegen/%23/gluegen-rt.jar",
+ "file:/gluegen/#/gluegen-rt.jar",
+ "/gluegen/#/gluegen-rt.jar" }, */
+ };
+
+ static final String[][] fileSArrayWindows = new String[][] {
+ new String[] {"C:/gluegen/build-x86_64/gluegen-rt.jar",
+ "file:/C:/gluegen/build-x86_64/gluegen-rt.jar",
+ "file:/C:/gluegen/build-x86_64/gluegen-rt.jar",
+ "C:\\gluegen\\build-x86_64\\gluegen-rt.jar"},
+
+ new String[] {"C:/gluegen/build-x86_64 lala/gluegen-rt.jar",
+ "file:/C:/gluegen/build-x86_64%20lala/gluegen-rt.jar",
+ "file:/C:/gluegen/build-x86_64 lala/gluegen-rt.jar",
+ "C:\\gluegen\\build-x86_64 lala\\gluegen-rt.jar"},
+
+ new String[] {"C:/gluegen/build-x86_64 öä lala/gluegen-rt.jar",
+ "file:/C:/gluegen/build-x86_64%20%c3%b6%c3%a4%20lala/gluegen-rt.jar",
+ "file:/C:/gluegen/build-x86_64 öä lala/gluegen-rt.jar",
+ "C:\\gluegen\\build-x86_64 öä lala\\gluegen-rt.jar"},
+
+ new String[] {"C:\\gluegen\\build-x86_64 öä lala\\gluegen-rt.jar",
+ "file:/C:/gluegen/build-x86_64%20%c3%b6%c3%a4%20lala/gluegen-rt.jar",
+ "file:/C:/gluegen/build-x86_64 öä lala/gluegen-rt.jar",
+ "C:\\gluegen\\build-x86_64 öä lala\\gluegen-rt.jar"},
+
+ /* No support for '#' fragment in URI path !
+ new String[] {"C:/gluegen/#/gluegen-rt.jar",
+ "file:/C:/gluegen/%23/gluegen-rt.jar",
+ "file:/C:/gluegen/#/gluegen-rt.jar",
+ "C:\\gluegen\\#\\gluegen-rt.jar" }, */
};
@Test
public void test01HttpURI2URL() throws IOException, URISyntaxException {
- testURI2URL(uriHttpSArray, false /*usesFile*/, false /*matchOS*/);
+ testURI2URL(getSimpleTestName("."), uriHttpSArray);
}
@Test
public void test02FileUnixURI2URL() throws IOException, URISyntaxException {
- testURI2URL(uriFileSArrayUnix, true /*usesFile*/, Platform.OSType.WINDOWS != Platform.getOSType() /*matchOS*/);
+ testURI2URL(getSimpleTestName("."), uriFileSArrayUnix);
}
@Test
- public void test02FileWindowsURI2URL() throws IOException, URISyntaxException {
- testURI2URL(uriFileSArrayWindows, true /*usesFile*/, Platform.OSType.WINDOWS == Platform.getOSType() /*matchOS*/);
+ public void test03FileWindowsURI2URL() throws IOException, URISyntaxException {
+ testURI2URL(getSimpleTestName("."), uriFileSArrayWindows);
}
- static void testURI2URL(String[][] uriSArray, boolean usesFile, boolean matchOS) throws IOException, URISyntaxException {
+ @Test
+ public void test04FileUnixURI2URL() throws IOException, URISyntaxException {
+ if( Platform.OSType.WINDOWS != PlatformPropsImpl.OS_TYPE ) {
+ testFile2URI(getSimpleTestName("."), fileSArrayUnix);
+ }
+ }
+
+ @Test
+ public void test05FileWindowsURI2URL() throws IOException, URISyntaxException {
+ if( Platform.OSType.WINDOWS == PlatformPropsImpl.OS_TYPE ) {
+ testFile2URI(getSimpleTestName("."), fileSArrayWindows);
+ }
+ }
+
+ static void testURI2URL(String testname, String[][] uriSArray) throws IOException, URISyntaxException {
+ boolean ok = true;
for(int i=0; i<uriSArray.length; i++) {
final String[] uriSPair = uriSArray[i];
final String uriSource = uriSPair[0];
final String uriExpected= uriSPair[1];
- System.err.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
- showURX(uriSource);
- testURI2URL(uriSource, uriExpected, usesFile, matchOS);
- System.err.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
+ System.err.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX "+testname+": "+(i+1)+"/"+uriSArray.length);
+ ok = testURI2URL(uriSource, uriExpected) && ok;
+ System.err.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX "+testname+": "+(i+1)+"/"+uriSArray.length);
}
+ Assert.assertTrue("One or more errors occured see stderr above", ok);
}
- static void testURI2URL(String source, String expected, boolean usesFile, boolean matchOS) throws IOException, URISyntaxException {
- final URI uri0 = new URI(source);
- System.err.println("uri: "+uri0.toString());
+ static boolean testURI2URL(String uriSource, String uriExpected) throws IOException, URISyntaxException {
+ showURX(uriSource);
+ final URI uri0 = new URI(uriSource);
+ System.err.println("uri.string: "+uri0.toString());
+ System.err.println("uri.ascii : "+uri0.toASCIIString());
final URL actualUrl = IOUtil.toURL(uri0);
final String actualUrlS = actualUrl.toExternalForm();
- System.err.println("url: "+actualUrlS);
- final boolean equalsA = expected.equals(actualUrlS);
- System.err.println("expected___: "+expected+" - ok "+equalsA);
+ final boolean equalsA = uriExpected.equals(actualUrlS);
System.err.println("actual : "+actualUrlS);
- Assert.assertTrue("No match, expected w/ orig url", equalsA);
+ System.err.println("expected___: "+uriExpected+" - "+(equalsA?"OK":"ERROR"));
+ final boolean ok = equalsA;
+
+ // now test open ..
+ Throwable t = null;
+ URLConnection con = null;
+ try {
+ con = actualUrl.openConnection();
+ } catch (Throwable _t) {
+ t = _t;
+ }
+ if( null != t ) {
+ System.err.println("XXX: "+t.getClass().getName()+": "+t.getMessage());
+ t.printStackTrace();
+ } else {
+ System.err.println("XXX: No openConnection() failure");
+ System.err.println("XXX: "+con);
+ }
+ return ok;
+ }
+
+ static void testFile2URI(String testname, String[][] uriSArray) throws IOException, URISyntaxException {
+ boolean ok = true;
+ for(int i=0; i<uriSArray.length; i++) {
+ final String[] uriSPair = uriSArray[i];
+ final String uriSource = uriSPair[0];
+ final String uriEncExpected= uriSPair[1];
+ final String uriDecExpected= uriSPair[2];
+ final String fileExpected= uriSPair[3];
+ System.err.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX "+testname+": "+(i+1)+"/"+uriSArray.length);
+ ok = testFile2URI(uriSource, uriEncExpected, uriDecExpected, fileExpected) && ok;
+ System.err.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX "+testname+": "+(i+1)+"/"+uriSArray.length);
+ }
+ Assert.assertTrue("One or more errors occured see stderr above", ok);
+ }
+
+ static boolean testFile2URI(String fileSource, String uriEncExpected, String uriDecExpected, String fileExpected) throws IOException, URISyntaxException {
+ final File file = new File(fileSource);
+ final URI uri0 = IOUtil.toURISimple(file);
+ System.err.println("uri.string: "+uri0.toString());
+ System.err.println("uri.ascii : "+uri0.toASCIIString());
+ showURI(uri0);
+ showURL(uri0.toURL());
+
+ final URL actualUrl = IOUtil.toURL(uri0);
+ final String actualUrlS = actualUrl.toExternalForm();
+ final String actualUrlPathS = actualUrl.getPath();
+ final String actualFilePathS = IOUtil.decodeURIToFilePath( actualUrlPathS );
+ final boolean equalsFilePath = fileExpected.equals(actualFilePathS);
+ System.err.println("actual____url-path: "+actualUrlPathS);
+ System.err.println("actual___file-path: "+actualFilePathS);
+ System.err.println("expected_path: "+fileExpected+" - "+(equalsFilePath?"OK":"ERROR"));
+ final boolean equalsDecUri = uriDecExpected.equals(actualUrlS);
+ System.err.println("actual_______uri: "+actualUrlS);
+ System.err.println("expected__encUri: "+uriEncExpected);
+ System.err.println("expected__decUri: "+uriDecExpected+" - "+(equalsDecUri?"OK":"ERROR"));
+ final boolean ok = equalsDecUri && equalsFilePath;
// now test open ..
Throwable t = null;
@@ -141,6 +292,7 @@ public class TestIOUtilURIHandling extends JunitTracer {
System.err.println("XXX: No openConnection() failure");
System.err.println("XXX: "+con);
}
+ return ok;
}
public static void main(String args[]) throws IOException {