content: /*
   * 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 gov2.nist.javax2.sip.message;
  
  import java.text.ParseException;
  
  import java.util.LinkedList;
  import java.util.List;
  
  import javax2.sip.address.*;
  import javax2.sip.header.*;
  import javax2.sip.message.*;
  
  import gov2.nist.javax2.sip.header.*;
  import gov2.nist.javax2.sip.parser.*;
  
  /**
   * Message Factory implementation
   *
   * @version 1.2 $Revision: 1.23 $ $Date: 2009/09/08 01:58:40 $
   * @since 1.1
   *
   * @author M. Ranganathan <br/>
   * @author Olivier Deruelle <br/>
   *
   */
  @SuppressWarnings("unchecked")
  public class MessageFactoryImpl implements MessageFactory, MessageFactoryExt {
  
      private boolean testing = false;
      
      private boolean strict  = true;
  
      private static String defaultContentEncodingCharset = "UTF-8";
  
  
      /*
       * The UserAgent header to include for all requests created from this message factory.
       */
      private static UserAgentHeader userAgent;
  
      /*
       * The Server header to include
       */
      private static ServerHeader server;
      
      
      public void setStrict(boolean strict) {
          this.strict = strict;
      }
  
  
  
      /**
       * This is for testing -- allows you to generate invalid requests
       */
      public void setTest(boolean flag) {
          this.testing = flag;
      }
  
      /**
       * Creates a new instance of MessageFactoryImpl
       */
      public MessageFactoryImpl() {
      }
  
      /**
       * Creates a new Request message of type specified by the method paramater,
       * containing the URI of the Request, the mandatory headers of the message
       * with a body in the form of a Java object and the body content type.
       *
       * @param requestURI -
       *            the new URI object of the requestURI value of this Message.
       * @param method -
       *            the new string of the method value of this Message.
       * @param callId -
       *            the new CallIdHeader object of the callId value of this
       *            Message.
       * @param cSeq -
       *            the new CSeqHeader object of the cSeq value of this Message.
       * @param from -
       *            the new FromHeader object of the from value of this Message.
       * @param to -
       *            the new ToHeader object of the to value of this Message.
       * @param via -
       *            the new List object of the ViaHeaders of this Message.
       * @param content -
       *            the new Object of the body content value of this Message.
       * @param contentType -
       *            the new ContentTypeHeader object of the content type value of
       *            this Message.
       * @throws ParseException
       *             which signals that an error has been reached unexpectedly
       *             while parsing the method or the body.
       */
      public Request createRequest(javax2.sip.address.URI requestURI,
              String method, CallIdHeader callId, CSeqHeader cSeq,
              FromHeader from, ToHeader to, List via,
              MaxForwardsHeader maxForwards, ContentTypeHeader contentType,
              Object content) throws ParseException {
          if (requestURI == null || method == null || callId == null
                  || cSeq == null || from == null || to == null || via == null
                  || maxForwards == null || content == null
                  || contentType == null)
              throw new NullPointerException("Null parameters");
  
          SIPRequest sipRequest = new SIPRequest();
          sipRequest.setRequestURI(requestURI);
          sipRequest.setMethod(method);
          sipRequest.setCallId(callId);
          sipRequest.setCSeq(cSeq);
          sipRequest.setFrom(from);
          sipRequest.setTo(to);
          sipRequest.setVia(via);
          sipRequest.setMaxForwards(maxForwards);
          sipRequest.setContent(content, contentType);
          if ( userAgent != null ) {
              sipRequest.setHeader(userAgent);
          }
  
          return sipRequest;
      }
  
      /**
       * Creates a new Request message of type specified by the method paramater,
       * containing the URI of the Request, the mandatory headers of the message
       * with a body in the form of a byte array and body content type.
       *
       * @param requestURI -
       *            the new URI object of the requestURI value of this Message.
       * @param method -
       *            the new string of the method value of this Message.
       * @param callId -
       *            the new CallIdHeader object of the callId value of this
       *            Message.
       * @param cSeq -
       *            the new CSeqHeader object of the cSeq value of this Message.
       * @param from -
       *            the new FromHeader object of the from value of this Message.
       * @param to -
       *            the new ToHeader object of the to value of this Message.
       * @param via -
       *            the new List object of the ViaHeaders of this Message.
       * @param content -
       *            the new byte array of the body content value of this Message.
       * @param contentType -
       *            the new ContentTypeHeader object of the content type value of
       *            this Message.
       * @throws ParseException
       *             which signals that an error has been reached unexpectedly
       *             while parsing the method or the body.
       */
      public Request createRequest(URI requestURI, String method,
              CallIdHeader callId, CSeqHeader cSeq, FromHeader from, ToHeader to,
              List via, MaxForwardsHeader maxForwards, byte[] content,
              ContentTypeHeader contentType) throws ParseException {
          if (requestURI == null || method == null || callId == null
                  || cSeq == null || from == null || to == null || via == null
                  || maxForwards == null || content == null
                  || contentType == null)
              throw new ParseException(
                      "JAIN-SIP Exception, some parameters are missing"
                              + ", unable to create the request", 0);
  
          SIPRequest sipRequest = new SIPRequest();
          sipRequest.setRequestURI(requestURI);
          sipRequest.setMethod(method);
          sipRequest.setCallId(callId);
          sipRequest.setCSeq(cSeq);
          sipRequest.setFrom(from);
          sipRequest.setTo(to);
          sipRequest.setVia(via);
          sipRequest.setMaxForwards(maxForwards);
          sipRequest.setHeader((ContentType) contentType);
          sipRequest.setMessageContent(content);
          if ( userAgent != null ) {
              sipRequest.setHeader(userAgent);
          }
          return sipRequest;
      }
  
      /**
       * Creates a new Request message of type specified by the method paramater,
       * containing the URI of the Request, the mandatory headers of the message.
       * This new Request does not contain a body.
       *
       * @param requestURI -
       *            the new URI object of the requestURI value of this Message.
       * @param method -
       *            the new string of the method value of this Message.
       * @param callId -
       *            the new CallIdHeader object of the callId value of this
       *            Message.
       * @param cSeq -
       *            the new CSeqHeader object of the cSeq value of this Message.
       * @param from -
       *            the new FromHeader object of the from value of this Message.
       * @param to -
       *            the new ToHeader object of the to value of this Message.
       * @param via -
       *            the new List object of the ViaHeaders of this Message.
       * @throws ParseException
       *             which signals that an error has been reached unexpectedly
       *             while parsing the method.
       */
      public Request createRequest(URI requestURI, String method,
              CallIdHeader callId, CSeqHeader cSeq, FromHeader from, ToHeader to,
              List via, MaxForwardsHeader maxForwards) throws ParseException {
          if (requestURI == null || method == null || callId == null
                  || cSeq == null || from == null || to == null || via == null
                  || maxForwards == null)
              throw new ParseException(
                      "JAIN-SIP Exception, some parameters are missing"
                              + ", unable to create the request", 0);
  
          SIPRequest sipRequest = new SIPRequest();
          sipRequest.setRequestURI(requestURI);
          sipRequest.setMethod(method);
          sipRequest.setCallId(callId);
          sipRequest.setCSeq(cSeq);
          sipRequest.setFrom(from);
          sipRequest.setTo(to);
          sipRequest.setVia(via);
          sipRequest.setMaxForwards(maxForwards);
          if (userAgent != null) {
              sipRequest.setHeader(userAgent);
          }
  
          return sipRequest;
      }
  
      // Standard Response Creation methods
  
      /**
       * Creates a new Response message of type specified by the statusCode
       * paramater, containing the mandatory headers of the message with a body in
       * the form of a Java object and the body content type.
       *
       * @param statusCode -
       *            the new integer of the statusCode value of this Message.
       * @param callId -
       *            the new CallIdHeader object of the callId value of this
       *            Message.
       * @param cSeq -
       *            the new CSeqHeader object of the cSeq value of this Message.
       * @param from -
       *            the new FromHeader object of the from value of this Message.
       * @param to -
       *            the new ToHeader object of the to value of this Message.
       * @param via -
       *            the new List object of the ViaHeaders of this Message.
       * @param content -
       *            the new Object of the body content value of this Message.
       * @param contentType -
       *            the new ContentTypeHeader object of the content type value of
       *            this Message.
       * @throws ParseException
       *             which signals that an error has been reached unexpectedly
       *             while parsing the statusCode or the body.
       */
      public Response createResponse(int statusCode, CallIdHeader callId,
              CSeqHeader cSeq, FromHeader from, ToHeader to, List via,
              MaxForwardsHeader maxForwards, Object content,
              ContentTypeHeader contentType) throws ParseException {
          if (callId == null || cSeq == null || from == null || to == null
                  || via == null || maxForwards == null || content == null
                  || contentType == null)
              throw new NullPointerException(" unable to create the response");
  
          SIPResponse sipResponse = new SIPResponse();
          StatusLine statusLine = new StatusLine();
          statusLine.setStatusCode(statusCode);
          String reasonPhrase = SIPResponse.getReasonPhrase(statusCode);
          //if (reasonPhrase == null)
          //  throw new ParseException(statusCode + " Unkown  ", 0);
          statusLine.setReasonPhrase(reasonPhrase);
          sipResponse.setStatusLine(statusLine);
          sipResponse.setCallId(callId);
          sipResponse.setCSeq(cSeq);
          sipResponse.setFrom(from);
          sipResponse.setTo(to);
          sipResponse.setVia(via);
          sipResponse.setMaxForwards(maxForwards);
          sipResponse.setContent(content, contentType);
          if (userAgent != null) {
              sipResponse.setHeader(userAgent);
          }
          return sipResponse;
      }
  
      /**
       * Creates a new Response message of type specified by the statusCode
       * paramater, containing the mandatory headers of the message with a body in
       * the form of a byte array and the body content type.
       *
       * @param statusCode -
       *            the new integer of the statusCode value of this Message.
       * @param callId -
       *            the new CallIdHeader object of the callId value of this
       *            Message.
       * @param cSeq -
       *            the new CSeqHeader object of the cSeq value of this Message.
       * @param from -
       *            the new FromHeader object of the from value of this Message.
       * @param to -
       *            the new ToHeader object of the to value of this Message.
       * @param via -
       *            the new List object of the ViaHeaders of this Message.
       * @param content -
       *            the new byte array of the body content value of this Message.
       * @param contentType -
       *            the new ContentTypeHeader object of the content type value of
       *            this Message.
       * @throws ParseException
       *             which signals that an error has been reached unexpectedly
       *             while parsing the statusCode or the body.
       */
      public Response createResponse(int statusCode, CallIdHeader callId,
              CSeqHeader cSeq, FromHeader from, ToHeader to, List via,
              MaxForwardsHeader maxForwards, byte[] content,
              ContentTypeHeader contentType) throws ParseException {
          if (callId == null || cSeq == null || from == null || to == null
                  || via == null || maxForwards == null || content == null
                  || contentType == null)
              throw new NullPointerException("Null params ");
  
          SIPResponse sipResponse = new SIPResponse();
          sipResponse.setStatusCode(statusCode);
          sipResponse.setCallId(callId);
          sipResponse.setCSeq(cSeq);
          sipResponse.setFrom(from);
          sipResponse.setTo(to);
          sipResponse.setVia(via);
          sipResponse.setMaxForwards(maxForwards);
          sipResponse.setHeader((ContentType) contentType);
          sipResponse.setMessageContent(content);
          if (userAgent != null) {
              sipResponse.setHeader(userAgent);
          }
          return sipResponse;
      }
  
      /**
       * Creates a new Response message of type specified by the statusCode
       * paramater, containing the mandatory headers of the message. This new
       * Response does not contain a body.
       *
       * @param statusCode -
       *            the new integer of the statusCode value of this Message.
       * @param callId -
       *            the new CallIdHeader object of the callId value of this
       *            Message.
       * @param cSeq -
       *            the new CSeqHeader object of the cSeq value of this Message.
       * @param from -
       *            the new FromHeader object of the from value of this Message.
       * @param to -
       *            the new ToHeader object of the to value of this Message.
       * @param via -
       *            the new List object of the ViaHeaders of this Message.
       * @throws ParseException
       *             which signals that an error has been reached unexpectedly
       *             while parsing the statusCode.
       */
      public Response createResponse(int statusCode, CallIdHeader callId,
              CSeqHeader cSeq, FromHeader from, ToHeader to, List via,
              MaxForwardsHeader maxForwards) throws ParseException {
          if (callId == null || cSeq == null || from == null || to == null
                  || via == null || maxForwards == null)
              throw new ParseException(
                      "JAIN-SIP Exception, some parameters are missing"
                              + ", unable to create the response", 0);
  
          SIPResponse sipResponse = new SIPResponse();
          sipResponse.setStatusCode(statusCode);
          sipResponse.setCallId(callId);
          sipResponse.setCSeq(cSeq);
          sipResponse.setFrom(from);
          sipResponse.setTo(to);
          sipResponse.setVia(via);
          sipResponse.setMaxForwards(maxForwards);
          if (userAgent != null) {
              sipResponse.setHeader(userAgent);
          }
          return sipResponse;
      }
  
      // Response Creation methods based on a Request
  
      /**
       * Creates a new Response message of type specified by the statusCode
       * paramater, based on a specific Request with a new body in the form of a
       * Java object and the body content type.
       *
       * @param statusCode -
       *            the new integer of the statusCode value of this Message.
       * @param request -
       *            the received Reqest object upon which to base the Response.
       * @param content -
       *            the new Object of the body content value of this Message.
       * @param contentType -
       *            the new ContentTypeHeader object of the content type value of
       *            this Message.
       * @throws ParseException
       *             which signals that an error has been reached unexpectedly
       *             while parsing the statusCode or the body.
       */
      public Response createResponse(int statusCode, Request request,
              ContentTypeHeader contentType, Object content)
              throws ParseException {
          if (request == null || content == null || contentType == null)
              throw new NullPointerException("null parameters");
  
          SIPRequest sipRequest = (SIPRequest) request;
          SIPResponse sipResponse = sipRequest.createResponse(statusCode);
          sipResponse.setContent(content, contentType);
          if (server != null) {
              sipResponse.setHeader(server);
          }
          return sipResponse;
      }
  
      /**
       * Creates a new Response message of type specified by the statusCode
       * paramater, based on a specific Request with a new body in the form of a
       * byte array and the body content type.
       *
       * @param statusCode -
       *            the new integer of the statusCode value of this Message.
       * @param request -
       *            the received Reqest object upon which to base the Response.
       * @param content -
       *            the new byte array of the body content value of this Message.
       * @param contentType -
       *            the new ContentTypeHeader object of the content type value of
       *            this Message.
       * @throws ParseException
       *             which signals that an error has been reached unexpectedly
       *             while parsing the statusCode or the body.
       */
      public Response createResponse(int statusCode, Request request,
              ContentTypeHeader contentType, byte[] content)
              throws ParseException {
          if (request == null || content == null || contentType == null)
              throw new NullPointerException("null Parameters");
  
          SIPRequest sipRequest = (SIPRequest) request;
          SIPResponse sipResponse = sipRequest.createResponse(statusCode);
          sipResponse.setHeader((ContentType) contentType);
          sipResponse.setMessageContent(content);
          if (server != null) {
              sipResponse.setHeader(server);
          }
          return sipResponse;
      }
  
      /**
       * Creates a new Response message of type specified by the statusCode
       * paramater, based on a specific Request message. This new Response does
       * not contain a body.
       *
       * @param statusCode -
       *            the new integer of the statusCode value of this Message.
       * @param request -
       *            the received Reqest object upon which to base the Response.
       * @throws ParseException
       *             which signals that an error has been reached unexpectedly
       *             while parsing the statusCode.
       */
      public Response createResponse(int statusCode, Request request)
              throws ParseException {
          if (request == null)
              throw new NullPointerException("null parameters");
  
          // if (LogWriter.needsLogging)
          // LogWriter.logMessage("createResponse " + request);
  
          SIPRequest sipRequest = (SIPRequest) request;
          SIPResponse sipResponse = sipRequest.createResponse(statusCode);
          // Remove the content from the message (Bug report from
          // Antonis Karydas.
          sipResponse.removeContent();
          sipResponse.removeHeader(ContentTypeHeader.NAME);
          if (server != null) {
              sipResponse.setHeader(server);
          }
          return sipResponse;
      }
  
      /**
       * Creates a new Request message of type specified by the method paramater,
       * containing the URI of the Request, the mandatory headers of the message
       * with a body in the form of a byte array and body content type.
       *
       * @param requestURI -
       *            the new URI object of the requestURI value of this Message.
       * @param method -
       *            the new string of the method value of this Message.
       * @param callId -
       *            the new CallIdHeader object of the callId value of this
       *            Message.
       * @param cSeq -
       *            the new CSeqHeader object of the cSeq value of this Message.
       * @param from -
       *            the new FromHeader object of the from value of this Message.
       * @param to -
       *            the new ToHeader object of the to value of this Message.
       * @param via -
       *            the new List object of the ViaHeaders of this Message.
       * @param contentType -
       *            the new ContentTypeHeader object of the content type value of
       *            this Message.
       * @param content -
       *            the new byte array of the body content value of this Message.
       * @throws ParseException
       *             which signals that an error has been reached unexpectedly
       *             while parsing the method or the body.
       */
      public Request createRequest(javax2.sip.address.URI requestURI,
              String method, CallIdHeader callId, CSeqHeader cSeq,
              FromHeader from, ToHeader to, List via,
              MaxForwardsHeader maxForwards, ContentTypeHeader contentType,
              byte[] content) throws ParseException {
          if (requestURI == null || method == null || callId == null
                  || cSeq == null || from == null || to == null || via == null
                  || maxForwards == null || content == null
                  || contentType == null)
              throw new NullPointerException("missing parameters");
  
          SIPRequest sipRequest = new SIPRequest();
          sipRequest.setRequestURI(requestURI);
          sipRequest.setMethod(method);
          sipRequest.setCallId(callId);
          sipRequest.setCSeq(cSeq);
          sipRequest.setFrom(from);
          sipRequest.setTo(to);
          sipRequest.setVia(via);
          sipRequest.setMaxForwards(maxForwards);
          sipRequest.setContent(content, contentType);
          if (userAgent != null) {
              sipRequest.setHeader(userAgent);
          }
          return sipRequest;
      }
  
      /**
       * Creates a new Response message of type specified by the statusCode
       * paramater, containing the mandatory headers of the message with a body in
       * the form of a Java object and the body content type.
       *
       * @param statusCode
       *            the new integer of the statusCode value of this Message.
       * @param callId
       *            the new CallIdHeader object of the callId value of this
       *            Message.
       * @param cSeq
       *            the new CSeqHeader object of the cSeq value of this Message.
       * @param from
       *            the new FromHeader object of the from value of this Message.
       * @param to
       *            the new ToHeader object of the to value of this Message.
       * @param via
       *            the new List object of the ViaHeaders of this Message.
       * @param contentType
       *            the new ContentTypeHeader object of the content type value of
       *            this Message.
       * @param content
       *            the new Object of the body content value of this Message.
       * @throws ParseException
       *             which signals that an error has been reached unexpectedly
       *             while parsing the statusCode or the body.
       */
      public Response createResponse(int statusCode, CallIdHeader callId,
              CSeqHeader cSeq, FromHeader from, ToHeader to, List via,
              MaxForwardsHeader maxForwards, ContentTypeHeader contentType,
              Object content) throws ParseException {
          if (callId == null || cSeq == null || from == null || to == null
                  || via == null || maxForwards == null || content == null
                  || contentType == null)
              throw new NullPointerException("missing parameters");
          SIPResponse sipResponse = new SIPResponse();
          StatusLine statusLine = new StatusLine();
          statusLine.setStatusCode(statusCode);
          String reason = SIPResponse.getReasonPhrase(statusCode);
          if (reason == null)
              throw new ParseException(statusCode + " Unknown", 0);
          statusLine.setReasonPhrase(reason);
          sipResponse.setStatusLine(statusLine);
          sipResponse.setCallId(callId);
          sipResponse.setCSeq(cSeq);
          sipResponse.setFrom(from);
          sipResponse.setTo(to);
          sipResponse.setVia(via);
          sipResponse.setContent(content, contentType);
          if ( userAgent != null) {
              sipResponse.setHeader(userAgent);
          }
          return sipResponse;
  
      }
  
      /**
       * Creates a new Response message of type specified by the statusCode
       * paramater, containing the mandatory headers of the message with a body in
       * the form of a byte array and the body content type.
       *
       * @param statusCode
       *            the new integer of the statusCode value of this Message.
       * @param callId
       *            the new CallIdHeader object of the callId value of this
       *            Message.
       * @param cSeq
       *            the new CSeqHeader object of the cSeq value of this Message.
       * @param from
       *            the new FromHeader object of the from value of this Message.
       * @param to
       *            the new ToHeader object of the to value of this Message.
       * @param via
       *            the new List object of the ViaHeaders of this Message.
       * @param contentType
       *            the new ContentTypeHeader object of the content type value of
       *            this Message.
       * @param content
       *            the new byte array of the body content value of this Message.
       * @throws ParseException
       *             which signals that an error has been reached unexpectedly
       *             while parsing the statusCode or the body.
       */
      public Response createResponse(int statusCode, CallIdHeader callId,
              CSeqHeader cSeq, FromHeader from, ToHeader to, List via,
              MaxForwardsHeader maxForwards, ContentTypeHeader contentType,
              byte[] content) throws ParseException {
          if (callId == null || cSeq == null || from == null || to == null
                  || via == null || maxForwards == null || content == null
                  || contentType == null)
              throw new NullPointerException("missing parameters");
          SIPResponse sipResponse = new SIPResponse();
          StatusLine statusLine = new StatusLine();
          statusLine.setStatusCode(statusCode);
          String reason = SIPResponse.getReasonPhrase(statusCode);
          if (reason == null)
              throw new ParseException(statusCode + " : Unknown", 0);
          statusLine.setReasonPhrase(reason);
          sipResponse.setStatusLine(statusLine);
          sipResponse.setCallId(callId);
          sipResponse.setCSeq(cSeq);
          sipResponse.setFrom(from);
          sipResponse.setTo(to);
          sipResponse.setVia(via);
          sipResponse.setContent(content, contentType);
          if ( userAgent != null) {
              sipResponse.setHeader(userAgent);
          }
          return sipResponse;
      }
  
      /**
       * Create a request from a string. Conveniance method for UACs that want to
       * create an outgoing request from a string. Only the headers of the request
       * should be included in the String that is supplied to this method.
       *
       * @param requestString --
       *            string from which to create the message null string returns an
       *            empty message.
       */
      public javax2.sip.message.Request createRequest(String requestString)
              throws java.text.ParseException {
          if (requestString == null || requestString.equals("")) {
              SIPRequest retval = new SIPRequest();
              retval.setNullRequest();
              return retval;
          }
  
          StringMsgParser smp = new StringMsgParser();
          smp.setStrict(this.strict);
  
          /*
           * This allows you to catch parse exceptions and create invalid messages
           * if you want.
           */
          ParseExceptionListener parseExceptionListener = new ParseExceptionListener() {
  
              public void handleException(ParseException ex,
                      SIPMessage sipMessage, Class headerClass,
                      String headerText, String messageText)
                      throws ParseException {
                  // Rethrow the error for the essential headers. Otherwise bad
                  // headers are simply
                  // recorded in the message.
                  if (testing) {
                      if (headerClass == From.class || headerClass == To.class
                              || headerClass == CallID.class
                              || headerClass == MaxForwards.class
                              || headerClass == Via.class
                              || headerClass == RequestLine.class
                              || headerClass == StatusLine.class
                              || headerClass == CSeq.class)
                          throw ex;
  
                      sipMessage.addUnparsed(headerText);
                  }
  
              }
  
          };
  
          if (this.testing)
              smp.setParseExceptionListener(parseExceptionListener);
  
          SIPMessage sipMessage = smp.parseSIPMessage(requestString);
  
          if (!(sipMessage instanceof SIPRequest))
              throw new ParseException(requestString, 0);
  
          return (SIPRequest) sipMessage;
      }
  
      /**
       * Create a response from a string
       *
       * @param responseString --
       *            string from which to create the message null string returns an
       *            empty message.
       *
       */
      public Response createResponse(String responseString)
              throws java.text.ParseException {
          if (responseString == null)
              return new SIPResponse();
  
          StringMsgParser smp = new StringMsgParser();
  
          SIPMessage sipMessage = smp.parseSIPMessage(responseString);
  
          if (!(sipMessage instanceof SIPResponse))
              throw new ParseException(responseString, 0);
  
          return (SIPResponse) sipMessage;
      }
  
      /**
       * Set the common UserAgent header for all requests created from this message factory.
       * This header is applied to all Messages created from this Factory object except those
       * that take String for an argument and create Message from the given String.
       *
       * @param userAgent -- the user agent header to set.
       *
       * @since 2.0
       */
  
      public void setDefaultUserAgentHeader(UserAgentHeader userAgent) {
          MessageFactoryImpl.userAgent = userAgent;
      }
  
      /**
       * Set the common Server header for all responses created from this message factory.
       * This header is applied to all Messages created from this Factory object except those
       * that take String for an argument and create Message from the given String.
       *
       * @param userAgent -- the user agent header to set.
       *
       * @since 2.0
       */
  
      public void setDefaultServerHeader(ServerHeader server) {
          MessageFactoryImpl.server = server;
      }
      /**
       * Get the default common UserAgentHeader.
       *
       * @return the user agent header.
       *
       * @since 2.0
       */
      public static UserAgentHeader getDefaultUserAgentHeader() {
          return userAgent;
      }
  
  
      /**
       * Get the default common server header.
       *
       * @return the server header.
       */
      public static ServerHeader getDefaultServerHeader() {
          return server;
      }
  
  
      /**
       * Set default charset used for encoding String content.
       * @param charset
       */
      public  void setDefaultContentEncodingCharset(String charset) throws NullPointerException,
      IllegalArgumentException {
          if (charset == null ) throw new NullPointerException ("Null argument!");
          MessageFactoryImpl.defaultContentEncodingCharset = charset;
  
      }
  
      public static String getDefaultContentEncodingCharset() {
          return MessageFactoryImpl.defaultContentEncodingCharset;
      }
  
      
      public MultipartMimeContent createMultipartMimeContent(ContentTypeHeader multipartMimeCth,
              String[] contentType,
              String[] contentSubtype, 
              String[] contentBody) {
          String boundary = multipartMimeCth.getParameter("boundary");
          MultipartMimeContentImpl retval = new MultipartMimeContentImpl(multipartMimeCth);
          for (int i = 0 ;  i < contentType.length; i++ ) {
              ContentTypeHeader cth = new ContentType(contentType[i],contentSubtype[i]);
              ContentImpl contentImpl  = new ContentImpl(contentBody[i],boundary);
              contentImpl.setContentTypeHeader(cth);
              retval.add(contentImpl);
          }
          return retval;
      }
  
  
  
  
  }
  