1/*
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
9 *
10 *     http://www.apache.org/licenses/LICENSE-2.0
11 *
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.
17 */
18/*
19 * $Id: AVTPartXPath.java 468643 2006-10-28 06:56:03Z minchau $
20 */
21package org.apache.xalan.templates;
22
23import org.apache.xml.utils.FastStringBuffer;
24import org.apache.xpath.XPath;
25import org.apache.xpath.XPathContext;
26import org.apache.xpath.XPathFactory;
27import org.apache.xpath.compiler.XPathParser;
28import org.apache.xpath.objects.XObject;
29
30/**
31 * Simple string part of a complex AVT.
32 * @xsl.usage internal
33 */
34public class AVTPartXPath extends AVTPart
35{
36    static final long serialVersionUID = -4460373807550527675L;
37
38  /**
39   * The XPath object contained in this part.
40   * @serial
41   */
42  private XPath m_xpath;
43
44  /**
45   * This function is used to fixup variables from QNames to stack frame
46   * indexes at stylesheet build time.
47   * @param vars List of QNames that correspond to variables.  This list
48   * should be searched backwards for the first qualified name that
49   * corresponds to the variable reference qname.  The position of the
50   * QName in the vector from the start of the vector will be its position
51   * in the stack frame (but variables above the globalsTop value will need
52   * to be offset to the current stack frame).
53   */
54  public void fixupVariables(java.util.Vector vars, int globalsSize)
55  {
56    m_xpath.fixupVariables(vars, globalsSize);
57  }
58
59  /**
60   * Tell if this expression or it's subexpressions can traverse outside
61   * the current subtree.
62   *
63   * @return true if traversal outside the context node's subtree can occur.
64   */
65   public boolean canTraverseOutsideSubtree()
66   {
67    return m_xpath.getExpression().canTraverseOutsideSubtree();
68   }
69
70  /**
71   * Construct a simple AVT part.
72   *
73   * @param xpath Xpath section of AVT
74   */
75  public AVTPartXPath(XPath xpath)
76  {
77    m_xpath = xpath;
78  }
79
80  /**
81   * Construct a simple AVT part.
82   *
83   * @param val A pure string section of an AVT.
84   * @param nsNode An object which can be used to determine the
85   * Namespace Name (URI) for any Namespace prefix used in the XPath.
86   * Usually this is based on the context where the XPath was specified,
87   * such as a node within a Stylesheet.
88   * @param xpathProcessor XPath parser
89   * @param factory XPath factory
90   * @param liaison An XPathContext object, providing infomation specific
91   * to this invocation and this thread. Maintains SAX output state,
92   * variables, error handler and so on, so the transformation/XPath
93   * object itself can be simultaneously invoked from multiple threads.
94   *
95   * @throws javax.xml.transform.TransformerException
96   * TODO: Fix or remove this unused c'tor.
97   */
98  public AVTPartXPath(
99          String val, org.apache.xml.utils.PrefixResolver nsNode,
100          XPathParser xpathProcessor, XPathFactory factory,
101          XPathContext liaison)
102            throws javax.xml.transform.TransformerException
103  {
104    m_xpath = new XPath(val, null, nsNode, XPath.SELECT, liaison.getErrorListener());
105  }
106
107  /**
108   * Get the AVT part as the original string.
109   *
110   * @return the AVT part as the original string.
111   */
112  public String getSimpleString()
113  {
114    return "{" + m_xpath.getPatternString() + "}";
115  }
116
117  /**
118   * Write the value into the buffer.
119   *
120   * @param xctxt An XPathContext object, providing infomation specific
121   * to this invocation and this thread. Maintains SAX state, variables,
122   * error handler and  so on, so the transformation/XPath object itself
123   * can be simultaneously invoked from multiple threads.
124   * @param buf Buffer to write into.
125   * @param context The current source tree context.
126   * @param nsNode The current namespace context (stylesheet tree context).
127   *
128   * @throws javax.xml.transform.TransformerException
129   */
130  public void evaluate(
131          XPathContext xctxt, FastStringBuffer buf, int context, org.apache.xml.utils.PrefixResolver nsNode)
132            throws javax.xml.transform.TransformerException
133  {
134
135    XObject xobj = m_xpath.execute(xctxt, context, nsNode);
136
137    if (null != xobj)
138    {
139      xobj.appendToFsb(buf);
140    }
141  }
142
143  /**
144   * @see XSLTVisitable#callVisitors(XSLTVisitor)
145   */
146  public void callVisitors(XSLTVisitor visitor)
147  {
148  	m_xpath.getExpression().callVisitors(m_xpath, visitor);
149  }
150}
151