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 package org.jaxen.expr; 49 50 import org.jaxen.JaxenException; 51 52 /** 53 * An abstract factory used to create individual path component objects. 54 * 55 */ 56 public interface XPathFactory 57 { 58 59 /** 60 * Create a new <code>XPathExpr</code> from an <code>Expr</code>. 61 * 62 * @param rootExpr the expression wrapped by the resulting XPathExpr 63 * @return an XPathExpr wrapping the root expression 64 * @throws JaxenException if expression evaluation fails 65 */ 66 XPathExpr createXPath( Expr rootExpr ) throws JaxenException; 67 68 /** 69 * Create a new path expression. 70 * 71 * @param filterExpr the filter expression that starts the path expression 72 * @param locationPath the location path that follows the filter expression 73 * @return a path expression formed by concatenating the two arguments 74 * @throws JaxenException if expression evaluation fails 75 */ 76 PathExpr createPathExpr( FilterExpr filterExpr, 77 LocationPath locationPath ) throws JaxenException; 78 79 /** 80 * Create a new empty relative location path. 81 * 82 * @return an empty relative location path 83 * @throws JaxenException never 84 */ 85 LocationPath createRelativeLocationPath() throws JaxenException; 86 87 /** 88 * Create a new empty absolute location path. 89 * 90 * @return an empty absolute location path 91 * @throws JaxenException never 92 */ 93 LocationPath createAbsoluteLocationPath() throws JaxenException; 94 95 /** 96 * Returns a new XPath Or expression. 97 * 98 * @param lhs the left hand side of the expression 99 * @param rhs the right hand side of the expression 100 * @return <code><i>lhs</i> or <i>rhs</i></code> 101 * @throws JaxenException if expression evaluation fails 102 */ 103 BinaryExpr createOrExpr( Expr lhs, 104 Expr rhs ) throws JaxenException; 105 106 /** 107 * Returns a new XPath And expression. 108 * 109 * @param lhs the left hand side of the expression 110 * @param rhs the right hand side of the expression 111 * @return <code><i>lhs</i> and <i>rhs</i></code> 112 * @throws JaxenException if expression evaluation fails 113 */ 114 BinaryExpr createAndExpr( Expr lhs, 115 Expr rhs ) throws JaxenException; 116 117 /** 118 * Returns a new XPath equality expression. 119 * 120 * @param lhs the left hand side of the expression 121 * @param rhs the right hand side of the expression 122 * @param equalityOperator <code>Operator.EQUALS</code> or <code>Operator.NOT_EQUALS</code> 123 * @return <code><i>lhs</i> = <i>rhs</i></code> or <code><i>lhs</i> != <i>rhs</i></code> 124 * @throws JaxenException if the third argument is not 125 * <code>Operator.EQUALS</code> or <code>Operator.NOT_EQUALS</code> 126 */ 127 BinaryExpr createEqualityExpr( Expr lhs, 128 Expr rhs, 129 int equalityOperator ) throws JaxenException; 130 131 /** 132 * Returns a new XPath relational expression. 133 * 134 * @param lhs the left hand side of the expression 135 * @param rhs the right hand side of the expression 136 * @param relationalOperator <code>Operator.LESS_THAN</code>, <code>Operator.GREATER_THAN</code>, 137 * <code>Operator.LESS_THAN_EQUALS</code>, or <code>Operator.GREATER_THAN_EQUALS</code> 138 * @return <code><i>lhs</i> <i>relationalOperator</i> <i>rhs</i></code> or <code><i>lhs</i> != <i>rhs</i></code> 139 * @throws JaxenException if the third argument is not a relational operator constant 140 */ 141 BinaryExpr createRelationalExpr( Expr lhs, 142 Expr rhs, 143 int relationalOperator ) throws JaxenException; 144 145 /** 146 * Returns a new XPath additive expression. 147 * 148 * @param lhs the left hand side of the expression 149 * @param rhs the right hand side of the expression 150 * @param additiveOperator <code>Operator.ADD</code> or <code>Operator.SUBTRACT</code> 151 * @return <code><i>lhs</i> + <i>rhs</i></code> or <code><i>lhs</i> - <i>rhs</i></code> 152 * @throws JaxenException if the third argument is not 153 * <code>Operator.ADD</code> or <code>Operator.SUBTRACT</code> 154 */ 155 BinaryExpr createAdditiveExpr( Expr lhs, 156 Expr rhs, 157 int additiveOperator ) throws JaxenException; 158 159 /** 160 * Returns a new XPath multiplicative expression. 161 * 162 * @param lhs the left hand side of the expression 163 * @param rhs the right hand side of the expression 164 * @param multiplicativeOperator <code>Operator.MULTIPLY</code>, 165 * <code>Operator.DIV</code>, or <code>Operator.MOD</code> 166 * @return <code><i>lhs</i> * <i>rhs</i></code>, <code><i>lhs</i> div <i>rhs</i></code>, 167 * or <code><i>lhs</i> mod <i>rhs</i></code> 168 * @throws JaxenException if the third argument is not a multiplicative operator constant 169 */ 170 BinaryExpr createMultiplicativeExpr( Expr lhs, 171 Expr rhs, 172 int multiplicativeOperator ) throws JaxenException; 173 174 /** 175 * Returns a new XPath unary expression. 176 * 177 * @param expr the expression to be negated 178 * @param unaryOperator <code>Operator.NEGATIVE</code> 179 * @return <code>- <i>expr</i></code> or <code><i>expr</i></code> 180 * @throws JaxenException if expression evaluation fails 181 */ 182 Expr createUnaryExpr( Expr expr, 183 int unaryOperator ) throws JaxenException; 184 185 /** 186 * Returns a new XPath union expression. 187 * 188 * @param lhs the left hand side of the expression 189 * @param rhs the right hand side of the expression 190 * @return <code><i>lhs</i> | <i>rhs</i></code> 191 * @throws JaxenException if expression evaluation fails 192 */ 193 UnionExpr createUnionExpr( Expr lhs, 194 Expr rhs ) throws JaxenException; 195 196 /** 197 * Returns a new XPath filter expression. 198 * 199 * @param expr the basic expression to which the predicate will be added 200 * @return the expression with an empty predicate set 201 * @throws JaxenException if expression evaluation fails 202 */ 203 FilterExpr createFilterExpr( Expr expr ) throws JaxenException; 204 205 206 /** 207 * Create a new function call expression. 208 * 209 * @param prefix the namespace prefix of the function 210 * @param functionName the local name of the function 211 * @return a function with an empty argument list 212 * @throws JaxenException if expression evaluation fails 213 */ 214 FunctionCallExpr createFunctionCallExpr( String prefix, 215 String functionName ) throws JaxenException; 216 217 /** 218 * Create a number expression. 219 * 220 * @param number the value 221 * @return a number expression wrapping that value 222 * @throws JaxenException if expression evaluation fails 223 */ 224 NumberExpr createNumberExpr( int number ) throws JaxenException; 225 226 /** 227 * Create a number expression. 228 * 229 * @param number the value 230 * @return a number expression wrapping that value 231 * @throws JaxenException if expression evaluation fails 232 */ 233 NumberExpr createNumberExpr( double number ) throws JaxenException; 234 235 /** 236 * Create a string literal expression. 237 * 238 * @param literal the value 239 * @return a literal expression wrapping that value 240 * @throws JaxenException if expression evaluation fails 241 */ 242 LiteralExpr createLiteralExpr( String literal ) throws JaxenException; 243 244 /** 245 * Create a new variable reference expression. 246 * 247 * @param prefix the namespace prefix of the variable 248 * @param variableName the local name of the variable 249 * @return a variable expression 250 * @throws JaxenException if expression evaluation fails 251 */ 252 VariableReferenceExpr createVariableReferenceExpr( String prefix, 253 String variableName ) throws JaxenException; 254 255 /** 256 * Create a step with a named node-test. 257 * 258 * @param axis the axis to create the name-test on 259 * @param prefix the namespace prefix for the test 260 * @param localName the local name for the test 261 * @return a name step 262 * @throws JaxenException if <code>axis</code> is not one of the axis constants 263 */ 264 Step createNameStep( int axis, 265 String prefix, 266 String localName ) throws JaxenException; 267 268 /** 269 * Create a step with a node() node-test. 270 * 271 * @param axis the axis to create the node-test on 272 * @return an all node step 273 * @throws JaxenException if <code>axis</code> is not one of the axis constants 274 */ 275 Step createAllNodeStep( int axis ) throws JaxenException; 276 277 /** 278 * Create a step with a <code>comment()</code> node-test. 279 * 280 * @param axis the axis to create the <code>comment()</code> node-test on 281 * @return a comment node step 282 * @throws JaxenException if <code>axis</code> is not one of the axis constants 283 */ 284 Step createCommentNodeStep( int axis ) throws JaxenException; 285 286 /** 287 * Create a step with a <code>text()</code> node-test. 288 * 289 * @param axis the axis to create the <code>text()</code> node-test on 290 * @return a text node step 291 * @throws JaxenException if <code>axis</code> is not one of the axis constants 292 */ 293 Step createTextNodeStep( int axis ) throws JaxenException; 294 295 /** 296 * Create a step with a <code>processing-instruction()</code> node-test. 297 * 298 * @param axis the axis to create the <code>processing-instruction()</code> node-test on 299 * @param name the target to match, may be empty 300 * @return a processing instruction node step 301 * @throws JaxenException if <code>axis</code> is not one of the axis constants 302 */ 303 Step createProcessingInstructionNodeStep( int axis, 304 String name ) throws JaxenException; 305 306 /** 307 * Create from the supplied expression. 308 * 309 * @param predicateExpr the expression to evaluate in the predicate 310 * @return a predicate 311 * @throws JaxenException if expression evaluation fails 312 */ 313 Predicate createPredicate( Expr predicateExpr ) throws JaxenException; 314 315 /** 316 * Create an empty predicate set. 317 * 318 * @return an empty predicate set 319 * @throws JaxenException never 320 */ 321 PredicateSet createPredicateSet() throws JaxenException; 322 323 }