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 private static final long serialVersionUID = 3567675610742422397L; 61 private String xpath; 62 private int position; 63 private final static String lineSeparator = System.getProperty("line.separator"); 64 65 /** 66 * Creates a new XPathSyntaxException. 67 * 68 * @param xpath the incorrect XPath expression 69 * @param position the index of the character at which the syntax error was detected 70 * @param message the detail message 71 */ 72 public XPathSyntaxException(String xpath, 73 int position, 74 String message) 75 { 76 super( message ); 77 this.position = position; 78 this.xpath = xpath; 79 } 80 81 /** 82 * <p> 83 * Returns the index of the character at which the syntax error was detected 84 * in the XPath expression. 85 * </p> 86 * 87 * @return the character index in the XPath expression 88 * at which the syntax error was detected 89 */ 90 public int getPosition() 91 { 92 return this.position; 93 } 94 95 /** 96 * <p> 97 * Returns the syntactically incorrect XPath expression. 98 * </p> 99 * 100 * @return the syntactically incorrect XPath expression 101 */ 102 public String getXPath() 103 { 104 return this.xpath; 105 } 106 107 public String toString() 108 { 109 return getClass() + ": " + getXPath() + ": " + getPosition() + ": " + getMessage(); 110 } 111 112 /** 113 * <p> 114 * Returns a string in the form <code>" ^"</code> which, when placed on the line 115 * below the XPath expression in a monospaced font, should point to the 116 * location of the error. 117 * </p> 118 * 119 * @return the position marker 120 */ 121 private String getPositionMarker() 122 { 123 int pos = getPosition(); 124 StringBuffer buf = new StringBuffer(pos+1); 125 for ( int i = 0 ; i < pos ; ++i ) 126 { 127 buf.append(" "); 128 } 129 130 buf.append("^"); 131 132 return buf.toString(); 133 134 } 135 136 /** 137 * <p> 138 * Returns a long formatted description of the error, 139 * including line breaks. 140 * </p> 141 * 142 * @return a longer description of the error on multiple lines 143 */ 144 public String getMultilineMessage() 145 { 146 StringBuffer buf = new StringBuffer(); 147 148 buf.append( getMessage() ); 149 buf.append( lineSeparator ); 150 buf.append( getXPath() ); 151 buf.append( lineSeparator ); 152 153 buf.append( getPositionMarker() ); 154 155 return buf.toString(); 156 } 157 158 }