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 */
26package gov.nist.javax.sip.parser;
27
28import gov.nist.core.*;
29
30import gov.nist.javax.sip.header.extensions.*;
31
32import gov.nist.javax.sip.header.ims.*;
33
34import javax.sip.header.*;
35import java.util.Hashtable;
36
37/**
38 * Lexer class for the parser.
39 *
40 * @version 1.2
41 *
42 * @author M. Ranganathan <br/>
43 *
44 *
45 */
46public class Lexer extends LexerCore {
47    /**
48     * get the header name of the line
49     *
50     * @return the header name (stuff before the :) bug fix submitted by
51     *         zvali@dev.java.net
52     */
53    public static String getHeaderName(String line) {
54        if (line == null)
55            return null;
56        String headerName = null;
57        try {
58            int begin = line.indexOf(":");
59            headerName = null;
60            if (begin >= 1)
61                headerName = line.substring(0, begin).trim();
62        } catch (IndexOutOfBoundsException e) {
63            return null;
64        }
65        return headerName;
66    }
67
68    public Lexer(String lexerName, String buffer) {
69        super(lexerName, buffer);
70        this.selectLexer(lexerName);
71    }
72
73    /**
74     * get the header value of the line
75     *
76     * @return String
77     */
78    public static String getHeaderValue(String line) {
79        if (line == null)
80            return null;
81        String headerValue = null;
82        try {
83            int begin = line.indexOf(":");
84            headerValue = line.substring(begin + 1);
85        } catch (IndexOutOfBoundsException e) {
86            return null;
87        }
88        return headerValue;
89    }
90
91    public void selectLexer(String lexerName) {
92        synchronized (lexerTables) {
93            // Synchronization Bug fix by Robert Rosen.
94            currentLexer = (Hashtable) lexerTables.get(lexerName);
95            this.currentLexerName = lexerName;
96            if (currentLexer == null) {
97                addLexer(lexerName);
98                if (lexerName.equals("method_keywordLexer")) {
99                    addKeyword(TokenNames.REGISTER, TokenTypes.REGISTER);
100                    addKeyword(TokenNames.ACK, TokenTypes.ACK);
101                    addKeyword(TokenNames.OPTIONS, TokenTypes.OPTIONS);
102                    addKeyword(TokenNames.BYE, TokenTypes.BYE);
103                    addKeyword(TokenNames.INVITE, TokenTypes.INVITE);
104                    addKeyword(TokenNames.SIP.toUpperCase(), TokenTypes.SIP);
105                    addKeyword(TokenNames.SIPS.toUpperCase(), TokenTypes.SIPS);
106                    addKeyword(TokenNames.SUBSCRIBE, TokenTypes.SUBSCRIBE);
107                    addKeyword(TokenNames.NOTIFY, TokenTypes.NOTIFY);
108                    addKeyword(TokenNames.MESSAGE, TokenTypes.MESSAGE);
109
110                    // JvB: added to support RFC3903
111                    addKeyword(TokenNames.PUBLISH, TokenTypes.PUBLISH);
112
113                } else if (lexerName.equals("command_keywordLexer")) {
114                    addKeyword(ErrorInfoHeader.NAME.toUpperCase(),
115                            TokenTypes.ERROR_INFO);
116                    addKeyword(AllowEventsHeader.NAME.toUpperCase(),
117                            TokenTypes.ALLOW_EVENTS);
118                    addKeyword(AuthenticationInfoHeader.NAME.toUpperCase(),
119                            TokenTypes.AUTHENTICATION_INFO);
120                    addKeyword(EventHeader.NAME.toUpperCase(), TokenTypes.EVENT);
121                    addKeyword(MinExpiresHeader.NAME.toUpperCase(),
122                            TokenTypes.MIN_EXPIRES);
123                    addKeyword(RSeqHeader.NAME.toUpperCase(), TokenTypes.RSEQ);
124                    addKeyword(RAckHeader.NAME.toUpperCase(), TokenTypes.RACK);
125                    addKeyword(ReasonHeader.NAME.toUpperCase(),
126                            TokenTypes.REASON);
127                    addKeyword(ReplyToHeader.NAME.toUpperCase(),
128                            TokenTypes.REPLY_TO);
129                    addKeyword(SubscriptionStateHeader.NAME.toUpperCase(),
130                            TokenTypes.SUBSCRIPTION_STATE);
131                    addKeyword(TimeStampHeader.NAME.toUpperCase(),
132                            TokenTypes.TIMESTAMP);
133                    addKeyword(InReplyToHeader.NAME.toUpperCase(),
134                            TokenTypes.IN_REPLY_TO);
135                    addKeyword(MimeVersionHeader.NAME.toUpperCase(),
136                            TokenTypes.MIME_VERSION);
137                    addKeyword(AlertInfoHeader.NAME.toUpperCase(),
138                            TokenTypes.ALERT_INFO);
139                    addKeyword(FromHeader.NAME.toUpperCase(), TokenTypes.FROM);
140                    addKeyword(ToHeader.NAME.toUpperCase(), TokenTypes.TO);
141                    addKeyword(ReferToHeader.NAME.toUpperCase(),
142                            TokenTypes.REFER_TO);
143                    addKeyword(ViaHeader.NAME.toUpperCase(), TokenTypes.VIA);
144                    addKeyword(UserAgentHeader.NAME.toUpperCase(),
145                            TokenTypes.USER_AGENT);
146                    addKeyword(ServerHeader.NAME.toUpperCase(),
147                            TokenTypes.SERVER);
148                    addKeyword(AcceptEncodingHeader.NAME.toUpperCase(),
149                            TokenTypes.ACCEPT_ENCODING);
150                    addKeyword(AcceptHeader.NAME.toUpperCase(),
151                            TokenTypes.ACCEPT);
152                    addKeyword(AllowHeader.NAME.toUpperCase(), TokenTypes.ALLOW);
153                    addKeyword(RouteHeader.NAME.toUpperCase(), TokenTypes.ROUTE);
154                    addKeyword(AuthorizationHeader.NAME.toUpperCase(),
155                            TokenTypes.AUTHORIZATION);
156                    addKeyword(ProxyAuthorizationHeader.NAME.toUpperCase(),
157                            TokenTypes.PROXY_AUTHORIZATION);
158                    addKeyword(RetryAfterHeader.NAME.toUpperCase(),
159                            TokenTypes.RETRY_AFTER);
160                    addKeyword(ProxyRequireHeader.NAME.toUpperCase(),
161                            TokenTypes.PROXY_REQUIRE);
162                    addKeyword(ContentLanguageHeader.NAME.toUpperCase(),
163                            TokenTypes.CONTENT_LANGUAGE);
164                    addKeyword(UnsupportedHeader.NAME.toUpperCase(),
165                            TokenTypes.UNSUPPORTED);
166                    addKeyword(SupportedHeader.NAME.toUpperCase(),
167                            TokenTypes.SUPPORTED);
168                    addKeyword(WarningHeader.NAME.toUpperCase(),
169                            TokenTypes.WARNING);
170                    addKeyword(MaxForwardsHeader.NAME.toUpperCase(),
171                            TokenTypes.MAX_FORWARDS);
172                    addKeyword(DateHeader.NAME.toUpperCase(), TokenTypes.DATE);
173                    addKeyword(PriorityHeader.NAME.toUpperCase(),
174                            TokenTypes.PRIORITY);
175                    addKeyword(ProxyAuthenticateHeader.NAME.toUpperCase(),
176                            TokenTypes.PROXY_AUTHENTICATE);
177                    addKeyword(ContentEncodingHeader.NAME.toUpperCase(),
178                            TokenTypes.CONTENT_ENCODING);
179                    addKeyword(ContentLengthHeader.NAME.toUpperCase(),
180                            TokenTypes.CONTENT_LENGTH);
181                    addKeyword(SubjectHeader.NAME.toUpperCase(),
182                            TokenTypes.SUBJECT);
183                    addKeyword(ContentTypeHeader.NAME.toUpperCase(),
184                            TokenTypes.CONTENT_TYPE);
185                    addKeyword(ContactHeader.NAME.toUpperCase(),
186                            TokenTypes.CONTACT);
187                    addKeyword(CallIdHeader.NAME.toUpperCase(),
188                            TokenTypes.CALL_ID);
189                    addKeyword(RequireHeader.NAME.toUpperCase(),
190                            TokenTypes.REQUIRE);
191                    addKeyword(ExpiresHeader.NAME.toUpperCase(),
192                            TokenTypes.EXPIRES);
193                    addKeyword(RecordRouteHeader.NAME.toUpperCase(),
194                            TokenTypes.RECORD_ROUTE);
195                    addKeyword(OrganizationHeader.NAME.toUpperCase(),
196                            TokenTypes.ORGANIZATION);
197                    addKeyword(CSeqHeader.NAME.toUpperCase(), TokenTypes.CSEQ);
198                    addKeyword(AcceptLanguageHeader.NAME.toUpperCase(),
199                            TokenTypes.ACCEPT_LANGUAGE);
200                    addKeyword(WWWAuthenticateHeader.NAME.toUpperCase(),
201                            TokenTypes.WWW_AUTHENTICATE);
202                    addKeyword(CallInfoHeader.NAME.toUpperCase(),
203                            TokenTypes.CALL_INFO);
204                    addKeyword(ContentDispositionHeader.NAME.toUpperCase(),
205                            TokenTypes.CONTENT_DISPOSITION);
206                    // And now the dreaded short forms....
207                    addKeyword(TokenNames.K.toUpperCase(), TokenTypes.SUPPORTED);
208                    addKeyword(TokenNames.C.toUpperCase(),
209                            TokenTypes.CONTENT_TYPE);
210                    addKeyword(TokenNames.E.toUpperCase(),
211                            TokenTypes.CONTENT_ENCODING);
212                    addKeyword(TokenNames.F.toUpperCase(), TokenTypes.FROM);
213                    addKeyword(TokenNames.I.toUpperCase(), TokenTypes.CALL_ID);
214                    addKeyword(TokenNames.M.toUpperCase(), TokenTypes.CONTACT);
215                    addKeyword(TokenNames.L.toUpperCase(),
216                            TokenTypes.CONTENT_LENGTH);
217                    addKeyword(TokenNames.S.toUpperCase(), TokenTypes.SUBJECT);
218                    addKeyword(TokenNames.T.toUpperCase(), TokenTypes.TO);
219                    addKeyword(TokenNames.U.toUpperCase(),
220                            TokenTypes.ALLOW_EVENTS); // JvB: added
221                    addKeyword(TokenNames.V.toUpperCase(), TokenTypes.VIA);
222                    addKeyword(TokenNames.R.toUpperCase(), TokenTypes.REFER_TO);
223                    addKeyword(TokenNames.O.toUpperCase(), TokenTypes.EVENT); // Bug
224                                                                                // fix
225                                                                                // by
226                                                                                // Mario
227                                                                                // Mantak
228                    addKeyword(TokenNames.X.toUpperCase(), TokenTypes.SESSIONEXPIRES_TO); // Bug fix by Jozef Saniga
229
230                    // JvB: added to support RFC3903
231                    addKeyword(SIPETagHeader.NAME.toUpperCase(),
232                            TokenTypes.SIP_ETAG);
233                    addKeyword(SIPIfMatchHeader.NAME.toUpperCase(),
234                            TokenTypes.SIP_IF_MATCH);
235
236                    // pmusgrave: Add RFC4028 and ReferredBy
237                    addKeyword(SessionExpiresHeader.NAME.toUpperCase(),
238                            TokenTypes.SESSIONEXPIRES_TO);
239                    addKeyword(MinSEHeader.NAME.toUpperCase(),
240                            TokenTypes.MINSE_TO);
241                    addKeyword(ReferredByHeader.NAME.toUpperCase(),
242                            TokenTypes.REFERREDBY_TO);
243
244                    // pmusgrave RFC3891
245                    addKeyword(ReplacesHeader.NAME.toUpperCase(),
246                            TokenTypes.REPLACES_TO);
247                    //jean deruelle RFC3911
248                    addKeyword(JoinHeader.NAME.toUpperCase(),
249                            TokenTypes.JOIN_TO);
250
251                    // IMS Headers
252                    addKeyword(PathHeader.NAME.toUpperCase(), TokenTypes.PATH);
253                    addKeyword(ServiceRouteHeader.NAME.toUpperCase(),
254                            TokenTypes.SERVICE_ROUTE);
255                    addKeyword(PAssertedIdentityHeader.NAME.toUpperCase(),
256                            TokenTypes.P_ASSERTED_IDENTITY);
257                    addKeyword(PPreferredIdentityHeader.NAME.toUpperCase(),
258                            TokenTypes.P_PREFERRED_IDENTITY);
259                    addKeyword(PrivacyHeader.NAME.toUpperCase(),
260                            TokenTypes.PRIVACY);
261
262                    // issued by Miguel Freitas
263                    addKeyword(PCalledPartyIDHeader.NAME.toUpperCase(),
264                            TokenTypes.P_CALLED_PARTY_ID);
265                    addKeyword(PAssociatedURIHeader.NAME.toUpperCase(),
266                            TokenTypes.P_ASSOCIATED_URI);
267                    addKeyword(PVisitedNetworkIDHeader.NAME.toUpperCase(),
268                            TokenTypes.P_VISITED_NETWORK_ID);
269                    addKeyword(PChargingFunctionAddressesHeader.NAME
270                            .toUpperCase(),
271                            TokenTypes.P_CHARGING_FUNCTION_ADDRESSES);
272                    addKeyword(PChargingVectorHeader.NAME.toUpperCase(),
273                            TokenTypes.P_VECTOR_CHARGING);
274                    addKeyword(PAccessNetworkInfoHeader.NAME.toUpperCase(),
275                            TokenTypes.P_ACCESS_NETWORK_INFO);
276                    addKeyword(PMediaAuthorizationHeader.NAME.toUpperCase(),
277                            TokenTypes.P_MEDIA_AUTHORIZATION);
278
279                    addKeyword(SecurityServerHeader.NAME.toUpperCase(),
280                            TokenTypes.SECURITY_SERVER);
281                    addKeyword(SecurityVerifyHeader.NAME.toUpperCase(),
282                            TokenTypes.SECURITY_VERIFY);
283                    addKeyword(SecurityClientHeader.NAME.toUpperCase(),
284                            TokenTypes.SECURITY_CLIENT);
285
286                    // added by aayush@rancore
287                    addKeyword(PUserDatabaseHeader.NAME.toUpperCase(),
288                            TokenTypes.P_USER_DATABASE);
289
290                    // added by aayush@rancore
291                    addKeyword(PProfileKeyHeader.NAME.toUpperCase(),
292                            TokenTypes.P_PROFILE_KEY);
293
294                    // added by aayush@rancore
295                    addKeyword(PServedUserHeader.NAME.toUpperCase(),
296                            TokenTypes.P_SERVED_USER);
297
298                    // added by aayush@rancore
299                    addKeyword(PPreferredServiceHeader.NAME.toUpperCase(),
300                            TokenTypes.P_PREFERRED_SERVICE);
301
302                    // added by aayush@rancore
303                    addKeyword(PAssertedServiceHeader.NAME.toUpperCase(),
304                            TokenTypes.P_ASSERTED_SERVICE);
305
306                    // added References header
307                    addKeyword(ReferencesHeader.NAME.toUpperCase(),TokenTypes.REFERENCES);
308
309                    // end //
310
311
312                } else if (lexerName.equals("status_lineLexer")) {
313                    addKeyword(TokenNames.SIP.toUpperCase(), TokenTypes.SIP);
314                } else if (lexerName.equals("request_lineLexer")) {
315                    addKeyword(TokenNames.SIP.toUpperCase(), TokenTypes.SIP);
316                } else if (lexerName.equals("sip_urlLexer")) {
317                    addKeyword(TokenNames.TEL.toUpperCase(), TokenTypes.TEL);
318                    addKeyword(TokenNames.SIP.toUpperCase(), TokenTypes.SIP);
319                    addKeyword(TokenNames.SIPS.toUpperCase(), TokenTypes.SIPS);
320                }
321            }
322        }
323    }
324}
325