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: KeyDeclaration.java 468643 2006-10-28 06:56:03Z minchau $
20 */
21package org.apache.xalan.templates;
22
23import org.apache.xml.utils.QName;
24import org.apache.xpath.XPath;
25
26/**
27 * Holds the attribute declarations for the xsl:keys element.
28 * A stylesheet declares a set of keys for each document using
29 * the xsl:key element. When this set of keys contains a member
30 * with node x, name y and value z, we say that node x has a key
31 * with name y and value z.
32 * @see <a href="http://www.w3.org/TR/xslt#key">key in XSLT Specification</a>
33 * @xsl.usage internal
34 */
35public class KeyDeclaration extends ElemTemplateElement
36{
37    static final long serialVersionUID = 7724030248631137918L;
38
39  /**
40   * Constructs a new element representing the xsl:key.  The parameters
41   * are needed to prioritize this key element as part of the recomposing
42   * process.  For this element, they are not automatically created
43   * because the element is never added on to the stylesheet parent.
44   */
45  public KeyDeclaration(Stylesheet parentNode, int docOrderNumber)
46  {
47    m_parentNode = parentNode;
48    setUid(docOrderNumber);
49  }
50
51  /**
52   * The "name" property.
53   * @serial
54   */
55  private QName m_name;
56
57  /**
58   * Set the "name" attribute.
59   * The name attribute specifies the name of the key. The value
60   * of the name attribute is a QName, which is expanded as
61   * described in [2.4 Qualified Names].
62   *
63   * @param name Value to set for the "name" attribute.
64   */
65  public void setName(QName name)
66  {
67    m_name = name;
68  }
69
70  /**
71   * Get the "name" attribute.
72   * The name attribute specifies the name of the key. The value
73   * of the name attribute is a QName, which is expanded as
74   * described in [2.4 Qualified Names].
75   *
76   * @return Value of the "name" attribute.
77   */
78  public QName getName()
79  {
80    return m_name;
81  }
82
83  /**
84   * Return the node name.
85   *
86   * @return the element's name
87   */
88  public String getNodeName()
89  {
90    return Constants.ELEMNAME_KEY_STRING;
91  }
92
93
94  /**
95   * The "match" attribute.
96   * @serial
97   */
98  private XPath m_matchPattern = null;
99
100  /**
101   * Set the "match" attribute.
102   * The match attribute is a Pattern; an xsl:key element gives
103   * information about the keys of any node that matches the
104   * pattern specified in the match attribute.
105   * @see <a href="http://www.w3.org/TR/xslt#patterns">patterns in XSLT Specification</a>
106   *
107   * @param v Value to set for the "match" attribute.
108   */
109  public void setMatch(XPath v)
110  {
111    m_matchPattern = v;
112  }
113
114  /**
115   * Get the "match" attribute.
116   * The match attribute is a Pattern; an xsl:key element gives
117   * information about the keys of any node that matches the
118   * pattern specified in the match attribute.
119   * @see <a href="http://www.w3.org/TR/xslt#patterns">patterns in XSLT Specification</a>
120   *
121   * @return Value of the "match" attribute.
122   */
123  public XPath getMatch()
124  {
125    return m_matchPattern;
126  }
127
128  /**
129   * The "use" attribute.
130   * @serial
131   */
132  private XPath m_use;
133
134  /**
135   * Set the "use" attribute.
136   * The use attribute is an expression specifying the values
137   * of the key; the expression is evaluated once for each node
138   * that matches the pattern.
139   *
140   * @param v Value to set for the "use" attribute.
141   */
142  public void setUse(XPath v)
143  {
144    m_use = v;
145  }
146
147  /**
148   * Get the "use" attribute.
149   * The use attribute is an expression specifying the values
150   * of the key; the expression is evaluated once for each node
151   * that matches the pattern.
152   *
153   * @return Value of the "use" attribute.
154   */
155  public XPath getUse()
156  {
157    return m_use;
158  }
159
160  /**
161   * Get an int constant identifying the type of element.
162   * @see org.apache.xalan.templates.Constants
163   *
164   * @return The token ID for this element
165   */
166  public int getXSLToken()
167  {
168    return Constants.ELEMNAME_KEY;
169  }
170
171  /**
172   * This function is called after everything else has been
173   * recomposed, and allows the template to set remaining
174   * values that may be based on some other property that
175   * depends on recomposition.
176   */
177  public void compose(StylesheetRoot sroot)
178    throws javax.xml.transform.TransformerException
179  {
180    super.compose(sroot);
181    java.util.Vector vnames = sroot.getComposeState().getVariableNames();
182    if(null != m_matchPattern)
183      m_matchPattern.fixupVariables(vnames, sroot.getComposeState().getGlobalsSize());
184    if(null != m_use)
185      m_use.fixupVariables(vnames, sroot.getComposeState().getGlobalsSize());
186  }
187
188  /**
189   * This function is called during recomposition to
190   * control how this element is composed.
191   * @param root The root stylesheet for this transformation.
192   */
193  public void recompose(StylesheetRoot root)
194  {
195    root.recomposeKeys(this);
196  }
197
198}
199