View Javadoc

1   /*
2    * $Header: /home/projects/jaxen/scm/jaxen/src/java/main/org/jaxen/expr/DefaultStep.java,v 1.17 2005/04/20 22:43:27 elharo Exp $
3    * $Revision: 1.17 $
4    * $Date: 2005/04/20 22:43:27 $
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: DefaultStep.java,v 1.17 2005/04/20 22:43:27 elharo Exp $
60   */
61  package org.jaxen.expr;
62  
63  import java.util.ArrayList;
64  import java.util.Iterator;
65  import java.util.List;
66  
67  import org.jaxen.Context;
68  import org.jaxen.ContextSupport;
69  import org.jaxen.JaxenException;
70  import org.jaxen.UnsupportedAxisException;
71  import org.jaxen.expr.iter.IterableAxis;
72  import org.jaxen.saxpath.Axis;
73  
74  public abstract class DefaultStep implements Step
75  {
76      private IterableAxis axis;
77      private PredicateSet predicates;
78  
79      public DefaultStep(IterableAxis axis, PredicateSet predicates)
80      {
81          this.axis = axis;
82          this.predicates = predicates;
83      }
84  
85      public void addPredicate(Predicate predicate)
86      {
87          this.predicates.addPredicate(predicate);
88      }
89  
90      public List getPredicates()
91      {
92          return this.predicates.getPredicates();
93      }
94  
95      public PredicateSet getPredicateSet()
96      {
97          return this.predicates;
98      }
99  
100     public int getAxis()
101     {
102         return this.axis.value();
103     }
104 
105     public IterableAxis getIterableAxis()
106     {
107         return this.axis;
108     }
109 
110     public String getAxisName()
111     {
112         return Axis.lookup(getAxis());
113     }
114 
115     public String getText()
116     {
117         return this.predicates.getText();
118     }
119 
120     public String toString()
121     {
122         return getIterableAxis() + " " + super.toString();
123     }
124 
125     public void simplify()
126     {
127         this.predicates.simplify();
128     }
129 
130     public Iterator axisIterator(Object contextNode, ContextSupport support)
131         throws UnsupportedAxisException
132     {
133         return getIterableAxis().iterator(contextNode, support);
134     }
135 
136     public List evaluate(final Context context) throws JaxenException
137     {
138         final List contextNodeSet  = context.getNodeSet();
139         final IdentitySet unique = new IdentitySet();
140         final int contextSize = contextNodeSet.size();
141 
142         // ???? try linked lists instead?
143         // ???? initial size for these?
144         final ArrayList interimSet = new ArrayList();
145         final ArrayList newNodeSet = new ArrayList();
146         final ContextSupport support = context.getContextSupport();
147             
148         // ???? use iterator instead????
149         for ( int i = 0 ; i < contextSize ; ++i )
150         {
151             Object eachContextNode = contextNodeSet.get( i );
152 
153             Iterator axisNodeIter = axis.iterator(eachContextNode, support);
154 
155             while ( axisNodeIter.hasNext() )
156             {
157                 Object eachAxisNode = axisNodeIter.next();
158                 if ( ! unique.contains( eachAxisNode ) )
159                 {
160                     if ( matches( eachAxisNode, support ) )
161                     {
162                         unique.add( eachAxisNode );
163                         interimSet.add( eachAxisNode );
164                     }
165                 }
166             }
167             newNodeSet.addAll(getPredicateSet().evaluatePredicates(
168                               interimSet, support ));
169             interimSet.clear();
170         }
171         return newNodeSet;
172     }
173 
174 }