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* Product of NIST/ITL Advanced Networking Technologies Division (ANTD).        *
26*******************************************************************************/
27package gov.nist.javax.sip.header;
28import gov.nist.javax.sip.header.ims.*; /* IMS headers - issued by Miguel Freitas */
29import gov.nist.javax.sip.header.extensions.*; // extension headers - pmusgrave
30import javax.sip.header.*;
31
32import gov.nist.javax.sip.parser.*;
33import gov.nist.javax.sip.parser.extensions.ReferencesParser;
34
35import javax.sip.address.*;
36import java.text.ParseException;
37import javax.sip.InvalidArgumentException;
38import java.util.*;
39import gov.nist.javax.sip.address.*;
40
41/*
42* This file contains enhancements contributed by Alexandre Silva Santos
43* (PT-Inovacao) and Miguel Freitas
44*/
45
46/** Implementation of the JAIN SIP  HeaderFactory
47*
48* @version 1.2 $Revision: 1.22 $ $Date: 2010/01/12 18:58:48 $
49* @since 1.1
50*
51*@author M. Ranganathan   <br/>
52*@author Olivier Deruelle <br/>
53*
54*
55*/
56public class HeaderFactoryImpl implements HeaderFactory , HeaderFactoryExt {
57
58    /**
59     * Determines whether or not we should tolerate and strip address scope
60     * zones from IPv6 addresses. Address scope zones are sometimes returned
61     * at the end of IPv6 addresses generated by InetAddress.getHostAddress().
62     * They are however not part of the SIP semantics so basically this method
63     * determines whether or not the parser should be stripping them (as
64     * opposed simply being blunt and throwing an exception).
65     */
66    private boolean stripAddressScopeZones = false;
67
68    /**
69     * Set pretty encoding on / off.
70     * This splits up via headers into multiple lines for readability ( better for
71     * debugging ).
72     *
73     */
74    public void setPrettyEncoding(boolean flag) {
75        SIPHeaderList.setPrettyEncode(flag);
76    }
77
78    /**
79    * Creates a new AcceptEncodingHeader based on the newly supplied encoding
80    * value.
81    *
82    * @param encoding - the new string containing the encoding value.
83    * @throws ParseException which signals that an error has been reached
84    * unexpectedly while parsing the encoding value.
85    * @return the newly created AcceptEncodingHeader object.
86    */
87    public AcceptEncodingHeader createAcceptEncodingHeader(String encoding)
88        throws ParseException {
89        if (encoding == null)
90            throw new NullPointerException("the encoding parameter is null");
91        AcceptEncoding acceptEncoding = new AcceptEncoding();
92        acceptEncoding.setEncoding(encoding);
93        return acceptEncoding;
94    }
95
96    /**
97     * Creates a new AcceptHeader based on the newly supplied contentType and
98     * contentSubType values.
99     *
100     * @param contentType The new string content type value.
101     * @param contentSubType The new string content sub-type value.
102     * @throws ParseException which signals that an error has been reached
103     * unexpectedly while parsing the content type or content subtype value.
104     * @return the newly created AcceptHeader object.
105     */
106    public AcceptHeader createAcceptHeader(
107        String contentType,
108        String contentSubType)
109        throws ParseException {
110        if (contentType == null || contentSubType == null)
111            throw new NullPointerException("contentType or subtype is null ");
112        Accept accept = new Accept();
113        accept.setContentType(contentType);
114        accept.setContentSubType(contentSubType);
115
116        return accept;
117    }
118
119    /**
120     * Creates a new AcceptLanguageHeader based on the newly supplied
121     * language value.
122     *
123     * @param language - the new Locale value of the language
124     * @return the newly created AcceptLanguageHeader object.
125     */
126    public AcceptLanguageHeader createAcceptLanguageHeader(Locale language) {
127        if (language == null)
128            throw new NullPointerException("null arg");
129        AcceptLanguage acceptLanguage = new AcceptLanguage();
130        acceptLanguage.setAcceptLanguage(language);
131
132        return acceptLanguage;
133    }
134
135    /**
136     * Creates a new AlertInfoHeader based on the newly supplied alertInfo value.
137     *
138     * @param alertInfo - the new URI value of the alertInfo
139     * @return the newly created AlertInfoHeader object.
140     * @since v1.1
141     */
142    public AlertInfoHeader createAlertInfoHeader(URI alertInfo) {
143        if (alertInfo == null)
144            throw new NullPointerException("null arg alertInfo");
145        AlertInfo a = new AlertInfo();
146        a.setAlertInfo(alertInfo);
147        return a;
148    }
149
150    /**
151     * Creates a new AllowEventsHeader based on the newly supplied event type
152     * value.
153     *
154     * @param eventType - the new string containing the eventType value.
155     * @throws ParseException which signals that an error has been reached
156     * unexpectedly while parsing the eventType value.
157     * @return the newly created AllowEventsHeader object.
158     * @since v1.1
159     */
160    public AllowEventsHeader createAllowEventsHeader(String eventType)
161        throws ParseException {
162        if (eventType == null)
163            throw new NullPointerException("null arg eventType");
164        AllowEvents allowEvents = new AllowEvents();
165        allowEvents.setEventType(eventType);
166        return allowEvents;
167    }
168
169    /**
170     * Creates a new AllowHeader based on the newly supplied method value.
171     *
172     * @param method - the new string containing the method value.
173     * @throws ParseException which signals that an error has been reached
174     * unexpectedly while parsing the method value.
175     * @return the newly created AllowHeader object.
176     */
177    public AllowHeader createAllowHeader(String method) throws ParseException {
178        if (method == null)
179            throw new NullPointerException("null arg method");
180        Allow allow = new Allow();
181        allow.setMethod(method);
182
183        return allow;
184    }
185
186    /**
187     * Creates a new AuthenticationInfoHeader based on the newly supplied
188     * response value.
189     *
190     * @param response - the new string value of the response.
191     * @throws ParseException which signals that an error has been reached
192     * unexpectedly while parsing the response value.
193     * @return the newly created AuthenticationInfoHeader object.
194     * @since v1.1
195     */
196    public AuthenticationInfoHeader createAuthenticationInfoHeader(String response)
197        throws ParseException {
198        if (response == null)
199            throw new NullPointerException("null arg response");
200        AuthenticationInfo auth = new AuthenticationInfo();
201        auth.setResponse(response);
202
203        return auth;
204    }
205
206    /**
207     * Creates a new AuthorizationHeader based on the newly supplied
208     * scheme value.
209     *
210     * @param scheme - the new string value of the scheme.
211     * @throws ParseException which signals that an error has been reached
212     * unexpectedly while parsing the scheme value.
213     * @return the newly created AuthorizationHeader object.
214     */
215    public AuthorizationHeader createAuthorizationHeader(String scheme)
216        throws ParseException {
217        if (scheme == null)
218            throw new NullPointerException("null arg scheme ");
219        Authorization auth = new Authorization();
220        auth.setScheme(scheme);
221
222        return auth;
223    }
224
225    /**
226     * Creates a new CSeqHeader based on the newly supplied sequence number and
227     * method values.
228     *
229     * @param sequenceNumber - the new integer value of the sequence number.
230     * @param method - the new string value of the method.
231     * @throws InvalidArgumentException if supplied sequence number is less
232     * than zero.
233     * @throws ParseException which signals that an error has been reached
234     * unexpectedly while parsing the method value.
235     * @return the newly created CSeqHeader object.
236     */
237    public CSeqHeader createCSeqHeader( long sequenceNumber, String method)
238        throws ParseException, InvalidArgumentException {
239        if (sequenceNumber < 0)
240            throw new InvalidArgumentException("bad arg " + sequenceNumber);
241        if (method == null)
242            throw new NullPointerException("null arg method");
243        CSeq cseq = new CSeq();
244        cseq.setMethod(method);
245        cseq.setSeqNumber(sequenceNumber);
246
247        return cseq;
248    }
249
250    /**
251     * For backwards compatibility, also accept int
252     * @deprecated
253     */
254    public CSeqHeader createCSeqHeader( int sequenceNumber, String method)
255        throws ParseException, InvalidArgumentException {
256        return this.createCSeqHeader( (long) sequenceNumber, method );
257    }
258
259    /**
260     * Creates a new CallIdHeader based on the newly supplied callId value.
261     *
262     * @param callId - the new string value of the call-id.
263     * @throws ParseException which signals that an error has been reached
264     * unexpectedly while parsing the callId value.
265     * @return the newly created CallIdHeader object.
266     */
267    public CallIdHeader createCallIdHeader(String callId)
268        throws ParseException {
269        if (callId == null)
270            throw new NullPointerException("null arg callId");
271        CallID c = new CallID();
272        c.setCallId(callId);
273        return c;
274    }
275
276    /**
277     * Creates a new CallInfoHeader based on the newly supplied callInfo value.
278     *
279     * @param callInfo The new string value of the callInfo.
280     * @return the newly created CallInfoHeader object.
281     */
282    public CallInfoHeader createCallInfoHeader(URI callInfo) {
283        if (callInfo == null)
284            throw new NullPointerException("null arg callInfo");
285
286        CallInfo c = new CallInfo();
287        c.setInfo(callInfo);
288        return c;
289    }
290
291    /**
292     * Creates a new ContactHeader based on the newly supplied address value.
293     *
294     * @param address - the new Address value of the address.
295     * @return the newly created ContactHeader object.
296     */
297    public ContactHeader createContactHeader(Address address) {
298        if (address == null)
299            throw new NullPointerException("null arg address");
300        Contact contact = new Contact();
301        contact.setAddress(address);
302
303        return contact;
304    }
305
306    /**
307    * Creates a new wildcard ContactHeader. This is used in Register requests
308    * to indicate to the server that it should remove all locations the
309    * at which the user is currently available. This implies that the
310    * following conditions are met:
311    * <ul>
312    * <li><code>ContactHeader.getAddress.getAddress.getUserInfo() == *;</code>
313    * <li><code>ContactHeader.getAddress.getAddress.isWildCard() == true;</code>
314    * <li><code>ContactHeader.getExpires() == 0;</code>
315    * </ul>
316    *
317    * @return the newly created wildcard ContactHeader.
318    */
319    public ContactHeader createContactHeader() {
320        Contact contact = new Contact();
321        contact.setWildCardFlag(true);
322        contact.setExpires(0);
323
324        return contact;
325    }
326
327    /**
328     * Creates a new ContentDispositionHeader based on the newly supplied
329     * contentDisposition value.
330     *
331     * @param contentDisposition - the new string value of the contentDisposition.
332     * @throws ParseException which signals that an error has been reached
333     * unexpectedly while parsing the contentDisposition value.
334     * @return the newly created ContentDispositionHeader object.
335     * @since v1.1
336     */
337    public ContentDispositionHeader createContentDispositionHeader(String contentDisposition)
338        throws ParseException {
339        if (contentDisposition == null)
340            throw new NullPointerException("null arg contentDisposition");
341        ContentDisposition c = new ContentDisposition();
342        c.setDispositionType(contentDisposition);
343
344        return c;
345    }
346
347    /**
348    * Creates a new ContentEncodingHeader based on the newly supplied encoding
349    * value.
350    *
351    * @param encoding - the new string containing the encoding value.
352    * @throws ParseException which signals that an error has been reached
353    * unexpectedly while parsing the encoding value.
354    * @return the newly created ContentEncodingHeader object.
355    */
356    public ContentEncodingHeader createContentEncodingHeader(String encoding)
357        throws ParseException {
358        if (encoding == null)
359            throw new NullPointerException("null encoding");
360        ContentEncoding c = new ContentEncoding();
361        c.setEncoding(encoding);
362
363        return c;
364    }
365
366    /**
367     * Creates a new ContentLanguageHeader based on the newly supplied
368     * contentLanguage value.
369     *
370     * @param contentLanguage - the new Locale value of the contentLanguage.
371     * @return the newly created ContentLanguageHeader object.
372     * @since v1.1
373     */
374    public ContentLanguageHeader createContentLanguageHeader(Locale contentLanguage) {
375        if (contentLanguage == null)
376            throw new NullPointerException("null arg contentLanguage");
377        ContentLanguage c = new ContentLanguage();
378        c.setContentLanguage(contentLanguage);
379
380        return c;
381    }
382
383    /**
384     * Creates a new CSeqHeader based on the newly supplied contentLength value.
385     *
386     * @param contentLength - the new integer value of the contentLength.
387     * @throws InvalidArgumentException if supplied contentLength is less
388     * than zero.
389     * @return the newly created ContentLengthHeader object.
390     */
391    public ContentLengthHeader createContentLengthHeader(int contentLength)
392        throws InvalidArgumentException {
393        if (contentLength < 0)
394            throw new InvalidArgumentException("bad contentLength");
395        ContentLength c = new ContentLength();
396        c.setContentLength(contentLength);
397
398        return c;
399    }
400
401    /**
402     * Creates a new ContentTypeHeader based on the newly supplied contentType and
403     * contentSubType values.
404     *
405     * @param contentType - the new string content type value.
406     * @param contentSubType - the new string content sub-type value.
407     * @throws ParseException which signals that an error has been reached
408     * unexpectedly while parsing the content type or content subtype value.
409     * @return the newly created ContentTypeHeader object.
410     */
411    public ContentTypeHeader createContentTypeHeader(
412        String contentType,
413        String contentSubType)
414        throws ParseException {
415        if (contentType == null || contentSubType == null)
416            throw new NullPointerException("null contentType or subType");
417        ContentType c = new ContentType();
418        c.setContentType(contentType);
419        c.setContentSubType(contentSubType);
420        return c;
421    }
422
423    /**
424    * Creates a new DateHeader based on the newly supplied date value.
425    *
426    * @param date - the new Calender value of the date.
427    * @return the newly created DateHeader object.
428    */
429    public DateHeader createDateHeader(Calendar date) {
430        SIPDateHeader d = new SIPDateHeader();
431        if (date == null)
432            throw new NullPointerException("null date");
433        d.setDate(date);
434
435        return d;
436    }
437
438    /**
439     * Creates a new EventHeader based on the newly supplied eventType value.
440     *
441     * @param eventType - the new string value of the eventType.
442     * @throws ParseException which signals that an error has been reached
443     * unexpectedly while parsing the eventType value.
444     * @return the newly created EventHeader object.
445     * @since v1.1
446     */
447    public EventHeader createEventHeader(String eventType)
448        throws ParseException {
449        if (eventType == null)
450            throw new NullPointerException("null eventType");
451        Event event = new Event();
452        event.setEventType(eventType);
453
454        return event;
455    }
456
457    /**
458     * Creates a new ExpiresHeader based on the newly supplied expires value.
459     *
460     * @param expires - the new integer value of the expires.
461     * @throws InvalidArgumentException if supplied expires is less
462     * than zero.
463     * @return the newly created ExpiresHeader object.
464     */
465    public ExpiresHeader createExpiresHeader(int expires)
466        throws InvalidArgumentException {
467        if (expires < 0)
468            throw new InvalidArgumentException("bad value " + expires);
469        Expires e = new Expires();
470        e.setExpires(expires);
471
472        return e;
473    }
474
475    /**
476     * Creates a new ExtensionHeader based on the newly supplied name and
477     * value values.
478     *
479     * @param name - the new string name of the ExtensionHeader value.
480     * @param value - the new string value of the ExtensionHeader.
481     * @throws ParseException which signals that an error has been reached
482     * unexpectedly while parsing the name or value values.
483     * @return the newly created ExtensionHeader object.
484     */
485    public javax.sip.header.ExtensionHeader createExtensionHeader(
486        String name,
487        String value)
488        throws ParseException {
489        if (name == null)
490            throw new NullPointerException("bad name");
491
492        gov.nist.javax.sip.header.ExtensionHeaderImpl ext =
493            new gov.nist.javax.sip.header.ExtensionHeaderImpl();
494        ext.setName(name);
495        ext.setValue(value);
496
497        return ext;
498    }
499
500    /**
501     * Creates a new FromHeader based on the newly supplied address and
502     * tag values.
503     *
504     * @param address - the new Address object of the address.
505     * @param tag - the new string value of the tag.
506     * @throws ParseException which signals that an error has been reached
507     * unexpectedly while parsing the tag value.
508     * @return the newly created FromHeader object.
509     */
510    public FromHeader createFromHeader(Address address, String tag)
511        throws ParseException {
512        if (address == null)
513            throw new NullPointerException("null address arg");
514        From from = new From();
515        from.setAddress(address);
516        if (tag != null)
517            from.setTag(tag);
518
519        return from;
520    }
521
522    /**
523     * Creates a new InReplyToHeader based on the newly supplied callId
524     * value.
525     *
526     * @param callId - the new string containing the callId value.
527     * @throws ParseException which signals that an error has been reached
528     * unexpectedly while parsing the callId value.
529     * @return the newly created InReplyToHeader object.
530     * @since v1.1
531     */
532    public InReplyToHeader createInReplyToHeader(String callId)
533        throws ParseException {
534        if (callId == null)
535            throw new NullPointerException("null callId arg");
536        InReplyTo inReplyTo = new InReplyTo();
537        inReplyTo.setCallId(callId);
538
539        return inReplyTo;
540    }
541    /**
542    * Creates a new MaxForwardsHeader based on the newly
543    * supplied maxForwards value.
544    *
545    * @param maxForwards The new integer value of the maxForwards.
546    * @throws InvalidArgumentException if supplied maxForwards is less
547    * than zero or greater than 255.
548    * @return the newly created MaxForwardsHeader object.
549    */
550    public MaxForwardsHeader createMaxForwardsHeader(int maxForwards)
551        throws InvalidArgumentException {
552        if (maxForwards < 0 || maxForwards > 255)
553            throw new InvalidArgumentException(
554                "bad maxForwards arg " + maxForwards);
555        MaxForwards m = new MaxForwards();
556        m.setMaxForwards(maxForwards);
557
558        return m;
559    }
560
561    /**
562     * Creates a new MimeVersionHeader based on the newly
563     * supplied mimeVersion value.
564     *
565     * @param majorVersion - the new integer value of the majorVersion.
566     * @param minorVersion - the new integer value of the minorVersion.
567     * @throws InvalidArgumentException if supplied mimeVersion is less
568     * than zero.
569     * @return the newly created MimeVersionHeader object.
570     * @since v1.1
571     */
572    public MimeVersionHeader createMimeVersionHeader(
573        int majorVersion,
574        int minorVersion)
575        throws InvalidArgumentException {
576        if (majorVersion < 0 || minorVersion < 0)
577            throw new javax.sip.InvalidArgumentException(
578                "bad major/minor version");
579        MimeVersion m = new MimeVersion();
580        m.setMajorVersion(majorVersion);
581        m.setMinorVersion(minorVersion);
582
583        return m;
584    }
585
586    /**
587     * Creates a new MinExpiresHeader based on the newly supplied minExpires value.
588     *
589     * @param minExpires - the new integer value of the minExpires.
590     * @throws InvalidArgumentException if supplied minExpires is less
591     * than zero.
592     * @return the newly created MinExpiresHeader object.
593     * @since v1.1
594     */
595    public MinExpiresHeader createMinExpiresHeader(int minExpires)
596        throws InvalidArgumentException {
597        if (minExpires < 0)
598            throw new InvalidArgumentException("bad minExpires " + minExpires);
599        MinExpires min = new MinExpires();
600        min.setExpires(minExpires);
601
602        return min;
603    }
604
605    /**
606     * Creates a new MinSEHeader based on the newly supplied expires value.
607     *
608     * @param expires - the new integer value of the expires.
609     * @throws InvalidArgumentException if supplied expires is less
610     * than zero.
611     * @return the newly created ExpiresHeader object.
612     *
613     * TODO: Once interfaces are in javax, change the type to MinSEHeader
614     * and add to HeaderFactory. - pmusgrave
615     *
616     * pmusgrave
617     */
618    public ExtensionHeader createMinSEHeader(int expires)
619        throws InvalidArgumentException {
620        if (expires < 0)
621            throw new InvalidArgumentException("bad value " + expires);
622        MinSE e = new MinSE();
623        e.setExpires(expires);
624
625        return e;
626    }
627
628    /**
629     * Creates a new OrganizationHeader based on the newly supplied
630     * organization value.
631     *
632     * @param organization - the new string value of the organization.
633     * @throws ParseException which signals that an error has been reached
634     * unexpectedly while parsing the organization value.
635     * @return the newly created OrganizationHeader object.
636     */
637    public OrganizationHeader createOrganizationHeader(String organization)
638        throws ParseException {
639        if (organization == null)
640            throw new NullPointerException("bad organization arg");
641        Organization o = new Organization();
642        o.setOrganization(organization);
643
644        return o;
645    }
646
647    /**
648     * Creates a new PriorityHeader based on the newly supplied priority value.
649     *
650     * @param priority - the new string value of the priority.
651     * @throws ParseException which signals that an error has been reached
652     * unexpectedly while parsing the priority value.
653     * @return the newly created PriorityHeader object.
654     */
655    public PriorityHeader createPriorityHeader(String priority)
656        throws ParseException {
657        if (priority == null)
658            throw new NullPointerException("bad priority arg");
659        Priority p = new Priority();
660        p.setPriority(priority);
661
662        return p;
663    }
664
665    /**
666     * Creates a new ProxyAuthenticateHeader based on the newly supplied
667     * scheme value.
668     *
669     * @param scheme - the new string value of the scheme.
670     * @throws ParseException which signals that an error has been reached
671     * unexpectedly while parsing the scheme value.
672     * @return the newly created ProxyAuthenticateHeader object.
673     */
674    public ProxyAuthenticateHeader createProxyAuthenticateHeader(String scheme)
675        throws ParseException {
676        if (scheme == null)
677            throw new NullPointerException("bad scheme arg");
678        ProxyAuthenticate p = new ProxyAuthenticate();
679        p.setScheme(scheme);
680
681        return p;
682    }
683
684    /**
685     * Creates a new ProxyAuthorizationHeader based on the newly supplied
686     * scheme value.
687     *
688     * @param scheme - the new string value of the scheme.
689     * @throws ParseException which signals that an error has been reached
690     * unexpectedly while parsing the scheme value.
691     * @return the newly created ProxyAuthorizationHeader object.
692     */
693    public ProxyAuthorizationHeader createProxyAuthorizationHeader(String scheme)
694        throws ParseException {
695        if (scheme == null)
696            throw new NullPointerException("bad scheme arg");
697        ProxyAuthorization p = new ProxyAuthorization();
698        p.setScheme(scheme);
699
700        return p;
701    }
702
703    /**
704     * Creates a new ProxyRequireHeader based on the newly supplied optionTag
705     * value.
706     *
707     * @param optionTag - the new string OptionTag value.
708     * @return the newly created ProxyRequireHeader object.
709     * @throws ParseException which signals that an error has been reached
710     * unexpectedly while parsing the optionTag value.
711     */
712    public ProxyRequireHeader createProxyRequireHeader(String optionTag)
713        throws ParseException {
714        if (optionTag == null)
715            throw new NullPointerException("bad optionTag arg");
716        ProxyRequire p = new ProxyRequire();
717        p.setOptionTag(optionTag);
718
719        return p;
720    }
721
722    /**
723     * Creates a new RAckHeader based on the newly supplied rSeqNumber,
724     * cSeqNumber and method values.
725     *
726     * @param rSeqNumber - the new integer value of the rSeqNumber.
727     * @param cSeqNumber - the new integer value of the cSeqNumber.
728     * @param method - the new string value of the method.
729     * @throws InvalidArgumentException if supplied rSeqNumber or cSeqNumber is
730     * less than zero or greater than than 2**31-1.
731     * @throws ParseException which signals that an error has been reached
732     * unexpectedly while parsing the method value.
733     * @return the newly created RAckHeader object.
734     * @since v1.1
735     */
736    public RAckHeader createRAckHeader(
737        long rSeqNumber,
738        long cSeqNumber,
739        String method)
740        throws InvalidArgumentException, ParseException {
741        if (method == null)
742            throw new NullPointerException("Bad method");
743        if (cSeqNumber < 0 || rSeqNumber < 0)
744            throw new InvalidArgumentException("bad cseq/rseq arg");
745        RAck rack = new RAck();
746        rack.setMethod(method);
747        rack.setCSequenceNumber(cSeqNumber);
748        rack.setRSequenceNumber(rSeqNumber);
749
750        return rack;
751    }
752
753    /**
754     * @deprecated
755     * @see javax.sip.header.HeaderFactory#createRAckHeader(int, int, java.lang.String)
756     */
757    public RAckHeader createRAckHeader(int rSeqNumber, int cSeqNumber, String method) throws InvalidArgumentException, ParseException {
758
759        return createRAckHeader((long)rSeqNumber, (long)cSeqNumber, method);
760    }
761
762
763    /**
764     * @deprecated
765     * @see javax.sip.header.HeaderFactory#createRSeqHeader(int)
766     */
767    public RSeqHeader createRSeqHeader(int sequenceNumber) throws InvalidArgumentException {
768
769        return createRSeqHeader((long) sequenceNumber) ;
770    }
771
772    /**
773     * Creates a new RSeqHeader based on the newly supplied sequenceNumber value.
774     *
775     * @param sequenceNumber - the new integer value of the sequenceNumber.
776     * @throws InvalidArgumentException if supplied sequenceNumber is
777     * less than zero or greater than than 2**31-1.
778     * @return the newly created RSeqHeader object.
779     * @since v1.1
780     */
781    public RSeqHeader createRSeqHeader(long sequenceNumber)
782        throws InvalidArgumentException {
783        if (sequenceNumber < 0)
784            throw new InvalidArgumentException(
785                "invalid sequenceNumber arg " + sequenceNumber);
786        RSeq rseq = new RSeq();
787        rseq.setSeqNumber(sequenceNumber);
788
789        return rseq;
790    }
791
792    /**
793     * Creates a new ReasonHeader based on the newly supplied reason value.
794     *
795     * @param protocol - the new string value of the protocol.
796     * @param cause - the new integer value of the cause.
797     * @param text - the new string value of the text.
798     * @throws ParseException which signals that an error has been reached
799     * unexpectedly while parsing the protocol, cause or text value.
800     * @return the newly created ReasonHeader object.
801     * @since v1.1
802     */
803    public ReasonHeader createReasonHeader(
804        String protocol,
805        int cause,
806        String text)
807        throws InvalidArgumentException, ParseException {
808        if (protocol == null)
809            throw new NullPointerException("bad protocol arg");
810        if (cause < 0)
811            throw new InvalidArgumentException("bad cause");
812        Reason reason = new Reason();
813        reason.setProtocol(protocol);
814        reason.setCause(cause);
815        reason.setText(text);
816
817        return reason;
818    }
819
820    /**
821    * Creates a new RecordRouteHeader based on the newly supplied address value.
822    *
823    * @param address - the new Address object of the address.
824    * @return the newly created RecordRouteHeader object.
825    */
826    public RecordRouteHeader createRecordRouteHeader(Address address) {
827        if ( address == null) throw new NullPointerException("Null argument!");
828        RecordRoute recordRoute = new RecordRoute();
829        recordRoute.setAddress(address);
830
831        return recordRoute;
832    }
833
834    /**
835    * Creates a new ReplyToHeader based on the newly supplied address value.
836    *
837    * @param address - the new Address object of the address.
838    * @return the newly created ReplyToHeader object.
839    * @since v1.1
840    */
841    public ReplyToHeader createReplyToHeader(Address address) {
842        if (address == null)
843            throw new NullPointerException("null address");
844        ReplyTo replyTo = new ReplyTo();
845        replyTo.setAddress(address);
846
847        return replyTo;
848    }
849
850    /**
851     * Creates a new RequireHeader based on the newly supplied optionTag
852     * value.
853     *
854     * @param optionTag - the new string value containing the optionTag value.
855     * @throws ParseException which signals that an error has been reached
856     * unexpectedly while parsing the List of optionTag value.
857     * @return the newly created RequireHeader object.
858     */
859    public RequireHeader createRequireHeader(String optionTag)
860        throws ParseException {
861        if (optionTag == null)
862            throw new NullPointerException("null optionTag");
863        Require require = new Require();
864        require.setOptionTag(optionTag);
865
866        return require;
867    }
868
869    /**
870     * Creates a new RetryAfterHeader based on the newly supplied retryAfter
871     * value.
872     *
873     * @param retryAfter - the new integer value of the retryAfter.
874     * @throws InvalidArgumentException if supplied retryAfter is less
875     * than zero.
876     * @return the newly created RetryAfterHeader object.
877     */
878    public RetryAfterHeader createRetryAfterHeader(int retryAfter)
879        throws InvalidArgumentException {
880        if (retryAfter < 0)
881            throw new InvalidArgumentException("bad retryAfter arg");
882        RetryAfter r = new RetryAfter();
883        r.setRetryAfter(retryAfter);
884
885        return r;
886    }
887
888    /**
889     * Creates a new RouteHeader based on the newly supplied address value.
890     *
891     * @param address - the new Address object of the address.
892     * @return the newly created RouteHeader object.
893     */
894    public RouteHeader createRouteHeader(Address address) {
895        if (address == null)
896            throw new NullPointerException("null address arg");
897        Route route = new Route();
898        route.setAddress(address);
899
900        return route;
901    }
902
903    /**
904     * Creates a new ServerHeader based on the newly supplied product value.
905     *
906     * @param product - the new list value of the product.
907     * @throws ParseException which signals that an error has been reached
908     * unexpectedly while parsing the product value.
909     * @return the newly created ServerHeader object.
910     */
911    public ServerHeader createServerHeader(List product)
912        throws ParseException {
913        if (product == null)
914            throw new NullPointerException("null productList arg");
915        Server server = new Server();
916        server.setProduct(product);
917
918        return server;
919    }
920
921    /**
922     * Creates a new SubjectHeader based on the newly supplied subject value.
923     *
924     * @param subject - the new string value of the subject.
925     * @throws ParseException which signals that an error has been reached
926     * unexpectedly while parsing the subject value.
927     * @return the newly created SubjectHeader object.
928     */
929    public SubjectHeader createSubjectHeader(String subject)
930        throws ParseException {
931        if (subject == null)
932            throw new NullPointerException("null subject arg");
933        Subject s = new Subject();
934        s.setSubject(subject);
935
936        return s;
937    }
938
939    /**
940     * Creates a new SubscriptionStateHeader based on the newly supplied
941     * subscriptionState value.
942     *
943     * @param subscriptionState - the new string value of the subscriptionState.
944     * @throws ParseException which signals that an error has been reached
945     * unexpectedly while parsing the subscriptionState value.
946     * @return the newly created SubscriptionStateHeader object.
947     * @since v1.1
948     */
949    public SubscriptionStateHeader createSubscriptionStateHeader(String subscriptionState)
950        throws ParseException {
951        if (subscriptionState == null)
952            throw new NullPointerException("null subscriptionState arg");
953        SubscriptionState s = new SubscriptionState();
954        s.setState(subscriptionState);
955
956        return s;
957    }
958
959    /**
960     * Creates a new SupportedHeader based on the newly supplied optionTag
961     * value.
962     *
963     * @param optionTag - the new string containing the optionTag value.
964     * @throws ParseException which signals that an error has been reached
965     * unexpectedly while parsing the optionTag value.
966     * @return the newly created SupportedHeader object.
967     */
968    public SupportedHeader createSupportedHeader(String optionTag)
969        throws ParseException {
970        if (optionTag == null)
971            throw new NullPointerException("null optionTag arg");
972        Supported supported = new Supported();
973        supported.setOptionTag(optionTag);
974
975        return supported;
976    }
977
978    /**
979     * Creates a new TimeStampHeader based on the newly supplied timeStamp value.
980     *
981     * @param timeStamp - the new float value of the timeStamp.
982     * @throws InvalidArgumentException if supplied timeStamp is less
983     * than zero.
984     * @return the newly created TimeStampHeader object.
985     */
986    public TimeStampHeader createTimeStampHeader(float timeStamp)
987        throws InvalidArgumentException {
988        if (timeStamp < 0)
989            throw new IllegalArgumentException("illegal timeStamp");
990        TimeStamp t = new TimeStamp();
991        t.setTimeStamp(timeStamp);
992
993        return t;
994    }
995
996    /**
997     * Creates a new ToHeader based on the newly supplied address and
998     * tag values.
999     *
1000     * @param address - the new Address object of the address.
1001     * @param tag - the new string value of the tag.
1002     * @throws ParseException which signals that an error has been reached
1003     * unexpectedly while parsing the tag value.
1004     * @return the newly created ToHeader object.
1005     */
1006    public ToHeader createToHeader(Address address, String tag)
1007        throws ParseException {
1008        if (address == null)
1009            throw new NullPointerException("null address");
1010        To to = new To();
1011        to.setAddress(address);
1012        if (tag != null)
1013            to.setTag(tag);
1014
1015        return to;
1016    }
1017
1018    /**
1019     * Creates a new UnsupportedHeader based on the newly supplied optionTag
1020     * value.
1021     *
1022     * @param optionTag - the new string containing the optionTag value.
1023     * @throws ParseException which signals that an error has been reached
1024     * unexpectedly while parsing the List of optionTag value.
1025     * @return the newly created UnsupportedHeader object.
1026     */
1027    public UnsupportedHeader createUnsupportedHeader(String optionTag)
1028        throws ParseException {
1029        if (optionTag == null)
1030            throw new NullPointerException(optionTag);
1031        Unsupported unsupported = new Unsupported();
1032        unsupported.setOptionTag(optionTag);
1033
1034        return unsupported;
1035    }
1036
1037    /**
1038     * Creates a new UserAgentHeader based on the newly supplied product value.
1039     *
1040     * @param product - the new list value of the product.
1041     * @throws ParseException which signals that an error has been reached
1042     * unexpectedly while parsing the product value.
1043     * @return the newly created UserAgentHeader object.
1044     */
1045    public UserAgentHeader createUserAgentHeader(List product)
1046        throws ParseException {
1047
1048        if (product == null)
1049            throw new NullPointerException("null user agent");
1050        UserAgent userAgent = new UserAgent();
1051        userAgent.setProduct(product);
1052
1053        return userAgent;
1054    }
1055
1056    /**
1057     * Creates a new ViaHeader based on the newly supplied uri and branch values.
1058     *
1059     * @param host the new host value of uri.
1060     * @param port the new port value of uri.
1061     * @param transport the new transport value of uri.
1062     * @param branch the new string value of the branch.
1063     * @throws ParseException which signals that an error has been reached
1064     * unexpectedly while parsing the branch value.
1065     * @return the newly created ViaHeader object.
1066     */
1067    public ViaHeader createViaHeader(
1068        String host,
1069        int port,
1070        String transport,
1071        String branch)
1072        throws ParseException, InvalidArgumentException {
1073        // This should be changed.
1074        if (host == null || transport == null)
1075            throw new NullPointerException("null arg");
1076        Via via = new Via();
1077        if (branch != null)
1078            via.setBranch(branch);
1079
1080        // for supporting IPv6 addresses
1081        if(host.indexOf(':') >= 0
1082            && host.indexOf('[') < 0)
1083        {
1084            //strip address scope zones if any
1085            if(stripAddressScopeZones)
1086            {
1087                int zoneStart = host.indexOf('%');
1088                if(zoneStart != -1)
1089                    host = host.substring(0, zoneStart);
1090            }
1091            host = '[' + host + ']';
1092        }
1093
1094        via.setHost(host);
1095        via.setPort(port);
1096        via.setTransport(transport);
1097
1098        return via;
1099    }
1100
1101    /**
1102     * Creates a new WWWAuthenticateHeader based on the newly supplied
1103     * scheme value.
1104     *
1105     * @param scheme - the new string value of the scheme.
1106     * @throws ParseException which signals that an error has been reached
1107     * unexpectedly while parsing the scheme values.
1108     * @return the newly created WWWAuthenticateHeader object.
1109     */
1110    public WWWAuthenticateHeader createWWWAuthenticateHeader(String scheme)
1111        throws ParseException {
1112        if (scheme == null)
1113            throw new NullPointerException("null scheme");
1114        WWWAuthenticate www = new WWWAuthenticate();
1115        www.setScheme(scheme);
1116
1117        return www;
1118    }
1119
1120    /**
1121     * Creates a new WarningHeader based on the newly supplied
1122     * agent, code and comment values.
1123     *
1124     * @param agent - the new string value of the agent.
1125     * @param code - the new boolean integer of the code.
1126     * @param comment - the new string value of the comment.
1127     * @throws ParseException which signals that an error has been reached
1128     * unexpectedly while parsing the agent or comment values.
1129     * @throws InvalidArgumentException if an invalid integer code is given for
1130     * the WarningHeader.
1131     * @return the newly created WarningHeader object.
1132     */
1133    public WarningHeader createWarningHeader(
1134        String agent,
1135        int code,
1136        String comment)
1137        throws ParseException, InvalidArgumentException {
1138        if (agent == null)
1139            throw new NullPointerException("null arg");
1140        Warning warning = new Warning();
1141        warning.setAgent(agent);
1142        warning.setCode(code);
1143        warning.setText(comment);
1144
1145        return warning;
1146    }
1147
1148    /** Creates a new ErrorInfoHeader based on the newly
1149     * supplied errorInfo value.
1150     *
1151     * @param errorInfo - the new URI value of the errorInfo.
1152     * @return the newly created ErrorInfoHeader object.
1153     */
1154    public ErrorInfoHeader createErrorInfoHeader(URI errorInfo) {
1155        if (errorInfo == null)
1156            throw new NullPointerException("null arg");
1157        return new ErrorInfo((GenericURI) errorInfo);
1158    }
1159
1160    /**
1161     * Create a header from the given header text.
1162     * Header should not have the trailng crlf.
1163     * @throws ParseException
1164     */
1165    public javax.sip.header.Header createHeader(String headerText) throws ParseException {
1166        StringMsgParser smp = new StringMsgParser();
1167        SIPHeader sipHeader = smp.parseSIPHeader(headerText.trim());
1168        if (sipHeader instanceof SIPHeaderList) {
1169            if (((SIPHeaderList) sipHeader).size() > 1) {
1170                throw new ParseException(
1171                    "Only singleton allowed " + headerText,
1172                    0);
1173            } else if (((SIPHeaderList) sipHeader).size() == 0) {
1174                try {
1175                    return (Header) ((SIPHeaderList) sipHeader)
1176                        .getMyClass()
1177                        .newInstance();
1178                } catch (InstantiationException ex) {
1179                    ex.printStackTrace();
1180                    return null;
1181                } catch (IllegalAccessException ex) {
1182                    ex.printStackTrace();
1183                    return null;
1184                }
1185            } else {
1186                return (Header) ((SIPHeaderList) sipHeader).getFirst();
1187            }
1188        } else {
1189            return (Header) sipHeader;
1190        }
1191
1192    }
1193
1194    /** Create and parse a header.
1195     *
1196     * @param headerName -- header name for the header to parse.
1197     * @param headerValue -- header value for the header to parse.
1198     * @throws ParseException
1199     * @return  the parsed sip header
1200     */
1201    public javax.sip.header.Header createHeader(
1202        String headerName,
1203        String headerValue)
1204        throws java.text.ParseException {
1205        if (headerName == null)
1206            throw new NullPointerException("header name is null");
1207        String hdrText =
1208            new StringBuffer()
1209                .append(headerName)
1210                .append(":")
1211                .append(headerValue)
1212                .toString();
1213        return createHeader(hdrText);
1214
1215    }
1216
1217    /** Create and return a list of headers.
1218     *@param headers -- list of headers.
1219     *@throws ParseException -- if a parse exception occurs or a List
1220     * of that type of header is not alowed.
1221     *@return a List containing the headers.
1222     */
1223    public java.util.List createHeaders(String headers)
1224        throws java.text.ParseException {
1225        if (headers == null)
1226            throw new NullPointerException("null arg!");
1227        StringMsgParser smp = new StringMsgParser();
1228        SIPHeader shdr = smp.parseSIPHeader(headers);
1229        if (shdr instanceof SIPHeaderList)
1230            return (SIPHeaderList) shdr;
1231        else
1232            throw new ParseException(
1233                "List of headers of this type is not allowed in a message",
1234                0);
1235    }
1236
1237    /** Create a ReferTo Header.
1238     *@param address -- address for the header.
1239     */
1240    public ReferToHeader createReferToHeader(Address address) {
1241        if (address == null)
1242            throw new NullPointerException("null address!");
1243        ReferTo referTo = new ReferTo();
1244        referTo.setAddress(address);
1245        return referTo;
1246    }
1247
1248    /** Create a ReferredBy Header.
1249     *
1250     *  pmusgrave
1251     *
1252     *@param address -- address for the header.
1253     *
1254     * TODO: Once interfaces are in javax, change the type to MinSEHeader
1255     * and add to HeaderFactory. - pmusgrave
1256
1257     */
1258    public ReferredByHeader createReferredByHeader(Address address) {
1259        if (address == null)
1260            throw new NullPointerException("null address!");
1261        ReferredBy referredBy = new ReferredBy();
1262        referredBy.setAddress(address);
1263        return referredBy;
1264    }
1265
1266    /**
1267     * Create a Replaces header with a call Id, to and from tag.
1268     *
1269     * TODO: Once interfaces are in javax, change the type to MinSEHeader
1270     * and add to HeaderFactory. - pmusgrave
1271     * pmusgrave
1272     */
1273    public ReplacesHeader createReplacesHeader(String callId, String toTag,
1274                String fromTag) throws ParseException
1275    {
1276        Replaces replaces = new Replaces();
1277        replaces.setCallId(callId);
1278        replaces.setFromTag(fromTag);
1279        replaces.setToTag(toTag);
1280
1281        return replaces;
1282    }
1283
1284    /**
1285     * Create a Join header with a call Id, to and from tag.
1286     *
1287     */
1288    public JoinHeader createJoinHeader(String callId, String toTag,
1289                String fromTag) throws ParseException
1290    {
1291        Join join = new Join();
1292        join.setCallId(callId);
1293        join.setFromTag(fromTag);
1294        join.setToTag(toTag);
1295
1296        return join;
1297    }
1298
1299
1300    /*
1301     * (non-Javadoc)
1302     * @see javax.sip.header.HeaderFactory#createSIPETagHeader(java.lang.String)
1303     */
1304    public SIPETagHeader createSIPETagHeader(String etag) throws ParseException {
1305        return new SIPETag(etag);
1306    }
1307
1308    /*
1309     * (non-Javadoc)
1310     * @see javax.sip.header.HeaderFactory#createSIPIfMatchHeader(java.lang.String)
1311     */
1312    public SIPIfMatchHeader createSIPIfMatchHeader(String etag) throws ParseException {
1313        return new SIPIfMatch(etag);
1314    }
1315
1316    //////////////////////////////////////////////////////////////////////////
1317    // The following headers are not part of the JSIP spec.
1318    // They are IMS headers
1319    // (contributed by Miguel Freitas - PT Inovacao and Telecommunications Institute)
1320    ///////////////////////////////////////////////////////////////////////////
1321
1322    /**
1323     * creates a P-Access-Network-Info header
1324     * @return newly created P-Access-Network-Info header
1325     */
1326    public PAccessNetworkInfoHeader createPAccessNetworkInfoHeader()
1327    {
1328        PAccessNetworkInfo accessNetworkInfo = new PAccessNetworkInfo();
1329
1330        return accessNetworkInfo;
1331    }
1332
1333
1334    /**
1335     * P-Asserted-Identity header
1336     * @param address - Address
1337     * @return newly created P-Asserted-Identity header
1338     * @throws ParseException
1339     * @throws NullPointerException
1340     */
1341    public PAssertedIdentityHeader createPAssertedIdentityHeader(Address address)
1342        throws NullPointerException, ParseException
1343    {
1344        if (address == null)
1345            throw new NullPointerException("null address!");
1346
1347        PAssertedIdentity assertedIdentity = new PAssertedIdentity();
1348        assertedIdentity.setAddress(address);
1349
1350        return assertedIdentity;
1351
1352
1353    }
1354
1355
1356    /**
1357     * Creates a new P-Associated-URI header based on the supplied address
1358     * @param assocURI - Address
1359     * @return newly created P-Associated-URI header
1360     * @throws NullPointerException if the supplied address is null
1361     * @throws ParseException
1362     */
1363    public PAssociatedURIHeader createPAssociatedURIHeader(Address assocURI)
1364    {
1365        if (assocURI == null)
1366        throw new NullPointerException("null associatedURI!");
1367
1368        PAssociatedURI associatedURI = new PAssociatedURI();
1369        associatedURI.setAddress(assocURI);
1370
1371        return associatedURI;
1372    }
1373
1374
1375
1376
1377    /**
1378     * P-Called-Party-ID header
1379     * @param address - Address
1380     * @return newly created P-Called-Party-ID header
1381     * @throws NullPointerException
1382     * @throws ParseException
1383     */
1384    public PCalledPartyIDHeader createPCalledPartyIDHeader(Address address)
1385    {
1386        if (address == null)
1387            throw new NullPointerException("null address!");
1388
1389        PCalledPartyID calledPartyID = new PCalledPartyID();
1390        calledPartyID.setAddress(address);
1391
1392        return calledPartyID;
1393    }
1394
1395
1396
1397    /**
1398     * P-Charging-Function-Addresses header
1399     * @return newly created P-Charging-Function-Addresses header
1400     */
1401    public PChargingFunctionAddressesHeader createPChargingFunctionAddressesHeader()
1402    {
1403        PChargingFunctionAddresses cfa = new PChargingFunctionAddresses();
1404
1405        return cfa;
1406    }
1407
1408
1409    /**
1410     * P-Charging-Vector header
1411     * @param icid - icid string
1412     * @return newly created P-Charging-Vector header
1413     * @throws NullPointerException
1414     * @throws ParseException
1415     */
1416    public PChargingVectorHeader createChargingVectorHeader(String icid)
1417        throws ParseException
1418    {
1419        if (icid == null)
1420        throw new NullPointerException("null icid arg!");
1421
1422        PChargingVector chargingVector = new PChargingVector();
1423        chargingVector.setICID(icid);
1424
1425        return chargingVector;
1426
1427    }
1428
1429
1430    /**
1431     * P-Media-Authorization header
1432     * @param token - token string
1433     * @return newly created P-Media-Authorizarion header
1434     * @throws InvalidArgumentException
1435     * @throws ParseException
1436     */
1437    public PMediaAuthorizationHeader createPMediaAuthorizationHeader(String token)
1438        throws InvalidArgumentException, ParseException
1439    {
1440        if (token == null || token == "")
1441            throw new InvalidArgumentException("The Media-Authorization-Token parameter is null or empty");
1442
1443
1444        PMediaAuthorization mediaAuthorization = new PMediaAuthorization();
1445        mediaAuthorization.setMediaAuthorizationToken(token);
1446
1447        return mediaAuthorization;
1448    }
1449
1450
1451    /**
1452     * P-Preferred-Identity header
1453     * @param address - Address
1454     * @return newly created P-Preferred-Identity header
1455     * @throws NullPointerException
1456     */
1457    public PPreferredIdentityHeader createPPreferredIdentityHeader(Address address)
1458    {
1459        if (address == null)
1460            throw new NullPointerException("null address!");
1461
1462        PPreferredIdentity preferredIdentity = new PPreferredIdentity();
1463        preferredIdentity.setAddress(address);
1464
1465        return preferredIdentity;
1466
1467    }
1468
1469    /**
1470     * P-Visited-Network-ID header
1471     * @return newly created P-Visited-Network-ID header
1472     */
1473    public PVisitedNetworkIDHeader createPVisitedNetworkIDHeader()
1474    {
1475        PVisitedNetworkID visitedNetworkID = new PVisitedNetworkID();
1476
1477        return visitedNetworkID;
1478    }
1479
1480
1481
1482    /**
1483     * PATH header
1484     * @param address - Address
1485     * @return newly created Path header
1486     * @throws NullPointerException
1487     * @throws ParseException
1488     */
1489    public PathHeader createPathHeader(Address address)
1490    {
1491        if (address == null)
1492            throw new NullPointerException("null address!");
1493
1494
1495        Path path = new Path();
1496        path.setAddress(address);
1497
1498        return path;
1499    }
1500
1501
1502    /**
1503     * Privacy header
1504     * @param privacyType - privacy type string
1505     * @return newly created Privacy header
1506     * @throws NullPointerException
1507     */
1508    public PrivacyHeader createPrivacyHeader(String privacyType)
1509    {
1510        if (privacyType == null)
1511            throw new NullPointerException("null privacyType arg");
1512
1513        Privacy privacy = new Privacy(privacyType);
1514
1515        return privacy;
1516
1517    }
1518
1519
1520    /**
1521     * Service-Route header
1522     * @param address - Address
1523     * @return newly created Service-Route header
1524     * @throws NullPointerException
1525     */
1526    public ServiceRouteHeader createServiceRouteHeader(Address address)
1527    {
1528        if (address == null)
1529            throw new NullPointerException("null address!");
1530
1531        ServiceRoute serviceRoute = new ServiceRoute();
1532        serviceRoute.setAddress(address);
1533
1534        return serviceRoute;
1535
1536    }
1537
1538    /**
1539     * Security-Server header
1540     * @return newly created Security-Server header
1541     */
1542    public SecurityServerHeader createSecurityServerHeader()
1543    {
1544        SecurityServer secServer = new SecurityServer();
1545        return secServer;
1546    }
1547
1548    /**
1549     * Security-Client header
1550     * @return newly created Security-Client header
1551     */
1552    public SecurityClientHeader createSecurityClientHeader()
1553    {
1554        SecurityClient secClient = new SecurityClient();
1555        return secClient;
1556    }
1557
1558    /**
1559     * Security-Verify header
1560     * @return newly created Security-Verify header
1561     */
1562    public SecurityVerifyHeader createSecurityVerifyHeader()
1563    {
1564        SecurityVerify secVerify = new SecurityVerify();
1565        return secVerify;
1566    }
1567
1568    /**
1569     * @return the newly create P-User-Database header.
1570     * Please note that this is not a SIP/TEL uri. It is a
1571     * DIAMETER AAA URI.
1572     */
1573    public PUserDatabaseHeader createPUserDatabaseHeader(String databaseName)
1574    {
1575        if((databaseName ==null)||(databaseName.equals(" ")))
1576            throw new NullPointerException("Database name is null");
1577
1578        PUserDatabase pUserDatabase = new PUserDatabase();
1579        pUserDatabase.setDatabaseName(databaseName);
1580
1581        return pUserDatabase;
1582    }
1583
1584
1585    /**
1586     *
1587     * @return The newly created P-Profile-Key header.
1588     *
1589     */
1590    public PProfileKeyHeader createPProfileKeyHeader(Address address)
1591    {
1592        if (address ==null)
1593            throw new NullPointerException("Address is null");
1594        PProfileKey pProfileKey = new PProfileKey();
1595        pProfileKey.setAddress(address);
1596
1597        return pProfileKey;
1598    }
1599
1600    /**
1601     *
1602     * @return The newly created P-Served-User header.
1603     */
1604    public PServedUserHeader createPServedUserHeader(Address address)
1605    {
1606        if(address==null)
1607            throw new NullPointerException("Address is null");
1608        PServedUser psu = new PServedUser();
1609        psu.setAddress(address);
1610
1611        return psu;
1612    }
1613    /**
1614     * @return The newly created P-Preferred-Service header.
1615     */
1616    public PPreferredServiceHeader createPPreferredServiceHeader()
1617    {
1618        PPreferredService pps = new PPreferredService();
1619        return pps;
1620    }
1621
1622    /**
1623     *
1624     * @return The newly created P-Asserted-Service header.
1625     */
1626    public PAssertedServiceHeader createPAssertedServiceHeader()
1627    {
1628        PAssertedService pas = new PAssertedService();
1629        return pas;
1630    }
1631
1632    /**
1633     * Creates a new SessionExpiresHeader based on the newly supplied expires value.
1634     *
1635     * @param expires - the new integer value of the expires.
1636     * @throws InvalidArgumentException if supplied expires is less
1637     * than zero.
1638     * @return the newly created SessionExpiresHeader object.
1639     *
1640     */
1641    public SessionExpiresHeader createSessionExpiresHeader(int expires)
1642        throws InvalidArgumentException {
1643        if (expires < 0)
1644            throw new InvalidArgumentException("bad value " + expires);
1645        SessionExpires s = new SessionExpires();
1646        s.setExpires(expires);
1647
1648        return s;
1649    }
1650
1651
1652    /**
1653     * Create a new Request Line from a String.
1654     *
1655     */
1656    public SipRequestLine createRequestLine(String requestLine)  throws ParseException {
1657
1658        RequestLineParser requestLineParser = new RequestLineParser(requestLine);
1659        return (SipRequestLine) requestLineParser.parse();
1660    }
1661
1662    /**
1663     * Create a new StatusLine from a String.
1664     */
1665    public SipStatusLine createStatusLine(String statusLine) throws ParseException {
1666        StatusLineParser statusLineParser = new StatusLineParser(statusLine);
1667        return (SipStatusLine) statusLineParser.parse();
1668    }
1669
1670
1671
1672    /**
1673     * Create and return a references header.
1674     *
1675     * @param callId
1676     * @param rel
1677     * @return
1678     * @throws ParseException
1679     */
1680
1681    public ReferencesHeader createReferencesHeader(String callId, String rel) throws ParseException {
1682        ReferencesHeader retval = new References();
1683        retval.setCallId(callId);
1684        retval.setRel(rel);
1685        return retval;
1686    }
1687
1688
1689
1690
1691    //////////////////////////////////////////////////////////
1692    // Constructor
1693    //////////////////////////////////////////////////////////
1694    /**
1695     * Default constructor.
1696     */
1697    public HeaderFactoryImpl() {
1698        stripAddressScopeZones
1699            = Boolean.getBoolean("gov.nist.core.STRIP_ADDR_SCOPES");
1700    }
1701
1702
1703
1704
1705
1706}
1707