/**
* Copyright 2010 Voxeo Corporation
*
* 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.server.test;
import java.util.HashMap;
import java.util.Iterator;
import java.util.StringTokenizer;
import javax.servlet.sip.SipURI;
import javax.servlet.sip.URI;
import com.rayo.core.sip.SipGrammar;
public class MockSipURI implements SipURI {
private String _user;
private String _host;
private String _uri;
private String _scheme;
private String _password;
private int _port;
private HashMap<String, String> _params = new HashMap<String, String>();
private HashMap<String, String> _headers = new HashMap<String, String>();
public MockSipURI(String uri) {
if (uri != null) {
_uri = uri;
parse();
}
}
final public URI clone() {
return this;
}
@Override
public String getHeader(String arg0) {
return null;
}
@Override
public Iterator<String> getHeaderNames() {
return null;
}
@Override
public String getHost() {
return _host;
}
@Override
public boolean getLrParam() {
return false;
}
@Override
public String getMAddrParam() {
return null;
}
@Override
public String getMethodParam() {
return null;
}
@Override
public int getPort() {
return 0;
}
@Override
public int getTTLParam() {
return 0;
}
@Override
public String getTransportParam() {
return null;
}
@Override
public String getUser() {
return _user;
}
@Override
public String getUserParam() {
return null;
}
@Override
public String getUserPassword() {
return null;
}
@Override
public boolean isSecure() {
return false;
}
@Override
final public void removeHeader(String arg0) {
}
@Override
public void setHeader(String arg0, String arg1) {
}
@Override
public void setHost(String arg0) {
_host = arg0;
}
@Override
public void setLrParam(boolean arg0) {
}
@Override
public void setMAddrParam(String arg0) {
}
@Override
public void setMethodParam(String arg0) {
}
@Override
public void setPort(int arg0) {
}
@Override
public void setSecure(boolean arg0) {
}
@Override
public void setTTLParam(int arg0) {
}
@Override
public void setTransportParam(String arg0) {
}
@Override
public void setUser(String arg0) {
_user = arg0;
}
@Override
public void setUserParam(String arg0) {
}
@Override
public void setUserPassword(String arg0) {
}
@Override
public String getParameter(String name) {
return (String) _params.get(name.toLowerCase());
}
@Override
public Iterator<String> getParameterNames() {
return null;
}
@Override
public String getScheme() {
return "sip";
}
@Override
public boolean isSipURI() {
return true;
}
@Override
public void removeParameter(String arg0) {
}
@Override
public void setParameter(String arg0, String arg1) {
}
private void parse() {
int indexScheme = _uri.indexOf(':');
if (indexScheme < 0)
throw new IllegalArgumentException("Missing SIP scheme. URI=["
+ _uri + "]");
_scheme = _uri.substring(0, indexScheme);
if (!_scheme.equals("sip") && !_scheme.equals("sips"))
throw new IllegalArgumentException("Invalid SIP scheme. URI=["
+ _uri + "]");
int indexUser = _uri.indexOf('@', indexScheme + 1);
int indexHost;
if (indexUser >= 0) {
int indexPassword = _uri.indexOf(':', indexScheme + 1);
String sUser;
if (indexPassword >= 0 && indexPassword < indexUser) {
sUser = _uri.substring(indexScheme + 1, indexPassword);
String sPassword = _uri.substring(indexPassword + 1, indexUser);
if (!SipGrammar.__passwd.containsAll(sPassword))
throw new IllegalArgumentException("Invalid password ["
+ sPassword + "] in URI [" + _uri + "]");
_password = SipGrammar.unescape(sPassword);
} else {
sUser = _uri.substring(indexScheme + 1, indexUser);
}
if (!SipGrammar.__user.containsAll(sUser))
throw new IllegalArgumentException("Invalid user [" + sUser
+ "] in URI [" + _uri + "]");
_user = SipGrammar.unescape(sUser);
indexHost = indexUser + 1;
} else {
indexHost = indexScheme + 1;
}
int indexPort = -1;
if (_uri.charAt(indexHost) == '[') {
int i = _uri.indexOf(']', indexHost);
if (i < 0)
throw new IllegalArgumentException("Invalid IPv6 in " + _uri);
indexPort = _uri.indexOf(':', i);
} else {
indexPort = _uri.indexOf(':', indexHost);
}
int indexParams = _uri.indexOf(';', indexHost);
int indexHeaders = _uri.indexOf('?', indexHost);
if ((indexPort > indexParams && indexParams > -1)
|| (indexPort > indexHeaders && indexHeaders > -1))
indexPort = -1;
int endHost = indexPort;
if (endHost < 0)
endHost = indexParams;
if (endHost < 0)
endHost = indexHeaders;
String host;
if (endHost < 0)
host = _uri.substring(indexHost);
else
host = _uri.substring(indexHost, endHost);
host = host.trim();
if (!SipGrammar.__host.containsAll(host))
throw new IllegalArgumentException("Invalid host [" + host
+ "] in URI [" + _uri + "]");
setHost(host);
if (indexPort < 0) {
_port = -1;
} else {
int endPort = indexParams;
if (endPort < 0)
endPort = indexHeaders;
String sPort;
if (endPort < 0)
sPort = _uri.substring(indexPort + 1);
else
sPort = _uri.substring(indexPort + 1, endPort);
try {
_port = Integer.parseInt(sPort);
} catch (NumberFormatException _) {
throw new IllegalArgumentException("Invalid port number ["
+ sPort + "] in [" + _uri + "]");
}
}
if (indexParams >= 0) {
String params;
if (indexHeaders < 0)
params = _uri.substring(indexParams + 1);
else
params = _uri.substring(indexParams + 1, indexHeaders);
parseParams(params);
}
if (indexHeaders >= 0) {
String headers = _uri.substring(indexHeaders + 1);
parseHeaders(headers);
}
}
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));
}
}
private void parseHeaders(String sHeaders) {
StringTokenizer st = new StringTokenizer(sHeaders, "&");
while (st.hasMoreTokens()) {
String header = st.nextToken();
String name;
String value;
int index = header.indexOf('=');
if (index < 0)
throw new IllegalArgumentException("Missing value in header ["
+ header + "] in uri [" + _uri + "]");
name = header.substring(0, index).trim();
value = header.substring(index + 1).trim();
if (!SipGrammar.__header.containsAll(name))
throw new IllegalArgumentException("Invalid header name ["
+ name + "] in [" + _uri + "]");
if (!SipGrammar.__header.containsAll(value))
throw new IllegalArgumentException("Invalid header value ["
+ value + "] in [" + _uri + "]");
_headers.put(SipGrammar.unescape(name), SipGrammar.unescape(value));
}
}
}