1d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */
2d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen/*
3d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen *  Copyright 2004 the mime4j project
4d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen *
5d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen *  Licensed under the Apache License, Version 2.0 (the "License");
6d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen *  you may not use this file except in compliance with the License.
7d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen *  You may obtain a copy of the License at
8d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen *
9d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen *      http://www.apache.org/licenses/LICENSE-2.0
10d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen *
11d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen *  Unless required by applicable law or agreed to in writing, software
12d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen *  distributed under the License is distributed on an "AS IS" BASIS,
13d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen *  See the License for the specific language governing permissions and
15d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen *  limitations under the License.
16d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen */
17d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chenpackage org.apache.james.mime4j.field.contenttype.parser;
18d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
19d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen/**
20d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * This exception is thrown when parse errors are encountered.
21d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * You can explicitly create objects of this exception type by
22d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * calling the method generateParseException in the generated
23d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * parser.
24d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen *
25d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * You can modify this class to customize your error reporting
26d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * mechanisms so long as you retain the public fields.
27d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen */
28d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chenpublic class ParseException extends Exception {
29d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
30d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  /**
31d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * This constructor is used by the method "generateParseException"
32d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * in the generated parser.  Calling this constructor generates
33d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * a new object of this type with the fields "currentToken",
34d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * "expectedTokenSequences", and "tokenImage" set.  The boolean
35d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * flag "specialConstructor" is also set to true to indicate that
36d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * this constructor was used to create this object.
37d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * This constructor calls its super class with the empty string
38d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * to force the "toString" method of parent class "Throwable" to
39d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * print the error message in the form:
40d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   *     ParseException: <result of getMessage>
41d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   */
42d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  public ParseException(Token currentTokenVal,
43d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                        int[][] expectedTokenSequencesVal,
44d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                        String[] tokenImageVal
45d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                       )
46d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  {
47d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    super("");
48d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    specialConstructor = true;
49d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    currentToken = currentTokenVal;
50d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    expectedTokenSequences = expectedTokenSequencesVal;
51d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    tokenImage = tokenImageVal;
52d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  }
53d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
54d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  /**
55d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * The following constructors are for use by you for whatever
56d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * purpose you can think of.  Constructing the exception in this
57d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * manner makes the exception behave in the normal way - i.e., as
58d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * documented in the class "Throwable".  The fields "errorToken",
59d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * "expectedTokenSequences", and "tokenImage" do not contain
60d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * relevant information.  The JavaCC generated code does not use
61d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * these constructors.
62d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   */
63d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
64d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  public ParseException() {
65d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    super();
66d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    specialConstructor = false;
67d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  }
68d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
69d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  public ParseException(String message) {
70d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    super(message);
71d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    specialConstructor = false;
72d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  }
73d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
74d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  /**
75d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * This variable determines which constructor was used to create
76d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * this object and thereby affects the semantics of the
77d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * "getMessage" method (see below).
78d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   */
79d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  protected boolean specialConstructor;
80d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
81d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  /**
82d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * This is the last token that has been consumed successfully.  If
83d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * this object has been created due to a parse error, the token
84d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * followng this token will (therefore) be the first error token.
85d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   */
86d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  public Token currentToken;
87d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
88d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  /**
89d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * Each entry in this array is an array of integers.  Each array
90d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * of integers represents a sequence of tokens (by their ordinal
91d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * values) that is expected at this point of the parse.
92d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   */
93d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  public int[][] expectedTokenSequences;
94d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
95d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  /**
96d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * This is a reference to the "tokenImage" array of the generated
97d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * parser within which the parse error occurred.  This array is
98d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * defined in the generated ...Constants interface.
99d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   */
100d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  public String[] tokenImage;
101d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
102d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  /**
103d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * This method has the standard behavior when this object has been
104d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * created using the standard constructors.  Otherwise, it uses
105d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * "currentToken" and "expectedTokenSequences" to generate a parse
106d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * error message and returns it.  If this object has been created
107d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * due to a parse error, and you do not catch it (it gets thrown
108d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * from the parser), then this method is called during the printing
109d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * of the final stack trace, and hence the correct error message
110d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * gets displayed.
111d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   */
112d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  public String getMessage() {
113d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    if (!specialConstructor) {
114d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      return super.getMessage();
115d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    }
116d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    StringBuffer expected = new StringBuffer();
117d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    int maxSize = 0;
118d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    for (int i = 0; i < expectedTokenSequences.length; i++) {
119d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      if (maxSize < expectedTokenSequences[i].length) {
120d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        maxSize = expectedTokenSequences[i].length;
121d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      }
122d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      for (int j = 0; j < expectedTokenSequences[i].length; j++) {
123d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        expected.append(tokenImage[expectedTokenSequences[i][j]]).append(" ");
124d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      }
125d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
126d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        expected.append("...");
127d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      }
128d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      expected.append(eol).append("    ");
129d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    }
130d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    String retval = "Encountered \"";
131d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    Token tok = currentToken.next;
132d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    for (int i = 0; i < maxSize; i++) {
133d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      if (i != 0) retval += " ";
134d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      if (tok.kind == 0) {
135d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        retval += tokenImage[0];
136d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        break;
137d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      }
138d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      retval += add_escapes(tok.image);
139d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      tok = tok.next;
140d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    }
141d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
142d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    retval += "." + eol;
143d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    if (expectedTokenSequences.length == 1) {
144d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      retval += "Was expecting:" + eol + "    ";
145d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    } else {
146d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      retval += "Was expecting one of:" + eol + "    ";
147d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    }
148d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    retval += expected.toString();
149d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    return retval;
150d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  }
151d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
152d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  /**
153d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * The end of line string for this machine.
154d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   */
155d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  protected String eol = System.getProperty("line.separator", "\n");
156d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
157d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  /**
158d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * Used to convert raw characters to their escaped version
159d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * when these raw version cannot be used as part of an ASCII
160d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   * string literal.
161d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   */
162d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen  protected String add_escapes(String str) {
163d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      StringBuffer retval = new StringBuffer();
164d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      char ch;
165d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      for (int i = 0; i < str.length(); i++) {
166d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        switch (str.charAt(i))
167d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        {
168d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           case 0 :
169d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              continue;
170d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           case '\b':
171d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              retval.append("\\b");
172d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              continue;
173d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           case '\t':
174d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              retval.append("\\t");
175d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              continue;
176d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           case '\n':
177d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              retval.append("\\n");
178d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              continue;
179d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           case '\f':
180d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              retval.append("\\f");
181d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              continue;
182d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           case '\r':
183d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              retval.append("\\r");
184d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              continue;
185d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           case '\"':
186d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              retval.append("\\\"");
187d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              continue;
188d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           case '\'':
189d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              retval.append("\\\'");
190d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              continue;
191d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           case '\\':
192d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              retval.append("\\\\");
193d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              continue;
194d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           default:
195d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
196d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                 String s = "0000" + Integer.toString(ch, 16);
197d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
198d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              } else {
199d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                 retval.append(ch);
200d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              }
201d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              continue;
202d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        }
203d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      }
204d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      return retval.toString();
205d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   }
206d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
207d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen}
208