package org.xmind.ui.internal.editor; import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.Iterator; import org.eclipse.core.runtime.Assert; public final class URIParser { private URIParser() { throw new AssertionError(); } public static String quote(String str) { try { return URLEncoder.encode(str, "UTF-8"); //$NON-NLS-1$ } catch (UnsupportedEncodingException e) { throw new IllegalStateException(e); } } public static String unquote(String str) { try { return URLDecoder.decode(str, "UTF-8"); //$NON-NLS-1$ } catch (UnsupportedEncodingException e) { throw new IllegalStateException(e); } } public static final class QueryParameter { public final String name; public final String value; private QueryParameter(String name, String value) { this.name = name; this.value = value; } } public static Iterator<QueryParameter> iterateQueryParameters(URI uri) { final String query = uri.getQuery(); return new Iterator<QueryParameter>() { int pos = 0; QueryParameter next = findNext(); public boolean hasNext() { return next != null; } public QueryParameter next() { QueryParameter n = this.next; this.next = findNext(); return n; } public void remove() { } private QueryParameter findNext() { if (query == null) return null; String param; int sep; if (pos < 0) return null; sep = query.indexOf('&', pos); if (sep < 0) { param = query.substring(pos); pos = -1; } else { param = query.substring(pos, sep); pos = sep + 1; } sep = param.indexOf('='); if (sep < 0) { return new QueryParameter(unquote(param.substring(0)), ""); //$NON-NLS-1$ } else { return new QueryParameter(unquote(param.substring(0, sep)), unquote(param.substring(sep + 1))); } } }; } public static String getQueryParameter(URI uri, String name) { Assert.isNotNull(uri); Assert.isNotNull(name); Iterator<QueryParameter> it = iterateQueryParameters(uri); while (it.hasNext()) { QueryParameter param = it.next(); if (name.equals(param.name)) return param.value; } return null; } public static URI appendQueryParameter(URI uri, QueryParameter param) { return appendQueryParameter(uri, param.name, param.value); } public static URI appendQueryParameter(URI uri, String name, String value) { String query = uri.getQuery(); if (name != null && name.length() > 0) { if (query != null && query.length() > 0) { query = query + "&" + quote(name); //$NON-NLS-1$ } else { query = quote(name); } if (value != null && value.length() > 0) { query = query + "=" + quote(value); //$NON-NLS-1$ } } try { return new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), uri.getPath(), query, uri.getFragment()); } catch (URISyntaxException e) { throw new IllegalArgumentException(e); } } }