Coverage Report - org.jaxen.function.StringFunction

Classes in this Package Line Coverage Branch Coverage Complexity
StringFunction
86% 
100% 
9.75

 1  
 /*
 2  
  * $Header: /home/projects/jaxen/scm/jaxen/src/java/main/org/jaxen/function/StringFunction.java,v 1.18 2005/04/16 14:18:12 elharo Exp $
 3  
  * $Revision: 1.18 $
 4  
  * $Date: 2005/04/16 14:18:12 $
 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: StringFunction.java,v 1.18 2005/04/16 14:18:12 elharo Exp $
 60  
  */
 61  
 
 62  
 
 63  
 package org.jaxen.function;
 64  
 
 65  
 import org.jaxen.Context;
 66  
 import org.jaxen.Function;
 67  
 import org.jaxen.FunctionCallException;
 68  
 import org.jaxen.Navigator;
 69  
 import org.jaxen.UnsupportedAxisException;
 70  
 import org.jaxen.JaxenRuntimeException;
 71  
 
 72  
 import java.text.NumberFormat;
 73  
 import java.util.List;
 74  
 import java.util.Iterator;
 75  
 import java.util.Locale;
 76  
 
 77  
 /**
 78  
  * <p><b>4.2</b> <code><i>string</i> string(<i>object</i>)</code>
 79  
  *
 80  
  * @author bob mcwhirter (bob @ werken.com)
 81  
  */
 82  41
 public class StringFunction implements Function
 83  
 {
 84  
     
 85  41
     private static NumberFormat format = NumberFormat.getInstance(Locale.ENGLISH);
 86  
     
 87  
     static {
 88  41
         format.setGroupingUsed(false);
 89  41
         format.setMaximumFractionDigits(32);
 90  41
     }
 91  
 
 92  
     public Object call(Context context,
 93  
                        List args) throws FunctionCallException
 94  
     {
 95  25
         int size = args.size();
 96  
 
 97  25
         if ( size == 0 )
 98  
         {
 99  20
             return evaluate( context.getNodeSet(),
 100  
                              context.getNavigator() );
 101  
         }
 102  5
         else if ( size == 1 )
 103  
         {
 104  5
             return evaluate( args.get(0),
 105  
                              context.getNavigator() );
 106  
         }
 107  
 
 108  0
         throw new FunctionCallException( "string() requires one argument." );
 109  
     }
 110  
     
 111  
     public static String evaluate(Object obj,
 112  
                                   Navigator nav)
 113  
     {
 114  
         try
 115  
         {
 116  5487
             if (obj == null) {
 117  0
                 return "";
 118  
             }
 119  
             
 120  
             // Workaround because XOM uses lists for Text nodes
 121  
             // so we need to check for that first
 122  5487
             if (nav != null && nav.isText(obj))
 123  
             {
 124  24
                 return nav.getTextStringValue(obj);
 125  
             }
 126  
             
 127  5463
             if (obj instanceof List)
 128  
             {
 129  258
                 List list = (List) obj;
 130  258
                 if (list.isEmpty())
 131  
                 {
 132  8
                     return "";
 133  
                 }
 134  
                 // do not recurse: only first list should unwrap
 135  250
                 obj = list.get(0);
 136  
             }
 137  
             
 138  5455
             if (nav != null && (nav.isElement(obj) || nav.isDocument(obj)))
 139  
             {
 140  526
                 Iterator descendantAxisIterator = nav.getDescendantAxisIterator(obj);
 141  526
                 StringBuffer sb = new StringBuffer();
 142  1119
                 while (descendantAxisIterator.hasNext())
 143  
                 {
 144  593
                     Object descendant = descendantAxisIterator.next();
 145  593
                     if (nav.isText(descendant))
 146  
                     {
 147  539
                         sb.append(nav.getTextStringValue(descendant));
 148  
                     }
 149  
                 }
 150  526
                 return sb.toString();
 151  
             }
 152  4929
             else if (nav != null && nav.isAttribute(obj))
 153  
             {
 154  1028
                 return nav.getAttributeStringValue(obj);
 155  
             }
 156  3901
             else if (nav != null && nav.isText(obj))
 157  
             {
 158  20
                 return nav.getTextStringValue(obj);
 159  
             }
 160  3881
             else if (nav != null && nav.isProcessingInstruction(obj))
 161  
             {
 162  12
                 return nav.getProcessingInstructionData(obj);
 163  
             }
 164  3869
             else if (nav != null && nav.isComment(obj))
 165  
             {
 166  0
                 return nav.getCommentStringValue(obj);
 167  
             }
 168  3869
             else if (nav != null && nav.isNamespace(obj))
 169  
             {
 170  0
                 return nav.getNamespaceStringValue(obj);
 171  
             }
 172  3869
             else if (obj instanceof String)
 173  
             {
 174  3667
                 return (String) obj;
 175  
             }
 176  202
             else if (obj instanceof Boolean)
 177  
             {
 178  104
                 return stringValue(((Boolean) obj).booleanValue());
 179  
             }
 180  98
             else if (obj instanceof Number)
 181  
             {
 182  98
                 return stringValue(((Number) obj).doubleValue());
 183  
             }
 184  0
             return "";
 185  
         }
 186  0
         catch (UnsupportedAxisException e)
 187  
         {
 188  0
             throw new JaxenRuntimeException(e);
 189  
         }
 190  
 
 191  
     }
 192  
 
 193  
     public static String stringValue(double value)
 194  
     {
 195  98
         return format.format(value);
 196  
     }
 197  
 
 198  
     public static String stringValue(boolean bool)
 199  
     {
 200  104
         return bool ? "true" : "false";
 201  
     }
 202  
 
 203  
 }