PageRenderTime 56ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/servers/jain-sip-ext/src/main/java/gov/nist/javax/sip/parser/chars/Lexer.java

http://mobicents.googlecode.com/
Java | 413 lines | 324 code | 26 blank | 63 comment | 21 complexity | 967c0535e6d0964fde33973c30d9f9f9 MD5 | raw file
Possible License(s): LGPL-3.0, GPL-3.0, LGPL-2.1, GPL-2.0, CC-BY-SA-3.0, CC0-1.0, Apache-2.0, BSD-3-Clause
  1. /*
  2. * JBoss, Home of Professional Open Source
  3. * Copyright 2011, Red Hat, Inc. and individual contributors
  4. * by the @authors tag. See the copyright.txt in the distribution for a
  5. * full listing of individual contributors.
  6. *
  7. * This is free software; you can redistribute it and/or modify it
  8. * under the terms of the GNU Lesser General Public License as
  9. * published by the Free Software Foundation; either version 2.1 of
  10. * the License, or (at your option) any later version.
  11. *
  12. * This software is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with this software; if not, write to the Free
  19. * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  20. * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  21. */
  22. package gov.nist.javax.sip.parser.chars;
  23. import gov.nist.javax.sip.header.extensions.JoinHeader;
  24. import gov.nist.javax.sip.header.extensions.MinSEHeader;
  25. import gov.nist.javax.sip.header.extensions.ReferencesHeader;
  26. import gov.nist.javax.sip.header.extensions.ReferredByHeader;
  27. import gov.nist.javax.sip.header.extensions.ReplacesHeader;
  28. import gov.nist.javax.sip.header.extensions.SessionExpiresHeader;
  29. import gov.nist.javax.sip.header.ims.PAccessNetworkInfoHeader;
  30. import gov.nist.javax.sip.header.ims.PAssertedIdentityHeader;
  31. import gov.nist.javax.sip.header.ims.PAssertedServiceHeader;
  32. import gov.nist.javax.sip.header.ims.PAssociatedURIHeader;
  33. import gov.nist.javax.sip.header.ims.PCalledPartyIDHeader;
  34. import gov.nist.javax.sip.header.ims.PChargingFunctionAddressesHeader;
  35. import gov.nist.javax.sip.header.ims.PChargingVectorHeader;
  36. import gov.nist.javax.sip.header.ims.PMediaAuthorizationHeader;
  37. import gov.nist.javax.sip.header.ims.PPreferredIdentityHeader;
  38. import gov.nist.javax.sip.header.ims.PPreferredServiceHeader;
  39. import gov.nist.javax.sip.header.ims.PProfileKeyHeader;
  40. import gov.nist.javax.sip.header.ims.PServedUserHeader;
  41. import gov.nist.javax.sip.header.ims.PUserDatabaseHeader;
  42. import gov.nist.javax.sip.header.ims.PVisitedNetworkIDHeader;
  43. import gov.nist.javax.sip.header.ims.PathHeader;
  44. import gov.nist.javax.sip.header.ims.PrivacyHeader;
  45. import gov.nist.javax.sip.header.ims.SecurityClientHeader;
  46. import gov.nist.javax.sip.header.ims.SecurityServerHeader;
  47. import gov.nist.javax.sip.header.ims.SecurityVerifyHeader;
  48. import gov.nist.javax.sip.header.ims.ServiceRouteHeader;
  49. import java.util.concurrent.ConcurrentHashMap;
  50. import javax.sip.header.AcceptEncodingHeader;
  51. import javax.sip.header.AcceptHeader;
  52. import javax.sip.header.AcceptLanguageHeader;
  53. import javax.sip.header.AlertInfoHeader;
  54. import javax.sip.header.AllowEventsHeader;
  55. import javax.sip.header.AllowHeader;
  56. import javax.sip.header.AuthenticationInfoHeader;
  57. import javax.sip.header.AuthorizationHeader;
  58. import javax.sip.header.CSeqHeader;
  59. import javax.sip.header.CallIdHeader;
  60. import javax.sip.header.CallInfoHeader;
  61. import javax.sip.header.ContactHeader;
  62. import javax.sip.header.ContentDispositionHeader;
  63. import javax.sip.header.ContentEncodingHeader;
  64. import javax.sip.header.ContentLanguageHeader;
  65. import javax.sip.header.ContentLengthHeader;
  66. import javax.sip.header.ContentTypeHeader;
  67. import javax.sip.header.DateHeader;
  68. import javax.sip.header.ErrorInfoHeader;
  69. import javax.sip.header.EventHeader;
  70. import javax.sip.header.ExpiresHeader;
  71. import javax.sip.header.FromHeader;
  72. import javax.sip.header.InReplyToHeader;
  73. import javax.sip.header.MaxForwardsHeader;
  74. import javax.sip.header.MimeVersionHeader;
  75. import javax.sip.header.MinExpiresHeader;
  76. import javax.sip.header.OrganizationHeader;
  77. import javax.sip.header.PriorityHeader;
  78. import javax.sip.header.ProxyAuthenticateHeader;
  79. import javax.sip.header.ProxyAuthorizationHeader;
  80. import javax.sip.header.ProxyRequireHeader;
  81. import javax.sip.header.RAckHeader;
  82. import javax.sip.header.RSeqHeader;
  83. import javax.sip.header.ReasonHeader;
  84. import javax.sip.header.RecordRouteHeader;
  85. import javax.sip.header.ReferToHeader;
  86. import javax.sip.header.ReplyToHeader;
  87. import javax.sip.header.RequireHeader;
  88. import javax.sip.header.RetryAfterHeader;
  89. import javax.sip.header.RouteHeader;
  90. import javax.sip.header.SIPETagHeader;
  91. import javax.sip.header.SIPIfMatchHeader;
  92. import javax.sip.header.ServerHeader;
  93. import javax.sip.header.SubjectHeader;
  94. import javax.sip.header.SubscriptionStateHeader;
  95. import javax.sip.header.SupportedHeader;
  96. import javax.sip.header.TimeStampHeader;
  97. import javax.sip.header.ToHeader;
  98. import javax.sip.header.UnsupportedHeader;
  99. import javax.sip.header.UserAgentHeader;
  100. import javax.sip.header.ViaHeader;
  101. import javax.sip.header.WWWAuthenticateHeader;
  102. import javax.sip.header.WarningHeader;
  103. /**
  104. * Lexer class for the parser.
  105. *
  106. * @version 1.2
  107. *
  108. * @author M. Ranganathan <br/>
  109. *
  110. *
  111. */
  112. public class Lexer extends LexerCore {
  113. /**
  114. * get the header name of the line
  115. *
  116. * @return the header name (stuff before the :) bug fix submitted by
  117. * zvali@dev.java.net
  118. */
  119. public static String getHeaderName(char[] line) {
  120. if (line == null)
  121. return null;
  122. String headerName = null;
  123. try {
  124. int begin = indexOf(line, ':');
  125. headerName = null;
  126. if (begin >= 1)
  127. headerName = String.valueOf(line, 0, begin).trim();
  128. } catch (IndexOutOfBoundsException e) {
  129. return null;
  130. }
  131. return headerName;
  132. }
  133. public static int indexOf(char[] buffer, char charToCompare) {
  134. int i = 0;
  135. while(i < buffer.length) {
  136. if(buffer[i] == charToCompare) {
  137. return i;
  138. }
  139. i++;
  140. }
  141. return -1;
  142. }
  143. public Lexer(String lexerName, char[] buffer) {
  144. super(lexerName, buffer);
  145. this.selectLexer(lexerName);
  146. }
  147. /**
  148. * get the header value of the line
  149. *
  150. * @return String
  151. */
  152. public static String getHeaderValue(char[] line) {
  153. if (line == null)
  154. return null;
  155. String headerValue = null;
  156. try {
  157. int begin = indexOf(line, ':');
  158. headerValue = String.valueOf(line, begin + 1, line.length - begin - 1);
  159. } catch (IndexOutOfBoundsException e) {
  160. return null;
  161. }
  162. return headerValue;
  163. }
  164. public void selectLexer(String lexerName) {
  165. // Synchronization Bug fix by Robert Rosen.
  166. ConcurrentHashMap<String, Integer> lexer = lexerTables.get(lexerName);
  167. this.currentLexerName = lexerName;
  168. if (lexer == null) {
  169. ConcurrentHashMap<String, Integer> newLexer = new ConcurrentHashMap<String, Integer>();
  170. lexer = lexerTables.putIfAbsent(lexerName, newLexer);
  171. if (lexer == null) {
  172. // put succeeded, use new value
  173. lexer = newLexer;
  174. }
  175. currentLexer = lexer;
  176. // addLexer(lexerName);
  177. if (lexerName.equals("method_keywordLexer")) {
  178. addKeyword(TokenNames.REGISTER, TokenTypes.REGISTER);
  179. addKeyword(TokenNames.ACK, TokenTypes.ACK);
  180. addKeyword(TokenNames.OPTIONS, TokenTypes.OPTIONS);
  181. addKeyword(TokenNames.BYE, TokenTypes.BYE);
  182. addKeyword(TokenNames.INVITE, TokenTypes.INVITE);
  183. addKeyword(TokenNames.SIP.toUpperCase(), TokenTypes.SIP);
  184. addKeyword(TokenNames.SIPS.toUpperCase(), TokenTypes.SIPS);
  185. addKeyword(TokenNames.SUBSCRIBE, TokenTypes.SUBSCRIBE);
  186. addKeyword(TokenNames.NOTIFY, TokenTypes.NOTIFY);
  187. addKeyword(TokenNames.MESSAGE, TokenTypes.MESSAGE);
  188. // JvB: added to support RFC3903
  189. addKeyword(TokenNames.PUBLISH, TokenTypes.PUBLISH);
  190. } else if (lexerName.equals("command_keywordLexer")) {
  191. addKeyword(ErrorInfoHeader.NAME.toUpperCase(),
  192. TokenTypes.ERROR_INFO);
  193. addKeyword(AllowEventsHeader.NAME.toUpperCase(),
  194. TokenTypes.ALLOW_EVENTS);
  195. addKeyword(AuthenticationInfoHeader.NAME.toUpperCase(),
  196. TokenTypes.AUTHENTICATION_INFO);
  197. addKeyword(EventHeader.NAME.toUpperCase(), TokenTypes.EVENT);
  198. addKeyword(MinExpiresHeader.NAME.toUpperCase(),
  199. TokenTypes.MIN_EXPIRES);
  200. addKeyword(RSeqHeader.NAME.toUpperCase(), TokenTypes.RSEQ);
  201. addKeyword(RAckHeader.NAME.toUpperCase(), TokenTypes.RACK);
  202. addKeyword(ReasonHeader.NAME.toUpperCase(),
  203. TokenTypes.REASON);
  204. addKeyword(ReplyToHeader.NAME.toUpperCase(),
  205. TokenTypes.REPLY_TO);
  206. addKeyword(SubscriptionStateHeader.NAME.toUpperCase(),
  207. TokenTypes.SUBSCRIPTION_STATE);
  208. addKeyword(TimeStampHeader.NAME.toUpperCase(),
  209. TokenTypes.TIMESTAMP);
  210. addKeyword(InReplyToHeader.NAME.toUpperCase(),
  211. TokenTypes.IN_REPLY_TO);
  212. addKeyword(MimeVersionHeader.NAME.toUpperCase(),
  213. TokenTypes.MIME_VERSION);
  214. addKeyword(AlertInfoHeader.NAME.toUpperCase(),
  215. TokenTypes.ALERT_INFO);
  216. addKeyword(FromHeader.NAME.toUpperCase(), TokenTypes.FROM);
  217. addKeyword(ToHeader.NAME.toUpperCase(), TokenTypes.TO);
  218. addKeyword(ReferToHeader.NAME.toUpperCase(),
  219. TokenTypes.REFER_TO);
  220. addKeyword(ViaHeader.NAME.toUpperCase(), TokenTypes.VIA);
  221. addKeyword(UserAgentHeader.NAME.toUpperCase(),
  222. TokenTypes.USER_AGENT);
  223. addKeyword(ServerHeader.NAME.toUpperCase(),
  224. TokenTypes.SERVER);
  225. addKeyword(AcceptEncodingHeader.NAME.toUpperCase(),
  226. TokenTypes.ACCEPT_ENCODING);
  227. addKeyword(AcceptHeader.NAME.toUpperCase(),
  228. TokenTypes.ACCEPT);
  229. addKeyword(AllowHeader.NAME.toUpperCase(), TokenTypes.ALLOW);
  230. addKeyword(RouteHeader.NAME.toUpperCase(), TokenTypes.ROUTE);
  231. addKeyword(AuthorizationHeader.NAME.toUpperCase(),
  232. TokenTypes.AUTHORIZATION);
  233. addKeyword(ProxyAuthorizationHeader.NAME.toUpperCase(),
  234. TokenTypes.PROXY_AUTHORIZATION);
  235. addKeyword(RetryAfterHeader.NAME.toUpperCase(),
  236. TokenTypes.RETRY_AFTER);
  237. addKeyword(ProxyRequireHeader.NAME.toUpperCase(),
  238. TokenTypes.PROXY_REQUIRE);
  239. addKeyword(ContentLanguageHeader.NAME.toUpperCase(),
  240. TokenTypes.CONTENT_LANGUAGE);
  241. addKeyword(UnsupportedHeader.NAME.toUpperCase(),
  242. TokenTypes.UNSUPPORTED);
  243. addKeyword(SupportedHeader.NAME.toUpperCase(),
  244. TokenTypes.SUPPORTED);
  245. addKeyword(WarningHeader.NAME.toUpperCase(),
  246. TokenTypes.WARNING);
  247. addKeyword(MaxForwardsHeader.NAME.toUpperCase(),
  248. TokenTypes.MAX_FORWARDS);
  249. addKeyword(DateHeader.NAME.toUpperCase(), TokenTypes.DATE);
  250. addKeyword(PriorityHeader.NAME.toUpperCase(),
  251. TokenTypes.PRIORITY);
  252. addKeyword(ProxyAuthenticateHeader.NAME.toUpperCase(),
  253. TokenTypes.PROXY_AUTHENTICATE);
  254. addKeyword(ContentEncodingHeader.NAME.toUpperCase(),
  255. TokenTypes.CONTENT_ENCODING);
  256. addKeyword(ContentLengthHeader.NAME.toUpperCase(),
  257. TokenTypes.CONTENT_LENGTH);
  258. addKeyword(SubjectHeader.NAME.toUpperCase(),
  259. TokenTypes.SUBJECT);
  260. addKeyword(ContentTypeHeader.NAME.toUpperCase(),
  261. TokenTypes.CONTENT_TYPE);
  262. addKeyword(ContactHeader.NAME.toUpperCase(),
  263. TokenTypes.CONTACT);
  264. addKeyword(CallIdHeader.NAME.toUpperCase(),
  265. TokenTypes.CALL_ID);
  266. addKeyword(RequireHeader.NAME.toUpperCase(),
  267. TokenTypes.REQUIRE);
  268. addKeyword(ExpiresHeader.NAME.toUpperCase(),
  269. TokenTypes.EXPIRES);
  270. addKeyword(RecordRouteHeader.NAME.toUpperCase(),
  271. TokenTypes.RECORD_ROUTE);
  272. addKeyword(OrganizationHeader.NAME.toUpperCase(),
  273. TokenTypes.ORGANIZATION);
  274. addKeyword(CSeqHeader.NAME.toUpperCase(), TokenTypes.CSEQ);
  275. addKeyword(AcceptLanguageHeader.NAME.toUpperCase(),
  276. TokenTypes.ACCEPT_LANGUAGE);
  277. addKeyword(WWWAuthenticateHeader.NAME.toUpperCase(),
  278. TokenTypes.WWW_AUTHENTICATE);
  279. addKeyword(CallInfoHeader.NAME.toUpperCase(),
  280. TokenTypes.CALL_INFO);
  281. addKeyword(ContentDispositionHeader.NAME.toUpperCase(),
  282. TokenTypes.CONTENT_DISPOSITION);
  283. // And now the dreaded short forms....
  284. addKeyword(TokenNames.K.toUpperCase(), TokenTypes.SUPPORTED);
  285. addKeyword(TokenNames.C.toUpperCase(),
  286. TokenTypes.CONTENT_TYPE);
  287. addKeyword(TokenNames.E.toUpperCase(),
  288. TokenTypes.CONTENT_ENCODING);
  289. addKeyword(TokenNames.F.toUpperCase(), TokenTypes.FROM);
  290. addKeyword(TokenNames.I.toUpperCase(), TokenTypes.CALL_ID);
  291. addKeyword(TokenNames.M.toUpperCase(), TokenTypes.CONTACT);
  292. addKeyword(TokenNames.L.toUpperCase(),
  293. TokenTypes.CONTENT_LENGTH);
  294. addKeyword(TokenNames.S.toUpperCase(), TokenTypes.SUBJECT);
  295. addKeyword(TokenNames.T.toUpperCase(), TokenTypes.TO);
  296. addKeyword(TokenNames.U.toUpperCase(),
  297. TokenTypes.ALLOW_EVENTS); // JvB: added
  298. addKeyword(TokenNames.V.toUpperCase(), TokenTypes.VIA);
  299. addKeyword(TokenNames.R.toUpperCase(), TokenTypes.REFER_TO);
  300. addKeyword(TokenNames.O.toUpperCase(), TokenTypes.EVENT); // Bug
  301. // fix
  302. // by
  303. // Mario
  304. // Mantak
  305. addKeyword(TokenNames.X.toUpperCase(), TokenTypes.SESSIONEXPIRES_TO); // Bug fix by Jozef Saniga
  306. // JvB: added to support RFC3903
  307. addKeyword(SIPETagHeader.NAME.toUpperCase(),
  308. TokenTypes.SIP_ETAG);
  309. addKeyword(SIPIfMatchHeader.NAME.toUpperCase(),
  310. TokenTypes.SIP_IF_MATCH);
  311. // pmusgrave: Add RFC4028 and ReferredBy
  312. addKeyword(SessionExpiresHeader.NAME.toUpperCase(),
  313. TokenTypes.SESSIONEXPIRES_TO);
  314. addKeyword(MinSEHeader.NAME.toUpperCase(),
  315. TokenTypes.MINSE_TO);
  316. addKeyword(ReferredByHeader.NAME.toUpperCase(),
  317. TokenTypes.REFERREDBY_TO);
  318. // pmusgrave RFC3891
  319. addKeyword(ReplacesHeader.NAME.toUpperCase(),
  320. TokenTypes.REPLACES_TO);
  321. //jean deruelle RFC3911
  322. addKeyword(JoinHeader.NAME.toUpperCase(),
  323. TokenTypes.JOIN_TO);
  324. // IMS Headers
  325. addKeyword(PathHeader.NAME.toUpperCase(), TokenTypes.PATH);
  326. addKeyword(ServiceRouteHeader.NAME.toUpperCase(),
  327. TokenTypes.SERVICE_ROUTE);
  328. addKeyword(PAssertedIdentityHeader.NAME.toUpperCase(),
  329. TokenTypes.P_ASSERTED_IDENTITY);
  330. addKeyword(PPreferredIdentityHeader.NAME.toUpperCase(),
  331. TokenTypes.P_PREFERRED_IDENTITY);
  332. addKeyword(PrivacyHeader.NAME.toUpperCase(),
  333. TokenTypes.PRIVACY);
  334. // issued by Miguel Freitas
  335. addKeyword(PCalledPartyIDHeader.NAME.toUpperCase(),
  336. TokenTypes.P_CALLED_PARTY_ID);
  337. addKeyword(PAssociatedURIHeader.NAME.toUpperCase(),
  338. TokenTypes.P_ASSOCIATED_URI);
  339. addKeyword(PVisitedNetworkIDHeader.NAME.toUpperCase(),
  340. TokenTypes.P_VISITED_NETWORK_ID);
  341. addKeyword(PChargingFunctionAddressesHeader.NAME
  342. .toUpperCase(),
  343. TokenTypes.P_CHARGING_FUNCTION_ADDRESSES);
  344. addKeyword(PChargingVectorHeader.NAME.toUpperCase(),
  345. TokenTypes.P_VECTOR_CHARGING);
  346. addKeyword(PAccessNetworkInfoHeader.NAME.toUpperCase(),
  347. TokenTypes.P_ACCESS_NETWORK_INFO);
  348. addKeyword(PMediaAuthorizationHeader.NAME.toUpperCase(),
  349. TokenTypes.P_MEDIA_AUTHORIZATION);
  350. addKeyword(SecurityServerHeader.NAME.toUpperCase(),
  351. TokenTypes.SECURITY_SERVER);
  352. addKeyword(SecurityVerifyHeader.NAME.toUpperCase(),
  353. TokenTypes.SECURITY_VERIFY);
  354. addKeyword(SecurityClientHeader.NAME.toUpperCase(),
  355. TokenTypes.SECURITY_CLIENT);
  356. // added by aayush@rancore
  357. addKeyword(PUserDatabaseHeader.NAME.toUpperCase(),
  358. TokenTypes.P_USER_DATABASE);
  359. // added by aayush@rancore
  360. addKeyword(PProfileKeyHeader.NAME.toUpperCase(),
  361. TokenTypes.P_PROFILE_KEY);
  362. // added by aayush@rancore
  363. addKeyword(PServedUserHeader.NAME.toUpperCase(),
  364. TokenTypes.P_SERVED_USER);
  365. // added by aayush@rancore
  366. addKeyword(PPreferredServiceHeader.NAME.toUpperCase(),
  367. TokenTypes.P_PREFERRED_SERVICE);
  368. // added by aayush@rancore
  369. addKeyword(PAssertedServiceHeader.NAME.toUpperCase(),
  370. TokenTypes.P_ASSERTED_SERVICE);
  371. // added References header
  372. addKeyword(ReferencesHeader.NAME.toUpperCase(),TokenTypes.REFERENCES);
  373. // end //
  374. } else if (lexerName.equals("status_lineLexer")) {
  375. addKeyword(TokenNames.SIP.toUpperCase(), TokenTypes.SIP);
  376. } else if (lexerName.equals("request_lineLexer")) {
  377. addKeyword(TokenNames.SIP.toUpperCase(), TokenTypes.SIP);
  378. } else if (lexerName.equals("sip_urlLexer")) {
  379. addKeyword(TokenNames.TEL.toUpperCase(), TokenTypes.TEL);
  380. addKeyword(TokenNames.SIP.toUpperCase(), TokenTypes.SIP);
  381. addKeyword(TokenNames.SIPS.toUpperCase(), TokenTypes.SIPS);
  382. }
  383. } else {
  384. currentLexer = lexer;
  385. }
  386. }
  387. }