From 6a466e3f1e92a1e831ea61d1bb72c32f56b2a28d Mon Sep 17 00:00:00 2001
From: Sven Gothel
- * The order of the URI segments (any properties) are not preserved.
- *
+ * The order of the URI segments (any properties) are not preserved.
+ *
+ * Since 2.3.0 renamed from {@code URIQueryProps} to {@code UriQueryProps},
+ * and using {@link Uri} instead of {@link java.net.URI}.
+ *
- * 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 HashMapquerySeparator
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.
+ *
+ * URI: [scheme:][//authority][path][?query][#fragment]
+ * w/ authority: [user-info@]host[:port]
+ * Note: 'path' starts w/ fwd slash
+ *
+ * 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:
- *
- *
- *
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