code: public static Map<String, String> parseURIQuery(String uriQuery) throws IllegalArgumentException {
      	if (uriQuery == null || uriQuery.isEmpty()) {
      	    return new HashMap<String, String>(0);
      	}
          String[] queryParts = Utils.splitURIQuery(uriQuery);
          Map<String, String> map = new HashMap<String, String>(queryParts.length);
          for (String queryPart : queryParts) {
              int eqInx = queryPart.indexOf('=');
              String paramName = eqInx < 0 ? queryPart : queryPart.substring(0, eqInx);
              String paramValue = eqInx < 0 ? "" : queryPart.substring(eqInx + 1);
              require(map.put(paramName, paramValue) == null,
                      "Query parameter can only be specified once: " + paramName);
          }
          return map;
      }
docs: Split the given query component of a URI into its decoded parts and return them as
  a name/value map. First, parts delimited by non-encoded '{@literal &}'s are separated. Then,
  each unencoded '+' is replaced with a space within each part. Finally, the parts
  are URL-decoded and stored in the result map keyed by name. For example, if the URI
  is:
  <pre>
  "/foo/bar?a=cat{@literal &}b=dog+%24sheep{@literal &}c"
  </pre>
  The query component can be extracted using
  {@link #splitURI(String, StringBuilder, StringBuilder, StringBuilder)}, yielding:
  <pre>
  "a=cat{@literal &}b=dog+%24sheep{@literal &}c".
  </pre>
  If this string is then passed to this method, it would return the following Map:
  <pre>
  "a": "cat"
  "b": "dog $sheep"
  "c": ""
  </pre>
  As shown, if a parameter has no "=" sign, the whole parameter is used as the name
  and the value is an empty string. This method calls {@link #splitURIQuery(String)}.
  
  @param uriQuery                  Query component of a URI (cannot be null).
  @return                          A map of decoded parameter name/value pairs.
  @throws IllegalArgumentException If a parameter is specified twice.