Coverage Report - org.jaxen.javabean.DocumentNavigator

Classes in this File Line Coverage Branch Coverage Complexity
DocumentNavigator
36% 
70% 
1.743

 1  
 /*
 2  
  $Id: DocumentNavigator.java,v 1.6 2005/04/20 22:41:38 elharo Exp $
 3  
 
 4  
  Copyright 2003 (C) The Werken Company. All Rights Reserved.
 5  
  
 6  
  Redistribution and use of this software and associated documentation
 7  
  ("Software"), with or without modification, are permitted provided
 8  
  that the following conditions are met:
 9  
 
 10  
  1. Redistributions of source code must retain copyright
 11  
     statements and notices.  Redistributions must also contain a
 12  
     copy of this document.
 13  
  
 14  
  2. Redistributions in binary form must reproduce the
 15  
     above copyright notice, this list of conditions and the
 16  
     following disclaimer in the documentation and/or other
 17  
     materials provided with the distribution.
 18  
  
 19  
  3. The name "jaxen" must not be used to endorse or promote
 20  
     products derived from this Software without prior written
 21  
     permission of The Werken Company.  For written permission,
 22  
     please contact bob@werken.com.
 23  
  
 24  
  4. Products derived from this Software may not be called "jaxen"
 25  
     nor may "jaxen" appear in their names without prior written
 26  
     permission of The Werken Company. "jaxen" is a registered
 27  
     trademark of The Werken Company.
 28  
  
 29  
  5. Due credit should be given to The Werken Company.
 30  
     (http://jaxen.werken.com/).
 31  
  
 32  
  THIS SOFTWARE IS PROVIDED BY THE WERKEN COMPANY AND CONTRIBUTORS
 33  
  ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
 34  
  NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 35  
  FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
 36  
  THE WERKEN COMPANY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 37  
  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 38  
  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 39  
  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 40  
  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 41  
  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 42  
  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 43  
  OF THE POSSIBILITY OF SUCH DAMAGE.
 44  
 
 45  
  */
 46  
 package org.jaxen.javabean;
 47  
 
 48  
 import java.lang.reflect.Method;
 49  
 import java.lang.reflect.InvocationTargetException;
 50  
 import java.util.Iterator;
 51  
 import java.util.Collection;
 52  
 
 53  
 import org.jaxen.DefaultNavigator;
 54  
 import org.jaxen.FunctionCallException;
 55  
 import org.jaxen.NamedAccessNavigator;
 56  
 import org.jaxen.Navigator;
 57  
 import org.jaxen.XPath;
 58  
 import org.jaxen.JaxenConstants;
 59  
 import org.jaxen.util.SingleObjectIterator;
 60  
 
 61  
 /** 
 62  
  * Interface for navigating around a JavaBean object model.
 63  
  *
 64  
  * <p>
 65  
  * This class is not intended for direct usage, but is
 66  
  * used by the Jaxen engine during evaluation.
 67  
  * </p>
 68  
  *
 69  
  * @see XPath
 70  
  *
 71  
  * @author <a href="mailto:bob@werken.com">bob mcwhirter</a>
 72  
  */
 73  6
 public class DocumentNavigator
 74  
     extends DefaultNavigator
 75  
     implements NamedAccessNavigator
 76  
 {
 77  
 
 78  
     /** Empty Class array. */
 79  6
     private static final Class[] EMPTY_CLASS_ARRAY = new Class[0];
 80  
 
 81  
     /** Empty Object array. */
 82  6
     private static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];
 83  
 
 84  
     /** Singleton implementation.
 85  
      */
 86  6
     private static final DocumentNavigator instance = new DocumentNavigator();
 87  
 
 88  
     /** Retrieve the singleton instance of this <code>DocumentNavigator</code>.
 89  
      */
 90  
     public static Navigator getInstance()
 91  
     {
 92  6
         return instance;
 93  
     }
 94  
 
 95  
     public boolean isElement(Object obj)
 96  
     {
 97  0
         return (obj instanceof Element);
 98  
     }
 99  
 
 100  
     public boolean isComment(Object obj)
 101  
     {
 102  0
         return false;
 103  
     }
 104  
 
 105  
     public boolean isText(Object obj)
 106  
     {
 107  0
         return ( obj instanceof String );
 108  
     }
 109  
 
 110  
     public boolean isAttribute(Object obj)
 111  
     {
 112  18
         return false;
 113  
     }
 114  
 
 115  
     public boolean isProcessingInstruction(Object obj)
 116  
     {
 117  0
         return false;
 118  
     }
 119  
 
 120  
     public boolean isDocument(Object obj)
 121  
     {
 122  0
         return false;
 123  
     }
 124  
 
 125  
     public boolean isNamespace(Object obj)
 126  
     {
 127  18
         return false;
 128  
     }
 129  
 
 130  
     public String getElementName(Object obj)
 131  
     {
 132  0
         return ((Element)obj).getName();
 133  
     }
 134  
 
 135  
     public String getElementNamespaceUri(Object obj)
 136  
     {
 137  0
         return "";
 138  
     }
 139  
 
 140  
     public String getElementQName(Object obj)
 141  
     {
 142  0
         return "";
 143  
     }
 144  
 
 145  
     public String getAttributeName(Object obj)
 146  
     {
 147  0
         return "";
 148  
     }
 149  
 
 150  
     public String getAttributeNamespaceUri(Object obj)
 151  
     {
 152  0
         return "";
 153  
     }
 154  
 
 155  
     public String getAttributeQName(Object obj)
 156  
     {
 157  0
         return "";
 158  
     }
 159  
 
 160  
     public Iterator getChildAxisIterator(Object contextNode)
 161  
     {
 162  18
         return JaxenConstants.EMPTY_ITERATOR;
 163  
     }
 164  
 
 165  
     /**
 166  
      * Retrieves an <code>Iterator</code> over the child elements that
 167  
      * match the supplied name.
 168  
      *
 169  
      * @param contextNode  the origin context node
 170  
      * @param localName  the local name of the children to return, always present
 171  
      * @param namespacePrefix  the prefix of the namespace of the children to return
 172  
      * @param namespaceURI  the namespace URI of the children to return
 173  
      * @return an Iterator that traverses the named children, or null if none
 174  
      */
 175  
     public Iterator getChildAxisIterator(Object contextNode,
 176  
                                          String localName,
 177  
                                          String namespacePrefix,
 178  
                                          String namespaceURI)
 179  
     {
 180  24
         Class cls = ((Element)contextNode).getObject().getClass();
 181  
 
 182  24
         String methodName = javacase( localName );
 183  
 
 184  24
         Method method = null;
 185  
         
 186  
         try
 187  
         {
 188  24
             method = cls.getMethod( "get" + methodName, EMPTY_CLASS_ARRAY );
 189  
         }
 190  6
         catch (NoSuchMethodException e)
 191  
         {
 192  
             try
 193  
             {
 194  6
                 method = cls.getMethod( "get" + methodName + "s", EMPTY_CLASS_ARRAY );
 195  
             }
 196  0
             catch (NoSuchMethodException ee)
 197  
             {
 198  
                 try
 199  
                 {
 200  0
                     method = cls.getMethod( localName, EMPTY_CLASS_ARRAY );
 201  
                 }
 202  0
                 catch (NoSuchMethodException eee)
 203  
                 {
 204  0
                     method = null;
 205  0
                 }
 206  6
             }
 207  18
         }
 208  
 
 209  24
         if ( method == null )
 210  
         {
 211  0
             return JaxenConstants.EMPTY_ITERATOR;
 212  
         }
 213  
 
 214  
         try
 215  
         {
 216  24
             Object result = method.invoke( ((Element)contextNode).getObject(), EMPTY_OBJECT_ARRAY );
 217  
             
 218  24
             if ( result == null )
 219  
             {
 220  0
                 return JaxenConstants.EMPTY_ITERATOR;
 221  
             } 
 222  
             
 223  24
             if ( result instanceof Collection )
 224  
             {
 225  6
                 return new ElementIterator( (Element) contextNode, localName, ((Collection)result).iterator() );
 226  
             }
 227  
             
 228  18
             if ( result.getClass().isArray() )
 229  
             {
 230  0
                 return JaxenConstants.EMPTY_ITERATOR;
 231  
             }
 232  
             
 233  18
             return new SingleObjectIterator( new Element( (Element) contextNode, localName, result ) );
 234  
         }
 235  0
         catch (IllegalAccessException e)
 236  
         {
 237  
             // swallow
 238  
         }
 239  0
         catch (InvocationTargetException e)
 240  
         {
 241  
             // swallow
 242  0
         }
 243  
 
 244  0
         return JaxenConstants.EMPTY_ITERATOR;
 245  
     }
 246  
 
 247  
     public Iterator getParentAxisIterator(Object contextNode)
 248  
     {
 249  0
         if ( contextNode instanceof Element )
 250  
         {
 251  0
             return new SingleObjectIterator( ((Element)contextNode).getParent() );
 252  
         }
 253  
 
 254  0
         return JaxenConstants.EMPTY_ITERATOR;
 255  
     }
 256  
 
 257  
     public Iterator getAttributeAxisIterator(Object contextNode)
 258  
     {
 259  0
         return JaxenConstants.EMPTY_ITERATOR;
 260  
     }
 261  
 
 262  
     /**
 263  
      * Retrieves an <code>Iterator</code> over the attribute elements that
 264  
      * match the supplied name.
 265  
      *
 266  
      * @param contextNode  the origin context node
 267  
      * @param localName  the local name of the attributes to return, always present
 268  
      * @param namespacePrefix  the prefix of the namespace of the attributes to return
 269  
      * @param namespaceURI  the namespace URI of the attributes to return
 270  
      * @return an Iterator that traverses the named attributes, not null
 271  
      */
 272  
     public Iterator getAttributeAxisIterator(Object contextNode,
 273  
                                              String localName,
 274  
                                              String namespacePrefix,
 275  
                                              String namespaceURI) {
 276  0
         return JaxenConstants.EMPTY_ITERATOR;
 277  
     }
 278  
         
 279  
     public Iterator getNamespaceAxisIterator(Object contextNode)
 280  
     {
 281  0
         return JaxenConstants.EMPTY_ITERATOR;
 282  
     }
 283  
 
 284  
     public Object getDocumentNode(Object contextNode)
 285  
     {
 286  0
         return null;
 287  
     }
 288  
 
 289  
     public Object getParentNode(Object contextNode)
 290  
     {
 291  198
         if ( contextNode instanceof Element )
 292  
         {
 293  198
             return ((Element)contextNode).getParent();
 294  
         }
 295  
 
 296  0
         return JaxenConstants.EMPTY_ITERATOR;
 297  
     }
 298  
 
 299  
     public String getTextStringValue(Object obj)
 300  
     {
 301  0
         if ( obj instanceof Element )
 302  
         {
 303  0
             return ((Element)obj).getObject().toString();
 304  
         }
 305  0
         return obj.toString();
 306  
     }
 307  
 
 308  
     public String getElementStringValue(Object obj)
 309  
     {
 310  0
         if ( obj instanceof Element )
 311  
         {
 312  0
             return ((Element)obj).getObject().toString();
 313  
         }
 314  0
         return obj.toString();
 315  
     }
 316  
 
 317  
     public String getAttributeStringValue(Object obj)
 318  
     {
 319  0
         return obj.toString();
 320  
     }
 321  
 
 322  
     public String getNamespaceStringValue(Object obj)
 323  
     {
 324  0
         return obj.toString();
 325  
     }
 326  
 
 327  
     public String getNamespacePrefix(Object obj)
 328  
     {
 329  0
         return null;
 330  
     }
 331  
 
 332  
     public String getCommentStringValue(Object obj)
 333  
     {
 334  0
         return null;
 335  
     }
 336  
     
 337  
     public String translateNamespacePrefixToUri(String prefix, Object context)
 338  
     {
 339  0
         return null;
 340  
     }
 341  
     
 342  
     public short getNodeType(Object node) 
 343  
     {
 344  0
         return 0;
 345  
     }
 346  
     
 347  
     public Object getDocument(String uri) throws FunctionCallException
 348  
     {
 349  0
         return null;
 350  
     }
 351  
 
 352  
     public String getProcessingInstructionTarget(Object obj)
 353  
     {
 354  0
         return null;
 355  
     }
 356  
 
 357  
     public String getProcessingInstructionData(Object obj)
 358  
     {
 359  0
         return null;
 360  
     }
 361  
 
 362  
     public XPath parseXPath(String xpath)
 363  
         throws org.jaxen.saxpath.SAXPathException
 364  
     {
 365  0
         return new JavaBeanXPath( xpath );
 366  
     }
 367  
 
 368  
     protected String javacase(String name)
 369  
     {
 370  24
         if ( name.length() == 0 )
 371  
         {
 372  0
             return name;
 373  
         }
 374  24
         else if ( name.length() == 1 )
 375  
         {
 376  0
             return name.toUpperCase();
 377  
         } 
 378  
 
 379  24
         return name.substring( 0, 1 ).toUpperCase() + name.substring( 1 );
 380  
     }
 381  
 }