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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 * $Id: HasPositionalPredChecker.java 468655 2006-10-28 07:12:06Z minchau $
21 package org.apache.xpath.axes;
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;
38 public class HasPositionalPredChecker extends XPathVisitor
40 private boolean m_hasPositionalPred = false;
41 private int m_predDepth = 0;
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.
50 public static boolean check(LocPathIterator path)
52 HasPositionalPredChecker hppc = new HasPositionalPredChecker();
53 path.callVisitors(null, hppc);
54 return hppc.m_hasPositionalPred;
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.
64 public boolean visitFunction(ExpressionOwner owner, Function func)
66 if((func instanceof FuncPosition) ||
67 (func instanceof FuncLast))
68 m_hasPositionalPred = true;
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.
79 // public boolean visitVariableRef(ExpressionOwner owner, Variable var)
81 // m_hasPositionalPred = true;
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.
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.
95 public boolean visitPredicate(ExpressionOwner owner, Expression pred)
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;
113 pred.callVisitors(owner, this);
118 // Don't go have the caller go any further down the subtree.