View Javadoc

1   /*
2    * $Header: /home/projects/jaxen/scm/jaxen/src/java/main/org/jaxen/function/ConcatFunction.java,v 1.9 2006/02/05 21:47:41 elharo Exp $
3    * $Revision: 1.9 $
4    * $Date: 2006/02/05 21:47:41 $
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: ConcatFunction.java,v 1.9 2006/02/05 21:47:41 elharo Exp $
46   */
47  
48  
49  package org.jaxen.function;
50  
51  import java.util.Iterator;
52  import java.util.List;
53  
54  import org.jaxen.Context;
55  import org.jaxen.Function;
56  import org.jaxen.FunctionCallException;
57  import org.jaxen.Navigator;
58  
59  /***
60   * <b>4.2</b> <code><i>string</i> concat(<i>string</i>,<i>string</i>,<i>string*</i>)</code> 
61   * <p>
62   * Concatenates its arguments and returns the resulting string.
63   * </p>
64   *  
65   *  @author bob mcwhirter (bob@werken.com)
66   * 
67   * @see <a href="http://www.w3.org/TR/xpath#function-concat">Section 4.2 of the XPath Specification</a>
68   */
69  public class ConcatFunction implements Function
70  {
71  
72      /***
73       * Create a new <code>ConcatFunction</code> object.
74       */
75      public ConcatFunction() {}
76      
77      /*** 
78       * Concatenates the arguments and returns the resulting string.
79       * Non-string items are first converted to strings as if by the 
80       * XPath <code>string()<code> function.
81       *
82       * @param context the context at the point in the
83       *         expression when the function is called
84       * @param args the list of strings to be concatenated
85       * 
86       * @return a <code>String</code> containing the concatenation of the items 
87       *     of <code>args</code>
88       * 
89       * @throws FunctionCallException if <code>args</code> has less than two items
90       */
91      public Object call(Context context,
92                         List args) throws FunctionCallException
93      {
94          if ( args.size() >= 2 )
95          {
96              return evaluate( args,
97                               context.getNavigator() );
98          }
99  
100         throw new FunctionCallException("concat() requires at least two arguments");
101     }
102 
103     /*** 
104      * Converts each item in the list to a string and returns the 
105      * concatenation of these strings.
106      * If necessary, each item is first converted to a <code>String</code>
107      * as if by the XPath <code>string()</code> function.
108      * 
109      * @param list the items to be concatenated
110      * @param nav ignored
111      * 
112      * @return the concatenation of the arguments
113      */
114    public static String evaluate(List list,
115                                   Navigator nav)
116     {
117         StringBuffer result = new StringBuffer();
118         Iterator argIter = list.iterator();
119         while ( argIter.hasNext() )
120         {
121             result.append( StringFunction.evaluate( argIter.next(),
122                                                     nav ) );
123         }
124     
125         return result.toString();
126     }
127 }