View Javadoc

1   /*
2    * $Header$
3    * $Revision: 1128 $
4    * $Date: 2006-02-05 13:49:04 -0800 (Sun, 05 Feb 2006) $
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 1128 2006-02-05 21:49:04Z elharo $
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      {
69          this.steps = new LinkedList();
70      }
71  
72      public void addStep(Step step)
73      {
74          getSteps().add(step);
75      }
76  
77      public List getSteps()
78      {
79          return this.steps;
80      }
81  
82      public Expr simplify()
83      {
84          Iterator stepIter = getSteps().iterator();
85          Step eachStep = null;
86          while (stepIter.hasNext())
87          {
88              eachStep = (Step) stepIter.next();
89              eachStep.simplify();
90          }
91          return this;
92      }
93  
94      public String getText()
95      {
96          StringBuffer buf = new StringBuffer();
97          Iterator stepIter = getSteps().iterator();
98          while (stepIter.hasNext())
99          {
100             buf.append(((Step) stepIter.next()).getText());
101             if (stepIter.hasNext())
102             {
103                 buf.append("/");
104             }
105         }
106         return buf.toString();
107     }
108 
109     public String toString()
110     {
111         StringBuffer buf = new StringBuffer();
112         Iterator stepIter = getSteps().iterator();
113         while (stepIter.hasNext())
114         {
115             buf.append(stepIter.next().toString());
116             if (stepIter.hasNext())
117             {
118                 buf.append("/");
119             }
120         }
121         return buf.toString();
122     }
123 
124     public boolean isAbsolute()
125     {
126         return false;
127     }
128 
129     public Object evaluate(Context context) throws JaxenException
130     {
131         List nodeSet = context.getNodeSet();
132         List contextNodeSet = new ArrayList(nodeSet);
133         ContextSupport support = context.getContextSupport();
134         Context stepContext = new Context(support);
135         Iterator stepIter = getSteps().iterator();
136         while ( stepIter.hasNext() )
137         {
138             Step eachStep = (Step) stepIter.next();
139             stepContext.setNodeSet(contextNodeSet);
140             contextNodeSet = eachStep.evaluate(stepContext);
141             // now we need to reverse the list if this is a reverse axis
142             if (isReverseAxis(eachStep)) {
143                 Collections.reverse(contextNodeSet);
144             }
145         }
146         
147         if (getSteps().size() > 1) {
148             Collections.sort(contextNodeSet, new NodeComparator(support.getNavigator()));
149         }
150         
151         return contextNodeSet;
152     }
153 
154     private boolean isReverseAxis(Step step) {
155 
156         int axis = step.getAxis();
157         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