| Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
| XPathFunctionContext |
|
| 1.1666666666666667;1.167 |
| 1 | /* | |
| 2 | * $Header: /home/projects/jaxen/scm/jaxen/src/java/main/org/jaxen/XPathFunctionContext.java,v 1.29 2006/11/08 13:59:38 elharo Exp $ | |
| 3 | * $Revision: 1.29 $ | |
| 4 | * $Date: 2006/11/08 13:59:38 $ | |
| 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: XPathFunctionContext.java,v 1.29 2006/11/08 13:59:38 elharo Exp $ | |
| 46 | */ | |
| 47 | ||
| 48 | ||
| 49 | package org.jaxen; | |
| 50 | ||
| 51 | import org.jaxen.function.BooleanFunction; | |
| 52 | import org.jaxen.function.CeilingFunction; | |
| 53 | import org.jaxen.function.ConcatFunction; | |
| 54 | import org.jaxen.function.ContainsFunction; | |
| 55 | import org.jaxen.function.CountFunction; | |
| 56 | import org.jaxen.function.FalseFunction; | |
| 57 | import org.jaxen.function.FloorFunction; | |
| 58 | import org.jaxen.function.IdFunction; | |
| 59 | import org.jaxen.function.LangFunction; | |
| 60 | import org.jaxen.function.LastFunction; | |
| 61 | import org.jaxen.function.LocalNameFunction; | |
| 62 | import org.jaxen.function.NameFunction; | |
| 63 | import org.jaxen.function.NamespaceUriFunction; | |
| 64 | import org.jaxen.function.NormalizeSpaceFunction; | |
| 65 | import org.jaxen.function.NotFunction; | |
| 66 | import org.jaxen.function.NumberFunction; | |
| 67 | import org.jaxen.function.PositionFunction; | |
| 68 | import org.jaxen.function.RoundFunction; | |
| 69 | import org.jaxen.function.StartsWithFunction; | |
| 70 | import org.jaxen.function.StringFunction; | |
| 71 | import org.jaxen.function.StringLengthFunction; | |
| 72 | import org.jaxen.function.SubstringAfterFunction; | |
| 73 | import org.jaxen.function.SubstringBeforeFunction; | |
| 74 | import org.jaxen.function.SubstringFunction; | |
| 75 | import org.jaxen.function.SumFunction; | |
| 76 | import org.jaxen.function.TranslateFunction; | |
| 77 | import org.jaxen.function.TrueFunction; | |
| 78 | import org.jaxen.function.ext.EndsWithFunction; | |
| 79 | import org.jaxen.function.ext.EvaluateFunction; | |
| 80 | import org.jaxen.function.ext.LowerFunction; | |
| 81 | import org.jaxen.function.ext.UpperFunction; | |
| 82 | import org.jaxen.function.xslt.DocumentFunction; | |
| 83 | ||
| 84 | /** A <code>FunctionContext</code> implementing the core XPath | |
| 85 | * function library, plus Jaxen extensions. | |
| 86 | * | |
| 87 | * <p> | |
| 88 | * The core XPath function library is provided through this | |
| 89 | * implementation of <code>FunctionContext</code>. Additionally, | |
| 90 | * extension functions have been provided, as enumerated below. | |
| 91 | * </p> | |
| 92 | * | |
| 93 | * <p> | |
| 94 | * This class is re-entrant and thread-safe. If using the | |
| 95 | * default instance, it is inadvisable to call | |
| 96 | * {@link #registerFunction(String, String, Function)} | |
| 97 | * as that will extend the global function context, affecting other | |
| 98 | * users. | |
| 99 | * </p> | |
| 100 | * | |
| 101 | * <p> | |
| 102 | * Extension functions: | |
| 103 | * </p> | |
| 104 | * | |
| 105 | * <ul> | |
| 106 | * <li>evaluate(..)</li> | |
| 107 | * <li>upper-case(..)</li> | |
| 108 | * <li>lower-case(..)</li> | |
| 109 | * <li>ends-with(..)</li> | |
| 110 | * </ul> | |
| 111 | * | |
| 112 | * @see FunctionContext | |
| 113 | * @see org.jaxen.function | |
| 114 | * @see org.jaxen.function.xslt | |
| 115 | * @see org.jaxen.function.ext | |
| 116 | * | |
| 117 | * @author <a href="mailto:bob@werken.com">bob mcwhirter</a> | |
| 118 | */ | |
| 119 | public class XPathFunctionContext extends SimpleFunctionContext | |
| 120 | { | |
| 121 | 104 | private static XPathFunctionContext instance = new XPathFunctionContext(); |
| 122 | ||
| 123 | /** Retrieve the default function context | |
| 124 | * | |
| 125 | * @return the default function context | |
| 126 | */ | |
| 127 | public static FunctionContext getInstance() | |
| 128 | { | |
| 129 | 1702 | return instance; |
| 130 | } | |
| 131 | ||
| 132 | /** Create a new XPath function context. | |
| 133 | * All core XPath and Jaxen extension functions are registered. | |
| 134 | */ | |
| 135 | public XPathFunctionContext() | |
| 136 | { | |
| 137 | 104 | this(true); |
| 138 | 104 | } |
| 139 | ||
| 140 | /** Create a new XPath function context. | |
| 141 | * All core XPath functions are registered. | |
| 142 | * | |
| 143 | * @param includeExtensionFunctions if true extension functions are included; | |
| 144 | * if false, they aren't | |
| 145 | */ | |
| 146 | public XPathFunctionContext(boolean includeExtensionFunctions) | |
| 147 | 106 | { |
| 148 | 106 | registerXPathFunctions(); |
| 149 | 106 | if (includeExtensionFunctions) { |
| 150 | 104 | registerXSLTFunctions(); |
| 151 | 104 | registerExtensionFunctions(); |
| 152 | } | |
| 153 | 106 | } |
| 154 | ||
| 155 | private void registerXPathFunctions() { | |
| 156 | ||
| 157 | 106 | registerFunction( null, // namespace URI |
| 158 | "boolean", | |
| 159 | new BooleanFunction() ); | |
| 160 | ||
| 161 | 106 | registerFunction( null, // namespace URI |
| 162 | "ceiling", | |
| 163 | new CeilingFunction() ); | |
| 164 | ||
| 165 | 106 | registerFunction( null, // namespace URI |
| 166 | "concat", | |
| 167 | new ConcatFunction() ); | |
| 168 | ||
| 169 | 106 | registerFunction( null, // namespace URI |
| 170 | "contains", | |
| 171 | new ContainsFunction() ); | |
| 172 | ||
| 173 | 106 | registerFunction( null, // namespace URI |
| 174 | "count", | |
| 175 | new CountFunction() ); | |
| 176 | ||
| 177 | 106 | registerFunction( null, // namespace URI |
| 178 | "false", | |
| 179 | new FalseFunction() ); | |
| 180 | ||
| 181 | 106 | registerFunction( null, // namespace URI |
| 182 | "floor", | |
| 183 | new FloorFunction() ); | |
| 184 | ||
| 185 | 106 | registerFunction( null, // namespace URI |
| 186 | "id", | |
| 187 | new IdFunction() ); | |
| 188 | ||
| 189 | 106 | registerFunction( null, // namespace URI |
| 190 | "lang", | |
| 191 | new LangFunction() ); | |
| 192 | ||
| 193 | 106 | registerFunction( null, // namespace URI |
| 194 | "last", | |
| 195 | new LastFunction() ); | |
| 196 | ||
| 197 | 106 | registerFunction( null, // namespace URI |
| 198 | "local-name", | |
| 199 | new LocalNameFunction() ); | |
| 200 | ||
| 201 | 106 | registerFunction( null, // namespace URI |
| 202 | "name", | |
| 203 | new NameFunction() ); | |
| 204 | ||
| 205 | 106 | registerFunction( null, // namespace URI |
| 206 | "namespace-uri", | |
| 207 | new NamespaceUriFunction() ); | |
| 208 | ||
| 209 | 106 | registerFunction( null, // namespace URI |
| 210 | "normalize-space", | |
| 211 | new NormalizeSpaceFunction() ); | |
| 212 | ||
| 213 | 106 | registerFunction( null, // namespace URI |
| 214 | "not", | |
| 215 | new NotFunction() ); | |
| 216 | ||
| 217 | 106 | registerFunction( null, // namespace URI |
| 218 | "number", | |
| 219 | new NumberFunction() ); | |
| 220 | ||
| 221 | 106 | registerFunction( null, // namespace URI |
| 222 | "position", | |
| 223 | new PositionFunction() ); | |
| 224 | ||
| 225 | 106 | registerFunction( null, // namespace URI |
| 226 | "round", | |
| 227 | new RoundFunction() ); | |
| 228 | ||
| 229 | 106 | registerFunction( null, // namespace URI |
| 230 | "starts-with", | |
| 231 | new StartsWithFunction() ); | |
| 232 | ||
| 233 | 106 | registerFunction( null, // namespace URI |
| 234 | "string", | |
| 235 | new StringFunction() ); | |
| 236 | ||
| 237 | 106 | registerFunction( null, // namespace URI |
| 238 | "string-length", | |
| 239 | new StringLengthFunction() ); | |
| 240 | ||
| 241 | 106 | registerFunction( null, // namespace URI |
| 242 | "substring-after", | |
| 243 | new SubstringAfterFunction() ); | |
| 244 | ||
| 245 | 106 | registerFunction( null, // namespace URI |
| 246 | "substring-before", | |
| 247 | new SubstringBeforeFunction() ); | |
| 248 | ||
| 249 | 106 | registerFunction( null, // namespace URI |
| 250 | "substring", | |
| 251 | new SubstringFunction() ); | |
| 252 | ||
| 253 | 106 | registerFunction( null, // namespace URI |
| 254 | "sum", | |
| 255 | new SumFunction() ); | |
| 256 | ||
| 257 | 106 | registerFunction( null, // namespace URI |
| 258 | "true", | |
| 259 | new TrueFunction() ); | |
| 260 | ||
| 261 | 106 | registerFunction( null, // namespace URI |
| 262 | "translate", | |
| 263 | new TranslateFunction() ); | |
| 264 | 106 | } |
| 265 | ||
| 266 | private void registerXSLTFunctions() { | |
| 267 | ||
| 268 | // extension functions defined in XSLT | |
| 269 | 104 | registerFunction( null, // namespace URI |
| 270 | "document", | |
| 271 | new DocumentFunction() ); | |
| 272 | 104 | } |
| 273 | ||
| 274 | private void registerExtensionFunctions() { | |
| 275 | // extension functions should go into a namespace, but which one? | |
| 276 | // for now, keep them in default namespace to not break any code | |
| 277 | ||
| 278 | 104 | registerFunction( null, // namespace URI |
| 279 | "evaluate", | |
| 280 | new EvaluateFunction() ); | |
| 281 | ||
| 282 | 104 | registerFunction( null, // namespace URI |
| 283 | "lower-case", | |
| 284 | new LowerFunction() ); | |
| 285 | ||
| 286 | 104 | registerFunction( null, // namespace URI |
| 287 | "upper-case", | |
| 288 | new UpperFunction() ); | |
| 289 | ||
| 290 | 104 | registerFunction( null, // namespace URI |
| 291 | "ends-with", | |
| 292 | new EndsWithFunction() ); | |
| 293 | 104 | } |
| 294 | ||
| 295 | ||
| 296 | } |