Home | History | Annotate | Download | only in message
      1 /*
      2  * Conditions Of Use
      3  *
      4  * This software was developed by employees of the National Institute of
      5  * Standards and Technology (NIST), an agency of the Federal Government.
      6  * Pursuant to title 15 Untied States Code Section 105, works of NIST
      7  * employees are not subject to copyright protection in the United States
      8  * and are considered to be in the public domain.  As a result, a formal
      9  * license is not needed to use the software.
     10  *
     11  * This software is provided by NIST as a service and is expressly
     12  * provided "AS IS."  NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
     13  * OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
     14  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
     15  * AND DATA ACCURACY.  NIST does not warrant or make any representations
     16  * regarding the use of the software or the results thereof, including but
     17  * not limited to the correctness, accuracy, reliability or usefulness of
     18  * the software.
     19  *
     20  * Permission to use this software is contingent upon your acceptance
     21  * of the terms of this agreement
     22  *
     23  * .
     24  *
     25  */
     26 /*******************************************************************************
     27  * Product of NIST/ITL Advanced Networking Technologies Division (ANTD).        *
     28  *******************************************************************************/
     29 package gov.nist.javax.sip.message;
     30 
     31 import java.text.ParseException;
     32 import javax.sip.header.*;
     33 
     34 import java.util.LinkedList;
     35 import java.util.List;
     36 import gov.nist.javax.sip.header.*;
     37 
     38 import javax.sip.message.*;
     39 import javax.sip.address.*;
     40 import gov.nist.javax.sip.parser.*;
     41 
     42 /**
     43  * Message Factory implementation
     44  *
     45  * @version 1.2 $Revision: 1.23 $ $Date: 2009/09/08 01:58:40 $
     46  * @since 1.1
     47  *
     48  * @author M. Ranganathan <br/>
     49  * @author Olivier Deruelle <br/>
     50  *
     51  */
     52 @SuppressWarnings("unchecked")
     53 public class MessageFactoryImpl implements MessageFactory, MessageFactoryExt {
     54 
     55     private boolean testing = false;
     56 
     57     private boolean strict  = true;
     58 
     59     private static String defaultContentEncodingCharset = "UTF-8";
     60 
     61 
     62     /*
     63      * The UserAgent header to include for all requests created from this message factory.
     64      */
     65     private static UserAgentHeader userAgent;
     66 
     67     /*
     68      * The Server header to include
     69      */
     70     private static ServerHeader server;
     71 
     72 
     73     public void setStrict(boolean strict) {
     74         this.strict = strict;
     75     }
     76 
     77 
     78 
     79     /**
     80      * This is for testing -- allows you to generate invalid requests
     81      */
     82     public void setTest(boolean flag) {
     83         this.testing = flag;
     84     }
     85 
     86     /**
     87      * Creates a new instance of MessageFactoryImpl
     88      */
     89     public MessageFactoryImpl() {
     90     }
     91 
     92     /**
     93      * Creates a new Request message of type specified by the method paramater,
     94      * containing the URI of the Request, the mandatory headers of the message
     95      * with a body in the form of a Java object and the body content type.
     96      *
     97      * @param requestURI -
     98      *            the new URI object of the requestURI value of this Message.
     99      * @param method -
    100      *            the new string of the method value of this Message.
    101      * @param callId -
    102      *            the new CallIdHeader object of the callId value of this
    103      *            Message.
    104      * @param cSeq -
    105      *            the new CSeqHeader object of the cSeq value of this Message.
    106      * @param from -
    107      *            the new FromHeader object of the from value of this Message.
    108      * @param to -
    109      *            the new ToHeader object of the to value of this Message.
    110      * @param via -
    111      *            the new List object of the ViaHeaders of this Message.
    112      * @param content -
    113      *            the new Object of the body content value of this Message.
    114      * @param contentType -
    115      *            the new ContentTypeHeader object of the content type value of
    116      *            this Message.
    117      * @throws ParseException
    118      *             which signals that an error has been reached unexpectedly
    119      *             while parsing the method or the body.
    120      */
    121     public Request createRequest(javax.sip.address.URI requestURI,
    122             String method, CallIdHeader callId, CSeqHeader cSeq,
    123             FromHeader from, ToHeader to, List via,
    124             MaxForwardsHeader maxForwards, ContentTypeHeader contentType,
    125             Object content) throws ParseException {
    126         if (requestURI == null || method == null || callId == null
    127                 || cSeq == null || from == null || to == null || via == null
    128                 || maxForwards == null || content == null
    129                 || contentType == null)
    130             throw new NullPointerException("Null parameters");
    131 
    132         SIPRequest sipRequest = new SIPRequest();
    133         sipRequest.setRequestURI(requestURI);
    134         sipRequest.setMethod(method);
    135         sipRequest.setCallId(callId);
    136         sipRequest.setCSeq(cSeq);
    137         sipRequest.setFrom(from);
    138         sipRequest.setTo(to);
    139         sipRequest.setVia(via);
    140         sipRequest.setMaxForwards(maxForwards);
    141         sipRequest.setContent(content, contentType);
    142         if ( userAgent != null ) {
    143             sipRequest.setHeader(userAgent);
    144         }
    145 
    146         return sipRequest;
    147     }
    148 
    149     /**
    150      * Creates a new Request message of type specified by the method paramater,
    151      * containing the URI of the Request, the mandatory headers of the message
    152      * with a body in the form of a byte array and body content type.
    153      *
    154      * @param requestURI -
    155      *            the new URI object of the requestURI value of this Message.
    156      * @param method -
    157      *            the new string of the method value of this Message.
    158      * @param callId -
    159      *            the new CallIdHeader object of the callId value of this
    160      *            Message.
    161      * @param cSeq -
    162      *            the new CSeqHeader object of the cSeq value of this Message.
    163      * @param from -
    164      *            the new FromHeader object of the from value of this Message.
    165      * @param to -
    166      *            the new ToHeader object of the to value of this Message.
    167      * @param via -
    168      *            the new List object of the ViaHeaders of this Message.
    169      * @param content -
    170      *            the new byte array of the body content value of this Message.
    171      * @param contentType -
    172      *            the new ContentTypeHeader object of the content type value of
    173      *            this Message.
    174      * @throws ParseException
    175      *             which signals that an error has been reached unexpectedly
    176      *             while parsing the method or the body.
    177      */
    178     public Request createRequest(URI requestURI, String method,
    179             CallIdHeader callId, CSeqHeader cSeq, FromHeader from, ToHeader to,
    180             List via, MaxForwardsHeader maxForwards, byte[] content,
    181             ContentTypeHeader contentType) throws ParseException {
    182         if (requestURI == null || method == null || callId == null
    183                 || cSeq == null || from == null || to == null || via == null
    184                 || maxForwards == null || content == null
    185                 || contentType == null)
    186             throw new ParseException(
    187                     "JAIN-SIP Exception, some parameters are missing"
    188                             + ", unable to create the request", 0);
    189 
    190         SIPRequest sipRequest = new SIPRequest();
    191         sipRequest.setRequestURI(requestURI);
    192         sipRequest.setMethod(method);
    193         sipRequest.setCallId(callId);
    194         sipRequest.setCSeq(cSeq);
    195         sipRequest.setFrom(from);
    196         sipRequest.setTo(to);
    197         sipRequest.setVia(via);
    198         sipRequest.setMaxForwards(maxForwards);
    199         sipRequest.setHeader((ContentType) contentType);
    200         sipRequest.setMessageContent(content);
    201         if ( userAgent != null ) {
    202             sipRequest.setHeader(userAgent);
    203         }
    204         return sipRequest;
    205     }
    206 
    207     /**
    208      * Creates a new Request message of type specified by the method paramater,
    209      * containing the URI of the Request, the mandatory headers of the message.
    210      * This new Request does not contain a body.
    211      *
    212      * @param requestURI -
    213      *            the new URI object of the requestURI value of this Message.
    214      * @param method -
    215      *            the new string of the method value of this Message.
    216      * @param callId -
    217      *            the new CallIdHeader object of the callId value of this
    218      *            Message.
    219      * @param cSeq -
    220      *            the new CSeqHeader object of the cSeq value of this Message.
    221      * @param from -
    222      *            the new FromHeader object of the from value of this Message.
    223      * @param to -
    224      *            the new ToHeader object of the to value of this Message.
    225      * @param via -
    226      *            the new List object of the ViaHeaders of this Message.
    227      * @throws ParseException
    228      *             which signals that an error has been reached unexpectedly
    229      *             while parsing the method.
    230      */
    231     public Request createRequest(URI requestURI, String method,
    232             CallIdHeader callId, CSeqHeader cSeq, FromHeader from, ToHeader to,
    233             List via, MaxForwardsHeader maxForwards) throws ParseException {
    234         if (requestURI == null || method == null || callId == null
    235                 || cSeq == null || from == null || to == null || via == null
    236                 || maxForwards == null)
    237             throw new ParseException(
    238                     "JAIN-SIP Exception, some parameters are missing"
    239                             + ", unable to create the request", 0);
    240 
    241         SIPRequest sipRequest = new SIPRequest();
    242         sipRequest.setRequestURI(requestURI);
    243         sipRequest.setMethod(method);
    244         sipRequest.setCallId(callId);
    245         sipRequest.setCSeq(cSeq);
    246         sipRequest.setFrom(from);
    247         sipRequest.setTo(to);
    248         sipRequest.setVia(via);
    249         sipRequest.setMaxForwards(maxForwards);
    250         if (userAgent != null) {
    251             sipRequest.setHeader(userAgent);
    252         }
    253 
    254         return sipRequest;
    255     }
    256 
    257     // Standard Response Creation methods
    258 
    259     /**
    260      * Creates a new Response message of type specified by the statusCode
    261      * paramater, containing the mandatory headers of the message with a body in
    262      * the form of a Java object and the body content type.
    263      *
    264      * @param statusCode -
    265      *            the new integer of the statusCode value of this Message.
    266      * @param callId -
    267      *            the new CallIdHeader object of the callId value of this
    268      *            Message.
    269      * @param cSeq -
    270      *            the new CSeqHeader object of the cSeq value of this Message.
    271      * @param from -
    272      *            the new FromHeader object of the from value of this Message.
    273      * @param to -
    274      *            the new ToHeader object of the to value of this Message.
    275      * @param via -
    276      *            the new List object of the ViaHeaders of this Message.
    277      * @param content -
    278      *            the new Object of the body content value of this Message.
    279      * @param contentType -
    280      *            the new ContentTypeHeader object of the content type value of
    281      *            this Message.
    282      * @throws ParseException
    283      *             which signals that an error has been reached unexpectedly
    284      *             while parsing the statusCode or the body.
    285      */
    286     public Response createResponse(int statusCode, CallIdHeader callId,
    287             CSeqHeader cSeq, FromHeader from, ToHeader to, List via,
    288             MaxForwardsHeader maxForwards, Object content,
    289             ContentTypeHeader contentType) throws ParseException {
    290         if (callId == null || cSeq == null || from == null || to == null
    291                 || via == null || maxForwards == null || content == null
    292                 || contentType == null)
    293             throw new NullPointerException(" unable to create the response");
    294 
    295         SIPResponse sipResponse = new SIPResponse();
    296         StatusLine statusLine = new StatusLine();
    297         statusLine.setStatusCode(statusCode);
    298         String reasonPhrase = SIPResponse.getReasonPhrase(statusCode);
    299         //if (reasonPhrase == null)
    300         //  throw new ParseException(statusCode + " Unkown  ", 0);
    301         statusLine.setReasonPhrase(reasonPhrase);
    302         sipResponse.setStatusLine(statusLine);
    303         sipResponse.setCallId(callId);
    304         sipResponse.setCSeq(cSeq);
    305         sipResponse.setFrom(from);
    306         sipResponse.setTo(to);
    307         sipResponse.setVia(via);
    308         sipResponse.setMaxForwards(maxForwards);
    309         sipResponse.setContent(content, contentType);
    310         if (userAgent != null) {
    311             sipResponse.setHeader(userAgent);
    312         }
    313         return sipResponse;
    314     }
    315 
    316     /**
    317      * Creates a new Response message of type specified by the statusCode
    318      * paramater, containing the mandatory headers of the message with a body in
    319      * the form of a byte array and the body content type.
    320      *
    321      * @param statusCode -
    322      *            the new integer of the statusCode value of this Message.
    323      * @param callId -
    324      *            the new CallIdHeader object of the callId value of this
    325      *            Message.
    326      * @param cSeq -
    327      *            the new CSeqHeader object of the cSeq value of this Message.
    328      * @param from -
    329      *            the new FromHeader object of the from value of this Message.
    330      * @param to -
    331      *            the new ToHeader object of the to value of this Message.
    332      * @param via -
    333      *            the new List object of the ViaHeaders of this Message.
    334      * @param content -
    335      *            the new byte array of the body content value of this Message.
    336      * @param contentType -
    337      *            the new ContentTypeHeader object of the content type value of
    338      *            this Message.
    339      * @throws ParseException
    340      *             which signals that an error has been reached unexpectedly
    341      *             while parsing the statusCode or the body.
    342      */
    343     public Response createResponse(int statusCode, CallIdHeader callId,
    344             CSeqHeader cSeq, FromHeader from, ToHeader to, List via,
    345             MaxForwardsHeader maxForwards, byte[] content,
    346             ContentTypeHeader contentType) throws ParseException {
    347         if (callId == null || cSeq == null || from == null || to == null
    348                 || via == null || maxForwards == null || content == null
    349                 || contentType == null)
    350             throw new NullPointerException("Null params ");
    351 
    352         SIPResponse sipResponse = new SIPResponse();
    353         sipResponse.setStatusCode(statusCode);
    354         sipResponse.setCallId(callId);
    355         sipResponse.setCSeq(cSeq);
    356         sipResponse.setFrom(from);
    357         sipResponse.setTo(to);
    358         sipResponse.setVia(via);
    359         sipResponse.setMaxForwards(maxForwards);
    360         sipResponse.setHeader((ContentType) contentType);
    361         sipResponse.setMessageContent(content);
    362         if (userAgent != null) {
    363             sipResponse.setHeader(userAgent);
    364         }
    365         return sipResponse;
    366     }
    367 
    368     /**
    369      * Creates a new Response message of type specified by the statusCode
    370      * paramater, containing the mandatory headers of the message. This new
    371      * Response does not contain a body.
    372      *
    373      * @param statusCode -
    374      *            the new integer of the statusCode value of this Message.
    375      * @param callId -
    376      *            the new CallIdHeader object of the callId value of this
    377      *            Message.
    378      * @param cSeq -
    379      *            the new CSeqHeader object of the cSeq value of this Message.
    380      * @param from -
    381      *            the new FromHeader object of the from value of this Message.
    382      * @param to -
    383      *            the new ToHeader object of the to value of this Message.
    384      * @param via -
    385      *            the new List object of the ViaHeaders of this Message.
    386      * @throws ParseException
    387      *             which signals that an error has been reached unexpectedly
    388      *             while parsing the statusCode.
    389      */
    390     public Response createResponse(int statusCode, CallIdHeader callId,
    391             CSeqHeader cSeq, FromHeader from, ToHeader to, List via,
    392             MaxForwardsHeader maxForwards) throws ParseException {
    393         if (callId == null || cSeq == null || from == null || to == null
    394                 || via == null || maxForwards == null)
    395             throw new ParseException(
    396                     "JAIN-SIP Exception, some parameters are missing"
    397                             + ", unable to create the response", 0);
    398 
    399         SIPResponse sipResponse = new SIPResponse();
    400         sipResponse.setStatusCode(statusCode);
    401         sipResponse.setCallId(callId);
    402         sipResponse.setCSeq(cSeq);
    403         sipResponse.setFrom(from);
    404         sipResponse.setTo(to);
    405         sipResponse.setVia(via);
    406         sipResponse.setMaxForwards(maxForwards);
    407         if (userAgent != null) {
    408             sipResponse.setHeader(userAgent);
    409         }
    410         return sipResponse;
    411     }
    412 
    413     // Response Creation methods based on a Request
    414 
    415     /**
    416      * Creates a new Response message of type specified by the statusCode
    417      * paramater, based on a specific Request with a new body in the form of a
    418      * Java object and the body content type.
    419      *
    420      * @param statusCode -
    421      *            the new integer of the statusCode value of this Message.
    422      * @param request -
    423      *            the received Reqest object upon which to base the Response.
    424      * @param content -
    425      *            the new Object of the body content value of this Message.
    426      * @param contentType -
    427      *            the new ContentTypeHeader object of the content type value of
    428      *            this Message.
    429      * @throws ParseException
    430      *             which signals that an error has been reached unexpectedly
    431      *             while parsing the statusCode or the body.
    432      */
    433     public Response createResponse(int statusCode, Request request,
    434             ContentTypeHeader contentType, Object content)
    435             throws ParseException {
    436         if (request == null || content == null || contentType == null)
    437             throw new NullPointerException("null parameters");
    438 
    439         SIPRequest sipRequest = (SIPRequest) request;
    440         SIPResponse sipResponse = sipRequest.createResponse(statusCode);
    441         sipResponse.setContent(content, contentType);
    442         if (server != null) {
    443             sipResponse.setHeader(server);
    444         }
    445         return sipResponse;
    446     }
    447 
    448     /**
    449      * Creates a new Response message of type specified by the statusCode
    450      * paramater, based on a specific Request with a new body in the form of a
    451      * byte array and the body content type.
    452      *
    453      * @param statusCode -
    454      *            the new integer of the statusCode value of this Message.
    455      * @param request -
    456      *            the received Reqest object upon which to base the Response.
    457      * @param content -
    458      *            the new byte array of the body content value of this Message.
    459      * @param contentType -
    460      *            the new ContentTypeHeader object of the content type value of
    461      *            this Message.
    462      * @throws ParseException
    463      *             which signals that an error has been reached unexpectedly
    464      *             while parsing the statusCode or the body.
    465      */
    466     public Response createResponse(int statusCode, Request request,
    467             ContentTypeHeader contentType, byte[] content)
    468             throws ParseException {
    469         if (request == null || content == null || contentType == null)
    470             throw new NullPointerException("null Parameters");
    471 
    472         SIPRequest sipRequest = (SIPRequest) request;
    473         SIPResponse sipResponse = sipRequest.createResponse(statusCode);
    474         sipResponse.setHeader((ContentType) contentType);
    475         sipResponse.setMessageContent(content);
    476         if (server != null) {
    477             sipResponse.setHeader(server);
    478         }
    479         return sipResponse;
    480     }
    481 
    482     /**
    483      * Creates a new Response message of type specified by the statusCode
    484      * paramater, based on a specific Request message. This new Response does
    485      * not contain a body.
    486      *
    487      * @param statusCode -
    488      *            the new integer of the statusCode value of this Message.
    489      * @param request -
    490      *            the received Reqest object upon which to base the Response.
    491      * @throws ParseException
    492      *             which signals that an error has been reached unexpectedly
    493      *             while parsing the statusCode.
    494      */
    495     public Response createResponse(int statusCode, Request request)
    496             throws ParseException {
    497         if (request == null)
    498             throw new NullPointerException("null parameters");
    499 
    500         // if (LogWriter.needsLogging)
    501         // LogWriter.logMessage("createResponse " + request);
    502 
    503         SIPRequest sipRequest = (SIPRequest) request;
    504         SIPResponse sipResponse = sipRequest.createResponse(statusCode);
    505         // Remove the content from the message (Bug report from
    506         // Antonis Karydas.
    507         sipResponse.removeContent();
    508         sipResponse.removeHeader(ContentTypeHeader.NAME);
    509         if (server != null) {
    510             sipResponse.setHeader(server);
    511         }
    512         return sipResponse;
    513     }
    514 
    515     /**
    516      * Creates a new Request message of type specified by the method paramater,
    517      * containing the URI of the Request, the mandatory headers of the message
    518      * with a body in the form of a byte array and body content type.
    519      *
    520      * @param requestURI -
    521      *            the new URI object of the requestURI value of this Message.
    522      * @param method -
    523      *            the new string of the method value of this Message.
    524      * @param callId -
    525      *            the new CallIdHeader object of the callId value of this
    526      *            Message.
    527      * @param cSeq -
    528      *            the new CSeqHeader object of the cSeq value of this Message.
    529      * @param from -
    530      *            the new FromHeader object of the from value of this Message.
    531      * @param to -
    532      *            the new ToHeader object of the to value of this Message.
    533      * @param via -
    534      *            the new List object of the ViaHeaders of this Message.
    535      * @param contentType -
    536      *            the new ContentTypeHeader object of the content type value of
    537      *            this Message.
    538      * @param content -
    539      *            the new byte array of the body content value of this Message.
    540      * @throws ParseException
    541      *             which signals that an error has been reached unexpectedly
    542      *             while parsing the method or the body.
    543      */
    544     public Request createRequest(javax.sip.address.URI requestURI,
    545             String method, CallIdHeader callId, CSeqHeader cSeq,
    546             FromHeader from, ToHeader to, List via,
    547             MaxForwardsHeader maxForwards, ContentTypeHeader contentType,
    548             byte[] content) throws ParseException {
    549         if (requestURI == null || method == null || callId == null
    550                 || cSeq == null || from == null || to == null || via == null
    551                 || maxForwards == null || content == null
    552                 || contentType == null)
    553             throw new NullPointerException("missing parameters");
    554 
    555         SIPRequest sipRequest = new SIPRequest();
    556         sipRequest.setRequestURI(requestURI);
    557         sipRequest.setMethod(method);
    558         sipRequest.setCallId(callId);
    559         sipRequest.setCSeq(cSeq);
    560         sipRequest.setFrom(from);
    561         sipRequest.setTo(to);
    562         sipRequest.setVia(via);
    563         sipRequest.setMaxForwards(maxForwards);
    564         sipRequest.setContent(content, contentType);
    565         if (userAgent != null) {
    566             sipRequest.setHeader(userAgent);
    567         }
    568         return sipRequest;
    569     }
    570 
    571     /**
    572      * Creates a new Response message of type specified by the statusCode
    573      * paramater, containing the mandatory headers of the message with a body in
    574      * the form of a Java object and the body content type.
    575      *
    576      * @param statusCode
    577      *            the new integer of the statusCode value of this Message.
    578      * @param callId
    579      *            the new CallIdHeader object of the callId value of this
    580      *            Message.
    581      * @param cSeq
    582      *            the new CSeqHeader object of the cSeq value of this Message.
    583      * @param from
    584      *            the new FromHeader object of the from value of this Message.
    585      * @param to
    586      *            the new ToHeader object of the to value of this Message.
    587      * @param via
    588      *            the new List object of the ViaHeaders of this Message.
    589      * @param contentType
    590      *            the new ContentTypeHeader object of the content type value of
    591      *            this Message.
    592      * @param content
    593      *            the new Object of the body content value of this Message.
    594      * @throws ParseException
    595      *             which signals that an error has been reached unexpectedly
    596      *             while parsing the statusCode or the body.
    597      */
    598     public Response createResponse(int statusCode, CallIdHeader callId,
    599             CSeqHeader cSeq, FromHeader from, ToHeader to, List via,
    600             MaxForwardsHeader maxForwards, ContentTypeHeader contentType,
    601             Object content) throws ParseException {
    602         if (callId == null || cSeq == null || from == null || to == null
    603                 || via == null || maxForwards == null || content == null
    604                 || contentType == null)
    605             throw new NullPointerException("missing parameters");
    606         SIPResponse sipResponse = new SIPResponse();
    607         StatusLine statusLine = new StatusLine();
    608         statusLine.setStatusCode(statusCode);
    609         String reason = SIPResponse.getReasonPhrase(statusCode);
    610         if (reason == null)
    611             throw new ParseException(statusCode + " Unknown", 0);
    612         statusLine.setReasonPhrase(reason);
    613         sipResponse.setStatusLine(statusLine);
    614         sipResponse.setCallId(callId);
    615         sipResponse.setCSeq(cSeq);
    616         sipResponse.setFrom(from);
    617         sipResponse.setTo(to);
    618         sipResponse.setVia(via);
    619         sipResponse.setContent(content, contentType);
    620         if ( userAgent != null) {
    621             sipResponse.setHeader(userAgent);
    622         }
    623         return sipResponse;
    624 
    625     }
    626 
    627     /**
    628      * Creates a new Response message of type specified by the statusCode
    629      * paramater, containing the mandatory headers of the message with a body in
    630      * the form of a byte array and the body content type.
    631      *
    632      * @param statusCode
    633      *            the new integer of the statusCode value of this Message.
    634      * @param callId
    635      *            the new CallIdHeader object of the callId value of this
    636      *            Message.
    637      * @param cSeq
    638      *            the new CSeqHeader object of the cSeq value of this Message.
    639      * @param from
    640      *            the new FromHeader object of the from value of this Message.
    641      * @param to
    642      *            the new ToHeader object of the to value of this Message.
    643      * @param via
    644      *            the new List object of the ViaHeaders of this Message.
    645      * @param contentType
    646      *            the new ContentTypeHeader object of the content type value of
    647      *            this Message.
    648      * @param content
    649      *            the new byte array of the body content value of this Message.
    650      * @throws ParseException
    651      *             which signals that an error has been reached unexpectedly
    652      *             while parsing the statusCode or the body.
    653      */
    654     public Response createResponse(int statusCode, CallIdHeader callId,
    655             CSeqHeader cSeq, FromHeader from, ToHeader to, List via,
    656             MaxForwardsHeader maxForwards, ContentTypeHeader contentType,
    657             byte[] content) throws ParseException {
    658         if (callId == null || cSeq == null || from == null || to == null
    659                 || via == null || maxForwards == null || content == null
    660                 || contentType == null)
    661             throw new NullPointerException("missing parameters");
    662         SIPResponse sipResponse = new SIPResponse();
    663         StatusLine statusLine = new StatusLine();
    664         statusLine.setStatusCode(statusCode);
    665         String reason = SIPResponse.getReasonPhrase(statusCode);
    666         if (reason == null)
    667             throw new ParseException(statusCode + " : Unknown", 0);
    668         statusLine.setReasonPhrase(reason);
    669         sipResponse.setStatusLine(statusLine);
    670         sipResponse.setCallId(callId);
    671         sipResponse.setCSeq(cSeq);
    672         sipResponse.setFrom(from);
    673         sipResponse.setTo(to);
    674         sipResponse.setVia(via);
    675         sipResponse.setContent(content, contentType);
    676         if ( userAgent != null) {
    677             sipResponse.setHeader(userAgent);
    678         }
    679         return sipResponse;
    680     }
    681 
    682     /**
    683      * Create a request from a string. Conveniance method for UACs that want to
    684      * create an outgoing request from a string. Only the headers of the request
    685      * should be included in the String that is supplied to this method.
    686      *
    687      * @param requestString --
    688      *            string from which to create the message null string returns an
    689      *            empty message.
    690      */
    691     public javax.sip.message.Request createRequest(String requestString)
    692             throws java.text.ParseException {
    693         if (requestString == null || requestString.equals("")) {
    694             SIPRequest retval = new SIPRequest();
    695             retval.setNullRequest();
    696             return retval;
    697         }
    698 
    699         StringMsgParser smp = new StringMsgParser();
    700         smp.setStrict(this.strict);
    701 
    702         /*
    703          * This allows you to catch parse exceptions and create invalid messages
    704          * if you want.
    705          */
    706         ParseExceptionListener parseExceptionListener = new ParseExceptionListener() {
    707 
    708             public void handleException(ParseException ex,
    709                     SIPMessage sipMessage, Class headerClass,
    710                     String headerText, String messageText)
    711                     throws ParseException {
    712                 // Rethrow the error for the essential headers. Otherwise bad
    713                 // headers are simply
    714                 // recorded in the message.
    715                 if (testing) {
    716                     if (headerClass == From.class || headerClass == To.class
    717                             || headerClass == CallID.class
    718                             || headerClass == MaxForwards.class
    719                             || headerClass == Via.class
    720                             || headerClass == RequestLine.class
    721                             || headerClass == StatusLine.class
    722                             || headerClass == CSeq.class)
    723                         throw ex;
    724 
    725                     sipMessage.addUnparsed(headerText);
    726                 }
    727 
    728             }
    729 
    730         };
    731 
    732         if (this.testing)
    733             smp.setParseExceptionListener(parseExceptionListener);
    734 
    735         SIPMessage sipMessage = smp.parseSIPMessage(requestString);
    736 
    737         if (!(sipMessage instanceof SIPRequest))
    738             throw new ParseException(requestString, 0);
    739 
    740         return (SIPRequest) sipMessage;
    741     }
    742 
    743     /**
    744      * Create a response from a string
    745      *
    746      * @param responseString --
    747      *            string from which to create the message null string returns an
    748      *            empty message.
    749      *
    750      */
    751     public Response createResponse(String responseString)
    752             throws java.text.ParseException {
    753         if (responseString == null)
    754             return new SIPResponse();
    755 
    756         StringMsgParser smp = new StringMsgParser();
    757 
    758         SIPMessage sipMessage = smp.parseSIPMessage(responseString);
    759 
    760         if (!(sipMessage instanceof SIPResponse))
    761             throw new ParseException(responseString, 0);
    762 
    763         return (SIPResponse) sipMessage;
    764     }
    765 
    766     /**
    767      * Set the common UserAgent header for all requests created from this message factory.
    768      * This header is applied to all Messages created from this Factory object except those
    769      * that take String for an argument and create Message from the given String.
    770      *
    771      * @param userAgent -- the user agent header to set.
    772      *
    773      * @since 2.0
    774      */
    775 
    776     public void setDefaultUserAgentHeader(UserAgentHeader userAgent) {
    777         MessageFactoryImpl.userAgent = userAgent;
    778     }
    779 
    780     /**
    781      * Set the common Server header for all responses created from this message factory.
    782      * This header is applied to all Messages created from this Factory object except those
    783      * that take String for an argument and create Message from the given String.
    784      *
    785      * @param userAgent -- the user agent header to set.
    786      *
    787      * @since 2.0
    788      */
    789 
    790     public void setDefaultServerHeader(ServerHeader server) {
    791         MessageFactoryImpl.server = server;
    792     }
    793     /**
    794      * Get the default common UserAgentHeader.
    795      *
    796      * @return the user agent header.
    797      *
    798      * @since 2.0
    799      */
    800     public static UserAgentHeader getDefaultUserAgentHeader() {
    801         return userAgent;
    802     }
    803 
    804 
    805     /**
    806      * Get the default common server header.
    807      *
    808      * @return the server header.
    809      */
    810     public static ServerHeader getDefaultServerHeader() {
    811         return server;
    812     }
    813 
    814 
    815     /**
    816      * Set default charset used for encoding String content.
    817      * @param charset
    818      */
    819     public  void setDefaultContentEncodingCharset(String charset) throws NullPointerException,
    820     IllegalArgumentException {
    821         if (charset == null ) throw new NullPointerException ("Null argument!");
    822         MessageFactoryImpl.defaultContentEncodingCharset = charset;
    823 
    824     }
    825 
    826     public static String getDefaultContentEncodingCharset() {
    827         return MessageFactoryImpl.defaultContentEncodingCharset;
    828     }
    829 
    830 
    831     public MultipartMimeContent createMultipartMimeContent(ContentTypeHeader multipartMimeCth,
    832             String[] contentType,
    833             String[] contentSubtype,
    834             String[] contentBody) {
    835         String boundary = multipartMimeCth.getParameter("boundary");
    836         MultipartMimeContentImpl retval = new MultipartMimeContentImpl(multipartMimeCth);
    837         for (int i = 0 ;  i < contentType.length; i++ ) {
    838             ContentTypeHeader cth = new ContentType(contentType[i],contentSubtype[i]);
    839             ContentImpl contentImpl  = new ContentImpl(contentBody[i],boundary);
    840             contentImpl.setContentTypeHeader(cth);
    841             retval.add(contentImpl);
    842         }
    843         return retval;
    844     }
    845 
    846 
    847 
    848 
    849 }
    850