14c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/*
24c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one
34c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * or more contributor license agreements. See the NOTICE file
44c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * distributed with this work for additional information
54c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * regarding copyright ownership. The ASF licenses this file
64c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * to you under the Apache License, Version 2.0 (the  "License");
74c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * you may not use this file except in compliance with the License.
84c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * You may obtain a copy of the License at
94c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson *
104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson *
124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Unless required by applicable law or agreed to in writing, software
134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * See the License for the specific language governing permissions and
164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * limitations under the License.
174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/*
194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * $Id: AVTPartXPath.java 468643 2006-10-28 06:56:03Z minchau $
204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonpackage org.apache.xalan.templates;
224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xml.utils.FastStringBuffer;
244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xpath.XPath;
254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xpath.XPathContext;
264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xpath.XPathFactory;
274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xpath.compiler.XPathParser;
284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xpath.objects.XObject;
294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/**
314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Simple string part of a complex AVT.
324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @xsl.usage internal
334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonpublic class AVTPartXPath extends AVTPart
354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson{
364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    static final long serialVersionUID = -4460373807550527675L;
374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * The XPath object contained in this part.
404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @serial
414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  private XPath m_xpath;
434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * This function is used to fixup variables from QNames to stack frame
464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * indexes at stylesheet build time.
474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param vars List of QNames that correspond to variables.  This list
484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * should be searched backwards for the first qualified name that
494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * corresponds to the variable reference qname.  The position of the
504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * QName in the vector from the start of the vector will be its position
514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * in the stack frame (but variables above the globalsTop value will need
524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * to be offset to the current stack frame).
534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public void fixupVariables(java.util.Vector vars, int globalsSize)
554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_xpath.fixupVariables(vars, globalsSize);
574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Tell if this expression or it's subexpressions can traverse outside
614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * the current subtree.
624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return true if traversal outside the context node's subtree can occur.
644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   public boolean canTraverseOutsideSubtree()
664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   {
674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return m_xpath.getExpression().canTraverseOutsideSubtree();
684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   }
694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Construct a simple AVT part.
724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param xpath Xpath section of AVT
744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public AVTPartXPath(XPath xpath)
764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_xpath = xpath;
784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Construct a simple AVT part.
824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param val A pure string section of an AVT.
844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param nsNode An object which can be used to determine the
854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Namespace Name (URI) for any Namespace prefix used in the XPath.
864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Usually this is based on the context where the XPath was specified,
874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * such as a node within a Stylesheet.
884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param xpathProcessor XPath parser
894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param factory XPath factory
904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param liaison An XPathContext object, providing infomation specific
914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * to this invocation and this thread. Maintains SAX output state,
924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * variables, error handler and so on, so the transformation/XPath
934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * object itself can be simultaneously invoked from multiple threads.
944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @throws javax.xml.transform.TransformerException
964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * TODO: Fix or remove this unused c'tor.
974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public AVTPartXPath(
994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          String val, org.apache.xml.utils.PrefixResolver nsNode,
1004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          XPathParser xpathProcessor, XPathFactory factory,
1014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          XPathContext liaison)
1024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            throws javax.xml.transform.TransformerException
1034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
1044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_xpath = new XPath(val, null, nsNode, XPath.SELECT, liaison.getErrorListener());
1054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
1064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
1084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Get the AVT part as the original string.
1094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
1104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return the AVT part as the original string.
1114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
1124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public String getSimpleString()
1134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
1144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return "{" + m_xpath.getPatternString() + "}";
1154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
1164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
1184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Write the value into the buffer.
1194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
1204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param xctxt An XPathContext object, providing infomation specific
1214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * to this invocation and this thread. Maintains SAX state, variables,
1224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * error handler and  so on, so the transformation/XPath object itself
1234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * can be simultaneously invoked from multiple threads.
1244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param buf Buffer to write into.
1254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param context The current source tree context.
1264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param nsNode The current namespace context (stylesheet tree context).
1274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
1284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @throws javax.xml.transform.TransformerException
1294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
1304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public void evaluate(
1314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          XPathContext xctxt, FastStringBuffer buf, int context, org.apache.xml.utils.PrefixResolver nsNode)
1324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            throws javax.xml.transform.TransformerException
1334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
1344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    XObject xobj = m_xpath.execute(xctxt, context, nsNode);
1364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    if (null != xobj)
1384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
1394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      xobj.appendToFsb(buf);
1404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
1414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
1424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
1444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @see XSLTVisitable#callVisitors(XSLTVisitor)
1454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
1464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public void callVisitors(XSLTVisitor visitor)
1474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
1484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  	m_xpath.getExpression().callVisitors(m_xpath, visitor);
1494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
1504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson}
151