Coverage Report - org.jaxen.DefaultNavigator

Classes in this File Line Coverage Branch Coverage Complexity
DefaultNavigator
56% 
100% 
1.952

 1  
 /*
 2  
  * $Header: /home/projects/jaxen/scm/jaxen/src/java/main/org/jaxen/DefaultNavigator.java,v 1.17 2005/06/28 13:44:44 elharo Exp $
 3  
  * $Revision: 1.17 $
 4  
  * $Date: 2005/06/28 13:44:44 $
 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: DefaultNavigator.java,v 1.17 2005/06/28 13:44:44 elharo Exp $
 60  
  */
 61  
 
 62  
 
 63  
 
 64  
 package org.jaxen;
 65  
 
 66  
 import java.util.Iterator;
 67  
 
 68  
 import org.jaxen.pattern.Pattern;
 69  
 import org.jaxen.util.AncestorAxisIterator;
 70  
 import org.jaxen.util.AncestorOrSelfAxisIterator;
 71  
 import org.jaxen.util.DescendantAxisIterator;
 72  
 import org.jaxen.util.DescendantOrSelfAxisIterator;
 73  
 import org.jaxen.util.FollowingAxisIterator;
 74  
 import org.jaxen.util.FollowingSiblingAxisIterator;
 75  
 import org.jaxen.util.PrecedingAxisIterator;
 76  
 import org.jaxen.util.PrecedingSiblingAxisIterator;
 77  
 import org.jaxen.util.SelfAxisIterator;
 78  
 
 79  
 /** Default implementation of {@link Navigator}.
 80  
  *
 81  
  *  <p>
 82  
  *  This implementation is an abstract class, since
 83  
  *  some required operations cannot be implemented without
 84  
  *  additional knowledge of the object model.
 85  
  *  </p>
 86  
  *
 87  
  *  <p>
 88  
  *  When possible, default method implementations build
 89  
  *  upon each other, to reduce the number of methods required
 90  
  *  to be implemented for each object model.  All methods,
 91  
  *  of course, may be overridden, to provide more-efficient
 92  
  *  implementations.
 93  
  *  </p>
 94  
  *
 95  
  *  @author bob mcwhirter (bob@werken.com)
 96  
  *  @author Erwin Bolwidt (ejb@klomp.org)
 97  
  */
 98  7014
 public abstract class DefaultNavigator implements Navigator
 99  
 {
 100  
 
 101  
     /** Throws <code>UnsupportedAxisException</code>
 102  
      * 
 103  
      * @param contextNode
 104  
      * @return never returns
 105  
      * @throws UnsupportedAxisException always
 106  
      */
 107  
     public Iterator getChildAxisIterator(Object contextNode) throws UnsupportedAxisException
 108  
     {
 109  0
         throw new UnsupportedAxisException("child");
 110  
     }
 111  
 
 112  
     /* (non-Javadoc)
 113  
      * @see org.jaxen.Navigator#getDescendantAxisIterator(java.lang.Object)
 114  
      */
 115  
     public Iterator getDescendantAxisIterator(Object contextNode) throws UnsupportedAxisException
 116  
     {
 117  498
         return new DescendantAxisIterator( contextNode,
 118  
                                            this );
 119  
     }
 120  
 
 121  
     /** Throws <code>UnsupportedAxisException</code>
 122  
      * 
 123  
      * @param  contextNode
 124  
      * @return never returns
 125  
      * @throws UnsupportedAxisException
 126  
      */
 127  
     public Iterator getParentAxisIterator(Object contextNode) throws UnsupportedAxisException
 128  
     {
 129  0
         throw new UnsupportedAxisException("parent");
 130  
     }
 131  
 
 132  
     public Iterator getAncestorAxisIterator(Object contextNode) throws UnsupportedAxisException
 133  
     {
 134  120
         return new AncestorAxisIterator( contextNode,
 135  
                                          this );
 136  
     }
 137  
 
 138  
 
 139  
     public Iterator getFollowingSiblingAxisIterator(Object contextNode) throws UnsupportedAxisException
 140  
     {
 141  41184
         return new FollowingSiblingAxisIterator( contextNode,
 142  
                                                  this );
 143  
     }
 144  
 
 145  
 
 146  
     public Iterator getPrecedingSiblingAxisIterator(Object contextNode) throws UnsupportedAxisException
 147  
     {
 148  198
         return new PrecedingSiblingAxisIterator( contextNode,
 149  
                                                  this );
 150  
     }
 151  
 
 152  
     public Iterator getFollowingAxisIterator(Object contextNode) throws UnsupportedAxisException
 153  
     {
 154  144
         return new FollowingAxisIterator( contextNode,
 155  
                                           this );
 156  
 
 157  
         // throw new UnsupportedAxisException("following");
 158  
     }
 159  
 
 160  
 
 161  
     public Iterator getPrecedingAxisIterator(Object contextNode) throws UnsupportedAxisException
 162  
     {
 163  462
         return new PrecedingAxisIterator( contextNode,
 164  
                                          this );
 165  
 
 166  
         // throw new UnsupportedAxisException("preceding");
 167  
     }
 168  
 
 169  
     /** Throws <code>UnsupportedAxisException</code>. Subclasses that 
 170  
      * support the attribute axis must override this method.
 171  
      * 
 172  
      * @param contextNode
 173  
      * @return never returns
 174  
      * @throws UnsupportedAxisException
 175  
      */
 176  
     public Iterator getAttributeAxisIterator(Object contextNode) throws UnsupportedAxisException
 177  
     {
 178  0
         throw new UnsupportedAxisException("attribute");
 179  
     }
 180  
 
 181  
     /** Throws <code>UnsupportedAxisException</code>. Subclasses that 
 182  
      * support the namespace axis must override this method.
 183  
      * 
 184  
      * @param contextNode
 185  
      * @return never returns
 186  
      * @throws UnsupportedAxisException
 187  
      */
 188  
     public Iterator getNamespaceAxisIterator(Object contextNode) throws UnsupportedAxisException
 189  
     {
 190  0
         throw new UnsupportedAxisException("namespace");
 191  
     }
 192  
 
 193  
     public Iterator getSelfAxisIterator(Object contextNode) throws UnsupportedAxisException
 194  
     {
 195  630
         return new SelfAxisIterator( contextNode );
 196  
     }
 197  
 
 198  
     public Iterator getDescendantOrSelfAxisIterator(Object contextNode) throws UnsupportedAxisException
 199  
     {
 200  1206
         return new DescendantOrSelfAxisIterator( contextNode,
 201  
                                                  this );
 202  
     }
 203  
 
 204  
     public Iterator getAncestorOrSelfAxisIterator(Object contextNode) throws UnsupportedAxisException
 205  
     {
 206  528
         return new AncestorOrSelfAxisIterator( contextNode,
 207  
                                                this );
 208  
     }
 209  
 
 210  
     public Object getDocumentNode(Object contextNode)
 211  
     {
 212  0
         return null;
 213  
     }
 214  
     
 215  
     public String translateNamespacePrefixToUri(String prefix, Object element)
 216  
     {
 217  0
         return null;
 218  
     }
 219  
 
 220  
     public String getProcessingInstructionTarget(Object obj)
 221  
     {
 222  0
         return null;
 223  
     }
 224  
 
 225  
     public String getProcessingInstructionData(Object obj)
 226  
     {
 227  0
         return null;
 228  
     }
 229  
 
 230  
     public short getNodeType(Object node)
 231  
     {
 232  450
         if ( isElement(node) ) 
 233  
         {
 234  0
             return Pattern.ELEMENT_NODE;
 235  
         }
 236  450
         else if ( isAttribute(node) ) 
 237  
         {
 238  0
             return Pattern.ATTRIBUTE_NODE;
 239  
         }
 240  450
         else if ( isText(node) ) 
 241  
         {
 242  0
             return Pattern.TEXT_NODE;
 243  
         }
 244  450
         else if ( isComment(node) ) 
 245  
         {
 246  0
             return Pattern.COMMENT_NODE;
 247  
         }
 248  450
         else if ( isDocument(node) ) 
 249  
         {
 250  0
             return Pattern.DOCUMENT_NODE;
 251  
         }
 252  450
         else if ( isProcessingInstruction(node) ) 
 253  
         {
 254  0
             return Pattern.PROCESSING_INSTRUCTION_NODE;
 255  
         }
 256  450
         else if ( isNamespace(node) ) 
 257  
         {
 258  450
             return Pattern.NAMESPACE_NODE;
 259  
         }
 260  
         else {
 261  0
             return Pattern.UNKNOWN_NODE;
 262  
         }
 263  
     }
 264  
     
 265  
     /**
 266  
      *  Default implementation that cannot find parent. Subclasses for
 267  
      *  models with parent should override this method.
 268  
      *
 269  
      * @param contextNode   the node whose parent to return
 270  
      * @return null
 271  
      * @throws UnsupportedAxisException if the parent axis is not supported
 272  
      */
 273  
     public Object getParentNode(Object contextNode) throws UnsupportedAxisException
 274  
     {
 275  150360
         Iterator iter = getParentAxisIterator( contextNode );
 276  150360
         if ( iter != null && iter.hasNext() )
 277  
         {
 278  121008
             return iter.next();
 279  
         }
 280  29352
         return null;
 281  
     }
 282  
 
 283  
     /**
 284  
      *  Default implementation that always returns null. Override in subclass
 285  
      *  if the subclass can load documents. 
 286  
      *
 287  
      * @param url the URL of the document to load
 288  
      *
 289  
      * @return null
 290  
      * @throws FunctionCallException if an error occurs while loading the
 291  
      *    URL; e.g. an I/O error or the document is malformed
 292  
      */
 293  
     public Object getDocument(String url) throws FunctionCallException
 294  
     {
 295  0
         return null;
 296  
     }
 297  
 
 298  
     /**
 299  
      *  Default implementation that cannot find elements. Override in subclass
 300  
      *  if subclass does know about attribute types.
 301  
      *
 302  
      *  @param contextNode   a node from the document in which to look for the
 303  
      *                       id
 304  
      *  @param elementId   id to look for
 305  
      *
 306  
      *  @return   null
 307  
      */
 308  
     public Object getElementById(Object contextNode, String elementId)
 309  
     {
 310  0
         return null;
 311  
     }
 312  
     
 313  
 }