}
DcrUtils dcrUtils = DcrUtils.getInstance();
if (name.startsWith("request.uri")) {
URI uri = dcrUtils.canonicalize(request.getRequestURI());
if (name.startsWith("request.uri.resolve")) {
if (UriUtil.isTelephoneNumber(uri)) {
URI resolvedUri = dcrUtils.transformURI(uri);
if (resolvedUri != null) {
uri = resolvedUri;
} else {
uri = dcrUtils.normalize(uri);
}
}
if (name.endsWith("uri.resolve")) {
return uri.toString();
}
if (name.endsWith("uri.resolve.user")) {
return dcrUtils.getUserOrPhoneNumber(uri);
}
if (name.endsWith("uri.resolve.host")) {
if (uri.isSipURI()) {
return ((SipURI) uri).getHost();
}
}
}
// request.uri
// request.uri.scheme
// request.uri.user
// request.uri.host
// request.uri.port
// request.method
if (name.equals("request.uri")) {
return uri.toString();
}
if (name.equals("request.uri.scheme")) {
return uri.getScheme();
}
if (name.equals("request.uri.user")) {
return dcrUtils.getUserOrPhoneNumber(dcrUtils.normalize(uri));
}
if (name.equals("request.uri.host")) {
if (uri.isSipURI()) {
return ((SipURI) uri).getHost();
} else {
Matcher matcher = genericUriPattern.matcher(uri.toString());
if (matcher.find()) {
// Found matching user in regexp.
String host = matcher.group(3);
if (host == null) {
host = matcher.group(5);
}
return host;
} else {
return null;
}
}
}
if (name.equals("request.uri.port")) {
if (uri.isSipURI()) {
return Integer.toString(((SipURI) uri).getPort());
} else {
Matcher matcher = genericUriPattern.matcher(uri.toString());
if (matcher.find()) {
// Found matching user in regexp.
return matcher.group(4);
} else {
return null;
}
}
}
}
if (name.equals("request.method")) {
return request.getMethod();
}
// General Headers
//
// request.<header>
// request.<header>.uri
// request.<header>.uri.scheme
// request.<header>.uri.user
// request.<header>.uri.host
// request.<header>.uri.port
// request.<header>.uri.display-name
// request.<header>.uri.resolve
// request.<header>.uri.resolve.user
// request.<header>.uri.resolve.host
else if (name.startsWith("request.")) {
StringTokenizer token = new StringTokenizer(name, ".");
int ntok = token.countTokens();
String[] elements = new String[ntok];
for (int i = 0; i < ntok; i++) {
elements[i] = token.nextToken();
}
// request.<header>
if (elements.length == 2) {
return request.getHeader(elements[1]);
}
// Use getAddressHeaderImpl to retrieve the AddressImpl.
// getAddressHeader returns a wrapper around the Address.
SipServletRequestImpl requestImpl = (SipServletRequestImpl) request;
// request.<header>.uri
if ((elements.length > 2) && "uri".equals(elements[2])) {
try {
URI canonicalizedHeaderUri = dcrUtils.canonicalize(requestImpl.getAddressHeaderImpl(
elements[1]).getURI());
// check if the mapping ends with uri
if ((elements.length < 4) && "uri".equals(elements[2])) {
return (canonicalizedHeaderUri != null)
? dcrUtils.normalize(canonicalizedHeaderUri).toString()
: null;
}
// Handle request.<header>.uri.scheme
if ("scheme".equals(elements[3])) {
return canonicalizedHeaderUri.getScheme();
}
// request.<header>.uri.display-name
if ("display-name".equals(elements[3])) {
return requestImpl.getAddressHeaderImpl(elements[1])
.getDisplayName();
}
// Handle request.<header>.uri.user
if ("user".equals(elements[3])) {
URI normalizedUri = dcrUtils.normalize(canonicalizedHeaderUri);
String user = dcrUtils.getUserOrPhoneNumber(normalizedUri);
if (user != null) {
return user;
} else {
Matcher matcher = genericUriPattern.matcher(normalizedUri.toString());
if (matcher.find()) {
// Found matching user in regexp.
user = matcher.group(1);
if (user == null) {
user = matcher.group(2);
}
return user;
} else {
return null;
}
}
}
// Handle request.<header>.uri.host
if ("host".equals(elements[3])) {
if (canonicalizedHeaderUri.isSipURI()) {
return ((SipURI) canonicalizedHeaderUri).getHost();
} else {
Matcher matcher = genericUriPattern.matcher(canonicalizedHeaderUri.toString());
if (matcher.find()) {
// Found matching user in regexp.
String host = matcher.group(3);
if (host == null) {
host = matcher.group(5);
}
return host;
} else {
return null;
}
}
}
// Handle request.<header>.uri.port
if ("port".equals(elements[3])) {
if (canonicalizedHeaderUri.isSipURI()) {
return ((SipURI) canonicalizedHeaderUri).getPort() +
"";
} else {
Matcher matcher = genericUriPattern.matcher(canonicalizedHeaderUri.toString());
if (matcher.find()) {
// Found matching user in regexp.
return matcher.group(4);
} else {
return null;
}
}
}
// Handle request.<header>.uri.resolve
if ("resolve".equals(elements[3])) {
URI transformedUri = dcrUtils.transformURI(canonicalizedHeaderUri);
if ((transformedUri == null) &&
UriUtil.isTelephoneNumber(
canonicalizedHeaderUri)) {
transformedUri = dcrUtils.normalize(canonicalizedHeaderUri);
}
if (transformedUri != null) {
if (name.endsWith("uri.resolve")) {
return transformedUri.toString();
}
if (name.endsWith("uri.resolve.user")) {
return dcrUtils.getUserOrPhoneNumber(transformedUri);
}
if (name.endsWith("uri.resolve.host")) {
if (transformedUri.isSipURI()) {
return ((SipURI) transformedUri).getHost();
}
}
} else {
return null;