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: ContextMatchStepPattern.java 468655 2006-10-28 07:12:06Z minchau $ 209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xpath.patterns; 229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.Axis; 249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTM; 259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMAxisTraverser; 269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMFilter; 279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathContext; 289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.axes.WalkerFactory; 299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.objects.XObject; 309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/** 319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Special context node pattern matcher. 329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class ContextMatchStepPattern extends StepPattern 349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{ 359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson static final long serialVersionUID = -1888092779313211942L; 369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Construct a ContextMatchStepPattern. 399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ContextMatchStepPattern(int axis, int paxis) 429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super(DTMFilter.SHOW_ALL, axis, paxis); 449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Execute this pattern step, including predicates. 489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param xctxt XPath runtime context. 519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return {@link org.apache.xpath.patterns.NodeTest#SCORE_NODETEST}, 539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_NONE}, 549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_NSWILD}, 559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_QNAME}, or 569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_OTHER}. 579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws javax.xml.transform.TransformerException 599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public XObject execute(XPathContext xctxt) 619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws javax.xml.transform.TransformerException 629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (xctxt.getIteratorRoot() == xctxt.getCurrentNode()) 659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return getStaticScore(); 669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return this.SCORE_NONE; 689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Execute the match pattern step relative to another step. 729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param xctxt The XPath runtime context. 759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * NEEDSDOC @param prevStep 769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return {@link org.apache.xpath.patterns.NodeTest#SCORE_NODETEST}, 789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_NONE}, 799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_NSWILD}, 809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_QNAME}, or 819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_OTHER}. 829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws javax.xml.transform.TransformerException 849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public XObject executeRelativePathPattern( 869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XPathContext xctxt, StepPattern prevStep) 879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws javax.xml.transform.TransformerException 889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XObject score = NodeTest.SCORE_NONE; 919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int context = xctxt.getCurrentNode(); 929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson DTM dtm = xctxt.getDTM(context); 939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != dtm) 959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int predContext = xctxt.getCurrentNode(); 979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson DTMAxisTraverser traverser; 989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int axis = m_axis; 1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean needToTraverseAttrs = WalkerFactory.isDownwardAxisOfMany(axis); 1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean iterRootIsAttr = (dtm.getNodeType(xctxt.getIteratorRoot()) 1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson == DTM.ATTRIBUTE_NODE); 1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if((Axis.PRECEDING == axis) && iterRootIsAttr) 1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson axis = Axis.PRECEDINGANDANCESTOR; 1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson traverser = dtm.getAxisTraverser(axis); 1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int relative = traverser.first(context); DTM.NULL != relative; 1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson relative = traverser.next(context, relative)) 1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.pushCurrentNode(relative); 1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson score = execute(xctxt); 1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (score != NodeTest.SCORE_NONE) 1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson //score = executePredicates( xctxt, prevStep, SCORE_OTHER, 1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // predContext, relative); 1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (executePredicates(xctxt, dtm, context)) 1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return score; 1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson score = NodeTest.SCORE_NONE; 1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(needToTraverseAttrs && iterRootIsAttr 1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson && (DTM.ELEMENT_NODE == dtm.getNodeType(relative))) 1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int xaxis = Axis.ATTRIBUTE; 1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < 2; i++) 1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson DTMAxisTraverser atraverser = dtm.getAxisTraverser(xaxis); 1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int arelative = atraverser.first(relative); 1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson DTM.NULL != arelative; 1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson arelative = atraverser.next(relative, arelative)) 1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.pushCurrentNode(arelative); 1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson score = execute(xctxt); 1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (score != NodeTest.SCORE_NONE) 1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson //score = executePredicates( xctxt, prevStep, SCORE_OTHER, 1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // predContext, arelative); 1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (score != NodeTest.SCORE_NONE) 1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return score; 1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson finally 1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.popCurrentNode(); 1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xaxis = Axis.NAMESPACE; 1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson finally 1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.popCurrentNode(); 1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return score; 1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson} 180