View Javadoc

1   /*
2    * $Header: /home/projects/jaxen/scm/jaxen/src/java/main/org/jaxen/saxpath/XPathSyntaxException.java,v 1.10 2006/06/03 20:29:30 elharo Exp $
3    * $Revision: 1.10 $
4    * $Date: 2006/06/03 20:29:30 $
5    *
6    * ====================================================================
7    *
8    * Copyright 2000-2002 bob mcwhirter & James Strachan.
9    * All rights reserved.
10   *
11   *
12   * Redistribution and use in source and binary forms, with or without
13   * modification, are permitted provided that the following conditions are
14   * met:
15   * 
16   *   * Redistributions of source code must retain the above copyright
17   *     notice, this list of conditions and the following disclaimer.
18   * 
19   *   * Redistributions in binary form must reproduce the above copyright
20   *     notice, this list of conditions and the following disclaimer in the
21   *     documentation and/or other materials provided with the distribution.
22   * 
23   *   * Neither the name of the Jaxen Project nor the names of its
24   *     contributors may be used to endorse or promote products derived 
25   *     from this software without specific prior written permission.
26   * 
27   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
28   * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
29   * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
30   * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
31   * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
32   * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
33   * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
34   * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
35   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
36   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
37   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38   *
39   * ====================================================================
40   * This software consists of voluntary contributions made by many
41   * individuals on behalf of the Jaxen Project and was originally
42   * created by bob mcwhirter <bob@werken.com> and
43   * James Strachan <jstrachan@apache.org>.  For more information on the
44   * Jaxen Project, please see <http://www.jaxen.org/>.
45   *
46   * $Id: XPathSyntaxException.java,v 1.10 2006/06/03 20:29:30 elharo Exp $
47   */
48  
49  package org.jaxen.saxpath;
50  
51  
52  /***
53   * Represents a syntax error in an XPath expression.
54   * This is a compile-time error that is detectable irrespective of 
55   * the context in which the XPath expression is evaluated.
56   */
57  public class XPathSyntaxException extends SAXPathException
58  {
59      /***
60       * 
61       */
62      private static final long serialVersionUID = 3567675610742422397L;
63      private String xpath;
64      private int    position;
65      private final static String lineSeparator = System.getProperty("line.separator");
66  
67      /***
68       * Creates a new XPathSyntaxException.
69       * 
70       * @param xpath the incorrect XPath expression 
71       * @param position the index of the character at which the syntax error was detected
72       * @param message the detail message
73       */
74      public XPathSyntaxException(String xpath,
75                                  int position,
76                                  String message)
77      {
78          super( message );
79          this.position = position;
80          this.xpath    = xpath;
81      }
82  
83      /***
84       * <p>
85       * Returns the index of the character at which the syntax error was detected
86       * in the XPath expression.
87       * </p>
88       * 
89       * @return the character index in the XPath expression  
90       *     at which the syntax error was detected
91       */
92      public int getPosition()
93      {
94          return this.position;
95      }
96  
97      /***
98       * <p>
99       * Returns the syntactically incorrect XPath expression.
100      * </p>
101      * 
102      * @return the syntactically incorrect XPath expression
103      */
104     public String getXPath()
105     {
106         return this.xpath;
107     }
108 
109     public String toString()
110     {
111         return getClass() + ": " + getXPath() + ": " + getPosition() + ": " + getMessage();
112     }
113 
114     /***
115      * <p>
116      * Returns a string in the form <code>"   ^"</code> which, when placed on the line
117      * below the XPath expression in a monospaced font, should point to the
118      * location of the error.
119      * </p>
120      * 
121      * @return the position marker 
122      */
123     private String getPositionMarker()
124     {
125         int pos = getPosition();
126         StringBuffer buf = new StringBuffer(pos+1);
127         for ( int i = 0 ; i < pos ; ++i )
128         {
129             buf.append(" ");
130         }
131 
132         buf.append("^");
133 
134         return buf.toString();
135         
136     }
137 
138     /***
139      * <p>
140      * Returns a long formatted description of the error,
141      * including line breaks.
142      * </p>
143      * 
144      * @return a longer description of the error on multiple lines
145      */
146     public String getMultilineMessage()
147     {
148         StringBuffer buf = new StringBuffer();
149 
150         buf.append( getMessage() );
151         buf.append( lineSeparator );
152         buf.append( getXPath() );
153         buf.append( lineSeparator );
154 
155         buf.append( getPositionMarker() );
156 
157         return buf.toString();
158     }
159 
160 }