1 /* 2 * $Header$ 3 * $Revision$ 4 * $Date$ 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$ 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 }