From dde91a061cb0bc209442fe0e74a532b91d1bb4b8 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Mon, 8 Sep 2014 05:09:02 +0200 Subject: Bug 1063: Complete Uri impl. and adoption throughout GlueGen - Uri: - Add error correction (fix) of path at ctor in case a a contained Uri is requested from an opaque one. The latter might come from URI/URL and is not properly encoded! See Uri.PARSE_HINT_FIX_PATH - Simplify conversion methods: - valueOf(URI/URL): Re-encode only if not opaque - getNativeFilePath() -> toFile() - Move IOUtil Uri related constants to class Uri - Add DEBUG and DEBUG_SHOWFIX - Complete adoption of URI -> Uri changes - IOUtil, JarUtil and TempJarCache still holds some left over deprecated methods, which will be removed after officially starting 2.3.0 (JOGL dependencies) - Otherwise not URI utilization left - Tests - Cleaned ip TestUri01 and TestUri03Resolving - TestUri03Resolving also tests URL -> Uri, and hence mentioned Uri.PARSE_HINT_FIX_PATH --- src/junit/com/jogamp/common/net/TestUri01.java | 268 ++++++++------------- .../com/jogamp/common/net/TestUri03Resolving.java | 258 +++++++++++++------- .../TestUri99LaunchOnReservedCharPathBug908.java | 26 +- src/junit/com/jogamp/common/net/URIDumpUtil.java | 6 +- 4 files changed, 291 insertions(+), 267 deletions(-) (limited to 'src/junit/com/jogamp/common/net') diff --git a/src/junit/com/jogamp/common/net/TestUri01.java b/src/junit/com/jogamp/common/net/TestUri01.java index 652caa6..bcc7d27 100644 --- a/src/junit/com/jogamp/common/net/TestUri01.java +++ b/src/junit/com/jogamp/common/net/TestUri01.java @@ -4,16 +4,12 @@ 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; import com.jogamp.common.net.URIDumpUtil; -import com.jogamp.common.os.Platform; +import com.jogamp.common.util.IOUtil; import com.jogamp.junit.util.JunitTracer; import org.junit.FixMethodOrder; @@ -23,7 +19,66 @@ import org.junit.runners.MethodSorters; public class TestUri01 extends JunitTracer { @Test - public void test00URIEscapeSpecialChars() throws IOException, URISyntaxException { + public void test00BasicCoding() throws IOException, URISyntaxException { + final String string = "Hallo Welt öä"; + System.err.println("sp1 "+string); + final File file = new File(string); + System.err.println("file "+file); + System.err.println("file.path.dec "+file.getPath()); + System.err.println("file.path.abs "+file.getAbsolutePath()); + System.err.println("file.path.can "+file.getCanonicalPath()); + final Uri uri0 = Uri.valueOf(file); + URIDumpUtil.showUri(uri0); + URIDumpUtil.showReencodedURIOfUri(uri0); + + boolean ok = true; + { + final String s2 = IOUtil.slashify(file.getAbsolutePath(), true /* startWithSlash */, file.isDirectory() /* endWithSlash */); + System.err.println("uri2.slashify: "+s2); + final Uri uri1 = Uri.create(Uri.FILE_SCHEME, null, s2, null); + final boolean equalEncoded= uri0.getEncoded().equals(uri1.getEncoded()); + final boolean equalPath = uri0.path.decode().equals(uri1.path.decode()); + final boolean equalASCII= uri0.toASCIIString().equals(uri1.toASCIIString().get()); + System.err.println("uri2.enc : "+uri1.getEncoded()+" - "+(equalEncoded?"OK":"ERROR")); + System.err.println("uri2.pathD : "+uri1.path.decode()+" - "+(equalPath?"OK":"ERROR")); + System.err.println("uri2.asciiE: "+uri1.toASCIIString()+" - "+(equalASCII?"OK":"ERROR")); + ok = equalEncoded && equalPath && equalASCII && ok; + } + { + final String s2 = "/"+string; + System.err.println("uri3.orig: "+s2); + final Uri uri1 = Uri.create(Uri.FILE_SCHEME, s2, null); + final String rString = "file:/Hallo%20Welt%20öä"; + final String rPath = s2; + final String rASCII = "file:/Hallo%20Welt%20%C3%B6%C3%A4"; + final boolean equalEncoded = rString.equals(uri1.toString()); + final boolean equalPath = rPath.equals(uri1.path.decode()); + final boolean equalASCII= rASCII.equals(uri1.toASCIIString().get()); + System.err.println("uri3.enc : "+uri1.toString()+" - "+(equalEncoded?"OK":"ERROR")); + System.err.println("uri3.pathD : "+uri1.path.decode()+" - "+(equalPath?"OK":"ERROR")); + System.err.println("uri3.asciiE: "+uri1.toASCIIString()+" - "+(equalASCII?"OK":"ERROR")); + ok = equalEncoded && equalPath && equalASCII && ok; + } + { + final String s2 = "//lala.org/"+string; + System.err.println("uri4.orig: "+s2); + final Uri uri1 = Uri.create(Uri.HTTP_SCHEME, s2, null); + final String rString = "http://lala.org/Hallo%20Welt%20öä"; + final String rPath = "/"+string; + final String rASCII = "http://lala.org/Hallo%20Welt%20%C3%B6%C3%A4"; + final boolean equalString= rString.equals(uri1.toString()); + final boolean equalPath = rPath.equals(uri1.path.decode()); + final boolean equalASCII= rASCII.equals(uri1.toASCIIString().get()); + System.err.println("uri4.enc : "+uri1.toString()+" - "+(equalString?"OK":"ERROR")); + System.err.println("uri4.pathD : "+uri1.path.decode()+" - "+(equalPath?"OK":"ERROR")); + System.err.println("uri4.asciiE: "+uri1.toASCIIString()+" - "+(equalASCII?"OK":"ERROR")); + ok = equalString && equalPath && equalASCII && ok; + } + Assert.assertTrue("One or more errors occured see stderr above", ok); + } + + @Test + public void test02URIEscapeSpecialChars() throws IOException, URISyntaxException { { final String vanilla = "XXX ! # $ & ' ( ) * + , / : ; = ? @ [ ]"; final Uri.Encoded escaped = Uri.Encoded.cast("XXX%20!%20%23%20%24%20%26%20%27%20%28%20%29%20%2A%20%2B%20%2C%20/%20%3A%20%3B%20%3D%20%3F%20%40%20%5B%20%5D"); @@ -60,7 +115,7 @@ public class TestUri01 extends JunitTracer { } } @Test - public void test01URIEscapeCommonChars() throws IOException, URISyntaxException { + public void test03URIEscapeCommonChars() throws IOException, URISyntaxException { { final String vanilla = "/XXX \"%-.<>\\^_`{|}~"; final Uri.Encoded escaped = Uri.Encoded.cast("/XXX%20%22%25-.%3C%3E%5C%5E_%60%7B%7C%7D~"); @@ -95,16 +150,16 @@ public class TestUri01 extends JunitTracer { URIDumpUtil.showURI(uri3); System.err.println("URI -> Uri (keep encoding):"); - final Uri uri4 = Uri.valueOf(uri3, false); + final Uri uri4 = Uri.valueOf(uri3); URIDumpUtil.showUri(uri4); System.err.println("URI -> Uri (re-encode):"); - final Uri uri5 = Uri.valueOf(uri3, true); + final Uri uri5 = Uri.valueOf(uri3); URIDumpUtil.showUri(uri5); } @Test - public void test03EqualsAndHashCode() throws IOException, URISyntaxException { + public void test04EqualsAndHashCode() throws IOException, URISyntaxException { { final Uri uri0 = Uri.cast("http://localhost/test01.html#tag01"); final Uri uri1 = Uri.create("http", null, "localhost", -1, "/test01.html", null, "tag01"); @@ -155,7 +210,7 @@ public class TestUri01 extends JunitTracer { } @Test - public void test04ContainedUri() throws IOException, URISyntaxException { + public void test05Contained() throws IOException, URISyntaxException { { final Uri input = Uri.cast("http://localhost/test01.html#tag01"); final Uri contained = input.getContainedUri(); @@ -185,7 +240,7 @@ public class TestUri01 extends JunitTracer { } @Test - public void test05ParentUri() throws IOException, URISyntaxException { + public void test06ParentAndDir() throws IOException, URISyntaxException { { final Uri input = Uri.cast("http://localhost/"); final Uri parent = input.getParent(); @@ -193,167 +248,58 @@ public class TestUri01 extends JunitTracer { } { final Uri input = Uri.cast("jar:http://localhost/test01.jar!/com/Lala.class"); - final Uri expected1 = Uri.cast("jar:http://localhost/test01.jar!/com/"); - final Uri expected2 = Uri.cast("jar:http://localhost/test01.jar!/"); - final Uri expected3 = Uri.cast("jar:http://localhost/"); + final Uri expParen1 = Uri.cast("jar:http://localhost/test01.jar!/com/"); + final Uri expFolde1 = expParen1; + final Uri expParen2 = Uri.cast("jar:http://localhost/test01.jar!/"); + final Uri expFolde2 = expParen1; // is folder already + final Uri expParen3 = Uri.cast("jar:http://localhost/"); + final Uri expFolde3 = expParen2; // is folder already + Assert.assertNotEquals(input, expParen1); + Assert.assertNotEquals(expParen1, expParen2); + Assert.assertNotEquals(expParen1, expParen3); + final Uri parent1 = input.getParent(); + final Uri folder1 = input.getDirectory(); final Uri parent2 = parent1.getParent(); + final Uri folder2 = parent1.getDirectory(); final Uri parent3 = parent2.getParent(); - Assert.assertEquals(expected1, parent1); - Assert.assertEquals(expected1.hashCode(), parent1.hashCode()); - Assert.assertEquals(expected2, parent2); - Assert.assertEquals(expected2.hashCode(), parent2.hashCode()); - Assert.assertEquals(expected3, parent3); - Assert.assertEquals(expected3.hashCode(), parent3.hashCode()); - } - { - final Uri input = Uri.cast("http://localhost/dir/test01.jar?lala=01#frag01"); - final Uri expected1 = Uri.cast("http://localhost/dir/"); - final Uri expected2 = Uri.cast("http://localhost/"); - final Uri parent1 = input.getParent(); - final Uri parent2 = parent1.getParent(); - Assert.assertEquals(expected1, parent1); - Assert.assertEquals(expected1.hashCode(), parent1.hashCode()); - Assert.assertEquals(expected2, parent2); - Assert.assertEquals(expected2.hashCode(), parent2.hashCode()); - } - } + final Uri folder3 = parent2.getDirectory(); - @Test - public void test10HttpUri2URL() throws IOException, URISyntaxException { - testUri2URL(getSimpleTestName("."), TestUri03Resolving.uriHttpSArray); - } + Assert.assertEquals(expParen1, parent1); + Assert.assertEquals(expParen1.hashCode(), parent1.hashCode()); + Assert.assertEquals(expFolde1, folder1); - @Test - public void test20FileUnixUri2URL() throws IOException, URISyntaxException { - testUri2URL(getSimpleTestName("."), TestUri03Resolving.uriFileSArrayUnix); - } + Assert.assertEquals(expParen2, parent2); + Assert.assertEquals(expParen2.hashCode(), parent2.hashCode()); + Assert.assertEquals(expFolde2, folder2); - @Test - public void test21FileWindowsUri2URL() throws IOException, URISyntaxException { - testUri2URL(getSimpleTestName("."), TestUri03Resolving.uriFileSArrayWindows); - } - - @Test - public void test30FileUnixUri2URL() throws IOException, URISyntaxException { - if( Platform.OSType.WINDOWS != PlatformPropsImpl.OS_TYPE ) { - testFile2Uri(getSimpleTestName("."), TestUri03Resolving.fileSArrayUnix); - } - } - - @Test - public void test31FileWindowsUri2URL() throws IOException, URISyntaxException { - if( Platform.OSType.WINDOWS == PlatformPropsImpl.OS_TYPE ) { - testFile2Uri(getSimpleTestName("."), TestUri03Resolving.fileSArrayWindows); - } - } + Assert.assertEquals(expParen3, parent3); + Assert.assertEquals(expParen3.hashCode(), parent3.hashCode()); + Assert.assertEquals(expFolde3, folder3); - static void testUri2URL(final String testname, final String[][] uriSArray) throws IOException, URISyntaxException { - boolean ok = true; - for(int i=0; i [1] // "A$-B%5E-C~-D%23-E]-F[-%C3%B6%C3%A4/"); <- '[' ']' -> [2] - "A$-B%5E-C~-D%23-E%5D-F%5B-%C3%B6%C3%A4/"); + // "A$-B%5E-C~-D%23-E%5D-F%5B-%C3%B6%C3%A4/"); /** * [1] '#' java.lang.IllegalArgumentException: URI has a fragment component @@ -111,34 +110,35 @@ public class TestUri99LaunchOnReservedCharPathBug908 extends JunitTracer { */ } - private void testTempJarCacheOddJarPathImpl(final String subPathUTF, final String subPathEncoded) throws IOException, IllegalArgumentException, URISyntaxException { + private void testTempJarCacheOddJarPathImpl(final String subPathUTF) throws IOException, IllegalArgumentException, URISyntaxException { if(AndroidVersion.isAvailable) { System.err.println("n/a on Android"); return; } + final Uri.Encoded subPathEncoded = new Uri.Encoded(subPathUTF, Uri.PATH_LEGAL); final String reservedCharPathUnencoded = "test/build/"+getClass().getSimpleName()+"/"+getTestMethodName()+"/"+subPathUTF; - final String reservedCharPathEncoded = "test/build/"+getClass().getSimpleName()+"/"+getTestMethodName()+"/"+subPathEncoded; + final Uri.Encoded reservedCharPathEncoded = Uri.Encoded.cast("test/build/"+getClass().getSimpleName()+"/"+getTestMethodName()+"/").concat(subPathEncoded); System.err.println("0 Unencoded: "+reservedCharPathUnencoded); System.err.println("0 Encoded: "+reservedCharPathEncoded); // jar:file:/dir1/dir2/gluegen-rt.jar!/ - final URI jarFileURI = JarUtil.getJarFileURI(Platform.class.getName(), getClass().getClassLoader()); + final Uri jarFileURI = JarUtil.getJarFileUri(Platform.class.getName(), getClass().getClassLoader()); System.err.println("1 jarFileURI: "+jarFileURI.toString()); // gluegen-rt.jar - final String jarBasename = JarUtil.getJarBasename(jarFileURI); + final Uri.Encoded jarBasename = JarUtil.getJarBasename(jarFileURI); System.err.println("2 jarBasename: "+jarBasename); // file:/dir1/build/gluegen-rt.jar - final URI fileURI = JarUtil.getJarSubURI(jarFileURI); + final Uri fileURI = jarFileURI.getContainedUri(); System.err.println("3 fileURI: "+fileURI.toString()); // file:/dir1/build/ - final URI fileFolderURI = new URI(IOUtil.getParentOf(fileURI.toString())); + final Uri fileFolderURI = fileURI.getParent(); System.err.println("4 fileFolderURI: "+fileFolderURI.toString()); // file:/dir1/build/test/build/A$-B^-C~-D#-E]-F[/ - final URI fileNewFolderURI = new URI(fileFolderURI.toString()+reservedCharPathEncoded); + final Uri fileNewFolderURI = fileFolderURI.concat(reservedCharPathEncoded); System.err.println("5 fileNewFolderURI: "+fileNewFolderURI.toString()); - final File srcFolder = new File(fileFolderURI); - final File dstFolder = new File(fileNewFolderURI); + final File srcFolder = fileFolderURI.toFile(); + final File dstFolder = fileNewFolderURI.toFile(); System.err.println("6 srcFolder: "+srcFolder.toString()); System.err.println("7 dstFolder: "+dstFolder.toString()); try { diff --git a/src/junit/com/jogamp/common/net/URIDumpUtil.java b/src/junit/com/jogamp/common/net/URIDumpUtil.java index a7d050a..c5ba51f 100644 --- a/src/junit/com/jogamp/common/net/URIDumpUtil.java +++ b/src/junit/com/jogamp/common/net/URIDumpUtil.java @@ -52,7 +52,7 @@ public class URIDumpUtil { System.err.println("0.0.0 string: "+uri.toString()); System.err.println("0.0.0 ascii : "+uri.toASCIIString()); - System.err.println("0.0.0 native-file: "+uri.getNativeFilePath()); + System.err.println("0.0.0 native-file: "+uri.toFile()); System.err.println("0.0.0 contained: "+uri.getContainedUri()); System.err.println("1.0.0 scheme: "+uri.scheme); @@ -73,7 +73,7 @@ public class URIDumpUtil { * @throws URISyntaxException */ public static void showReencodedURIOfUri(final Uri uri) throws URISyntaxException { - final URI recomposedURI = uri.toURI(true); + final URI recomposedURI = uri.toURIReencoded(); showURI("YYYYYY Recomposed URI "+recomposedURI+", isOpaque "+recomposedURI.isOpaque()+", isAbs "+recomposedURI.isAbsolute(), recomposedURI); final String recomposedURIStr = recomposedURI.toString(); final boolean equalsRecompURI = uri.input.equals(recomposedURIStr); @@ -88,7 +88,7 @@ public class URIDumpUtil { * @throws URISyntaxException */ public static void showReencodedUriOfURI(final URI uri) throws URISyntaxException { - final Uri recomposedUri = Uri.valueOf(uri, true); + final Uri recomposedUri = Uri.valueOf(uri); showUri("ZZZZZZ Recomposed Uri "+recomposedUri+", isOpaque "+recomposedUri.opaque+", isAbs "+recomposedUri.absolute+", hasAuth "+recomposedUri.hasAuthority, recomposedUri); final String recomposedUriStr = recomposedUri.toString(); final boolean equalsRecompUri = uri.toString().equals(recomposedUriStr); -- cgit v1.2.3