1 /* 2 * $Header$ 3 * $Revision$ 4 * $Date$ 5 * 6 * ==================================================================== 7 * 8 * Copyright 2000-2002 bob mcwhirter & James Strachan. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions are 13 * met: 14 * 15 * * Redistributions of source code must retain the above copyright 16 * notice, this list of conditions and the following disclaimer. 17 * 18 * * Redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution. 21 * 22 * * Neither the name of the Jaxen Project nor the names of its 23 * contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 27 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 29 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 30 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 31 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 32 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 33 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 34 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 35 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 36 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 37 * 38 * ==================================================================== 39 * This software consists of voluntary contributions made by many 40 * individuals on behalf of the Jaxen Project and was originally 41 * created by bob mcwhirter <bob@werken.com> and 42 * James Strachan <jstrachan@apache.org>. For more information on the 43 * Jaxen Project, please see <http://www.jaxen.org/>. 44 * 45 * $Id$ 46 */ 47 48 49 package org.jaxen.function; 50 51 import java.util.List; 52 53 import org.jaxen.Context; 54 import org.jaxen.Function; 55 import org.jaxen.FunctionCallException; 56 import org.jaxen.Navigator; 57 58 /** 59 * <p><b>4.2</b> <code><i>string</i> substring-before(<i>string</i>,<i>string</i>)</code></p> 60 * 61 * 62 * <blockquote cite="http://www.w3.org/TR/xpath#function-substring-before"> 63 * The substring-before function returns the substring of the first argument 64 * string that precedes the first occurrence of the second argument string 65 * in the first argument string, or the empty string if the 66 * first argument string does not contain the second argument string. 67 * For example, substring-before("1999/04/01","/") returns 1999. 68 * </blockquote> 69 * 70 * @author bob mcwhirter (bob @ werken.com) 71 * 72 * @see <a href="https://www.w3.org/TR/xpath#function-substring-before" target="_top">Section 4.2 of the XPath Specification</a> 73 */ 74 public class SubstringBeforeFunction implements Function 75 { 76 77 78 /** 79 * Create a new <code>SubstringBeforeFunction</code> object. 80 */ 81 public SubstringBeforeFunction() {} 82 83 84 /** 85 * Returns the part of the string-value of the first item in <code>args</code> 86 * that comes before the string-value of the second item in <code>args</code>; 87 * or the empty string if the second string is not a substring of the first string. 88 * 89 * @param context the context at the point in the 90 * expression when the function is called 91 * @param args a list that contains two items 92 * 93 * @return a <code>String</code> containing that 94 * part of the string-value of the first item in <code>args</code> 95 * that comes before the string-value of the second item in <code>args</code> 96 * 97 * @throws FunctionCallException if <code>args</code> does not have length two 98 */ 99 public Object call(Context context, 100 List args) throws FunctionCallException 101 { 102 if (args.size() == 2) 103 { 104 return evaluate( args.get(0), 105 args.get(1), 106 context.getNavigator() ); 107 } 108 109 throw new FunctionCallException( "substring-before() requires two arguments." ); 110 } 111 112 /** 113 * Returns the part of <code>strArg</code> that precedes the first occurence 114 * of <code>matchArg</code>; or the empty string if the 115 * <code>strArg</code> does not contain <code>matchArg</code> 116 * 117 * @param strArg the string from which the substring is extracted 118 * @param matchArg the string that marks the boundary of the substring 119 * @param nav the <code>Navigator</code> used to calculate the string-values of 120 * the first two arguments 121 * 122 * @return a <code>String</code> containing the part of <code>strArg</code> that precedes the first occurence 123 * of <code>matchArg</code> 124 * 125 */ 126 public static String evaluate(Object strArg, 127 Object matchArg, 128 Navigator nav) 129 { 130 String str = StringFunction.evaluate( strArg, 131 nav ); 132 133 String match = StringFunction.evaluate( matchArg, 134 nav ); 135 136 int loc = str.indexOf(match); 137 138 if ( loc < 0 ) 139 { 140 return ""; 141 } 142 143 return str.substring(0, loc); 144 145 } 146 }