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: AVTPartXPath.java 468643 2006-10-28 06:56:03Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xalan.templates;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.FastStringBuffer;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPath;
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathContext;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathFactory;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.compiler.XPathParser;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.objects.XObject;
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Simple string part of a complex AVT.
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage internal
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class AVTPartXPath extends AVTPart
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static final long serialVersionUID = -4460373807550527675L;
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The XPath object contained in this part.
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private XPath m_xpath;
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This function is used to fixup variables from QNames to stack frame
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * indexes at stylesheet build time.
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param vars List of QNames that correspond to variables.  This list
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * should be searched backwards for the first qualified name that
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * corresponds to the variable reference qname.  The position of the
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * QName in the vector from the start of the vector will be its position
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * in the stack frame (but variables above the globalsTop value will need
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * to be offset to the current stack frame).
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void fixupVariables(java.util.Vector vars, int globalsSize)
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_xpath.fixupVariables(vars, globalsSize);
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell if this expression or it's subexpressions can traverse outside
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the current subtree.
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if traversal outside the context node's subtree can occur.
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   public boolean canTraverseOutsideSubtree()
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   {
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_xpath.getExpression().canTraverseOutsideSubtree();
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   }
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct a simple AVT part.
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xpath Xpath section of AVT
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public AVTPartXPath(XPath xpath)
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_xpath = xpath;
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct a simple AVT part.
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param val A pure string section of an AVT.
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nsNode An object which can be used to determine the
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Namespace Name (URI) for any Namespace prefix used in the XPath.
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Usually this is based on the context where the XPath was specified,
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * such as a node within a Stylesheet.
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xpathProcessor XPath parser
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param factory XPath factory
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param liaison An XPathContext object, providing infomation specific
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * to this invocation and this thread. Maintains SAX output state,
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * variables, error handler and so on, so the transformation/XPath
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * object itself can be simultaneously invoked from multiple threads.
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * TODO: Fix or remove this unused c'tor.
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public AVTPartXPath(
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          String val, org.apache.xml.utils.PrefixResolver nsNode,
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          XPathParser xpathProcessor, XPathFactory factory,
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          XPathContext liaison)
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws javax.xml.transform.TransformerException
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_xpath = new XPath(val, null, nsNode, XPath.SELECT, liaison.getErrorListener());
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the AVT part as the original string.
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the AVT part as the original string.
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getSimpleString()
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return "{" + m_xpath.getPatternString() + "}";
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Write the value into the buffer.
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt An XPathContext object, providing infomation specific
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * to this invocation and this thread. Maintains SAX state, variables,
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * error handler and  so on, so the transformation/XPath object itself
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * can be simultaneously invoked from multiple threads.
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param buf Buffer to write into.
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param context The current source tree context.
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nsNode The current namespace context (stylesheet tree context).
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void evaluate(
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          XPathContext xctxt, FastStringBuffer buf, int context, org.apache.xml.utils.PrefixResolver nsNode)
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws javax.xml.transform.TransformerException
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XObject xobj = m_xpath.execute(xctxt, context, nsNode);
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != xobj)
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xobj.appendToFsb(buf);
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see XSLTVisitable#callVisitors(XSLTVisitor)
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void callVisitors(XSLTVisitor visitor)
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	m_xpath.getExpression().callVisitors(m_xpath, visitor);
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
151