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 */
26 package gov.nist.javax.sip.parser;
27 
28 import gov.nist.javax.sip.header.*;
29 import gov.nist.core.*;
30 import java.text.ParseException;
31 import javax.sip.*;
32 
33 /**
34  * Parser for Warning header.
35  *
36  * @version 1.2
37  *
38  * @author Olivier Deruelle
39  * @author M. Ranganathan
40  *
41  *
42  *
43  * @version 1.0
44  */
45 public class WarningParser extends HeaderParser {
46 
47     /**
48      * Constructor
49      *
50      * @param warning -
51      *            Warning header to parse
52      */
WarningParser(String warning)53     public WarningParser(String warning) {
54         super(warning);
55     }
56 
57     /**
58      * Cosntructor
59      *
60      * @param lexer -
61      *            the lexer to use.
62      */
WarningParser(Lexer lexer)63     protected WarningParser(Lexer lexer) {
64         super(lexer);
65     }
66 
67     /**
68      * parse the String message
69      *
70      * @return SIPHeader (WarningList object)
71      * @throws SIPParseException
72      *             if the message does not respect the spec.
73      */
parse()74     public SIPHeader parse() throws ParseException {
75         WarningList warningList = new WarningList();
76         if (debug)
77             dbg_enter("WarningParser.parse");
78 
79         try {
80             headerName(TokenTypes.WARNING);
81 
82             while (lexer.lookAhead(0) != '\n') {
83                 Warning warning = new Warning();
84                 warning.setHeaderName(SIPHeaderNames.WARNING);
85 
86                 // Parsing the 3digits code
87                 this.lexer.match(TokenTypes.ID);
88                 Token token = lexer.getNextToken();
89                 try {
90                     int code = Integer.parseInt(token.getTokenValue());
91                     warning.setCode(code);
92                 } catch (NumberFormatException ex) {
93                     throw createParseException(ex.getMessage());
94                 } catch (InvalidArgumentException ex) {
95                     throw createParseException(ex.getMessage());
96                 }
97                 this.lexer.SPorHT();
98 
99                 // Parsing the agent
100                 this.lexer.match(TokenTypes.ID);
101                 token = lexer.getNextToken();
102                 // Bug reported by zvali@dev.java.net
103                 if (lexer.lookAhead(0) == ':') {
104                     this.lexer.match(':');
105                     this.lexer.match(TokenTypes.ID);
106                     Token token2 = lexer.getNextToken();
107                     warning.setAgent(token.getTokenValue() + ":"
108                             + token2.getTokenValue());
109                 } else {
110                     warning.setAgent(token.getTokenValue());
111                 }
112 
113                 this.lexer.SPorHT();
114 
115                 // Parsing the text
116                 String text = this.lexer.quotedString();
117                 warning.setText(text);
118                 this.lexer.SPorHT();
119 
120                 warningList.add(warning);
121 
122                 while (lexer.lookAhead(0) == ',') {
123                     this.lexer.match(',');
124                     this.lexer.SPorHT();
125 
126                     warning = new Warning();
127 
128                     // Parsing the 3digits code
129                     this.lexer.match(TokenTypes.ID);
130                     Token tok = lexer.getNextToken();
131                     try {
132                         int code = Integer.parseInt(tok.getTokenValue());
133                         warning.setCode(code);
134                     } catch (NumberFormatException ex) {
135                         throw createParseException(ex.getMessage());
136                     } catch (InvalidArgumentException ex) {
137                         throw createParseException(ex.getMessage());
138                     }
139                     this.lexer.SPorHT();
140 
141                     // Parsing the agent
142                     this.lexer.match(TokenTypes.ID);
143                     tok = lexer.getNextToken();
144 
145                     // Bug reported by zvali@dev.java.net
146 
147                     if (lexer.lookAhead(0) == ':') {
148                         this.lexer.match(':');
149                         this.lexer.match(TokenTypes.ID);
150                         Token token2 = lexer.getNextToken();
151                         warning.setAgent(tok.getTokenValue() + ":"
152                                 + token2.getTokenValue());
153                     } else {
154                         warning.setAgent(tok.getTokenValue());
155                     }
156 
157                     this.lexer.SPorHT();
158 
159                     // Parsing the text
160                     text = this.lexer.quotedString();
161                     warning.setText(text);
162                     this.lexer.SPorHT();
163 
164                     warningList.add(warning);
165                 }
166 
167             }
168         } finally {
169             if (debug)
170                 dbg_leave("WarningParser.parse");
171         }
172 
173         return warningList;
174     }
175 
176     /**
177      * public static void main(String args[]) throws ParseException { String
178      * warning[] = { "Warning: 307 isi.edu \"Session parameter 'foo' not
179      * understood\"\n", "Warning: 301 isi.edu \"Incompatible network address
180      * type 'E.164'\"\n", "Warning: 312 ii.edu \"Soda\", "+ " 351 i.edu \"I
181      * network address 'E.164'\" , 323 ii.edu \"Sodwea\"\n", "Warning: 392
182      * 192.168.89.71:5060 \"Noisy feedback tells: pid=936
183      * req_src_ip=192.168.89.20 in_uri=sip:xxx@yyyy.org:5061
184      * out_uri=sip:xxx@yyyy.org:5061 via_cnt==1\"\n" };
185      *
186      * for (int i = 0; i < warning.length; i++ ) { WarningParser parser = new
187      * WarningParser(warning[i]); WarningList warningList= (WarningList)
188      * parser.parse(); System.out.println("encoded = " + warningList.encode()); }
189      *  }
190      */
191 
192 }
193