001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.commons.jexl2.parser;
018
019 /**
020 * Token Manager Error.
021 */
022 public class TokenMgrError extends Error {
023 /**
024 * The version identifier for this Serializable class.
025 * Increment only if the <i>serialized</i> form of the
026 * class changes.
027 */
028 private static final long serialVersionUID = 1L;
029
030 /*
031 * Ordinals for various reasons why an Error of this type can be thrown.
032 */
033 /**
034 * Lexical error occurred.
035 */
036 public static final int LEXICAL_ERROR = 0;
037 /**
038 * An attempt was made to create a second instance of a static token manager.
039 */
040 public static final int STATIC_LEXER_ERROR = 1;
041 /**
042 * Tried to change to an invalid lexical state.
043 */
044 public static final int INVALID_LEXICAL_STATE = 2;
045 /**
046 * Detected (and bailed out of) an infinite loop in the token manager.
047 */
048 public static final int LOOP_DETECTED = 3;
049 /**
050 * Indicates the reason why the exception is thrown. It will have
051 * one of the above 4 values.
052 */
053 private int errorCode;
054 /**
055 * The lexer state.
056 */
057 @SuppressWarnings("unused") // not read currently
058 private int state;
059 /**
060 * The current character.
061 */
062 private char current;
063 /**
064 * Last correct input before error occurs.
065 */
066 private String after;
067 /**
068 *
069 */
070 private boolean eof;
071 /**
072 * Error line.
073 */
074 private int line;
075 /**
076 * Error column.
077 */
078 private int column;
079
080 /**
081 * Gets the reason why the exception is thrown.
082 * @return one of the 4 lexical error codes
083 */
084 public int getErrorCode() {
085 return errorCode;
086 }
087
088 /**
089 * Gets the line number.
090 * @return line number.
091 */
092 public int getLine() {
093 return line;
094 }
095
096 /**
097 * Gets the column number.
098 * @return the column.
099 */
100 public int getColumn() {
101 return column;
102 }
103
104 /**
105 * Gets the last correct input.
106 * @return the string after which the error occured
107 */
108 public String getAfter() {
109 return after;
110 }
111
112
113 /**
114 * Returns a detailed message for the Error when it is thrown by the
115 * token manager to indicate a lexical error.
116 * @return the message
117 */
118 @Override
119 public String getMessage() {
120 return ("Lexical error at line "
121 + line + ", column "
122 + column + ". Encountered: "
123 + (eof ? "<EOF> "
124 : (StringParser.escapeString(String.valueOf(current), '"')) + " (" + (int) current + "), ")
125 + "after : " + StringParser.escapeString(after, '"'));
126 }
127
128
129 /** Constructor with message and reason. */
130 public TokenMgrError(String message, int reason) {
131 super(message);
132 errorCode = reason;
133 }
134
135 /** Full Constructor. */
136 public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
137 eof = EOFSeen;
138 state = lexState;
139 line = errorLine;
140 column = errorColumn;
141 after = errorAfter;
142 current = curChar;
143 errorCode = reason;
144 }
145 }