00001
00002 package org.objectweb.jonas_ejb.deployment.ejbql;
00003
00016 public class ParseException extends Exception {
00017
00030 public ParseException(Token currentTokenVal,
00031 int[][] expectedTokenSequencesVal,
00032 String[] tokenImageVal
00033 )
00034 {
00035 super("");
00036 specialConstructor = true;
00037 currentToken = currentTokenVal;
00038 expectedTokenSequences = expectedTokenSequencesVal;
00039 tokenImage = tokenImageVal;
00040 }
00041
00052 public ParseException() {
00053 super();
00054 specialConstructor = false;
00055 }
00056
00057 public ParseException(String message) {
00058 super(message);
00059 specialConstructor = false;
00060 }
00061
00067 protected boolean specialConstructor;
00068
00074 public Token currentToken;
00075
00081 public int[][] expectedTokenSequences;
00082
00088 public String[] tokenImage;
00089
00100 public String getMessage(String query) {
00101 if (!specialConstructor) {
00102 return super.getMessage();
00103 }
00104 String expected = "";
00105 int maxSize = 0;
00106 for (int i = 0; i < expectedTokenSequences.length; i++) {
00107 if (maxSize < expectedTokenSequences[i].length) {
00108 maxSize = expectedTokenSequences[i].length;
00109 }
00110 for (int j = 0; j < expectedTokenSequences[i].length; j++) {
00111 expected += tokenImage[expectedTokenSequences[i][j]] + " ";
00112 }
00113 if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
00114 expected += "...";
00115 }
00116 expected += eol + " ";
00117 }
00118 String retval = "Encountered \"";
00119 Token tok = currentToken.next;
00120 for (int i = 0; i < maxSize; i++) {
00121 if (i != 0) retval += " ";
00122 if (tok.kind == 0) {
00123 retval += tokenImage[0];
00124 break;
00125 }
00126 retval += add_escapes(tok.image);
00127 tok = tok.next;
00128 }
00129
00130
00131 if ((query==null) || ("".equals(query))) {
00132 retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
00133 } else {
00134
00135 retval += "\" after \""+query.substring(0,currentToken.next.beginColumn-1)+"\""+ eol;
00136 retval += "in \""+query+"\"";
00137 }
00138
00139 retval += "." + eol;
00140 if (expectedTokenSequences.length == 1) {
00141 retval += "Was expecting:" + eol + " ";
00142 } else {
00143 retval += "Was expecting one of:" + eol + " ";
00144 }
00145 retval += expected;
00146 return retval;
00147 }
00148
00152 protected String eol = System.getProperty("line.separator", "\n");
00153
00159 protected String add_escapes(String str) {
00160 StringBuffer retval = new StringBuffer();
00161 char ch;
00162 for (int i = 0; i < str.length(); i++) {
00163 switch (str.charAt(i))
00164 {
00165 case 0 :
00166 continue;
00167 case '\b':
00168 retval.append("\\b");
00169 continue;
00170 case '\t':
00171 retval.append("\\t");
00172 continue;
00173 case '\n':
00174 retval.append("\\n");
00175 continue;
00176 case '\f':
00177 retval.append("\\f");
00178 continue;
00179 case '\r':
00180 retval.append("\\r");
00181 continue;
00182 case '\"':
00183 retval.append("\\\"");
00184 continue;
00185 case '\'':
00186 retval.append("\\\'");
00187 continue;
00188 case '\\':
00189 retval.append("\\\\");
00190 continue;
00191 default:
00192 if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
00193 String s = "0000" + Integer.toString(ch, 16);
00194 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
00195 } else {
00196 retval.append(ch);
00197 }
00198 continue;
00199 }
00200 }
00201 return retval.toString();
00202 }
00203
00204 }