From 6a466e3f1e92a1e831ea61d1bb72c32f56b2a28d Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
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 ++++++++++++++++++++++
 3 files changed, 169 insertions(+), 145 deletions(-)
 delete mode 100644 src/java/com/jogamp/common/net/URIQueryProps.java
 create mode 100644 src/java/com/jogamp/common/net/UriQueryProps.java

(limited to 'src/java/com/jogamp/common/net')

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.
- * <p>
- * The order of the URI segments (any properties) are <i>not</i> preserved.
- * </p>
- * <pre>
- *  URI: [scheme:][//authority][path][?query][#fragment]
- *  w/ authority: [user-info@]host[:port]
- *  Note: 'path' starts w/ fwd slash
- * </pre>
- */
-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<String, String> properties = new HashMap<String, String>();
-
-   private URIQueryProps(final char querySeparator) {
-       query_separator = String.valueOf(querySeparator);
-   }
-
-   public final Map<String, String> 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<Entry<String, String>> entries = properties.entrySet().iterator();
-       while(entries.hasNext()) {
-           if(needsSep) {
-               sb.append(query_separator);
-           }
-           final Entry<String, String> 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 <i>;</i> or <i>&</i>, <i>;</i> is encouraged due to troubles of escaping <i>&</i>.
-    * @return
-    * @throws IllegalArgumentException if <code>querySeparator</code> is illegal, i.e. neither <i>;</i> nor <i>&</i>
-    */
-   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.
+ * <p>
+ * The order of the URI segments (any properties) are <i>not</i> preserved.
+ * </p>
+ * <pre>
+ *  URI: [scheme:][//authority][path][?query][#fragment]
+ *  w/ authority: [user-info@]host[:port]
+ *  Note: 'path' starts w/ fwd slash
+ * </pre>
+ * <p>
+ * Since 2.3.0 renamed from {@code URIQueryProps} to {@code UriQueryProps},
+ * and using {@link Uri} instead of {@link java.net.URI}.
+ * </p>
+ */
+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<String, String> properties = new HashMap<String, String>();
+
+   private UriQueryProps(final char querySeparator) {
+       query_separator = String.valueOf(querySeparator);
+   }
+
+   public final Map<String, String> 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<Entry<String, String>> entries = properties.entrySet().iterator();
+       while(entries.hasNext()) {
+           if(needsSep) {
+               sb.append(query_separator);
+           }
+           final Entry<String, String> 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 <i>;</i> or <i>&</i>, <i>;</i> is encouraged due to troubles of escaping <i>&</i>.
+    * @return
+    * @throws IllegalArgumentException if <code>querySeparator</code> is illegal, i.e. neither <i>;</i> nor <i>&</i>
+    */
+   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;
+   }
+}
-- 
cgit v1.2.3