1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 package org.jaxen;
64
65 /*** Indicates an error during parsing of an XPath
66 * expression.
67 *
68 * @see XPath
69 *
70 * @author <a href="mailto:bob@werken.com">bob mcwhirter</a>
71 * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
72 */
73 public class XPathSyntaxException extends JaxenException
74 {
75 /*** The textual XPath expression */
76 private String xpath;
77
78 /*** The position of the error */
79 private int position;
80
81 /***
82 * Create a new XPathSyntaxException wrapping an existing
83 * <code>org.jaxen.saxpath.XPathSyntaxException</code>.
84 *
85 * @param e the exception that caused this exception
86 */
87 public XPathSyntaxException(org.jaxen.saxpath.XPathSyntaxException e)
88 {
89 super( e );
90
91 this.xpath = e.getXPath();
92 this.position = e.getPosition();
93 }
94
95 /*** Constructor
96 *
97 * @param xpath the erroneous XPath expression
98 * @param position the position of the error
99 * @param message the error message
100 */
101 public XPathSyntaxException(String xpath,
102 int position,
103 String message)
104 {
105 super( message );
106
107 this.xpath = xpath;
108 this.position = position;
109 }
110
111 /*** Retrieve the position of the error.
112 *
113 * @return the position of the error
114 */
115 public int getPosition()
116 {
117 return this.position;
118 }
119
120 /*** Retrieve the expression containing the error.
121 *
122 * @return the erroneous expression
123 */
124 public String getXPath()
125 {
126 return this.xpath;
127 }
128
129 /*** Retrieve a string useful for denoting where
130 * the error occurred.
131 *
132 * <p>
133 * This is a string composed of whitespace and
134 * a marker at the position (see {@link #getPosition})
135 * of the error. This is useful for creating
136 * friendly multi-line error displays.
137 * </p>
138 *
139 * @return the error position marker
140 */
141 public String getPositionMarker()
142 {
143 StringBuffer buf = new StringBuffer();
144
145 int pos = getPosition();
146
147 for ( int i = 0 ; i < pos ; ++i )
148 {
149 buf.append(" ");
150 }
151
152 buf.append("^");
153
154 return buf.toString();
155
156 }
157
158 /*** Retrieve the friendly multi-line error message.
159 *
160 * <p>
161 * This returns a multi-line string that contains
162 * the original erroneous XPath expression with a
163 * marker underneath indicating exactly where the
164 * error occurred.
165 * </p>
166 *
167 * @return the multi-line error message
168 */
169 public String getMultilineMessage()
170 {
171 StringBuffer buf = new StringBuffer(getMessage());
172 buf.append( "\n" );
173 buf.append( getXPath() );
174 buf.append( "\n" );
175
176 buf.append( getPositionMarker() );
177
178 return buf.toString();
179 }
180 }