19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one
39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or more contributor license agreements. See the NOTICE file
49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed with this work for additional information
59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * regarding copyright ownership. The ASF licenses this file
69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to you under the Apache License, Version 2.0 (the  "License");
79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * you may not use this file except in compliance with the License.
89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * You may obtain a copy of the License at
99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Unless required by applicable law or agreed to in writing, software
139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * See the License for the specific language governing permissions and
169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * limitations under the License.
179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * $Id: HasPositionalPredChecker.java 468655 2006-10-28 07:12:06Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xpath.axes;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.Expression;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.ExpressionOwner;
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathVisitor;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.functions.FuncLast;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.functions.FuncPosition;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.functions.Function;
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.objects.XNumber;
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.operations.Div;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.operations.Minus;
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.operations.Mod;
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.operations.Mult;
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.operations.Plus;
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.operations.Quo;
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.operations.Variable;
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class HasPositionalPredChecker extends XPathVisitor
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	private boolean m_hasPositionalPred = false;
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	private int m_predDepth = 0;
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * Process the LocPathIterator to see if it contains variables
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * or functions that may make it context dependent.
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * @param path LocPathIterator that is assumed to be absolute, but needs checking.
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * @return true if the path is confirmed to be absolute, false if it
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * may contain context dependencies.
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 */
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	public static boolean check(LocPathIterator path)
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	{
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		HasPositionalPredChecker hppc = new HasPositionalPredChecker();
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		path.callVisitors(null, hppc);
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		return hppc.m_hasPositionalPred;
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	}
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * Visit a function.
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * @param owner The owner of the expression, to which the expression can
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 *              be reset if rewriting takes place.
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * @param func The function reference object.
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * @return true if the sub expressions should be traversed.
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 */
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	public boolean visitFunction(ExpressionOwner owner, Function func)
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	{
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		if((func instanceof FuncPosition) ||
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		   (func instanceof FuncLast))
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			m_hasPositionalPred = true;
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		return true;
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	}
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//	/**
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//	 * Visit a variable reference.
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//	 * @param owner The owner of the expression, to which the expression can
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//	 *              be reset if rewriting takes place.
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//	 * @param var The variable reference object.
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//	 * @return true if the sub expressions should be traversed.
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//	 */
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//	public boolean visitVariableRef(ExpressionOwner owner, Variable var)
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//	{
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//		m_hasPositionalPred = true;
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//		return true;
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//	}
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Visit a predicate within a location path.  Note that there isn't a
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * proper unique component for predicates, and that the expression will
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * be called also for whatever type Expression is.
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param owner The owner of the expression, to which the expression can
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *              be reset if rewriting takes place.
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param pred The predicate object.
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if the sub expressions should be traversed.
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean visitPredicate(ExpressionOwner owner, Expression pred)
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_predDepth++;
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(m_predDepth == 1)
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if((pred instanceof Variable) ||
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         (pred instanceof XNumber) ||
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         (pred instanceof Div) ||
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         (pred instanceof Plus) ||
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         (pred instanceof Minus) ||
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         (pred instanceof Mod) ||
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         (pred instanceof Quo) ||
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         (pred instanceof Mult) ||
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         (pred instanceof org.apache.xpath.operations.Number) ||
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         (pred instanceof Function))
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_hasPositionalPred = true;
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      	pred.callVisitors(owner, this);
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_predDepth--;
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Don't go have the caller go any further down the subtree.
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return false;
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
125