Coverage Report - org.jaxen.expr.DefaultLocationPath
 
Classes in this File Line Coverage Branch Coverage Complexity
DefaultLocationPath
100%
47/47
100%
9/9
1.889
 
 1  
 /*
 2  
  * $Header: /home/projects/jaxen/scm/jaxen/src/java/main/org/jaxen/expr/DefaultLocationPath.java,v 1.29 2006/02/05 21:47:40 elharo Exp $
 3  
  * $Revision: 1.29 $
 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  
  *
 12  
  * Redistribution and use in source and binary forms, with or without
 13  
  * modification, are permitted provided that the following conditions are
 14  
  * met:
 15  
  * 
 16  
  *   * Redistributions of source code must retain the above copyright
 17  
  *     notice, this list of conditions and the following disclaimer.
 18  
  * 
 19  
  *   * Redistributions in binary form must reproduce the above copyright
 20  
  *     notice, this list of conditions and the following disclaimer in the
 21  
  *     documentation and/or other materials provided with the distribution.
 22  
  * 
 23  
  *   * Neither the name of the Jaxen Project nor the names of its
 24  
  *     contributors may be used to endorse or promote products derived 
 25  
  *     from this software without specific prior written permission.
 26  
  * 
 27  
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 28  
  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 29  
  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 30  
  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
 31  
  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 32  
  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 33  
  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 34  
  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 35  
  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 36  
  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 37  
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 38  
  *
 39  
  * ====================================================================
 40  
  * This software consists of voluntary contributions made by many
 41  
  * individuals on behalf of the Jaxen Project and was originally
 42  
  * created by bob mcwhirter <bob@werken.com> and
 43  
  * James Strachan <jstrachan@apache.org>.  For more information on the
 44  
  * Jaxen Project, please see <http://www.jaxen.org/>.
 45  
  *
 46  
  * $Id: DefaultLocationPath.java,v 1.29 2006/02/05 21:47:40 elharo Exp $
 47  
  */
 48  
 package org.jaxen.expr;
 49  
 
 50  
 import java.util.ArrayList;
 51  
 import java.util.Collections;
 52  
 import java.util.Iterator;
 53  
 import java.util.LinkedList;
 54  
 import java.util.List;
 55  
 
 56  
 import org.jaxen.Context;
 57  
 import org.jaxen.ContextSupport;
 58  
 import org.jaxen.JaxenException;
 59  
 
 60  
 abstract class DefaultLocationPath extends DefaultExpr implements LocationPath
 61  
 {
 62  
     private List steps;
 63  
     
 64  
     /**
 65  
      * Create a new empty location path.
 66  
      */
 67  
     DefaultLocationPath()
 68  5514
     {
 69  5514
         this.steps = new LinkedList();
 70  5514
     }
 71  
 
 72  
     public void addStep(Step step)
 73  
     {
 74  9156
         getSteps().add(step);
 75  9156
     }
 76  
 
 77  
     public List getSteps()
 78  
     {
 79  35528
         return this.steps;
 80  
     }
 81  
 
 82  
     public Expr simplify()
 83  
     {
 84  5406
         Iterator stepIter = getSteps().iterator();
 85  5406
         Step eachStep = null;
 86  14488
         while (stepIter.hasNext())
 87  
         {
 88  9082
             eachStep = (Step) stepIter.next();
 89  9082
             eachStep.simplify();
 90  9082
         }
 91  5406
         return this;
 92  
     }
 93  
 
 94  
     public String getText()
 95  
     {
 96  2140
         StringBuffer buf = new StringBuffer();
 97  2140
         Iterator stepIter = getSteps().iterator();
 98  5928
         while (stepIter.hasNext())
 99  
         {
 100  3788
             buf.append(((Step) stepIter.next()).getText());
 101  3788
             if (stepIter.hasNext())
 102  
             {
 103  1656
                 buf.append("/");
 104  1656
             }
 105  
         }
 106  2140
         return buf.toString();
 107  
     }
 108  
 
 109  
     public String toString()
 110  
     {
 111  4
         StringBuffer buf = new StringBuffer();
 112  4
         Iterator stepIter = getSteps().iterator();
 113  10
         while (stepIter.hasNext())
 114  
         {
 115  6
             buf.append(stepIter.next().toString());
 116  6
             if (stepIter.hasNext())
 117  
             {
 118  2
                 buf.append("/");
 119  2
             }
 120  
         }
 121  4
         return buf.toString();
 122  
     }
 123  
 
 124  
     public boolean isAbsolute()
 125  
     {
 126  2092
         return false;
 127  
     }
 128  
 
 129  
     public Object evaluate(Context context) throws JaxenException
 130  
     {
 131  7260
         List nodeSet = context.getNodeSet();
 132  7260
         List contextNodeSet = new ArrayList(nodeSet);
 133  7260
         ContextSupport support = context.getContextSupport();
 134  7260
         Context stepContext = new Context(support);
 135  7260
         Iterator stepIter = getSteps().iterator();
 136  16890
         while ( stepIter.hasNext() )
 137  
         {
 138  9638
             Step eachStep = (Step) stepIter.next();
 139  9638
             stepContext.setNodeSet(contextNodeSet);
 140  9638
             contextNodeSet = eachStep.evaluate(stepContext);
 141  
             // now we need to reverse the list if this is a reverse axis
 142  9630
             if (isReverseAxis(eachStep)) {
 143  222
                 Collections.reverse(contextNodeSet);
 144  
             }
 145  9630
         }
 146  
         
 147  7252
         if (getSteps().size() > 1) {
 148  1856
             Collections.sort(contextNodeSet, new NodeComparator(support.getNavigator()));
 149  
         }
 150  
         
 151  7252
         return contextNodeSet;
 152  
     }
 153  
 
 154  
     private boolean isReverseAxis(Step step) {
 155  
 
 156  9630
         int axis = step.getAxis();
 157  9630
         return axis == org.jaxen.saxpath.Axis.PRECEDING
 158  
           || axis == org.jaxen.saxpath.Axis.PRECEDING_SIBLING
 159  
           || axis == org.jaxen.saxpath.Axis.ANCESTOR
 160  
           || axis == org.jaxen.saxpath.Axis.ANCESTOR_OR_SELF;
 161  
     }
 162  
 
 163  
 }
 164