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   * 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 1128 2006-02-05 21:49:04Z elharo $
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      {
71          this.axis = axis;
72          this.predicates = predicates;
73      }
74  
75      public void addPredicate(Predicate predicate)
76      {
77          this.predicates.addPredicate(predicate);
78      }
79  
80      public List getPredicates()
81      {
82          return this.predicates.getPredicates();
83      }
84  
85      public PredicateSet getPredicateSet()
86      {
87          return this.predicates;
88      }
89  
90      public int getAxis()
91      {
92          return this.axis.value();
93      }
94  
95      public IterableAxis getIterableAxis()
96      {
97          return this.axis;
98      }
99  
100     public String getAxisName()
101     {
102         return Axis.lookup(getAxis());
103     }
104 
105     public String getText()
106     {
107         return this.predicates.getText();
108     }
109 
110     public String toString()
111     {
112         return getIterableAxis() + " " + super.toString();
113     }
114 
115     public void simplify()
116     {
117         this.predicates.simplify();
118     }
119 
120     public Iterator axisIterator(Object contextNode, ContextSupport support)
121         throws UnsupportedAxisException
122     {
123         return getIterableAxis().iterator(contextNode, support);
124     }
125 
126     public List evaluate(final Context context) throws JaxenException
127     {
128         final List contextNodeSet  = context.getNodeSet();
129         final IdentitySet unique = new IdentitySet();
130         final int contextSize = contextNodeSet.size();
131 
132         // ???? try linked lists instead?
133         // ???? initial size for these?
134         final ArrayList interimSet = new ArrayList();
135         final ArrayList newNodeSet = new ArrayList();
136         final ContextSupport support = context.getContextSupport();
137             
138         // ???? use iterator instead
139         for ( int i = 0 ; i < contextSize ; ++i )
140         {
141             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             Iterator axisNodeIter = axis.iterator(eachContextNode, support);
152             while ( axisNodeIter.hasNext() )
153             {
154                 Object eachAxisNode = axisNodeIter.next();
155                 if ( ! unique.contains( eachAxisNode ) )
156                 {
157                     if ( matches( eachAxisNode, support ) )
158                     {
159                         unique.add( eachAxisNode );
160                         interimSet.add( eachAxisNode );
161                     }
162                 }
163             }
164             newNodeSet.addAll(getPredicateSet().evaluatePredicates(
165                               interimSet, support ));
166             interimSet.clear();
167         }
168         return newNodeSet;
169     }
170 
171 }