package com.idega.util; import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; import java.util.StringTokenizer; import java.util.logging.Level; import java.util.logging.Logger; /** * @author <a href="mailto:civilis@idega.com">Vytautas Čivilis</a> * @version $Revision$ * * Last modified: $Date$ by $Author$ */ public class URIUtil { private String uri; private Map<String, String> parameters; public URIUtil() { this(CoreConstants.EMPTY); } public URIUtil(String uriStr) { setUri(uriStr); } public void setUri(String uri) { parameters = null; this.uri = uri; } public Map<String, String> getParameters() { if(parameters == null) parameters = new HashMap<String, String>(); if(uri != null) { try { String query = new URI(uri).getQuery(); if(StringUtil.isEmpty(query)) return parameters; StringTokenizer st = new StringTokenizer(query, CoreConstants.AMP, false); while (st.hasMoreTokens()) { String current = st.nextToken(); if(current.contains(CoreConstants.EQ)) { int eqOcc = current.indexOf(CoreConstants.EQ); parameters.put(URLDecoder.decode(current.substring(0, eqOcc), CoreConstants.ENCODING_UTF8), URLDecoder.decode(current.substring(eqOcc+1), CoreConstants.ENCODING_UTF8)); } } } catch (Exception e) { parameters = null; Logger.getLogger(getClass().getName()).log(Level.SEVERE, e.getMessage()); } } else { Logger.getLogger(getClass().getName()).log(Level.WARNING, "No uri while resolving uri parameters"); } return parameters; } public void setParameter(String key, String value) { if (StringUtil.isEmpty(key) || StringUtil.isEmpty(value)) { Logger.getLogger(getClass().getName()).log(Level.WARNING, "Invalid parameter ('"+key+"') or/and it's value ('"+value+"')"); return; } if(parameters == null) parameters = getParameters(); String notEncodedKey = key; String notEncodedValue = value; try { key = URLEncoder.encode(key, CoreConstants.ENCODING_UTF8); value = URLEncoder.encode(value, CoreConstants.ENCODING_UTF8); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } String query; try { query = new URI(uri).getRawQuery(); } catch (URISyntaxException e) { Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, e.getMessage()); return; } if(query == null) query = CoreConstants.EMPTY; String nonQuery = uri.substring(0, uri.lastIndexOf(query)); if(parameters.containsKey(notEncodedKey)) { StringTokenizer st = new StringTokenizer(query, CoreConstants.AMP, false); StringBuilder newquery = new StringBuilder(CoreConstants.EMPTY); while (st.hasMoreTokens()) { String current = st.nextToken(); if(!current.startsWith(key)) { newquery.append(current); if(st.hasMoreTokens()) newquery.append(CoreConstants.AMP); } } query = newquery.toString(); } uri = new StringBuilder(nonQuery) .append(nonQuery.endsWith(CoreConstants.QMARK) ? CoreConstants.EMPTY : CoreConstants.QMARK) .append(query) .append(CoreConstants.EMPTY.equals(query) ? CoreConstants.EMPTY : CoreConstants.AMP) .append(key) .append(CoreConstants.EQ) .append(value) .toString(); parameters.put(notEncodedKey, notEncodedValue); } public String getUri() { return uri; } }