code: public static URI buildNewURI( URI referenceUri, String uriSuffix ) throws URISyntaxException {
  
  		if( uriSuffix == null )
  			throw new IllegalArgumentException( "The URI suffix cannot be null." );
  
  		uriSuffix = uriSuffix.replaceAll( "\\\\", "/" );
  		URI importUri = null;
  		try {
  			// Absolute URL ?
  			importUri = urlToUri( new URL( uriSuffix ));
  
  		} catch( Exception e ) {
  			try {
  				// Relative URL ?
  				if( ! referenceUri.toString().endsWith( "/" )
  						&& ! uriSuffix.startsWith( "/" ))
  					referenceUri = new URI( referenceUri.toString() + "/" );
  
  				importUri = referenceUri.resolve( new URI( null, uriSuffix, null ));
  
  			} catch( Exception e2 ) {
  				String msg =
  						"An URI could not be built from the URI " + referenceUri.toString()
  						+ " and the suffix " + uriSuffix + ".";
  				throw new URISyntaxException( msg, e2.getMessage());
  			}
  		}
  
  		return importUri.normalize();
  	}
docs: Builds an URI from an URI and a suffix.
  
  <p>
  This suffix can be an absolute URL, or a relative path
  with respect to the first URI. In this case, the suffix is resolved
  with respect to the URI.
  </p>
  <p>
  If the suffix is already an URL, its is returned.<br>
  If the suffix is a relative file path and cannot be resolved, an exception is thrown.
  </p>
  <p>
  The returned URI is normalized.
  </p>
  
  @param referenceUri the reference URI (can be null)
  @param uriSuffix the URI suffix (not null)
  @return the new URI
  @throws URISyntaxException if the resolution failed