FileDocCategorySizeDatePackage
HeaderFactory.javaAPI DocphoneME MR2 API (J2ME)19022Wed May 02 18:00:42 BST 2007gov.nist.siplite.header

HeaderFactory.java

/*
 * Portions Copyright  2000-2007 Sun Microsystems, Inc. All Rights
 * Reserved.  Use is subject to license terms.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version
 * 2 only, as published by the Free Software Foundation.
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License version 2 for more details (a copy is
 * included at /legal/license.txt).
 * 
 * You should have received a copy of the GNU General Public License
 * version 2 along with this work; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 * 
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
 * Clara, CA 95054 or visit www.sun.com if you need additional
 * information or have any questions.
 */
/*
 */
package gov.nist.siplite.header;

import gov.nist.siplite.parser.*;
import gov.nist.siplite.address.*;
import gov.nist.core.*;
import java.util.*;

/**
 * Implementation of the JAIN SIP HeaderFactory
 *
 * @version JAIN-SIP-1.1
 *
 * <a href="{@docRoot}/uncopyright.html">This code is in the public domain.</a>
 *
 */
public class HeaderFactory {


    /**
     * 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 ");
        AuthorizationHeader auth = new AuthorizationHeader();
        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 IllegalArgumentException 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(int sequenceNumber, String method)
    throws ParseException, IllegalArgumentException {
        if (sequenceNumber < 0)
            throw new IllegalArgumentException
                    ("bad arg " + sequenceNumber);
        if (method == null)
            throw new NullPointerException("null arg method");
        CSeqHeader cseq = new CSeqHeader();
        cseq.setMethod(method);
        cseq.setSequenceNumber(sequenceNumber);

        return cseq;
    }

    /**
     * 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 createCallId(String callId)
    throws ParseException {
        if (callId == null)
            throw new NullPointerException("null arg callId");
        CallIdHeader c = new CallIdHeader();
        c.setCallId(callId);
        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");
        ContactHeader contact = new ContactHeader();
        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.getExpiresHeader() == 0;</code>
     * </ul>
     *
     * @return the newly created wildcard ContactHeader.
     */
    public ContactHeader createContactHeader() {
        ContactHeader contact = new ContactHeader();
        contact.setWildCardFlag(true);
        contact.setExpires(0);

        return contact;
    }



    /**
     * Creates a new CSeqHeader based on the newly supplied contentLength value.
     *
     * @param contentLength - the new integer value of the contentLength.
     * @throws IllegalArgumentException if supplied contentLength is less
     * than zero.
     * @return the newly created ContentLengthHeader object.
     */
    public ContentLengthHeader createContentLengthHeader(int contentLength)
    throws IllegalArgumentException {
        if (contentLength < 0)
            throw new IllegalArgumentException("bad contentLength");
        ContentLengthHeader c = new ContentLengthHeader();
        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");
        ContentTypeHeader c = new ContentTypeHeader();
        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) {
        DateHeader d = new DateHeader();
        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");
        EventHeader event = new EventHeader();
        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 IllegalArgumentException if supplied expires is less
     * than zero.
     * @return the newly created ExpiresHeader object.
     */
    public ExpiresHeader createExpiresHeader(int expires)
    throws IllegalArgumentException {
        if (expires < 0)
            throw new IllegalArgumentException("bad value " + expires);
        ExpiresHeader e = new ExpiresHeader();
        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 ExtensionHeader createExtensionHeader
            (String name, String value) throws ParseException {
        if (name == null)
            throw new NullPointerException("bad name");

        ExtensionHeader ext = new ExtensionHeader();
        ext.setHeaderName(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");
        FromHeader from = new FromHeader();
        from.setAddress(address);
        if (tag != null) from.setTag(tag);

        return from;
    }


    /**
     * Creates a new MaxForwardsHeader based on the newly
     * supplied maxForwards value.
     *
     * @param maxForwards the new integer value of the maxForwards.
     * @throws IllegalArgumentException if supplied maxForwards is less
     * than zero or greater than 255.
     * @return the newly created MaxForwardsHeader object.
     */
    public MaxForwardsHeader createMaxForwardsHeader(int maxForwards)
    throws IllegalArgumentException {
        if (maxForwards < 0 || maxForwards > 255)
            throw new IllegalArgumentException
                    ("bad maxForwards arg " + maxForwards);
        MaxForwardsHeader m = new MaxForwardsHeader();
        m.setMaxForwards(maxForwards);

        return m;
    }





    /**
     * 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");
        ProxyAuthenticateHeader p = new ProxyAuthenticateHeader();
        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");
        ProxyAuthorizationHeader p = new ProxyAuthorizationHeader();
        p.setScheme(scheme);

        return p;
    }




    /**
     * 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) {
        RecordRouteHeader recordRouteHeader = new RecordRouteHeader();
        recordRouteHeader.setAddress(address);

        return recordRouteHeader;
    }



    /**
     * 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");
        RouteHeader route = new RouteHeader();
        route.setAddress(address);

        return route;
    }



    /**
     * 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");
        ToHeader to = new ToHeader();
        to.setAddress(address);
        if (tag != null) to.setTag(tag);

        return to;
    }

    /**
     * Creates a new ViaHeader based on the newly supplied uri and
     * branch values.
     *
     * @param host the new host value from the uri field
     * @param port the new port value from the uri field
     * @param transport the new transport value from the uri field
     * @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 {
        // This should be changed.
        if (host == null || transport == null)
            throw new NullPointerException("null arg");
        ViaHeader via = new ViaHeader();
        if (branch != null) via.setBranch(branch);
        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");
        WWWAuthenticateHeader www = new WWWAuthenticateHeader();
        www.setScheme(scheme);

        return www;
    }



    /**
     * 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 Header
            createHeader(String headerName, String headerValue)
                throws ParseException {

        if (headerName == null)
            throw new NullPointerException("header name is null");

        String expandedHeaderName = NameMap.expandHeaderName(headerName);

        if (Header.isParameterLess(expandedHeaderName)) {
            // The header can't have any parameters
            // System.out.println("> '" + headerName + "' parameter-less");

            ParameterLessHeader retval = new ParameterLessHeader();
            retval.setHeaderName(headerName);
            retval.setValue(headerValue);

            return retval;
        }

        String hdrText = new StringBuffer().append(headerName)
                    .append(":").append(headerValue).toString();
        Class clazz = NameMap.getClassFromName(expandedHeaderName);

        if (clazz == null) {
            // ExtensionHeader - can have some parameters
            clazz = ExtensionHeader.clazz;
        }

        Exception ex = null;
        try {
            if (headerValue == null) {
                Header retval = (Header) clazz.newInstance();
                retval.setHeaderName(headerName);
            }
        } catch (InstantiationException ie) {
            ex = ie;
        } catch (IllegalAccessException iae) {
            ex = iae;
        }
        if (ex != null) {
            // print system message and exit
            InternalErrorHandler.handleException(ex);
            return null;
        }

        StringMsgParser smp = new StringMsgParser();
        Header sipHeader = smp.parseHeader(hdrText);

        if (sipHeader instanceof HeaderList) {
            if (((HeaderList) sipHeader).size() > 1)
                throw new ParseException("Only signleton allowed !", 0);
            else {
                // We have to preserve the original header's name
                // (it might be given in a copact form)
                Enumeration li = ((HeaderList) sipHeader).getElements();

                while (li.hasMoreElements()) {
                    Header header = (Header) li.nextElement();
                    header.setHeaderName(headerName);
                }

                return (Header) ((HeaderList) sipHeader).first();
            }
        } else {
            // We have to preserve the original header's name
            // (it might be given in a copact form)
            sipHeader.setHeaderName(headerName);
            return sipHeader;
        }
    }

    /**
     * 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 Vector createHeaders(String headers)
    throws ParseException {
        if (headers == null)
            throw new NullPointerException("null arg!");
        StringMsgParser smp = new StringMsgParser();
        Header shdr = smp.parseHeader(headers);
        if (shdr instanceof HeaderList)
            return ((HeaderList) shdr).getHeaders();
        else throw new ParseException
                ("List of headers of this type is not allowed in a message", 0);
    }



    /**
     * Default constructor.
     */
    public HeaderFactory() {

    }
}