/*
* Conditions Of Use
*
* This software was developed by employees of the National Institute of
* Standards and Technology (NIST), an agency of the Federal Government.
* Pursuant to title 15 Untied States Code Section 105, works of NIST
* employees are not subject to copyright protection in the United States
* and are considered to be in the public domain. As a result, a formal
* license is not needed to use the software.
*
* This software is provided by NIST as a service and is expressly
* provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
* AND DATA ACCURACY. NIST does not warrant or make any representations
* regarding the use of the software or the results thereof, including but
* not limited to the correctness, accuracy, reliability or usefulness of
* the software.
*
* Permission to use this software is contingent upon your acceptance
* of the terms of this agreement.
*
*/
/*******************************************************************************
* Product of NIST/ITL Advanced Networking Technologies Division (ANTD). *
*******************************************************************************/
package gov.nist.javax.sip.header;
import gov.nist.javax.sip.header.ims.*; /* IMS headers - issued by Miguel Freitas */
import gov.nist.javax.sip.header.extensions.*; // extension headers - pmusgrave
import javax.sip.header.*;
import gov.nist.javax.sip.parser.*;
import gov.nist.javax.sip.parser.extensions.ReferencesParser;
import javax.sip.address.*;
import java.text.ParseException;
import javax.sip.InvalidArgumentException;
import java.util.*;
import gov.nist.javax.sip.address.*;
/*
* This file contains enhancements contributed by Alexandre Silva Santos
* (PT-Inovacao) and Miguel Freitas
*/
/** Implementation of the JAIN SIP HeaderFactory
*
* @version 1.2 $Revision: 1.22 $ $Date: 2010/01/12 18:58:48 $
* @since 1.1
*
*@author M. Ranganathan <br/>
*@author Olivier Deruelle <br/>
*
*
*/
public class HeaderFactoryImpl implements HeaderFactory , HeaderFactoryExt {
/**
* Determines whether or not we should tolerate and strip address scope
* zones from IPv6 addresses. Address scope zones are sometimes returned
* at the end of IPv6 addresses generated by InetAddress.getHostAddress().
* They are however not part of the SIP semantics so basically this method
* determines whether or not the parser should be stripping them (as
* opposed simply being blunt and throwing an exception).
*/
private boolean stripAddressScopeZones = false;
/**
* Set pretty encoding on / off.
* This splits up via headers into multiple lines for readability ( better for
* debugging ).
*
*/
public void setPrettyEncoding(boolean flag) {
SIPHeaderList.setPrettyEncode(flag);
}
/**
* Creates a new AcceptEncodingHeader based on the newly supplied encoding
* value.
*
* @param encoding - the new string containing the encoding value.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the encoding value.
* @return the newly created AcceptEncodingHeader object.
*/
public AcceptEncodingHeader createAcceptEncodingHeader(String encoding)
throws ParseException {
if (encoding == null)
throw new NullPointerException("the encoding parameter is null");
AcceptEncoding acceptEncoding = new AcceptEncoding();
acceptEncoding.setEncoding(encoding);
return acceptEncoding;
}
/**
* Creates a new AcceptHeader based on the newly supplied contentType and
* contentSubType values.
*
* @param contentType The new string content type value.
* @param contentSubType The new string content sub-type value.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the content type or content subtype value.
* @return the newly created AcceptHeader object.
*/
public AcceptHeader createAcceptHeader(
String contentType,
String contentSubType)
throws ParseException {
if (contentType == null || contentSubType == null)
throw new NullPointerException("contentType or subtype is null ");
Accept accept = new Accept();
accept.setContentType(contentType);
accept.setContentSubType(contentSubType);
return accept;
}
/**
* Creates a new AcceptLanguageHeader based on the newly supplied
* language value.
*
* @param language - the new Locale value of the language
* @return the newly created AcceptLanguageHeader object.
*/
public AcceptLanguageHeader createAcceptLanguageHeader(Locale language) {
if (language == null)
throw new NullPointerException("null arg");
AcceptLanguage acceptLanguage = new AcceptLanguage();
acceptLanguage.setAcceptLanguage(language);
return acceptLanguage;
}
/**
* Creates a new AlertInfoHeader based on the newly supplied alertInfo value.
*
* @param alertInfo - the new URI value of the alertInfo
* @return the newly created AlertInfoHeader object.
* @since v1.1
*/
public AlertInfoHeader createAlertInfoHeader(URI alertInfo) {
if (alertInfo == null)
throw new NullPointerException("null arg alertInfo");
AlertInfo a = new AlertInfo();
a.setAlertInfo(alertInfo);
return a;
}
/**
* Creates a new AllowEventsHeader based on the newly supplied event type
* value.
*
* @param eventType - the new string containing the eventType value.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the eventType value.
* @return the newly created AllowEventsHeader object.
* @since v1.1
*/
public AllowEventsHeader createAllowEventsHeader(String eventType)
throws ParseException {
if (eventType == null)
throw new NullPointerException("null arg eventType");
AllowEvents allowEvents = new AllowEvents();
allowEvents.setEventType(eventType);
return allowEvents;
}
/**
* Creates a new AllowHeader based on the newly supplied method value.
*
* @param method - the new string containing the method value.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the method value.
* @return the newly created AllowHeader object.
*/
public AllowHeader createAllowHeader(String method) throws ParseException {
if (method == null)
throw new NullPointerException("null arg method");
Allow allow = new Allow();
allow.setMethod(method);
return allow;
}
/**
* Creates a new AuthenticationInfoHeader based on the newly supplied
* response value.
*
* @param response - the new string value of the response.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the response value.
* @return the newly created AuthenticationInfoHeader object.
* @since v1.1
*/
public AuthenticationInfoHeader createAuthenticationInfoHeader(String response)
throws ParseException {
if (response == null)
throw new NullPointerException("null arg response");
AuthenticationInfo auth = new AuthenticationInfo();
auth.setResponse(response);
return auth;
}
/**
* Creates a new AuthorizationHeader based on the newly supplied
* scheme value.
*
* @param scheme - the new string value of the scheme.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the scheme value.
* @return the newly created AuthorizationHeader object.
*/
public AuthorizationHeader createAuthorizationHeader(String scheme)
throws ParseException {
if (scheme == null)
throw new NullPointerException("null arg scheme ");
Authorization auth = new Authorization();
auth.setScheme(scheme);
return auth;
}
/**
* Creates a new CSeqHeader based on the newly supplied sequence number and
* method values.
*
* @param sequenceNumber - the new integer value of the sequence number.
* @param method - the new string value of the method.
* @throws InvalidArgumentException if supplied sequence number is less
* than zero.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the method value.
* @return the newly created CSeqHeader object.
*/
public CSeqHeader createCSeqHeader( long sequenceNumber, String method)
throws ParseException, InvalidArgumentException {
if (sequenceNumber < 0)
throw new InvalidArgumentException("bad arg " + sequenceNumber);
if (method == null)
throw new NullPointerException("null arg method");
CSeq cseq = new CSeq();
cseq.setMethod(method);
cseq.setSeqNumber(sequenceNumber);
return cseq;
}
/**
* For backwards compatibility, also accept int
* @deprecated
*/
public CSeqHeader createCSeqHeader( int sequenceNumber, String method)
throws ParseException, InvalidArgumentException {
return this.createCSeqHeader( (long) sequenceNumber, method );
}
/**
* Creates a new CallIdHeader based on the newly supplied callId value.
*
* @param callId - the new string value of the call-id.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the callId value.
* @return the newly created CallIdHeader object.
*/
public CallIdHeader createCallIdHeader(String callId)
throws ParseException {
if (callId == null)
throw new NullPointerException("null arg callId");
CallID c = new CallID();
c.setCallId(callId);
return c;
}
/**
* Creates a new CallInfoHeader based on the newly supplied callInfo value.
*
* @param callInfo The new string value of the callInfo.
* @return the newly created CallInfoHeader object.
*/
public CallInfoHeader createCallInfoHeader(URI callInfo) {
if (callInfo == null)
throw new NullPointerException("null arg callInfo");
CallInfo c = new CallInfo();
c.setInfo(callInfo);
return c;
}
/**
* Creates a new ContactHeader based on the newly supplied address value.
*
* @param address - the new Address value of the address.
* @return the newly created ContactHeader object.
*/
public ContactHeader createContactHeader(Address address) {
if (address == null)
throw new NullPointerException("null arg address");
Contact contact = new Contact();
contact.setAddress(address);
return contact;
}
/**
* Creates a new wildcard ContactHeader. This is used in Register requests
* to indicate to the server that it should remove all locations the
* at which the user is currently available. This implies that the
* following conditions are met:
* <ul>
* <li><code>ContactHeader.getAddress.getAddress.getUserInfo() == *;</code>
* <li><code>ContactHeader.getAddress.getAddress.isWildCard() == true;</code>
* <li><code>ContactHeader.getExpires() == 0;</code>
* </ul>
*
* @return the newly created wildcard ContactHeader.
*/
public ContactHeader createContactHeader() {
Contact contact = new Contact();
contact.setWildCardFlag(true);
contact.setExpires(0);
return contact;
}
/**
* Creates a new ContentDispositionHeader based on the newly supplied
* contentDisposition value.
*
* @param contentDisposition - the new string value of the contentDisposition.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the contentDisposition value.
* @return the newly created ContentDispositionHeader object.
* @since v1.1
*/
public ContentDispositionHeader createContentDispositionHeader(String contentDisposition)
throws ParseException {
if (contentDisposition == null)
throw new NullPointerException("null arg contentDisposition");
ContentDisposition c = new ContentDisposition();
c.setDispositionType(contentDisposition);
return c;
}
/**
* Creates a new ContentEncodingHeader based on the newly supplied encoding
* value.
*
* @param encoding - the new string containing the encoding value.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the encoding value.
* @return the newly created ContentEncodingHeader object.
*/
public ContentEncodingHeader createContentEncodingHeader(String encoding)
throws ParseException {
if (encoding == null)
throw new NullPointerException("null encoding");
ContentEncoding c = new ContentEncoding();
c.setEncoding(encoding);
return c;
}
/**
* Creates a new ContentLanguageHeader based on the newly supplied
* contentLanguage value.
*
* @param contentLanguage - the new Locale value of the contentLanguage.
* @return the newly created ContentLanguageHeader object.
* @since v1.1
*/
public ContentLanguageHeader createContentLanguageHeader(Locale contentLanguage) {
if (contentLanguage == null)
throw new NullPointerException("null arg contentLanguage");
ContentLanguage c = new ContentLanguage();
c.setContentLanguage(contentLanguage);
return c;
}
/**
* Creates a new CSeqHeader based on the newly supplied contentLength value.
*
* @param contentLength - the new integer value of the contentLength.
* @throws InvalidArgumentException if supplied contentLength is less
* than zero.
* @return the newly created ContentLengthHeader object.
*/
public ContentLengthHeader createContentLengthHeader(int contentLength)
throws InvalidArgumentException {
if (contentLength < 0)
throw new InvalidArgumentException("bad contentLength");
ContentLength c = new ContentLength();
c.setContentLength(contentLength);
return c;
}
/**
* Creates a new ContentTypeHeader based on the newly supplied contentType and
* contentSubType values.
*
* @param contentType - the new string content type value.
* @param contentSubType - the new string content sub-type value.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the content type or content subtype value.
* @return the newly created ContentTypeHeader object.
*/
public ContentTypeHeader createContentTypeHeader(
String contentType,
String contentSubType)
throws ParseException {
if (contentType == null || contentSubType == null)
throw new NullPointerException("null contentType or subType");
ContentType c = new ContentType();
c.setContentType(contentType);
c.setContentSubType(contentSubType);
return c;
}
/**
* Creates a new DateHeader based on the newly supplied date value.
*
* @param date - the new Calender value of the date.
* @return the newly created DateHeader object.
*/
public DateHeader createDateHeader(Calendar date) {
SIPDateHeader d = new SIPDateHeader();
if (date == null)
throw new NullPointerException("null date");
d.setDate(date);
return d;
}
/**
* Creates a new EventHeader based on the newly supplied eventType value.
*
* @param eventType - the new string value of the eventType.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the eventType value.
* @return the newly created EventHeader object.
* @since v1.1
*/
public EventHeader createEventHeader(String eventType)
throws ParseException {
if (eventType == null)
throw new NullPointerException("null eventType");
Event event = new Event();
event.setEventType(eventType);
return event;
}
/**
* Creates a new ExpiresHeader based on the newly supplied expires value.
*
* @param expires - the new integer value of the expires.
* @throws InvalidArgumentException if supplied expires is less
* than zero.
* @return the newly created ExpiresHeader object.
*/
public ExpiresHeader createExpiresHeader(int expires)
throws InvalidArgumentException {
if (expires < 0)
throw new InvalidArgumentException("bad value " + expires);
Expires e = new Expires();
e.setExpires(expires);
return e;
}
/**
* Creates a new ExtensionHeader based on the newly supplied name and
* value values.
*
* @param name - the new string name of the ExtensionHeader value.
* @param value - the new string value of the ExtensionHeader.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the name or value values.
* @return the newly created ExtensionHeader object.
*/
public javax.sip.header.ExtensionHeader createExtensionHeader(
String name,
String value)
throws ParseException {
if (name == null)
throw new NullPointerException("bad name");
gov.nist.javax.sip.header.ExtensionHeaderImpl ext =
new gov.nist.javax.sip.header.ExtensionHeaderImpl();
ext.setName(name);
ext.setValue(value);
return ext;
}
/**
* Creates a new FromHeader based on the newly supplied address and
* tag values.
*
* @param address - the new Address object of the address.
* @param tag - the new string value of the tag.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the tag value.
* @return the newly created FromHeader object.
*/
public FromHeader createFromHeader(Address address, String tag)
throws ParseException {
if (address == null)
throw new NullPointerException("null address arg");
From from = new From();
from.setAddress(address);
if (tag != null)
from.setTag(tag);
return from;
}
/**
* Creates a new InReplyToHeader based on the newly supplied callId
* value.
*
* @param callId - the new string containing the callId value.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the callId value.
* @return the newly created InReplyToHeader object.
* @since v1.1
*/
public InReplyToHeader createInReplyToHeader(String callId)
throws ParseException {
if (callId == null)
throw new NullPointerException("null callId arg");
InReplyTo inReplyTo = new InReplyTo();
inReplyTo.setCallId(callId);
return inReplyTo;
}
/**
* Creates a new MaxForwardsHeader based on the newly
* supplied maxForwards value.
*
* @param maxForwards The new integer value of the maxForwards.
* @throws InvalidArgumentException if supplied maxForwards is less
* than zero or greater than 255.
* @return the newly created MaxForwardsHeader object.
*/
public MaxForwardsHeader createMaxForwardsHeader(int maxForwards)
throws InvalidArgumentException {
if (maxForwards < 0 || maxForwards > 255)
throw new InvalidArgumentException(
"bad maxForwards arg " + maxForwards);
MaxForwards m = new MaxForwards();
m.setMaxForwards(maxForwards);
return m;
}
/**
* Creates a new MimeVersionHeader based on the newly
* supplied mimeVersion value.
*
* @param majorVersion - the new integer value of the majorVersion.
* @param minorVersion - the new integer value of the minorVersion.
* @throws InvalidArgumentException if supplied mimeVersion is less
* than zero.
* @return the newly created MimeVersionHeader object.
* @since v1.1
*/
public MimeVersionHeader createMimeVersionHeader(
int majorVersion,
int minorVersion)
throws InvalidArgumentException {
if (majorVersion < 0 || minorVersion < 0)
throw new javax.sip.InvalidArgumentException(
"bad major/minor version");
MimeVersion m = new MimeVersion();
m.setMajorVersion(majorVersion);
m.setMinorVersion(minorVersion);
return m;
}
/**
* Creates a new MinExpiresHeader based on the newly supplied minExpires value.
*
* @param minExpires - the new integer value of the minExpires.
* @throws InvalidArgumentException if supplied minExpires is less
* than zero.
* @return the newly created MinExpiresHeader object.
* @since v1.1
*/
public MinExpiresHeader createMinExpiresHeader(int minExpires)
throws InvalidArgumentException {
if (minExpires < 0)
throw new InvalidArgumentException("bad minExpires " + minExpires);
MinExpires min = new MinExpires();
min.setExpires(minExpires);
return min;
}
/**
* Creates a new MinSEHeader based on the newly supplied expires value.
*
* @param expires - the new integer value of the expires.
* @throws InvalidArgumentException if supplied expires is less
* than zero.
* @return the newly created ExpiresHeader object.
*
* TODO: Once interfaces are in javax, change the type to MinSEHeader
* and add to HeaderFactory. - pmusgrave
*
* pmusgrave
*/
public ExtensionHeader createMinSEHeader(int expires)
throws InvalidArgumentException {
if (expires < 0)
throw new InvalidArgumentException("bad value " + expires);
MinSE e = new MinSE();
e.setExpires(expires);
return e;
}
/**
* Creates a new OrganizationHeader based on the newly supplied
* organization value.
*
* @param organization - the new string value of the organization.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the organization value.
* @return the newly created OrganizationHeader object.
*/
public OrganizationHeader createOrganizationHeader(String organization)
throws ParseException {
if (organization == null)
throw new NullPointerException("bad organization arg");
Organization o = new Organization();
o.setOrganization(organization);
return o;
}
/**
* Creates a new PriorityHeader based on the newly supplied priority value.
*
* @param priority - the new string value of the priority.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the priority value.
* @return the newly created PriorityHeader object.
*/
public PriorityHeader createPriorityHeader(String priority)
throws ParseException {
if (priority == null)
throw new NullPointerException("bad priority arg");
Priority p = new Priority();
p.setPriority(priority);
return p;
}
/**
* Creates a new ProxyAuthenticateHeader based on the newly supplied
* scheme value.
*
* @param scheme - the new string value of the scheme.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the scheme value.
* @return the newly created ProxyAuthenticateHeader object.
*/
public ProxyAuthenticateHeader createProxyAuthenticateHeader(String scheme)
throws ParseException {
if (scheme == null)
throw new NullPointerException("bad scheme arg");
ProxyAuthenticate p = new ProxyAuthenticate();
p.setScheme(scheme);
return p;
}
/**
* Creates a new ProxyAuthorizationHeader based on the newly supplied
* scheme value.
*
* @param scheme - the new string value of the scheme.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the scheme value.
* @return the newly created ProxyAuthorizationHeader object.
*/
public ProxyAuthorizationHeader createProxyAuthorizationHeader(String scheme)
throws ParseException {
if (scheme == null)
throw new NullPointerException("bad scheme arg");
ProxyAuthorization p = new ProxyAuthorization();
p.setScheme(scheme);
return p;
}
/**
* Creates a new ProxyRequireHeader based on the newly supplied optionTag
* value.
*
* @param optionTag - the new string OptionTag value.
* @return the newly created ProxyRequireHeader object.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the optionTag value.
*/
public ProxyRequireHeader createProxyRequireHeader(String optionTag)
throws ParseException {
if (optionTag == null)
throw new NullPointerException("bad optionTag arg");
ProxyRequire p = new ProxyRequire();
p.setOptionTag(optionTag);
return p;
}
/**
* Creates a new RAckHeader based on the newly supplied rSeqNumber,
* cSeqNumber and method values.
*
* @param rSeqNumber - the new integer value of the rSeqNumber.
* @param cSeqNumber - the new integer value of the cSeqNumber.
* @param method - the new string value of the method.
* @throws InvalidArgumentException if supplied rSeqNumber or cSeqNumber is
* less than zero or greater than than 2**31-1.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the method value.
* @return the newly created RAckHeader object.
* @since v1.1
*/
public RAckHeader createRAckHeader(
long rSeqNumber,
long cSeqNumber,
String method)
throws InvalidArgumentException, ParseException {
if (method == null)
throw new NullPointerException("Bad method");
if (cSeqNumber < 0 || rSeqNumber < 0)
throw new InvalidArgumentException("bad cseq/rseq arg");
RAck rack = new RAck();
rack.setMethod(method);
rack.setCSequenceNumber(cSeqNumber);
rack.setRSequenceNumber(rSeqNumber);
return rack;
}
/**
* @deprecated
* @see javax.sip.header.HeaderFactory#createRAckHeader(int, int, java.lang.String)
*/
public RAckHeader createRAckHeader(int rSeqNumber, int cSeqNumber, String method) throws InvalidArgumentException, ParseException {
return createRAckHeader((long)rSeqNumber, (long)cSeqNumber, method);
}
/**
* @deprecated
* @see javax.sip.header.HeaderFactory#createRSeqHeader(int)
*/
public RSeqHeader createRSeqHeader(int sequenceNumber) throws InvalidArgumentException {
return createRSeqHeader((long) sequenceNumber) ;
}
/**
* Creates a new RSeqHeader based on the newly supplied sequenceNumber value.
*
* @param sequenceNumber - the new integer value of the sequenceNumber.
* @throws InvalidArgumentException if supplied sequenceNumber is
* less than zero or greater than than 2**31-1.
* @return the newly created RSeqHeader object.
* @since v1.1
*/
public RSeqHeader createRSeqHeader(long sequenceNumber)
throws InvalidArgumentException {
if (sequenceNumber < 0)
throw new InvalidArgumentException(
"invalid sequenceNumber arg " + sequenceNumber);
RSeq rseq = new RSeq();
rseq.setSeqNumber(sequenceNumber);
return rseq;
}
/**
* Creates a new ReasonHeader based on the newly supplied reason value.
*
* @param protocol - the new string value of the protocol.
* @param cause - the new integer value of the cause.
* @param text - the new string value of the text.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the protocol, cause or text value.
* @return the newly created ReasonHeader object.
* @since v1.1
*/
public ReasonHeader createReasonHeader(
String protocol,
int cause,
String text)
throws InvalidArgumentException, ParseException {
if (protocol == null)
throw new NullPointerException("bad protocol arg");
if (cause < 0)
throw new InvalidArgumentException("bad cause");
Reason reason = new Reason();
reason.setProtocol(protocol);
reason.setCause(cause);
reason.setText(text);
return reason;
}
/**
* Creates a new RecordRouteHeader based on the newly supplied address value.
*
* @param address - the new Address object of the address.
* @return the newly created RecordRouteHeader object.
*/
public RecordRouteHeader createRecordRouteHeader(Address address) {
if ( address == null) throw new NullPointerException("Null argument!");
RecordRoute recordRoute = new RecordRoute();
recordRoute.setAddress(address);
return recordRoute;
}
/**
* Creates a new ReplyToHeader based on the newly supplied address value.
*
* @param address - the new Address object of the address.
* @return the newly created ReplyToHeader object.
* @since v1.1
*/
public ReplyToHeader createReplyToHeader(Address address) {
if (address == null)
throw new NullPointerException("null address");
ReplyTo replyTo = new ReplyTo();
replyTo.setAddress(address);
return replyTo;
}
/**
* Creates a new RequireHeader based on the newly supplied optionTag
* value.
*
* @param optionTag - the new string value containing the optionTag value.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the List of optionTag value.
* @return the newly created RequireHeader object.
*/
public RequireHeader createRequireHeader(String optionTag)
throws ParseException {
if (optionTag == null)
throw new NullPointerException("null optionTag");
Require require = new Require();
require.setOptionTag(optionTag);
return require;
}
/**
* Creates a new RetryAfterHeader based on the newly supplied retryAfter
* value.
*
* @param retryAfter - the new integer value of the retryAfter.
* @throws InvalidArgumentException if supplied retryAfter is less
* than zero.
* @return the newly created RetryAfterHeader object.
*/
public RetryAfterHeader createRetryAfterHeader(int retryAfter)
throws InvalidArgumentException {
if (retryAfter < 0)
throw new InvalidArgumentException("bad retryAfter arg");
RetryAfter r = new RetryAfter();
r.setRetryAfter(retryAfter);
return r;
}
/**
* Creates a new RouteHeader based on the newly supplied address value.
*
* @param address - the new Address object of the address.
* @return the newly created RouteHeader object.
*/
public RouteHeader createRouteHeader(Address address) {
if (address == null)
throw new NullPointerException("null address arg");
Route route = new Route();
route.setAddress(address);
return route;
}
/**
* Creates a new ServerHeader based on the newly supplied product value.
*
* @param product - the new list value of the product.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the product value.
* @return the newly created ServerHeader object.
*/
public ServerHeader createServerHeader(List product)
throws ParseException {
if (product == null)
throw new NullPointerException("null productList arg");
Server server = new Server();
server.setProduct(product);
return server;
}
/**
* Creates a new SubjectHeader based on the newly supplied subject value.
*
* @param subject - the new string value of the subject.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the subject value.
* @return the newly created SubjectHeader object.
*/
public SubjectHeader createSubjectHeader(String subject)
throws ParseException {
if (subject == null)
throw new NullPointerException("null subject arg");
Subject s = new Subject();
s.setSubject(subject);
return s;
}
/**
* Creates a new SubscriptionStateHeader based on the newly supplied
* subscriptionState value.
*
* @param subscriptionState - the new string value of the subscriptionState.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the subscriptionState value.
* @return the newly created SubscriptionStateHeader object.
* @since v1.1
*/
public SubscriptionStateHeader createSubscriptionStateHeader(String subscriptionState)
throws ParseException {
if (subscriptionState == null)
throw new NullPointerException("null subscriptionState arg");
SubscriptionState s = new SubscriptionState();
s.setState(subscriptionState);
return s;
}
/**
* Creates a new SupportedHeader based on the newly supplied optionTag
* value.
*
* @param optionTag - the new string containing the optionTag value.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the optionTag value.
* @return the newly created SupportedHeader object.
*/
public SupportedHeader createSupportedHeader(String optionTag)
throws ParseException {
if (optionTag == null)
throw new NullPointerException("null optionTag arg");
Supported supported = new Supported();
supported.setOptionTag(optionTag);
return supported;
}
/**
* Creates a new TimeStampHeader based on the newly supplied timeStamp value.
*
* @param timeStamp - the new float value of the timeStamp.
* @throws InvalidArgumentException if supplied timeStamp is less
* than zero.
* @return the newly created TimeStampHeader object.
*/
public TimeStampHeader createTimeStampHeader(float timeStamp)
throws InvalidArgumentException {
if (timeStamp < 0)
throw new IllegalArgumentException("illegal timeStamp");
TimeStamp t = new TimeStamp();
t.setTimeStamp(timeStamp);
return t;
}
/**
* Creates a new ToHeader based on the newly supplied address and
* tag values.
*
* @param address - the new Address object of the address.
* @param tag - the new string value of the tag.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the tag value.
* @return the newly created ToHeader object.
*/
public ToHeader createToHeader(Address address, String tag)
throws ParseException {
if (address == null)
throw new NullPointerException("null address");
To to = new To();
to.setAddress(address);
if (tag != null)
to.setTag(tag);
return to;
}
/**
* Creates a new UnsupportedHeader based on the newly supplied optionTag
* value.
*
* @param optionTag - the new string containing the optionTag value.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the List of optionTag value.
* @return the newly created UnsupportedHeader object.
*/
public UnsupportedHeader createUnsupportedHeader(String optionTag)
throws ParseException {
if (optionTag == null)
throw new NullPointerException(optionTag);
Unsupported unsupported = new Unsupported();
unsupported.setOptionTag(optionTag);
return unsupported;
}
/**
* Creates a new UserAgentHeader based on the newly supplied product value.
*
* @param product - the new list value of the product.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the product value.
* @return the newly created UserAgentHeader object.
*/
public UserAgentHeader createUserAgentHeader(List product)
throws ParseException {
if (product == null)
throw new NullPointerException("null user agent");
UserAgent userAgent = new UserAgent();
userAgent.setProduct(product);
return userAgent;
}
/**
* Creates a new ViaHeader based on the newly supplied uri and branch values.
*
* @param host the new host value of uri.
* @param port the new port value of uri.
* @param transport the new transport value of uri.
* @param branch the new string value of the branch.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the branch value.
* @return the newly created ViaHeader object.
*/
public ViaHeader createViaHeader(
String host,
int port,
String transport,
String branch)
throws ParseException, InvalidArgumentException {
// This should be changed.
if (host == null || transport == null)
throw new NullPointerException("null arg");
Via via = new Via();
if (branch != null)
via.setBranch(branch);
// for supporting IPv6 addresses
if(host.indexOf(':') >= 0
&& host.indexOf('[') < 0)
{
//strip address scope zones if any
if(stripAddressScopeZones)
{
int zoneStart = host.indexOf('%');
if(zoneStart != -1)
host = host.substring(0, zoneStart);
}
host = '[' + host + ']';
}
via.setHost(host);
via.setPort(port);
via.setTransport(transport);
return via;
}
/**
* Creates a new WWWAuthenticateHeader based on the newly supplied
* scheme value.
*
* @param scheme - the new string value of the scheme.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the scheme values.
* @return the newly created WWWAuthenticateHeader object.
*/
public WWWAuthenticateHeader createWWWAuthenticateHeader(String scheme)
throws ParseException {
if (scheme == null)
throw new NullPointerException("null scheme");
WWWAuthenticate www = new WWWAuthenticate();
www.setScheme(scheme);
return www;
}
/**
* Creates a new WarningHeader based on the newly supplied
* agent, code and comment values.
*
* @param agent - the new string value of the agent.
* @param code - the new boolean integer of the code.
* @param comment - the new string value of the comment.
* @throws ParseException which signals that an error has been reached
* unexpectedly while parsing the agent or comment values.
* @throws InvalidArgumentException if an invalid integer code is given for
* the WarningHeader.
* @return the newly created WarningHeader object.
*/
public WarningHeader createWarningHeader(
String agent,
int code,
String comment)
throws ParseException, InvalidArgumentException {
if (agent == null)
throw new NullPointerException("null arg");
Warning warning = new Warning();
warning.setAgent(agent);
warning.setCode(code);
warning.setText(comment);
return warning;
}
/** Creates a new ErrorInfoHeader based on the newly
* supplied errorInfo value.
*
* @param errorInfo - the new URI value of the errorInfo.
* @return the newly created ErrorInfoHeader object.
*/
public ErrorInfoHeader createErrorInfoHeader(URI errorInfo) {
if (errorInfo == null)
throw new NullPointerException("null arg");
return new ErrorInfo((GenericURI) errorInfo);
}
/**
* Create a header from the given header text.
* Header should not have the trailng crlf.
* @throws ParseException
*/
public javax.sip.header.Header createHeader(String headerText) throws ParseException {
StringMsgParser smp = new StringMsgParser();
SIPHeader sipHeader = smp.parseSIPHeader(headerText.trim());
if (sipHeader instanceof SIPHeaderList) {
if (((SIPHeaderList) sipHeader).size() > 1) {
throw new ParseException(
"Only singleton allowed " + headerText,
0);
} else if (((SIPHeaderList) sipHeader).size() == 0) {
try {
return (Header) ((SIPHeaderList) sipHeader)
.getMyClass()
.newInstance();
} catch (InstantiationException ex) {
ex.printStackTrace();
return null;
} catch (IllegalAccessException ex) {
ex.printStackTrace();
return null;
}
} else {
return (Header) ((SIPHeaderList) sipHeader).getFirst();
}
} else {
return (Header) sipHeader;
}
}
/** Create and parse a header.
*
* @param headerName -- header name for the header to parse.
* @param headerValue -- header value for the header to parse.
* @throws ParseException
* @return the parsed sip header
*/
public javax.sip.header.Header createHeader(
String headerName,
String headerValue)
throws java.text.ParseException {
if (headerName == null)
throw new NullPointerException("header name is null");
String hdrText =
new StringBuffer()
.append(headerName)
.append(":")
.append(headerValue)
.toString();
return createHeader(hdrText);
}
/** Create and return a list of headers.
*@param headers -- list of headers.
*@throws ParseException -- if a parse exception occurs or a List
* of that type of header is not alowed.
*@return a List containing the headers.
*/
public java.util.List createHeaders(String headers)
throws java.text.ParseException {
if (headers == null)
throw new NullPointerException("null arg!");
StringMsgParser smp = new StringMsgParser();
SIPHeader shdr = smp.parseSIPHeader(headers);
if (shdr instanceof SIPHeaderList)
return (SIPHeaderList) shdr;
else
throw new ParseException(
"List of headers of this type is not allowed in a message",
0);
}
/** Create a ReferTo Header.
*@param address -- address for the header.
*/
public ReferToHeader createReferToHeader(Address address) {
if (address == null)
throw new NullPointerException("null address!");
ReferTo referTo = new ReferTo();
referTo.setAddress(address);
return referTo;
}
/** Create a ReferredBy Header.
*
* pmusgrave
*
*@param address -- address for the header.
*
* TODO: Once interfaces are in javax, change the type to MinSEHeader
* and add to HeaderFactory. - pmusgrave
*/
public ReferredByHeader createReferredByHeader(Address address) {
if (address == null)
throw new NullPointerException("null address!");
ReferredBy referredBy = new ReferredBy();
referredBy.setAddress(address);
return referredBy;
}
/**
* Create a Replaces header with a call Id, to and from tag.
*
* TODO: Once interfaces are in javax, change the type to MinSEHeader
* and add to HeaderFactory. - pmusgrave
* pmusgrave
*/
public ReplacesHeader createReplacesHeader(String callId, String toTag,
String fromTag) throws ParseException
{
Replaces replaces = new Replaces();
replaces.setCallId(callId);
replaces.setFromTag(fromTag);
replaces.setToTag(toTag);
return replaces;
}
/**
* Create a Join header with a call Id, to and from tag.
*
*/
public JoinHeader createJoinHeader(String callId, String toTag,
String fromTag) throws ParseException
{
Join join = new Join();
join.setCallId(callId);
join.setFromTag(fromTag);
join.setToTag(toTag);
return join;
}
/*
* (non-Javadoc)
* @see javax.sip.header.HeaderFactory#createSIPETagHeader(java.lang.String)
*/
public SIPETagHeader createSIPETagHeader(String etag) throws ParseException {
return new SIPETag(etag);
}
/*
* (non-Javadoc)
* @see javax.sip.header.HeaderFactory#createSIPIfMatchHeader(java.lang.String)
*/
public SIPIfMatchHeader createSIPIfMatchHeader(String etag) throws ParseException {
return new SIPIfMatch(etag);
}
//////////////////////////////////////////////////////////////////////////
// The following headers are not part of the JSIP spec.
// They are IMS headers
// (contributed by Miguel Freitas - PT Inovacao and Telecommunications Institute)
///////////////////////////////////////////////////////////////////////////
/**
* creates a P-Access-Network-Info header
* @return newly created P-Access-Network-Info header
*/
public PAccessNetworkInfoHeader createPAccessNetworkInfoHeader()
{
PAccessNetworkInfo accessNetworkInfo = new PAccessNetworkInfo();
return accessNetworkInfo;
}
/**
* P-Asserted-Identity header
* @param address - Address
* @return newly created P-Asserted-Identity header
* @throws ParseException
* @throws NullPointerException
*/
public PAssertedIdentityHeader createPAssertedIdentityHeader(Address address)
throws NullPointerException, ParseException
{
if (address == null)
throw new NullPointerException("null address!");
PAssertedIdentity assertedIdentity = new PAssertedIdentity();
assertedIdentity.setAddress(address);
return assertedIdentity;
}
/**
* Creates a new P-Associated-URI header based on the supplied address
* @param assocURI - Address
* @return newly created P-Associated-URI header
* @throws NullPointerException if the supplied address is null
* @throws ParseException
*/
public PAssociatedURIHeader createPAssociatedURIHeader(Address assocURI)
{
if (assocURI == null)
throw new NullPointerException("null associatedURI!");
PAssociatedURI associatedURI = new PAssociatedURI();
associatedURI.setAddress(assocURI);
return associatedURI;
}
/**
* P-Called-Party-ID header
* @param address - Address
* @return newly created P-Called-Party-ID header
* @throws NullPointerException
* @throws ParseException
*/
public PCalledPartyIDHeader createPCalledPartyIDHeader(Address address)
{
if (address == null)
throw new NullPointerException("null address!");
PCalledPartyID calledPartyID = new PCalledPartyID();
calledPartyID.setAddress(address);
return calledPartyID;
}
/**
* P-Charging-Function-Addresses header
* @return newly created P-Charging-Function-Addresses header
*/
public PChargingFunctionAddressesHeader createPChargingFunctionAddressesHeader()
{
PChargingFunctionAddresses cfa = new PChargingFunctionAddresses();
return cfa;
}
/**
* P-Charging-Vector header
* @param icid - icid string
* @return newly created P-Charging-Vector header
* @throws NullPointerException
* @throws ParseException
*/
public PChargingVectorHeader createChargingVectorHeader(String icid)
throws ParseException
{
if (icid == null)
throw new NullPointerException("null icid arg!");
PChargingVector chargingVector = new PChargingVector();
chargingVector.setICID(icid);
return chargingVector;
}
/**
* P-Media-Authorization header
* @param token - token string
* @return newly created P-Media-Authorizarion header
* @throws InvalidArgumentException
* @throws ParseException
*/
public PMediaAuthorizationHeader createPMediaAuthorizationHeader(String token)
throws InvalidArgumentException, ParseException
{
if (token == null || token == "")
throw new InvalidArgumentException("The Media-Authorization-Token parameter is null or empty");
PMediaAuthorization mediaAuthorization = new PMediaAuthorization();
mediaAuthorization.setMediaAuthorizationToken(token);
return mediaAuthorization;
}
/**
* P-Preferred-Identity header
* @param address - Address
* @return newly created P-Preferred-Identity header
* @throws NullPointerException
*/
public PPreferredIdentityHeader createPPreferredIdentityHeader(Address address)
{
if (address == null)
throw new NullPointerException("null address!");
PPreferredIdentity preferredIdentity = new PPreferredIdentity();
preferredIdentity.setAddress(address);
return preferredIdentity;
}
/**
* P-Visited-Network-ID header
* @return newly created P-Visited-Network-ID header
*/
public PVisitedNetworkIDHeader createPVisitedNetworkIDHeader()
{
PVisitedNetworkID visitedNetworkID = new PVisitedNetworkID();
return visitedNetworkID;
}
/**
* PATH header
* @param address - Address
* @return newly created Path header
* @throws NullPointerException
* @throws ParseException
*/
public PathHeader createPathHeader(Address address)
{
if (address == null)
throw new NullPointerException("null address!");
Path path = new Path();
path.setAddress(address);
return path;
}
/**
* Privacy header
* @param privacyType - privacy type string
* @return newly created Privacy header
* @throws NullPointerException
*/
public PrivacyHeader createPrivacyHeader(String privacyType)
{
if (privacyType == null)
throw new NullPointerException("null privacyType arg");
Privacy privacy = new Privacy(privacyType);
return privacy;
}
/**
* Service-Route header
* @param address - Address
* @return newly created Service-Route header
* @throws NullPointerException
*/
public ServiceRouteHeader createServiceRouteHeader(Address address)
{
if (address == null)
throw new NullPointerException("null address!");
ServiceRoute serviceRoute = new ServiceRoute();
serviceRoute.setAddress(address);
return serviceRoute;
}
/**
* Security-Server header
* @return newly created Security-Server header
*/
public SecurityServerHeader createSecurityServerHeader()
{
SecurityServer secServer = new SecurityServer();
return secServer;
}
/**
* Security-Client header
* @return newly created Security-Client header
*/
public SecurityClientHeader createSecurityClientHeader()
{
SecurityClient secClient = new SecurityClient();
return secClient;
}
/**
* Security-Verify header
* @return newly created Security-Verify header
*/
public SecurityVerifyHeader createSecurityVerifyHeader()
{
SecurityVerify secVerify = new SecurityVerify();
return secVerify;
}
/**
* @return the newly create P-User-Database header.
* Please note that this is not a SIP/TEL uri. It is a
* DIAMETER AAA URI.
*/
public PUserDatabaseHeader createPUserDatabaseHeader(String databaseName)
{
if((databaseName ==null)||(databaseName.equals(" ")))
throw new NullPointerException("Database name is null");
PUserDatabase pUserDatabase = new PUserDatabase();
pUserDatabase.setDatabaseName(databaseName);
return pUserDatabase;
}
/**
*
* @return The newly created P-Profile-Key header.
*
*/
public PProfileKeyHeader createPProfileKeyHeader(Address address)
{
if (address ==null)
throw new NullPointerException("Address is null");
PProfileKey pProfileKey = new PProfileKey();
pProfileKey.setAddress(address);
return pProfileKey;
}
/**
*
* @return The newly created P-Served-User header.
*/
public PServedUserHeader createPServedUserHeader(Address address)
{
if(address==null)
throw new NullPointerException("Address is null");
PServedUser psu = new PServedUser();
psu.setAddress(address);
return psu;
}
/**
* @return The newly created P-Preferred-Service header.
*/
public PPreferredServiceHeader createPPreferredServiceHeader()
{
PPreferredService pps = new PPreferredService();
return pps;
}
/**
*
* @return The newly created P-Asserted-Service header.
*/
public PAssertedServiceHeader createPAssertedServiceHeader()
{
PAssertedService pas = new PAssertedService();
return pas;
}
/**
* Creates a new SessionExpiresHeader based on the newly supplied expires value.
*
* @param expires - the new integer value of the expires.
* @throws InvalidArgumentException if supplied expires is less
* than zero.
* @return the newly created SessionExpiresHeader object.
*
*/
public SessionExpiresHeader createSessionExpiresHeader(int expires)
throws InvalidArgumentException {
if (expires < 0)
throw new InvalidArgumentException("bad value " + expires);
SessionExpires s = new SessionExpires();
s.setExpires(expires);
return s;
}
/**
* Create a new Request Line from a String.
*
*/
public SipRequestLine createRequestLine(String requestLine) throws ParseException {
RequestLineParser requestLineParser = new RequestLineParser(requestLine);
return (SipRequestLine) requestLineParser.parse();
}
/**
* Create a new StatusLine from a String.
*/
public SipStatusLine createStatusLine(String statusLine) throws ParseException {
StatusLineParser statusLineParser = new StatusLineParser(statusLine);
return (SipStatusLine) statusLineParser.parse();
}
/**
* Create and return a references header.
*
* @param callId
* @param rel
* @return
* @throws ParseException
*/
public ReferencesHeader createReferencesHeader(String callId, String rel) throws ParseException {
ReferencesHeader retval = new References();
retval.setCallId(callId);
retval.setRel(rel);
return retval;
}
//////////////////////////////////////////////////////////
// Constructor
//////////////////////////////////////////////////////////
/**
* Default constructor.
*/
public HeaderFactoryImpl() {
stripAddressScopeZones
= Boolean.getBoolean("gov.nist.core.STRIP_ADDR_SCOPES");
}
}