Coverage Report - org.jaxen.expr.DefaultStep
 
Classes in this File Line Coverage Branch Coverage Complexity
DefaultStep
97%
34/35
100%
4/4
1.333
 
 1  
 /*
 2  
  * $Header: /home/projects/jaxen/scm/jaxen/src/java/main/org/jaxen/expr/DefaultStep.java,v 1.21 2006/02/05 21:47:40 elharo Exp $
 3  
  * $Revision: 1.21 $
 4  
  * $Date: 2006/02/05 21:47:40 $
 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: DefaultStep.java,v 1.21 2006/02/05 21:47:40 elharo Exp $
 46  
  */
 47  
 package org.jaxen.expr;
 48  
 
 49  
 import java.util.ArrayList;
 50  
 import java.util.Iterator;
 51  
 import java.util.List;
 52  
 
 53  
 import org.jaxen.Context;
 54  
 import org.jaxen.ContextSupport;
 55  
 import org.jaxen.JaxenException;
 56  
 import org.jaxen.UnsupportedAxisException;
 57  
 import org.jaxen.expr.iter.IterableAxis;
 58  
 import org.jaxen.saxpath.Axis;
 59  
 
 60  
 /**
 61  
  * @deprecated this class will become non-public in the future;
 62  
  *     use the interface instead
 63  
  */
 64  
 public abstract class DefaultStep implements Step
 65  
 {
 66  
     private IterableAxis axis;
 67  
     private PredicateSet predicates;
 68  
 
 69  
     public DefaultStep(IterableAxis axis, PredicateSet predicates)
 70  9210
     {
 71  9210
         this.axis = axis;
 72  9210
         this.predicates = predicates;
 73  9210
     }
 74  
 
 75  
     public void addPredicate(Predicate predicate)
 76  
     {
 77  1344
         this.predicates.addPredicate(predicate);
 78  1344
     }
 79  
 
 80  
     public List getPredicates()
 81  
     {
 82  6720
         return this.predicates.getPredicates();
 83  
     }
 84  
 
 85  
     public PredicateSet getPredicateSet()
 86  
     {
 87  18210
         return this.predicates;
 88  
     }
 89  
 
 90  
     public int getAxis()
 91  
     {
 92  22882
         return this.axis.value();
 93  
     }
 94  
 
 95  
     public IterableAxis getIterableAxis()
 96  
     {
 97  34674
         return this.axis;
 98  
     }
 99  
 
 100  
     public String getAxisName()
 101  
     {
 102  3788
         return Axis.lookup(getAxis());
 103  
     }
 104  
 
 105  
     public String getText()
 106  
     {
 107  3748
         return this.predicates.getText();
 108  
     }
 109  
 
 110  
     public String toString()
 111  
     {
 112  0
         return getIterableAxis() + " " + super.toString();
 113  
     }
 114  
 
 115  
     public void simplify()
 116  
     {
 117  9082
         this.predicates.simplify();
 118  9082
     }
 119  
 
 120  
     public Iterator axisIterator(Object contextNode, ContextSupport support)
 121  
         throws UnsupportedAxisException
 122  
     {
 123  26120
         return getIterableAxis().iterator(contextNode, support);
 124  
     }
 125  
 
 126  
     public List evaluate(final Context context) throws JaxenException
 127  
     {
 128  1040
         final List contextNodeSet  = context.getNodeSet();
 129  1040
         final IdentitySet unique = new IdentitySet();
 130  1040
         final int contextSize = contextNodeSet.size();
 131  
 
 132  
         // ???? try linked lists instead?
 133  
         // ???? initial size for these?
 134  1040
         final ArrayList interimSet = new ArrayList();
 135  1040
         final ArrayList newNodeSet = new ArrayList();
 136  1040
         final ContextSupport support = context.getContextSupport();
 137  
             
 138  
         // ???? use iterator instead
 139  3612
         for ( int i = 0 ; i < contextSize ; ++i )
 140  
         {
 141  2574
             Object eachContextNode = contextNodeSet.get( i );
 142  
 
 143  
 
 144  
                 /* See jaxen-106. Might be able to optimize this by doing
 145  
                  * specific matching for individual axes. For instance on namespace axis
 146  
                  * we should only get namespace nodes and on attribute axes we only get 
 147  
                  * attribute nodes. Self and parent axes have single members.
 148  
                  * Children, descendant, ancestor, and sibling axes never 
 149  
                  * see any attributes or namespaces
 150  
                  */
 151  2574
             Iterator axisNodeIter = axis.iterator(eachContextNode, support);
 152  40972
             while ( axisNodeIter.hasNext() )
 153  
             {
 154  38400
                 Object eachAxisNode = axisNodeIter.next();
 155  38400
                 if ( ! unique.contains( eachAxisNode ) )
 156  
                 {
 157  38384
                     if ( matches( eachAxisNode, support ) )
 158  
                     {
 159  36688
                         unique.add( eachAxisNode );
 160  36688
                         interimSet.add( eachAxisNode );
 161  
                     }
 162  
                 }
 163  38400
             }
 164  2572
             newNodeSet.addAll(getPredicateSet().evaluatePredicates(
 165  
                               interimSet, support ));
 166  2572
             interimSet.clear();
 167  
         }
 168  1038
         return newNodeSet;
 169  
     }
 170  
 
 171  
 }