Coverage Report - org.jaxen.util.PrecedingSiblingAxisIterator
 
Classes in this File Line Coverage Branch Coverage Complexity
PrecedingSiblingAxisIterator
100%
31/31
100%
7/7
2.6
 
 1  
 /*
 2  
  * $Header: /home/projects/jaxen/scm/jaxen/src/java/main/org/jaxen/util/PrecedingSiblingAxisIterator.java,v 1.16 2006/11/13 22:10:09 elharo Exp $
 3  
  * $Revision: 1.16 $
 4  
  * $Date: 2006/11/13 22:10:09 $
 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: PrecedingSiblingAxisIterator.java,v 1.16 2006/11/13 22:10:09 elharo Exp $
 46  
  */
 47  
 
 48  
 
 49  
 
 50  
 package org.jaxen.util;
 51  
 
 52  
 import java.util.Iterator;
 53  
 import java.util.LinkedList;
 54  
 import java.util.NoSuchElementException;
 55  
 
 56  
 import org.jaxen.JaxenConstants;
 57  
 import org.jaxen.Navigator;
 58  
 import org.jaxen.UnsupportedAxisException;
 59  
 
 60  
 /**
 61  
  * 
 62  
  * Represents the XPath <code>preceding-sibling</code> axis. 
 63  
  * The "<code>preceding-sibling</code> axis contains all the
 64  
  * preceding siblings of the context node; if the context node is an
 65  
  * attribute node or namespace node, the <code>preceding-sibling</code>
 66  
  * axis is empty."
 67  
  * 
 68  
  * @version 1.2b12
 69  
  *
 70  
  */
 71  
 public class PrecedingSiblingAxisIterator implements Iterator
 72  
 {
 73  
     private Object    contextNode;
 74  
     private Navigator navigator;
 75  
 
 76  
     private Iterator  siblingIter;
 77  
     private Object    nextObj;
 78  
 
 79  
     /**
 80  
      * Create a new <code>preceding-sibling</code> axis iterator.
 81  
      * 
 82  
      * @param contextNode the node to start from
 83  
      * @param navigator the object model specific navigator
 84  
      */
 85  
     public PrecedingSiblingAxisIterator(Object contextNode,
 86  
                                         Navigator navigator) throws UnsupportedAxisException
 87  536
     {
 88  536
         this.contextNode = contextNode;
 89  536
         this.navigator   = navigator;
 90  
 
 91  536
         init();
 92  536
         if ( siblingIter.hasNext() )
 93  
         {
 94  152
             this.nextObj = siblingIter.next();
 95  
         }
 96  536
     }
 97  
 
 98  
     private void init() throws UnsupportedAxisException
 99  
     {
 100  
         
 101  536
         Object parent = this.navigator.getParentNode( this.contextNode );
 102  
 
 103  536
         if ( parent != null )
 104  
         {
 105  376
             Iterator childIter = this.navigator.getChildAxisIterator( parent );
 106  376
             LinkedList siblings = new LinkedList();
 107  
             
 108  860
             while ( childIter.hasNext() )
 109  
             {
 110  860
                 Object eachChild = childIter.next();
 111  860
                 if ( eachChild.equals(this.contextNode) )
 112  
                 {
 113  376
                     break;
 114  
                 }
 115  484
                 siblings.addFirst( eachChild );
 116  484
             }
 117  
             
 118  376
             this.siblingIter = siblings.iterator();
 119  
             
 120  376
         }
 121  
         else {
 122  160
             this.siblingIter = JaxenConstants.EMPTY_ITERATOR;
 123  
         }
 124  
         
 125  536
     }
 126  
 
 127  
     /**
 128  
      * Returns true if there are any preceding siblings remaining; false otherwise.
 129  
      * 
 130  
      * @return true if any preceding siblings remain; false otherwise
 131  
      * 
 132  
      * @see java.util.Iterator#hasNext()
 133  
      */
 134  
     public boolean hasNext()
 135  
     {
 136  1538
         return ( this.nextObj != null );
 137  
     }
 138  
 
 139  
     /**
 140  
      * Returns the next preceding sibling.
 141  
      * 
 142  
      * @return the next preceding sibling
 143  
      * 
 144  
      * @throws NoSuchElementException if no preceding siblings remain
 145  
      * 
 146  
      * @see java.util.Iterator#next()
 147  
      */
 148  
     public Object next() throws NoSuchElementException
 149  
     {
 150  486
         if ( ! hasNext() )
 151  
         {
 152  2
             throw new NoSuchElementException();
 153  
         }
 154  
 
 155  484
         Object obj = this.nextObj;
 156  484
         if ( siblingIter.hasNext() )
 157  
         {
 158  332
             this.nextObj = siblingIter.next();
 159  332
         }
 160  
         else {
 161  152
             this.nextObj = null;
 162  
         }
 163  484
         return obj;
 164  
     }
 165  
 
 166  
     /**
 167  
      * This operation is not supported.
 168  
      * 
 169  
      * @throws UnsupportedOperationException
 170  
      */
 171  
     public void remove() throws UnsupportedOperationException
 172  
     {
 173  2
         throw new UnsupportedOperationException();
 174  
     }
 175  
 
 176  
 }