OSDN Git Service

original
[gb-231r1-is01/Gingerbread_2.3.3_r1_IS01.git] / libcore / luni / src / main / java / org / apache / xpath / axes / HasPositionalPredChecker.java
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements. See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership. The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the  "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 /*
19  * $Id: HasPositionalPredChecker.java 468655 2006-10-28 07:12:06Z minchau $
20  */
21 package org.apache.xpath.axes;
22
23 import org.apache.xpath.Expression;
24 import org.apache.xpath.ExpressionOwner;
25 import org.apache.xpath.XPathVisitor;
26 import org.apache.xpath.functions.FuncLast;
27 import org.apache.xpath.functions.FuncPosition;
28 import org.apache.xpath.functions.Function;
29 import org.apache.xpath.objects.XNumber;
30 import org.apache.xpath.operations.Div;
31 import org.apache.xpath.operations.Minus;
32 import org.apache.xpath.operations.Mod;
33 import org.apache.xpath.operations.Mult;
34 import org.apache.xpath.operations.Plus;
35 import org.apache.xpath.operations.Quo;
36 import org.apache.xpath.operations.Variable;
37
38 public class HasPositionalPredChecker extends XPathVisitor
39 {
40         private boolean m_hasPositionalPred = false;
41         private int m_predDepth = 0;
42         
43         /**
44          * Process the LocPathIterator to see if it contains variables 
45          * or functions that may make it context dependent.
46          * @param path LocPathIterator that is assumed to be absolute, but needs checking.
47          * @return true if the path is confirmed to be absolute, false if it 
48          * may contain context dependencies.
49          */
50         public static boolean check(LocPathIterator path)
51         {
52                 HasPositionalPredChecker hppc = new HasPositionalPredChecker();
53                 path.callVisitors(null, hppc);
54                 return hppc.m_hasPositionalPred;
55         }
56         
57         /**
58          * Visit a function.
59          * @param owner The owner of the expression, to which the expression can 
60          *              be reset if rewriting takes place.
61          * @param func The function reference object.
62          * @return true if the sub expressions should be traversed.
63          */
64         public boolean visitFunction(ExpressionOwner owner, Function func)
65         {
66                 if((func instanceof FuncPosition) ||
67                    (func instanceof FuncLast))
68                         m_hasPositionalPred = true;
69                 return true;
70         }
71         
72 //      /**
73 //       * Visit a variable reference.
74 //       * @param owner The owner of the expression, to which the expression can 
75 //       *              be reset if rewriting takes place.
76 //       * @param var The variable reference object.
77 //       * @return true if the sub expressions should be traversed.
78 //       */
79 //      public boolean visitVariableRef(ExpressionOwner owner, Variable var)
80 //      {
81 //              m_hasPositionalPred = true;
82 //              return true;
83 //      }
84         
85   /**
86    * Visit a predicate within a location path.  Note that there isn't a 
87    * proper unique component for predicates, and that the expression will 
88    * be called also for whatever type Expression is.
89    * 
90    * @param owner The owner of the expression, to which the expression can 
91    *              be reset if rewriting takes place.
92    * @param pred The predicate object.
93    * @return true if the sub expressions should be traversed.
94    */
95   public boolean visitPredicate(ExpressionOwner owner, Expression pred)
96   {
97     m_predDepth++;
98
99     if(m_predDepth == 1)
100     {
101       if((pred instanceof Variable) || 
102          (pred instanceof XNumber) ||
103          (pred instanceof Div) ||
104          (pred instanceof Plus) ||
105          (pred instanceof Minus) ||
106          (pred instanceof Mod) ||
107          (pred instanceof Quo) ||
108          (pred instanceof Mult) ||
109          (pred instanceof org.apache.xpath.operations.Number) ||
110          (pred instanceof Function))
111           m_hasPositionalPred = true;
112       else
113         pred.callVisitors(owner, this);
114     }
115
116     m_predDepth--;
117
118     // Don't go have the caller go any further down the subtree.
119     return false;
120   }
121
122
123 }
124