##### Coverage Report - org.jaxen.expr.DefaultLocationPath

Classes in this File | Line Coverage | Branch Coverage | Complexity
DefaultLocationPath |
100% |
100% |
| 1.8888888888888888;1.889

1 |  |
     /*
2 |  |
      * $Header: /home/projects/jaxen/scm/jaxen/src/java/main/org/jaxen/expr/DefaultLocationPath.java,v 1.27 2005/06/28 13:44:44 elharo Exp $
3 |  |
      * $Revision: 1.27 $
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: DefaultLocationPath.java,v 1.27 2005/06/28 13:44:44 elharo Exp $
60 |  |
      */
61 |  |
     package org.jaxen.expr;
62 |  |
63 |  |
     import java.util.ArrayList;
64 |  |
     import java.util.Collections;
65 |  |
     import java.util.Iterator;
66 |  |
     import java.util.LinkedList;
67 |  |
     import java.util.List;
68 |  |
69 |  |
     import org.jaxen.Context;
70 |  |
     import org.jaxen.ContextSupport;
71 |  |
     import org.jaxen.JaxenException;
72 |  |
73 |  |
     abstract class DefaultLocationPath extends DefaultExpr implements LocationPath
74 |  |
     {
75 |  |
         private List steps;
76 |  |
77 |  |
         /**
78 |  |
          * Create a new empty location path.
79 |  |
          */
80 |  |
         DefaultLocationPath()
81 | 9966 |
         {
82 | 9966 |
             this.steps = new LinkedList();
83 | 9966 |
         }
84 |  |
85 |  |
         public void addStep(Step step)
86 |  |
         {
87 | 15864 |
             getSteps().add(step);
88 | 15864 |
         }
89 |  |
90 |  |
         public List getSteps()
91 |  |
         {
92 | 68850 |
             return this.steps;
93 |  |
         }
94 |  |
95 |  |
         public Expr simplify()
96 |  |
         {
97 | 9642 |
             Iterator stepIter = getSteps().iterator();
98 | 9642 |
             Step eachStep = null;
99 | 25284 |
             while (stepIter.hasNext())
100 |  |
             {
101 | 15642 |
                 eachStep = (Step) stepIter.next();
102 | 15642 |
                 eachStep.simplify();
103 |  |
             }
104 | 9642 |
             return this;
105 |  |
         }
106 |  |
107 |  |
         public String getText()
108 |  |
         {
109 | 36 |
             StringBuffer buf = new StringBuffer();
110 | 36 |
             Iterator stepIter = getSteps().iterator();
111 | 108 |
             while (stepIter.hasNext())
112 |  |
             {
113 | 72 |
                 buf.append(((Step) stepIter.next()).getText());
114 | 72 |
                 if (stepIter.hasNext())
115 |  |
                 {
116 | 36 |
                     buf.append("/");
117 |  |
                 }
118 |  |
             }
119 | 36 |
             return buf.toString();
120 |  |
         }
121 |  |
122 |  |
         public String toString()
123 |  |
         {
124 | 6 |
             StringBuffer buf = new StringBuffer();
125 | 6 |
             Iterator stepIter = getSteps().iterator();
126 | 18 |
             while (stepIter.hasNext())
127 |  |
             {
128 | 12 |
                 buf.append(stepIter.next().toString());
129 | 12 |
                 if (stepIter.hasNext())
130 |  |
                 {
131 | 6 |
                     buf.append("/");
132 |  |
                 }
133 |  |
             }
134 | 6 |
             return buf.toString();
135 |  |
         }
136 |  |
137 |  |
         public boolean isAbsolute()
138 |  |
         {
139 | 132 |
             return false;
140 |  |
         }
141 |  |
142 |  |
         public Object evaluate(Context context) throws JaxenException
143 |  |
         {
144 | 21582 |
             List nodeSet = context.getNodeSet();
145 | 21582 |
             List contextNodeSet = new ArrayList(nodeSet.size());
146 | 21582 |
             contextNodeSet.addAll(nodeSet);
147 | 21582 |
             ContextSupport support = context.getContextSupport();
148 | 21582 |
             Context stepContext = new Context(support);
149 | 21582 |
             Iterator stepIter = getSteps().iterator();
150 | 50178 |
             while ( stepIter.hasNext() )
151 |  |
             {
152 | 28614 |
                 Step eachStep = (Step) stepIter.next();
153 | 28614 |
                 stepContext.setNodeSet(contextNodeSet);
154 | 28614 |
                 contextNodeSet = eachStep.evaluate(stepContext);
155 |  |
                 // now we need to reverse the list if this is a reverse axis
156 | 28596 |
                 if (isReverseAxis(eachStep)) {
157 | 660 |
                     Collections.reverse(contextNodeSet);
158 |  |
                 }
159 |  |
             }
160 |  |
161 | 21564 |
             if (getSteps().size() > 1) {
162 | 5472 |
                 Collections.sort(contextNodeSet, new NodeComparator(support.getNavigator()));
163 |  |
             }
164 |  |
165 | 21564 |
             return contextNodeSet;
166 |  |
         }
167 |  |
168 |  |
         private boolean isReverseAxis(Step step) {
169 |  |
170 | 28596 |
             int axis = step.getAxis();
171 | 28596 |
             return axis == org.jaxen.saxpath.Axis.PRECEDING
172 |  |
               || axis == org.jaxen.saxpath.Axis.PRECEDING_SIBLING
173 |  |
               || axis == org.jaxen.saxpath.Axis.ANCESTOR
174 |  |
               || axis == org.jaxen.saxpath.Axis.ANCESTOR_OR_SELF;
175 |  |
         }
176 |  |
177 |  |
     }
178 |  |