1d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen/* Generated By:JavaCC: Do not edit this line. TokenMgrError.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.address.parser;
18d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
19d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chenpublic class TokenMgrError extends Error
20d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen{
21d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   /*
22d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    * Ordinals for various reasons why an Error of this type can be thrown.
23d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    */
24d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
25d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   /**
26d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    * Lexical error occured.
27d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    */
28d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   static final int LEXICAL_ERROR = 0;
29d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
30d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   /**
31d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    * An attempt wass made to create a second instance of a static token manager.
32d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    */
33d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   static final int STATIC_LEXER_ERROR = 1;
34d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
35d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   /**
36d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    * Tried to change to an invalid lexical state.
37d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    */
38d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   static final int INVALID_LEXICAL_STATE = 2;
39d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
40d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   /**
41d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    * Detected (and bailed out of) an infinite loop in the token manager.
42d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    */
43d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   static final int LOOP_DETECTED = 3;
44d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
45d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   /**
46d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    * Indicates the reason why the exception is thrown. It will have
47d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    * one of the above 4 values.
48d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    */
49d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   int errorCode;
50d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
51d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   /**
52d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    * Replaces unprintable characters by their espaced (or unicode escaped)
53d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    * equivalents in the given string
54d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    */
55d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   protected static final String addEscapes(String str) {
56d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      StringBuffer retval = new StringBuffer();
57d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      char ch;
58d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      for (int i = 0; i < str.length(); i++) {
59d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        switch (str.charAt(i))
60d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        {
61d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           case 0 :
62d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              continue;
63d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           case '\b':
64d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              retval.append("\\b");
65d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              continue;
66d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           case '\t':
67d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              retval.append("\\t");
68d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              continue;
69d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           case '\n':
70d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              retval.append("\\n");
71d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              continue;
72d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           case '\f':
73d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              retval.append("\\f");
74d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              continue;
75d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           case '\r':
76d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              retval.append("\\r");
77d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              continue;
78d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           case '\"':
79d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              retval.append("\\\"");
80d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              continue;
81d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           case '\'':
82d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              retval.append("\\\'");
83d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              continue;
84d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           case '\\':
85d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              retval.append("\\\\");
86d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              continue;
87d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           default:
88d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
89d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                 String s = "0000" + Integer.toString(ch, 16);
90d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
91d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              } else {
92d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                 retval.append(ch);
93d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              }
94d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen              continue;
95d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        }
96d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      }
97d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      return retval.toString();
98d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   }
99d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
100d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   /**
101d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    * Returns a detailed message for the Error when it is thrown by the
102d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    * token manager to indicate a lexical error.
103d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    * Parameters :
104d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    *    EOFSeen     : indicates if EOF caused the lexicl error
105d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    *    curLexState : lexical state in which this error occured
106d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    *    errorLine   : line number when the error occured
107d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    *    errorColumn : column number when the error occured
108d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    *    errorAfter  : prefix that was seen before this error occured
109d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    *    curchar     : the offending character
110d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    * Note: You can customize the lexical error message by modifying this method.
111d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    */
112d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
113d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      return("Lexical error at line " +
114d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           errorLine + ", column " +
115d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           errorColumn + ".  Encountered: " +
116d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
117d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen           "after : \"" + addEscapes(errorAfter) + "\"");
118d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   }
119d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
120d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   /**
121d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    * You can also modify the body of this method to customize your error messages.
122d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
123d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    * of end-users concern, so you can return something like :
124d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    *
125d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    *     "Internal Error : Please file a bug report .... "
126d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    *
127d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    * from this method for such cases in the release version of your parser.
128d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    */
129d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   public String getMessage() {
130d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      return super.getMessage();
131d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   }
132d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
133d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   /*
134d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    * Constructors of various flavors follow.
135d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    */
136d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
137d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   public TokenMgrError() {
138d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   }
139d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
140d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   public TokenMgrError(String message, int reason) {
141d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      super(message);
142d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      errorCode = reason;
143d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   }
144d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
145d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
146d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen      this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
147d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen   }
148d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen}
149