1600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/*
2600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Conditions Of Use
3600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
4600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* This software was developed by employees of the National Institute of
5600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Standards and Technology (NIST), an agency of the Federal Government.
6600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Pursuant to title 15 Untied States Code Section 105, works of NIST
7600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* employees are not subject to copyright protection in the United States
8600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* and are considered to be in the public domain.  As a result, a formal
9600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* license is not needed to use the software.
10600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
11600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* This software is provided by NIST as a service and is expressly
12600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* provided "AS IS."  NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
13600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
14600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
15600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* AND DATA ACCURACY.  NIST does not warrant or make any representations
16600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* regarding the use of the software or the results thereof, including but
17600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* not limited to the correctness, accuracy, reliability or usefulness of
18600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* the software.
19600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
20600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Permission to use this software is contingent upon your acceptance
21600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* of the terms of this agreement
22600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
23600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* .
24600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
25600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*/
26600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpackage gov.nist.javax.sip.parser;
27600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.parser.ims.*;
28600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.header.ims.*;
29600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.Hashtable;
30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.lang.reflect.*;
31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.header.*;
32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.text.ParseException;
33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.core.*;
34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.header.extensions.*;
35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.header.SIPHeaderNamesCache;
36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.parser.extensions.*;
37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/**
39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * A factory class that does a name lookup on a registered parser and
40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * returns a header parser for the given name.
41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @version 1.2 $Revision: 1.17 $ $Date: 2010/01/12 00:05:25 $
43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @author M. Ranganathan   <br/>
45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */
49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpublic class ParserFactory {
50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private static Hashtable<String,Class<? extends HeaderParser>> parserTable;
52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private static Class[] constructorArgs;
53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private static Hashtable parserConstructorCache;
54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    static {
56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable = new Hashtable<String,Class<? extends HeaderParser>>();
57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserConstructorCache = new Hashtable();
58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        constructorArgs = new Class[1];
59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        constructorArgs[0] = String.class;
60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(ReplyToHeader.NAME.toLowerCase(), ReplyToParser.class);
61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            InReplyToHeader.NAME.toLowerCase(),
64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            InReplyToParser.class);
65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            AcceptEncodingHeader.NAME.toLowerCase(),
68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            AcceptEncodingParser.class);
69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            AcceptLanguageHeader.NAME.toLowerCase(),
72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            AcceptLanguageParser.class);
73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put("t", ToParser.class);
75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(ToHeader.NAME.toLowerCase(), ToParser.class);
76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(FromHeader.NAME.toLowerCase(), FromParser.class);
78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put("f", FromParser.class);
79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(CSeqHeader.NAME.toLowerCase(), CSeqParser.class);
81600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
82600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(ViaHeader.NAME.toLowerCase(), ViaParser.class);
83600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put("v", ViaParser.class);
84600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
85600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(ContactHeader.NAME.toLowerCase(), ContactParser.class);
86600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put("m", ContactParser.class);
87600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
88600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
89600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ContentTypeHeader.NAME.toLowerCase(),
90600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ContentTypeParser.class);
91600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put("c", ContentTypeParser.class);
92600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
93600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
94600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ContentLengthHeader.NAME.toLowerCase(),
95600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ContentLengthParser.class);
96600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put("l", ContentLengthParser.class);
97600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
98600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
99600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            AuthorizationHeader.NAME.toLowerCase(),
100600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            AuthorizationParser.class);
101600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
102600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
103600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            WWWAuthenticateHeader.NAME.toLowerCase(),
104600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            WWWAuthenticateParser.class);
105600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
106600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(CallIdHeader.NAME.toLowerCase(), CallIDParser.class);
107600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put("i", CallIDParser.class);
108600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
109600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(RouteHeader.NAME.toLowerCase(), RouteParser.class);
110600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
111600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
112600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            RecordRouteHeader.NAME.toLowerCase(),
113600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            RecordRouteParser.class);
114600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
115600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(DateHeader.NAME.toLowerCase(), DateParser.class);
116600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
117600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
118600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ProxyAuthorizationHeader.NAME.toLowerCase(),
119600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ProxyAuthorizationParser.class);
120600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
121600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
122600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ProxyAuthenticateHeader.NAME.toLowerCase(),
123600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ProxyAuthenticateParser.class);
124600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
125600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
126600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            RetryAfterHeader.NAME.toLowerCase(),
127600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            RetryAfterParser.class);
128600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
129600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(RequireHeader.NAME.toLowerCase(), RequireParser.class);
130600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
131600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
132600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ProxyRequireHeader.NAME.toLowerCase(),
133600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ProxyRequireParser.class);
134600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
135600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
136600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            TimeStampHeader.NAME.toLowerCase(),
137600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            TimeStampParser.class);
138600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
139600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
140600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            UnsupportedHeader.NAME.toLowerCase(),
141600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            UnsupportedParser.class);
142600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
143600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
144600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            UserAgentHeader.NAME.toLowerCase(),
145600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            UserAgentParser.class);
146600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
147600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
148600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            SupportedHeader.NAME.toLowerCase(),
149600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            SupportedParser.class);
150600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        // bug fix by Steve Crosley
151600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put("k", SupportedParser.class);
152600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
153600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(ServerHeader.NAME.toLowerCase(), ServerParser.class);
154600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
155600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(SubjectHeader.NAME.toLowerCase(), SubjectParser.class);
156600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put( "s", SubjectParser.class); // JvB: added
157600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
158600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
159600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            SubscriptionStateHeader.NAME.toLowerCase(),
160600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            SubscriptionStateParser.class);
161600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
162600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
163600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            MaxForwardsHeader.NAME.toLowerCase(),
164600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            MaxForwardsParser.class);
165600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
166600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
167600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            MimeVersionHeader.NAME.toLowerCase(),
168600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            MimeVersionParser.class);
169600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
170600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
171600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            MinExpiresHeader.NAME.toLowerCase(),
172600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            MinExpiresParser.class);
173600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
174600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
175600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            OrganizationHeader.NAME.toLowerCase(),
176600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            OrganizationParser.class);
177600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
178600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
179600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            PriorityHeader.NAME.toLowerCase(),
180600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            PriorityParser.class);
181600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
182600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(RAckHeader.NAME.toLowerCase(), RAckParser.class);
183600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
184600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(RSeqHeader.NAME.toLowerCase(), RSeqParser.class);
185600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
186600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(ReasonHeader.NAME.toLowerCase(), ReasonParser.class);
187600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
188600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(WarningHeader.NAME.toLowerCase(), WarningParser.class);
189600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
190600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(ExpiresHeader.NAME.toLowerCase(), ExpiresParser.class);
191600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
192600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(EventHeader.NAME.toLowerCase(), EventParser.class);
193600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put("o", EventParser.class);
194600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
195600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
196600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ErrorInfoHeader.NAME.toLowerCase(),
197600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ErrorInfoParser.class);
198600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
199600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
200600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ContentLanguageHeader.NAME.toLowerCase(),
201600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ContentLanguageParser.class);
202600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
203600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
204600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ContentEncodingHeader.NAME.toLowerCase(),
205600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ContentEncodingParser.class);
206600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put("e", ContentEncodingParser.class);
207600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
208600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
209600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ContentDispositionHeader.NAME.toLowerCase(),
210600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            ContentDispositionParser.class);
211600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
212600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
213600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            CallInfoHeader.NAME.toLowerCase(),
214600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            CallInfoParser.class);
215600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
216600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
217600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            AuthenticationInfoHeader.NAME.toLowerCase(),
218600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            AuthenticationInfoParser.class);
219600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
220600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(AllowHeader.NAME.toLowerCase(), AllowParser.class);
221600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
222600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
223600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            AllowEventsHeader.NAME.toLowerCase(),
224600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            AllowEventsParser.class);
225600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put("u", AllowEventsParser.class);
226600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
227600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(
228600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            AlertInfoHeader.NAME.toLowerCase(),
229600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            AlertInfoParser.class);
230600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
231600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(AcceptHeader.NAME.toLowerCase(), AcceptParser.class);
232600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
233600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(ReferToHeader.NAME.toLowerCase(), ReferToParser.class);
234600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        // Was missing (bug noticed by Steve Crossley)
235600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put("r", ReferToParser.class);
236600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
237600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        // JvB: added to support RFC3903 PUBLISH
238600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(SIPETagHeader.NAME.toLowerCase(), SIPETagParser.class);
239600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(SIPIfMatchHeader.NAME.toLowerCase(), SIPIfMatchParser.class);
240600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
241600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        //IMS headers
242600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(PAccessNetworkInfoHeader.NAME.toLowerCase(), PAccessNetworkInfoParser.class);
243600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(PAssertedIdentityHeader.NAME.toLowerCase(), PAssertedIdentityParser.class);
244600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(PPreferredIdentityHeader.NAME.toLowerCase(), PPreferredIdentityParser.class);
245600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(PChargingVectorHeader.NAME.toLowerCase(), PChargingVectorParser.class);
246600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(PChargingFunctionAddressesHeader.NAME.toLowerCase(), PChargingFunctionAddressesParser.class);
247600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(PMediaAuthorizationHeader.NAME.toLowerCase(), PMediaAuthorizationParser.class);
248600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(PathHeader.NAME.toLowerCase(), PathParser.class);
249600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(PrivacyHeader.NAME.toLowerCase(), PrivacyParser.class);
250600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(ServiceRouteHeader.NAME.toLowerCase(), ServiceRouteParser.class);
251600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(PVisitedNetworkIDHeader.NAME.toLowerCase(), PVisitedNetworkIDParser.class);
252600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
253600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(PAssociatedURIHeader.NAME.toLowerCase(), PAssociatedURIParser.class);
254600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(PCalledPartyIDHeader.NAME.toLowerCase(), PCalledPartyIDParser.class);
255600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
256600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(SecurityServerHeader.NAME.toLowerCase(), SecurityServerParser.class);
257600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(SecurityClientHeader.NAME.toLowerCase(), SecurityClientParser.class);
258600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(SecurityVerifyHeader.NAME.toLowerCase(), SecurityVerifyParser.class);
259600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
260600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
261600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        // Per RFC 3892 (pmusgrave)
262600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(ReferredBy.NAME.toLowerCase(), ReferredByParser.class);
263600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put("b", ReferToParser.class);
264600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
265600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        // Per RFC4028 Session Timers (pmusgrave)
266600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(SessionExpires.NAME.toLowerCase(), SessionExpiresParser.class);
267600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put("x", SessionExpiresParser.class);
268600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(MinSE.NAME.toLowerCase(), MinSEParser.class);
269600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        // (RFC4028 does not give a short form header for MinSE)
270600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
271600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        // Per RFC3891 (pmusgrave)
272600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(Replaces.NAME.toLowerCase(), ReplacesParser.class);
273600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
274600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        // Per RFC3911 (jean deruelle)
275600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(Join.NAME.toLowerCase(), JoinParser.class);
276600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
277600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        //http://tools.ietf.org/html/draft-worley-references-05
278600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        parserTable.put(References.NAME.toLowerCase(), ReferencesParser.class);
279600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
280600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
281600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
282600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * create a parser for a header. This is the parser factory.
283600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
284600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static HeaderParser createParser(String line)
285600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        throws ParseException {
286600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        String headerName = Lexer.getHeaderName(line);
287600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        String headerValue = Lexer.getHeaderValue(line);
288600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (headerName == null || headerValue == null)
289600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new ParseException("The header name or value is null", 0);
290600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
291600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        Class parserClass = (Class) parserTable.get(SIPHeaderNamesCache.toLowerCase(headerName));
292600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (parserClass != null) {
293600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            try {
294600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                Constructor cons = (Constructor) parserConstructorCache.get(parserClass);
295600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                if (cons == null) {
296600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    cons = parserClass.getConstructor(constructorArgs);
297600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    parserConstructorCache.put(parserClass, cons);
298600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                }
299600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                Object[] args = new Object[1];
300600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                args[0] = line;
301600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                HeaderParser retval = (HeaderParser) cons.newInstance(args);
302600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                return retval;
303600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
304600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            } catch (Exception ex) {
305600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                InternalErrorHandler.handleException(ex);
306600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                return null; // to placate the compiler.
307600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            }
308600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
309600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else {
310600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            // Just generate a generic SIPHeader. We define
311600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            // parsers only for the above.
312600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return new HeaderParser(line);
313600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
314600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
315600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang}
316600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/*
317600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * $Log: ParserFactory.java,v $
318600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.17  2010/01/12 00:05:25  mranga
319600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Add support for References header draft-worley-references-05
320600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
321600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.16  2009/07/17 18:58:01  emcho
322600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Converts indentation tabs to spaces so that we have a uniform indentation policy in the whole project.
323600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
324600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.15  2009/01/22 19:33:48  deruelle_jean
325600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Add support for JOIN (RFC 3911)
326600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Issue number:  186
327600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Obtained from:
328600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Submitted by:  Jean Deruelle
329600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Reviewed by:   Ranga, The high priest and grand poobah of Jain-SIP
330600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
331600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.14  2007/03/07 14:29:46  belangery
332600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Yet another bunch of improvements in the parsing code.
333600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
334600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.13  2007/02/23 14:56:06  belangery
335600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Added performance improvement around header name lowercase conversion.
336600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
337600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.12  2007/01/08 19:24:21  mranga
338600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Issue number:
339600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Obtained from:
340600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Submitted by:  Miguel Freitas
341600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Reviewed by:   mranga
342600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
343600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Miguel -- please implement a deep clone method for the IMS headers.
344600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
345600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: ----------------------------------------------------------------------
346600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Issue number:
347600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If this change addresses one or more issues,
348600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   then enter the issue number(s) here.
349600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Obtained from:
350600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If this change has been taken from another system,
351600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   then name the system in this line, otherwise delete it.
352600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Submitted by:
353600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If this code has been contributed to the project by someone else; i.e.,
354600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   they sent us a patch or a set of diffs, then include their name/email
355600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   address here. If this is your work then delete this line.
356600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Reviewed by:
357600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If we are doing pre-commit code reviews and someone else has
358600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   reviewed your changes, include their name(s) here.
359600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If you have not had it reviewed then delete this line.
360600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
361600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.11  2006/10/12 11:57:54  pmusgrave
362600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Issue number:  79, 80
363600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Submitted by:  pmusgrave@newheights.com
364600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Reviewed by:   mranga
365600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
366600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.10  2006/09/29 19:40:50  jbemmel
367600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * fixed missing IMS header parsing plumbing
368600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
369600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.9  2006/09/11 18:41:32  mranga
370600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Issue number:
371600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Obtained from:
372600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Submitted by:  mranga
373600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Reviewed by:
374600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Tighter integration of IMS headers.
375600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: ----------------------------------------------------------------------
376600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Issue number:
377600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If this change addresses one or more issues,
378600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   then enter the issue number(s) here.
379600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Obtained from:
380600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If this change has been taken from another system,
381600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   then name the system in this line, otherwise delete it.
382600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Submitted by:
383600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If this code has been contributed to the project by someone else; i.e.,
384600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   they sent us a patch or a set of diffs, then include their name/email
385600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   address here. If this is your work then delete this line.
386600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Reviewed by:
387600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If we are doing pre-commit code reviews and someone else has
388600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   reviewed your changes, include their name(s) here.
389600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If you have not had it reviewed then delete this line.
390600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
391600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.8  2006/08/15 21:44:50  mranga
392600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Issue number:
393600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Obtained from:
394600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Submitted by:  mranga
395600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Reviewed by:   mranga
396600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Incorporating the latest API changes from Phelim
397600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: ----------------------------------------------------------------------
398600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Issue number:
399600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If this change addresses one or more issues,
400600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   then enter the issue number(s) here.
401600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Obtained from:
402600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If this change has been taken from another system,
403600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   then name the system in this line, otherwise delete it.
404600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Submitted by:
405600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If this code has been contributed to the project by someone else; i.e.,
406600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   they sent us a patch or a set of diffs, then include their name/email
407600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   address here. If this is your work then delete this line.
408600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Reviewed by:
409600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If we are doing pre-commit code reviews and someone else has
410600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   reviewed your changes, include their name(s) here.
411600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If you have not had it reviewed then delete this line.
412600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
413600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.7  2006/07/13 09:02:06  mranga
414600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Issue number:
415600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Obtained from:
416600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Submitted by:  jeroen van bemmel
417600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Reviewed by:   mranga
418600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Moved some changes from jain-sip-1.2 to java.net
419600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
420600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: ----------------------------------------------------------------------
421600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Issue number:
422600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If this change addresses one or more issues,
423600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   then enter the issue number(s) here.
424600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Obtained from:
425600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If this change has been taken from another system,
426600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   then name the system in this line, otherwise delete it.
427600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Submitted by:
428600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If this code has been contributed to the project by someone else; i.e.,
429600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   they sent us a patch or a set of diffs, then include their name/email
430600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   address here. If this is your work then delete this line.
431600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Reviewed by:
432600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If we are doing pre-commit code reviews and someone else has
433600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   reviewed your changes, include their name(s) here.
434600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If you have not had it reviewed then delete this line.
435600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
436600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.5  2006/06/19 06:47:27  mranga
437600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * javadoc fixups
438600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
439600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.4  2006/06/16 15:26:28  mranga
440600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Added NIST disclaimer to all public domain files. Clean up some javadoc. Fixed a leak
441600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
442600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.3  2005/10/27 20:49:00  jeroen
443600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * added support for RFC3903 PUBLISH
444600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
445600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.2  2005/10/14 19:59:00  jeroen
446600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * bugfix: missing parser for shortform of Subject (s)
447600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
448600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.1.1.1  2005/10/04 17:12:35  mranga
449600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
450600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Import
451600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
452600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
453600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.4  2005/04/04 09:29:03  dmuresan
454600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Replaced new String().getClass() with String.class.
455600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
456600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.3  2004/01/22 13:26:31  sverker
457600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Issue number:
458600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Obtained from:
459600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Submitted by:  sverker
460600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Reviewed by:   mranga
461600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
462600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Major reformat of code to conform with style guide. Resolved compiler and javadoc warnings. Added CVS tags.
463600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
464600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: ----------------------------------------------------------------------
465600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Issue number:
466600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If this change addresses one or more issues,
467600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   then enter the issue number(s) here.
468600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Obtained from:
469600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If this change has been taken from another system,
470600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   then name the system in this line, otherwise delete it.
471600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Submitted by:
472600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If this code has been contributed to the project by someone else; i.e.,
473600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   they sent us a patch or a set of diffs, then include their name/email
474600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   address here. If this is your work then delete this line.
475600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Reviewed by:
476600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If we are doing pre-commit code reviews and someone else has
477600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   reviewed your changes, include their name(s) here.
478600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS:   If you have not had it reviewed then delete this line.
479600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
480600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */
481