001: /* Generated By:JavaCC: Do not edit this line. ParseException.java Version 2.1 */
002: /*
003: * $Id : $
004: * $Source : $
005: * $Log: ParseException.java,v $
006: * Revision 1.3 2005/11/30 11:27:25 ss150821
007: * 6356996 - Srap Code base needs to save files in the unix file format and not windows
008: *
009: * Revision 1.2 2005/02/23 09:03:11 ss150821
010: * RFE 6223490 - SRA Should use JDK based logging
011: *
012: * Revision 1.1 2003/04/15 05:22:10 mm132998
013: * WebDAV support
014: *
015: *
016: */
017: package com.sun.portal.rproxy.connectionhandler.webdav;
018:
019: /**
020: * This exception is thrown when parse errors are encountered. You can
021: * explicitly create objects of this exception type by calling the method
022: * generateParseException in the generated parser.
023: *
024: * You can modify this class to customize your error reporting mechanisms so
025: * long as you retain the public fields.
026: */
027: public class ParseException extends Exception {
028:
029: /**
030: * This constructor is used by the method "generateParseException" in the
031: * generated parser. Calling this constructor generates a new object of this
032: * type with the fields "currentToken", "expectedTokenSequences", and
033: * "tokenImage" set. The boolean flag "specialConstructor" is also set to
034: * true to indicate that this constructor was used to create this object.
035: * This constructor calls its super class with the empty string to force the
036: * "toString" method of parent class "Throwable" to print the error message
037: * in the form: ParseException: <result of getMessage>
038: */
039: public ParseException(Token currentTokenVal,
040: int[][] expectedTokenSequencesVal, String[] tokenImageVal) {
041: super ("");
042: specialConstructor = true;
043: currentToken = currentTokenVal;
044: expectedTokenSequences = expectedTokenSequencesVal;
045: tokenImage = tokenImageVal;
046: }
047:
048: /**
049: * The following constructors are for use by you for whatever purpose you
050: * can think of. Constructing the exception in this manner makes the
051: * exception behave in the normal way - i.e., as documented in the class
052: * "Throwable". The fields "errorToken", "expectedTokenSequences", and
053: * "tokenImage" do not contain relevant information. The JavaCC generated
054: * code does not use these constructors.
055: */
056:
057: public ParseException() {
058: super ();
059: specialConstructor = false;
060: }
061:
062: public ParseException(String message) {
063: super (message);
064: specialConstructor = false;
065: }
066:
067: /**
068: * This variable determines which constructor was used to create this object
069: * and thereby affects the semantics of the "getMessage" method (see below).
070: */
071: protected boolean specialConstructor;
072:
073: /**
074: * This is the last token that has been consumed successfully. If this
075: * object has been created due to a parse error, the token followng this
076: * token will (therefore) be the first error token.
077: */
078: public Token currentToken;
079:
080: /**
081: * Each entry in this array is an array of integers. Each array of integers
082: * represents a sequence of tokens (by their ordinal values) that is
083: * expected at this point of the parse.
084: */
085: public int[][] expectedTokenSequences;
086:
087: /**
088: * This is a reference to the "tokenImage" array of the generated parser
089: * within which the parse error occurred. This array is defined in the
090: * generated ...Constants interface.
091: */
092: public String[] tokenImage;
093:
094: /**
095: * This method has the standard behavior when this object has been created
096: * using the standard constructors. Otherwise, it uses "currentToken" and
097: * "expectedTokenSequences" to generate a parse error message and returns
098: * it. If this object has been created due to a parse error, and you do not
099: * catch it (it gets thrown from the parser), then this method is called
100: * during the printing of the final stack trace, and hence the correct error
101: * message gets displayed.
102: */
103: public String getMessage() {
104: if (!specialConstructor) {
105: return super .getMessage();
106: }
107: String expected = "";
108: int maxSize = 0;
109: for (int i = 0; i < expectedTokenSequences.length; i++) {
110: if (maxSize < expectedTokenSequences[i].length) {
111: maxSize = expectedTokenSequences[i].length;
112: }
113: for (int j = 0; j < expectedTokenSequences[i].length; j++) {
114: expected += tokenImage[expectedTokenSequences[i][j]]
115: + " ";
116: }
117: if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
118: expected += "...";
119: }
120: expected += eol + " ";
121: }
122: String retval = "Encountered \"";
123: Token tok = currentToken.next;
124: for (int i = 0; i < maxSize; i++) {
125: if (i != 0)
126: retval += " ";
127: if (tok.kind == 0) {
128: retval += tokenImage[0];
129: break;
130: }
131: retval += add_escapes(tok.image);
132: tok = tok.next;
133: }
134: retval += "\" at line " + currentToken.next.beginLine
135: + ", column " + currentToken.next.beginColumn;
136: retval += "." + eol;
137: if (expectedTokenSequences.length == 1) {
138: retval += "Was expecting:" + eol + " ";
139: } else {
140: retval += "Was expecting one of:" + eol + " ";
141: }
142: retval += expected;
143: return retval;
144: }
145:
146: /**
147: * The end of line string for this machine.
148: */
149: protected String eol = System.getProperty("line.separator", "\n");
150:
151: /**
152: * Used to convert raw characters to their escaped version when these raw
153: * version cannot be used as part of an ASCII string literal.
154: */
155: protected String add_escapes(String str) {
156: StringBuffer retval = new StringBuffer();
157: char ch;
158: for (int i = 0; i < str.length(); i++) {
159: switch (str.charAt(i)) {
160: case 0:
161: continue;
162: case '\b':
163: retval.append("\\b");
164: continue;
165: case '\t':
166: retval.append("\\t");
167: continue;
168: case '\n':
169: retval.append("\\n");
170: continue;
171: case '\f':
172: retval.append("\\f");
173: continue;
174: case '\r':
175: retval.append("\\r");
176: continue;
177: case '\"':
178: retval.append("\\\"");
179: continue;
180: case '\'':
181: retval.append("\\\'");
182: continue;
183: case '\\':
184: retval.append("\\\\");
185: continue;
186: default:
187: if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
188: String s = "0000" + Integer.toString(ch, 16);
189: retval.append("\\u"
190: + s.substring(s.length() - 4, s.length()));
191: } else {
192: retval.append(ch);
193: }
194: continue;
195: }
196: }
197: return retval.toString();
198: }
199:
200: }
|