From 6a466e3f1e92a1e831ea61d1bb72c32f56b2a28d Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Mon, 8 Sep 2014 13:49:45 +0200 Subject: Bug 1063: Further Uri completion - As a result of JOGL Uri adoption --- src/java/com/jogamp/common/net/URIQueryProps.java | 137 -------------------- src/java/com/jogamp/common/net/Uri.java | 39 ++++-- src/java/com/jogamp/common/net/UriQueryProps.java | 138 +++++++++++++++++++++ src/java/com/jogamp/common/util/IOUtil.java | 41 ++---- .../com/jogamp/common/net/TestURIQueryProps.java | 50 -------- .../com/jogamp/common/net/TestUriQueryProps.java | 49 ++++++++ 6 files changed, 225 insertions(+), 229 deletions(-) delete mode 100644 src/java/com/jogamp/common/net/URIQueryProps.java create mode 100644 src/java/com/jogamp/common/net/UriQueryProps.java delete mode 100644 src/junit/com/jogamp/common/net/TestURIQueryProps.java create mode 100644 src/junit/com/jogamp/common/net/TestUriQueryProps.java (limited to 'src') diff --git a/src/java/com/jogamp/common/net/URIQueryProps.java b/src/java/com/jogamp/common/net/URIQueryProps.java deleted file mode 100644 index 138ff9b..0000000 --- a/src/java/com/jogamp/common/net/URIQueryProps.java +++ /dev/null @@ -1,137 +0,0 @@ -/** - * Copyright 2013 JogAmp Community. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those of the - * authors and should not be interpreted as representing official policies, either expressed - * or implied, of JogAmp Community. - */ -package com.jogamp.common.net; - -import java.net.URI; -import java.net.URISyntaxException; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; - -/** - * Helper class to process URI's query, handled as properties. - *

- * The order of the URI segments (any properties) are not preserved. - *

- *
- *  URI: [scheme:][//authority][path][?query][#fragment]
- *  w/ authority: [user-info@]host[:port]
- *  Note: 'path' starts w/ fwd slash
- * 
- */ -public class URIQueryProps { - private static final String QMARK = "?"; - private static final char ASSIG = '='; - private static final String EMPTY = ""; - private final String query_separator; - - private final HashMap properties = new HashMap(); - - private URIQueryProps(final char querySeparator) { - query_separator = String.valueOf(querySeparator); - } - - public final Map getProperties() { return properties; } - public final char getQuerySeparator() { return query_separator.charAt(0); } - - public final String appendQuery(String baseQuery) { - boolean needsSep = false; - final StringBuilder sb = new StringBuilder(); - if ( null != baseQuery ) { - if( !baseQuery.startsWith(QMARK) ) { - baseQuery = baseQuery.substring(1); - } - sb.append(baseQuery); - if( !baseQuery.endsWith(query_separator) ) { - needsSep = true; - } - } - final Iterator> entries = properties.entrySet().iterator(); - while(entries.hasNext()) { - if(needsSep) { - sb.append(query_separator); - } - final Entry entry = entries.next(); - sb.append(entry.getKey()); - if( EMPTY != entry.getValue() ) { - sb.append(ASSIG).append(entry.getValue()); - } - needsSep = true; - } - return sb.toString(); - } - - public final URI appendQuery(final URI base) throws URISyntaxException { - return new URI(base.getScheme(), - base.getRawUserInfo(), base.getHost(), base.getPort(), - base.getRawPath(), appendQuery(base.getRawQuery()), base.getRawFragment()); - } - - /** - * - * @param uri - * @param querySeparator should be either ; or &, ; is encouraged due to troubles of escaping &. - * @return - * @throws IllegalArgumentException if querySeparator is illegal, i.e. neither ; nor & - */ - public static final URIQueryProps create(final URI uri, final char querySeparator) throws IllegalArgumentException { - if( ';' != querySeparator && '&' != querySeparator ) { - throw new IllegalArgumentException("querySeparator is invalid: "+querySeparator); - } - final URIQueryProps data = new URIQueryProps(querySeparator); - final String q = uri.getQuery(); - final int q_l = null != q ? q.length() : -1; - int q_e = -1; - while(q_e < q_l) { - final int q_b = q_e + 1; // next term - q_e = q.indexOf(querySeparator, q_b); - if(0 == q_e) { - // single separator - continue; - } - if(0 > q_e) { - // end - q_e = q_l; - } - // n-part - final String part = q.substring(q_b, q_e); - final int assignment = part.indexOf(ASSIG); - if(0 < assignment) { - // assignment - final String k = part.substring(0, assignment); - final String v = part.substring(assignment+1); - data.properties.put(k, v); - } else { - // property key only - data.properties.put(part, EMPTY); - } - } - return data; - } -} diff --git a/src/java/com/jogamp/common/net/Uri.java b/src/java/com/jogamp/common/net/Uri.java index d1f2016..a2c8833 100644 --- a/src/java/com/jogamp/common/net/Uri.java +++ b/src/java/com/jogamp/common/net/Uri.java @@ -276,6 +276,8 @@ public class Uri { /** {@value} */ public static final char SCHEME_SEPARATOR = ':'; /** {@value} */ + public static final char QUERY_SEPARATOR = '?'; + /** {@value} */ public static final char FRAGMENT_SEPARATOR = '#'; /** {@value} */ public static final String FILE_SCHEME = "file"; @@ -735,7 +737,7 @@ public class Uri { } if ( !emptyString(query) ) { - uri.append('?'); + uri.append(QUERY_SEPARATOR); // QUOTE ILLEGAL CHARS uri.append(encode(query, QUERY_LEGAL)); } @@ -816,7 +818,7 @@ public class Uri { } if ( !emptyString(query) ) { // QUOTE ILLEGAL CHARS - uri.append('?'); + uri.append(QUERY_SEPARATOR); uri.append(encode(query, QUERY_LEGAL)); } if ( !emptyString(fragment) ) { @@ -1255,6 +1257,27 @@ public class Uri { } } + /** + * Returns a new Uri instance w/ the given new query {@code newQuery}. + * + * @throws URISyntaxException if this Uri is {@link #opaque} + * or if the new string {@code uri} doesn't fit to the + * specification RFC2396 and RFC3986 or could not be parsed correctly. + */ + public final Uri getNewQuery(final String newQuery) throws URISyntaxException { + if( opaque ) { + throw new URISyntaxException(input.decode(), "Opaque Uri cannot permute by query"); + } else if( null != host ) { + // with host validation + return Uri.create(decode(scheme), decode(userInfo), decode(host), port, + decode(path), newQuery, decode(fragment)); + } else { + // without host validation + return Uri.create(decode(scheme), decode(authority), + decode(path), newQuery, decode(fragment)); + } + } + /// NEW START /** @@ -1317,7 +1340,7 @@ public class Uri { // cut off optional query in scheme-specific-part final String query; - final int queryI = schemeSpecificPartS.lastIndexOf('?'); + final int queryI = schemeSpecificPartS.lastIndexOf(QUERY_SEPARATOR); if( queryI >= 0 ) { query = schemeSpecificPartS.substring(queryI+1); schemeSpecificPartS = schemeSpecificPartS.substring(0, queryI); @@ -1336,11 +1359,11 @@ public class Uri { uri.append(':'); uri.append(schemeSpecificPartS); if ( null != query ) { - uri.append('?'); + uri.append(QUERY_SEPARATOR); uri.append(query); } if ( null != fragment ) { - uri.append('#'); + uri.append(FRAGMENT_SEPARATOR); uri.append(fragment.get()); } return Uri.cast(uri.toString()); @@ -1532,7 +1555,7 @@ public class Uri { } if (query != null) { - result.append('?'); + result.append(QUERY_SEPARATOR); result.append(query.get()); } } @@ -1577,7 +1600,7 @@ public class Uri { final int indexSchemeSep = temp.indexOf(SCHEME_SEPARATOR); index = indexSchemeSep; final int indexSSP = temp.indexOf('/'); - final int indexQuerySep = temp.indexOf('?'); + final int indexQuerySep = temp.indexOf(QUERY_SEPARATOR); String sspTemp; // may get modified due to error correction @@ -1610,7 +1633,7 @@ public class Uri { // Query temp = sspTemp; - index = temp.indexOf('?'); + index = temp.indexOf(QUERY_SEPARATOR); if (index != -1) { query = new Encoded( temp.substring(index + 1) ); temp = temp.substring(0, index); diff --git a/src/java/com/jogamp/common/net/UriQueryProps.java b/src/java/com/jogamp/common/net/UriQueryProps.java new file mode 100644 index 0000000..8d9bcb4 --- /dev/null +++ b/src/java/com/jogamp/common/net/UriQueryProps.java @@ -0,0 +1,138 @@ +/** + * Copyright 2013 JogAmp Community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of JogAmp Community. + */ +package com.jogamp.common.net; + +import java.net.URISyntaxException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; + +/** + * Helper class to process URI's query, handled as properties. + *

+ * The order of the URI segments (any properties) are not preserved. + *

+ *
+ *  URI: [scheme:][//authority][path][?query][#fragment]
+ *  w/ authority: [user-info@]host[:port]
+ *  Note: 'path' starts w/ fwd slash
+ * 
+ *

+ * Since 2.3.0 renamed from {@code URIQueryProps} to {@code UriQueryProps}, + * and using {@link Uri} instead of {@link java.net.URI}. + *

+ */ +public class UriQueryProps { + private static final String QMARK = "?"; + private static final char ASSIG = '='; + private static final String EMPTY = ""; + private final String query_separator; + + private final HashMap properties = new HashMap(); + + private UriQueryProps(final char querySeparator) { + query_separator = String.valueOf(querySeparator); + } + + public final Map getProperties() { return properties; } + public final char getQuerySeparator() { return query_separator.charAt(0); } + + public final String appendQuery(String baseQuery) { + boolean needsSep = false; + final StringBuilder sb = new StringBuilder(); + if ( null != baseQuery ) { + if( baseQuery.startsWith(QMARK) ) { + baseQuery = baseQuery.substring(1); // cut off '?' + } + sb.append(baseQuery); + if( !baseQuery.endsWith(query_separator) ) { + needsSep = true; + } + } + final Iterator> entries = properties.entrySet().iterator(); + while(entries.hasNext()) { + if(needsSep) { + sb.append(query_separator); + } + final Entry entry = entries.next(); + sb.append(entry.getKey()); + if( EMPTY != entry.getValue() ) { + sb.append(ASSIG).append(entry.getValue()); + } + needsSep = true; + } + return sb.toString(); + } + + public final Uri appendQuery(final Uri base) throws URISyntaxException { + return base.getNewQuery( appendQuery( Uri.decode(base.query) ) ); + } + + /** + * + * @param uri + * @param querySeparator should be either ; or &, ; is encouraged due to troubles of escaping &. + * @return + * @throws IllegalArgumentException if querySeparator is illegal, i.e. neither ; nor & + */ + public static final UriQueryProps create(final Uri uri, final char querySeparator) throws IllegalArgumentException { + if( ';' != querySeparator && '&' != querySeparator ) { + throw new IllegalArgumentException("querySeparator is invalid: "+querySeparator); + } + final UriQueryProps data = new UriQueryProps(querySeparator); + final String q = Uri.decode(uri.query); + final int q_l = null != q ? q.length() : -1; + int q_e = -1; + while(q_e < q_l) { + final int q_b = q_e + 1; // next term + q_e = q.indexOf(querySeparator, q_b); + if(0 == q_e) { + // single separator + continue; + } + if(0 > q_e) { + // end + q_e = q_l; + } + // n-part + final String part = q.substring(q_b, q_e); + final int assignment = part.indexOf(ASSIG); + if(0 < assignment) { + // assignment + final String k = part.substring(0, assignment); + final String v = part.substring(assignment+1); + data.properties.put(k, v); + } else { + // property key only + data.properties.put(part, EMPTY); + } + } + return data; + } +} diff --git a/src/java/com/jogamp/common/util/IOUtil.java b/src/java/com/jogamp/common/util/IOUtil.java index 3a09835..d9fb9cf 100644 --- a/src/java/com/jogamp/common/util/IOUtil.java +++ b/src/java/com/jogamp/common/util/IOUtil.java @@ -535,20 +535,6 @@ public class IOUtil { return null; } - /** - * Wraps {@link #getRelativeOf(URI, String)} for convenience. - * @param relativePath denotes a relative file to the baseLocation's parent directory (URI encoded) - * @throws IOException - * @deprecated Use {@link Uri#getRelativeOf(com.jogamp.common.net.Uri.Encoded)}. - */ - public static URL getRelativeOf(final URL baseURL, final String relativePath) throws IOException { - try { - return Uri.valueOf(baseURL).getRelativeOf(Uri.Encoded.cast(relativePath)).toURL(); - } catch (final URISyntaxException e) { - throw new IOException(e); - } - } - /** * Generates a path for the 'relativeFile' relative to the 'baseLocation'. * @@ -620,30 +606,17 @@ public class IOUtil { public static final Pattern patternSpaceEnc = Pattern.compile("%20"); /** - * If uri is a file scheme, - * implementation completes space-decoding [ "//"+{@link URI#getAuthority()} ] + {@link URI#getPath()}.
- * Then it processes the path if {@link File#separatorChar} == '\\' - * as follows: - *
    - *
  • slash -> backslash
  • - *
  • drop a starting single backslash, preserving windows UNC
  • - *
- *

+ * If uri is a file scheme + * implementation returns {@link Uri#toFile()}.{@link File#getPath()}. *

* Otherwise it returns the {@link URI#toASCIIString()} encoded URI. *

- * @deprecated Use {@link Uri#toFile()} */ - public static String decodeURIIfFilePath(final java.net.URI uri) { - try { - final File file = Uri.valueOf(uri).toFile(); - if( null != file ) { - return file.getPath(); - } else { - return uri.toASCIIString(); - } - } catch (final URISyntaxException e) { - throw new RuntimeException(e); + public static String getUriFilePathOrASCII(final Uri uri) { + if( uri.isFileScheme() ) { + return uri.toFile().getPath(); + } else { + return uri.toASCIIString().get(); } } diff --git a/src/junit/com/jogamp/common/net/TestURIQueryProps.java b/src/junit/com/jogamp/common/net/TestURIQueryProps.java deleted file mode 100644 index 4f4435a..0000000 --- a/src/junit/com/jogamp/common/net/TestURIQueryProps.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.jogamp.common.net; - -import static com.jogamp.common.net.URIDumpUtil.showURI; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; - -import org.junit.Assert; -import org.junit.Test; - -import com.jogamp.junit.util.JunitTracer; - -import org.junit.FixMethodOrder; -import org.junit.runners.MethodSorters; - -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class TestURIQueryProps extends JunitTracer { - - @Test - public void test() throws IOException, URISyntaxException { - final String SCHEME = "camera"; - final String HOST = "somewhere"; - final String PATH = "0"; - final String[] args = new String[] { - SCHEME+"://"+HOST+"/"+PATH, - SCHEME+"://"+HOST+"/"+PATH+"?p1=1", - }; - for(int i=0; i -> "+uri1+" -> NULL"); - } else { - final URI uri1T = data.appendQuery(uri0); - showURI(uri1T); - Assert.assertEquals(uri1, uri1T); - } - } - } - public static void main(final String args[]) throws IOException { - final String tstname = TestURIQueryProps.class.getName(); - org.junit.runner.JUnitCore.main(tstname); - } -} diff --git a/src/junit/com/jogamp/common/net/TestUriQueryProps.java b/src/junit/com/jogamp/common/net/TestUriQueryProps.java new file mode 100644 index 0000000..471cae2 --- /dev/null +++ b/src/junit/com/jogamp/common/net/TestUriQueryProps.java @@ -0,0 +1,49 @@ +package com.jogamp.common.net; + +import static com.jogamp.common.net.URIDumpUtil.showUri; + +import java.io.IOException; +import java.net.URISyntaxException; + +import org.junit.Assert; +import org.junit.Test; + +import com.jogamp.junit.util.JunitTracer; + +import org.junit.FixMethodOrder; +import org.junit.runners.MethodSorters; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class TestUriQueryProps extends JunitTracer { + + @Test + public void test() throws IOException, URISyntaxException { + final String SCHEME = "camera"; + final String HOST = "somewhere"; + final String PATH = "0"; + final String[] args = new String[] { + SCHEME+"://"+HOST+"/"+PATH, + SCHEME+"://"+HOST+"/"+PATH+"?p1=1", + }; + for(int i=0; i -> "+uri1+" -> NULL"); + } else { + final Uri uri1T = data.appendQuery(uri0); + showUri(uri1T); + Assert.assertEquals(uri1, uri1T); + } + } + } + public static void main(final String args[]) throws IOException { + final String tstname = TestUriQueryProps.class.getName(); + org.junit.runner.JUnitCore.main(tstname); + } +} -- cgit v1.2.3