• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 RetryAfter header.
35  *
36  * @version 1.2
37  *
38  * @author Olivier Deruelle
39  * @author M. Ranganathan
40  *
41  *
42  * @version 1.2 $Revision: 1.10 $ $Date: 2009/11/04 17:23:00 $
43  */
44 public class RetryAfterParser extends HeaderParser {
45 
46     /**
47      * Creates a new instance of RetryAfterParser
48      * @param retryAfter the header to parse
49      */
RetryAfterParser(String retryAfter)50     public RetryAfterParser(String retryAfter) {
51         super(retryAfter);
52     }
53 
54     /**
55      * Constructor
56      * @param lexer the lexer to use to parse the header
57      */
RetryAfterParser(Lexer lexer)58     protected RetryAfterParser(Lexer lexer) {
59         super(lexer);
60     }
61 
62     /**
63      * parse the String message
64      * @return SIPHeader (RetryAfter object)
65      * @throws SIPParseException if the message does not respect the spec.
66      */
parse()67     public SIPHeader parse() throws ParseException {
68 
69         if (debug)
70             dbg_enter("RetryAfterParser.parse");
71 
72         RetryAfter retryAfter = new RetryAfter();
73         try {
74             headerName(TokenTypes.RETRY_AFTER);
75 
76             // mandatory delatseconds:
77             String value = lexer.number();
78             try {
79                 int ds = Integer.parseInt(value);
80                 retryAfter.setRetryAfter(ds);
81             } catch (NumberFormatException ex) {
82                 throw createParseException(ex.getMessage());
83             } catch (InvalidArgumentException ex) {
84                 throw createParseException(ex.getMessage());
85             }
86 
87             this.lexer.SPorHT();
88             if (lexer.lookAhead(0) == '(') {
89                 String comment = this.lexer.comment();
90                 retryAfter.setComment(comment);
91             }
92             this.lexer.SPorHT();
93 
94             while (lexer.lookAhead(0) == ';') {
95                 this.lexer.match(';');
96                 this.lexer.SPorHT();
97                 lexer.match(TokenTypes.ID);
98                 Token token = lexer.getNextToken();
99                 value = token.getTokenValue();
100                 if (value.equalsIgnoreCase("duration")) {
101                     this.lexer.match('=');
102                     this.lexer.SPorHT();
103                     value = lexer.number();
104                     try {
105                         int duration = Integer.parseInt(value);
106                         retryAfter.setDuration(duration);
107                     } catch (NumberFormatException ex) {
108                         throw createParseException(ex.getMessage());
109                     } catch (InvalidArgumentException ex) {
110                         throw createParseException(ex.getMessage());
111                     }
112                 } else {
113                     this.lexer.SPorHT();
114                     this.lexer.match('=');
115                     this.lexer.SPorHT();
116                     lexer.match(TokenTypes.ID);
117                     Token secondToken = lexer.getNextToken();
118                     String secondValue = secondToken.getTokenValue();
119                     retryAfter.setParameter(value, secondValue);
120                 }
121                 this.lexer.SPorHT();
122             }
123         } finally {
124             if (debug)
125                 dbg_leave("RetryAfterParser.parse");
126         }
127 
128         return retryAfter;
129     }
130 
131 }
132