View Javadoc

1   /*
2    * $Header: /home/projects/jaxen/scm/jaxen/src/java/main/org/jaxen/XPathFunctionContext.java,v 1.24 2005/05/08 18:51:49 elharo Exp $
3    * $Revision: 1.24 $
4    * $Date: 2005/05/08 18:51:49 $
5    *
6    * ====================================================================
7    *
8    * Copyright (C) 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
13   * are met:
14   * 
15   * 1. Redistributions of source code must retain the above copyright
16   *    notice, this list of conditions, and the following disclaimer.
17   *
18   * 2. Redistributions in binary form must reproduce the above copyright
19   *    notice, this list of conditions, and the disclaimer that follows 
20   *    these conditions in the documentation and/or other materials 
21   *    provided with the distribution.
22   *
23   * 3. The name "Jaxen" must not be used to endorse or promote products
24   *    derived from this software without prior written permission.  For
25   *    written permission, please contact license@jaxen.org.
26   * 
27   * 4. Products derived from this software may not be called "Jaxen", nor
28   *    may "Jaxen" appear in their name, without prior written permission
29   *    from the Jaxen Project Management (pm@jaxen.org).
30   * 
31   * In addition, we request (but do not require) that you include in the 
32   * end-user documentation provided with the redistribution and/or in the 
33   * software itself an acknowledgement equivalent to the following:
34   *     "This product includes software developed by the
35   *      Jaxen Project (http://www.jaxen.org/)."
36   * Alternatively, the acknowledgment may be graphical using the logos 
37   * available at http://www.jaxen.org/
38   *
39   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
40   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
41   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
42   * DISCLAIMED.  IN NO EVENT SHALL THE Jaxen AUTHORS OR THE PROJECT
43   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
45   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
46   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
47   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
48   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
49   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50   * SUCH DAMAGE.
51   *
52   * ====================================================================
53   * This software consists of voluntary contributions made by many 
54   * individuals on behalf of the Jaxen Project and was originally 
55   * created by bob mcwhirter <bob@werken.com> and 
56   * James Strachan <jstrachan@apache.org>.  For more information on the 
57   * Jaxen Project, please see <http://www.jaxen.org/>.
58   * 
59   * $Id: XPathFunctionContext.java,v 1.24 2005/05/08 18:51:49 elharo Exp $
60   */
61  
62  
63  package org.jaxen;
64  
65  import org.jaxen.function.BooleanFunction;
66  import org.jaxen.function.CeilingFunction;
67  import org.jaxen.function.ConcatFunction;
68  import org.jaxen.function.ContainsFunction;
69  import org.jaxen.function.CountFunction;
70  import org.jaxen.function.FalseFunction;
71  import org.jaxen.function.FloorFunction;
72  import org.jaxen.function.IdFunction;
73  import org.jaxen.function.LangFunction;
74  import org.jaxen.function.LastFunction;
75  import org.jaxen.function.LocalNameFunction;
76  import org.jaxen.function.NameFunction;
77  import org.jaxen.function.NamespaceUriFunction;
78  import org.jaxen.function.NormalizeSpaceFunction;
79  import org.jaxen.function.NotFunction;
80  import org.jaxen.function.NumberFunction;
81  import org.jaxen.function.PositionFunction;
82  import org.jaxen.function.RoundFunction;
83  import org.jaxen.function.StartsWithFunction;
84  import org.jaxen.function.StringFunction;
85  import org.jaxen.function.StringLengthFunction;
86  import org.jaxen.function.SubstringAfterFunction;
87  import org.jaxen.function.SubstringBeforeFunction;
88  import org.jaxen.function.SubstringFunction;
89  import org.jaxen.function.SumFunction;
90  import org.jaxen.function.TranslateFunction;
91  import org.jaxen.function.TrueFunction;
92  import org.jaxen.function.ext.EndsWithFunction;
93  import org.jaxen.function.ext.EvaluateFunction;
94  import org.jaxen.function.ext.LowerFunction;
95  import org.jaxen.function.ext.MatrixConcatFunction;
96  import org.jaxen.function.ext.UpperFunction;
97  import org.jaxen.function.xslt.DocumentFunction;
98  
99  /*** A <code>FunctionContext</code> implementing the core XPath
100  *  function library, with extensions.
101  *
102  *  <p>
103  *  The core XPath function library is provided through this
104  *  implementation of <code>FunctionContext</code>.  Additionally,
105  *  extension functions have been provided, as enumerated below.
106  *  </p>
107  *
108  *  <p>
109  *  This class is re-entrant and thread-safe.  If using the
110  *  default instance, it is inadvisable to call 
111  *  {@link #registerFunction(String, String, Function)}
112  *  as that will extend the global function context, affecting other
113  *  users.  But that's your call, really, now isn't
114  *  it?  That may be what you really want to do.
115  *  </p>
116  *
117  *  <p>
118  *  Extension functions:
119  *
120  *  <ul>
121  *     <li>matrix-concat(..)</li>
122  *     <li>evaluate(..)</li>
123  *     <li>upper-case(..)</li>
124  *     <li>lower-case(..)</li>
125  *     <li>ends-with(..)</li>
126  *  </ul>
127  *
128  *  @see FunctionContext
129  *  @see org.jaxen.function
130  *  @see org.jaxen.function.xslt
131  *  @see org.jaxen.function.ext
132  *
133  *  @author <a href="mailto:bob@werken.com">bob mcwhirter</a>
134  */
135 public class XPathFunctionContext extends SimpleFunctionContext
136 {
137     private static XPathFunctionContext instance = new XPathFunctionContext();
138 
139     /*** Retrieve the default function context
140      *
141      *  @return the default function context
142      */
143     public static FunctionContext getInstance()
144     {
145         return instance;
146     }
147 
148     /*** Create a new XPath function context.
149      *  All core XPath and Jaxen extension functions are registered.
150      */
151     public XPathFunctionContext()
152     {
153         registerFunction( null,  // namespace URI
154                           "boolean",
155                           new BooleanFunction() );
156 
157         registerFunction( null,  // namespace URI
158                           "ceiling",
159                           new CeilingFunction() );
160 
161         registerFunction( null,  // namespace URI
162                           "concat",
163                           new ConcatFunction() );
164 
165         registerFunction( null,  // namespace URI
166                           "contains",
167                           new ContainsFunction() );
168         
169         registerFunction( null,  // namespace URI
170                           "count",
171                           new CountFunction() );
172 
173         registerFunction( null,  // namespace URI
174                           "false",
175                           new FalseFunction() );
176 
177         registerFunction( null,  // namespace URI
178                           "floor",
179                           new FloorFunction() );
180 
181         registerFunction( null,  // namespace URI
182                           "id",
183                           new IdFunction() );
184 
185         registerFunction( null,  // namespace URI
186                           "lang",
187                           new LangFunction() );
188 
189         registerFunction( null,  // namespace URI
190                           "last",
191                           new LastFunction() );
192 
193         registerFunction( null,  // namespace URI
194                           "local-name",
195                           new LocalNameFunction() );
196 
197         registerFunction( null,  // namespace URI
198                           "name",
199                           new NameFunction() );
200 
201         registerFunction( null,  // namespace URI
202                           "namespace-uri",
203                           new NamespaceUriFunction() );
204 
205         registerFunction( null,  // namespace URI
206                           "normalize-space",
207                           new NormalizeSpaceFunction() );
208 
209         registerFunction( null,  // namespace URI
210                           "not",
211                           new NotFunction() );
212 
213         registerFunction( null,  // namespace URI
214                           "number",
215                           new NumberFunction() );
216 
217         registerFunction( null,  // namespace URI
218                           "position",
219                           new PositionFunction() );
220 
221         registerFunction( null,  // namespace URI
222                           "round",
223                           new RoundFunction() );
224 
225         registerFunction( null,  // namespace URI
226                           "starts-with",
227                           new StartsWithFunction() );
228 
229         registerFunction( null,  // namespace URI
230                           "string",
231                           new StringFunction() );
232 
233         registerFunction( null,  // namespace URI
234                           "string-length",
235                           new StringLengthFunction() );
236 
237         registerFunction( null,  // namespace URI
238                           "substring-after",
239                           new SubstringAfterFunction() );
240 
241         registerFunction( null,  // namespace URI
242                           "substring-before",
243                           new SubstringBeforeFunction() );
244 
245         registerFunction( null,  // namespace URI
246                           "substring",
247                           new SubstringFunction() );
248 
249         registerFunction( null,  // namespace URI
250                           "sum",
251                           new SumFunction() );
252 
253         registerFunction( null,  // namespace URI
254                           "true",
255                           new TrueFunction() );
256         
257         registerFunction( null,  // namespace URI
258                           "translate",
259                           new TranslateFunction() );
260         
261         // XSLT extension function
262         registerFunction( null,  // namespace URI
263                           "document",
264                           new DocumentFunction() );
265 
266         // register extension functions
267         // extension functions should go into a namespace, but which one?
268         // for now, keep them in default namespace to not break any code
269 
270         registerFunction( null,  // namespace URI
271                           "matrix-concat",
272                           new MatrixConcatFunction() );
273 
274         registerFunction( null,  // namespace URI
275                           "evaluate",
276                           new EvaluateFunction() );
277         
278         registerFunction( null,  // namespace URI
279                           "lower-case",
280                           new LowerFunction() );
281         
282         registerFunction( null,  // namespace URI
283                           "upper-case",
284                           new UpperFunction() );
285         
286         registerFunction( null,  // namespace URI
287                           "ends-with",
288                           new EndsWithFunction() );
289         
290     }
291 }