// ======================================================================== // Copyright 2008-2009 NEXCOM Systems // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ======================================================================== package com.rayo.core.sip; import java.util.HashMap; import java.util.Iterator; import java.util.StringTokenizer; public class BaseURI { static final long serialVersionUID = -8927516108461106171L; private String _uri; private String _scheme; private String _file; private HashMap<String, String> _params = new HashMap<String, String>(); protected BaseURI() {} public BaseURI(String uri) { _uri = uri; parse(); } private void parse() { int indexScheme = _uri.indexOf(':'); if (indexScheme < 0) throw new IllegalArgumentException("Missing scheme in uri [" + _uri + "]"); _scheme = _uri.substring(0, indexScheme); if (!SipGrammar.isURIScheme(_scheme)) throw new IllegalArgumentException("Invalid scheme [" + _scheme + "] in uri [" + _uri + "]"); int indexParam = _uri.indexOf(';', indexScheme); if (indexParam < 0) { _file = _uri.substring(indexScheme + 1); } else { _file = _uri.substring(indexScheme + 1, indexParam); String sParams = _uri.substring(indexParam + 1); parseParams(sParams); } } private void parseParams(String sParams) { StringTokenizer st = new StringTokenizer(sParams, ";"); while (st.hasMoreTokens()) { String param = st.nextToken(); String name; String value; int index = param.indexOf('='); if (index < 0) { name = param.trim(); value = ""; } else { name = param.substring(0, index).trim(); value = param.substring(index + 1).trim(); } if (!SipGrammar.__param.containsAll(name)) { throw new IllegalArgumentException("Invalid parameter name [" + name + "] in [" + _uri + "]"); } if (!SipGrammar.__param.containsAll(value)) { throw new IllegalArgumentException("Invalid parameter value [" + value + "] in [" + _uri + "]"); } _params.put(SipGrammar.unescape(name.toLowerCase()), SipGrammar.unescape(value)); } } public boolean isSipURI() { return false; } public String getScheme() { return _scheme; } @Override public boolean equals(Object o) { if (o == null || !(o instanceof BaseURI)) return false; BaseURI uri = (BaseURI) o; if (!_scheme.equals(uri.getScheme())) return false; // FIXME improve equals if (!toString().equals(uri.toString())) return false; return true; } @Override public int hashCode() { return toString().hashCode(); } @Override public BaseURI clone() { try { return (BaseURI) super.clone(); } catch (CloneNotSupportedException _) { throw new RuntimeException(); } } public String toString() { if (_uri != null) return _uri; StringBuffer sb = new StringBuffer(); sb.append(_scheme).append(":"); sb.append(_file); Iterator<String> it = getParameterNames(); while (it.hasNext()) { String name = (String) it.next(); String value = getParameter(name); sb.append(';'); sb.append(SipGrammar.escape(name, SipGrammar.__param)); if (value != null && value.length() > 0) { sb.append('='); sb.append(SipGrammar.escape(value, SipGrammar.__param)); } } return sb.toString(); } public String getParameter(String name) { return _params.get(name.toLowerCase()); } public void removeParameter(String name) { _uri = null; _params.remove(name); } public void setParameter(String name, String value) { if (name == null || value == null) throw new NullPointerException("Null value or name"); _uri = null; _params.put(name, value); } public synchronized Iterator<String> getParameterNames() { return _params.keySet().iterator(); } }