From 4c835f0337674a0181c43f448d44d961e27b2f54 Mon Sep 17 00:00:00 2001
From: Sven Gothel
+ * A file scheme path, i.e. path following
* Otherwise the default {@link URL} translation {@link URI#toURL()} is being used.
+ *
* The following cases are considered:
* file:/
.
+ * Converts an {@link URI} to an {@link URL} while using a non encoded path.
+ * file:
, is converted as follows:
+ *
+ File file = new File( {@link #decodeFromURI(String) decodeFromURI}( specificURI.getPath() ) );
+ String uriFilePath = {@link #encodeFilePathToURI(String) encodeFilePathToURI}( file.getPath() );
+ *
+ * above conversion results in a decoded file path appropriate to be used by subsequent file i/o operations (JarFile, zip, ..).
+ *
*
* new File(uri).getPath()
.
- *
- * Processes input filePath if {@link File#separatorChar} != '/'
+ * Implementation processes the filePath
if {@link File#separatorChar} != '/'
* as follows:
*
+ * Note that this method does not perform space encoding, + * which can be utilized via {@link #encodeToURI(String)}. + *
+ *
* Even though Oracle's JarURLStreamHandler can handle backslashes and
* erroneous URIs w/ e.g. Windows file 'syntax', other may not (Netbeans).
* See Bug 857 - http://jogamp.org/bugzilla/show_bug.cgi?id=857
*
+ * Implementation decodes the space-encoding path={@link #decodeFromURI(String) decodeFromURI}(uriPath)
.
+ *
+ * Then it processes the path
if {@link File#separatorChar} != '/'
+ * as follows:
+ *
uri
is a file scheme,
+ * 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
*/
@@ -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