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: ElemAttributeSet.java 468643 2006-10-28 06:56:03Z minchau $
204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonpackage org.apache.xalan.templates;
224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport javax.xml.transform.TransformerException;
244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.res.XSLMessages;
264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.res.XSLTErrorResources;
274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.transformer.TransformerImpl;
284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xml.utils.QName;
294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/**
314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Implement xsl:attribute-set.
324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * <pre>
334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * &amp;!ELEMENT xsl:attribute-set (xsl:attribute)*>
344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * &amp;!ATTLIST xsl:attribute-set
354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson *   name %qname; #REQUIRED
364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson *   use-attribute-sets %qnames; #IMPLIED
374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * &amp;
384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * </pre>
394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#attribute-sets">attribute-sets in XSLT Specification</a>
404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @xsl.usage advanced
414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonpublic class ElemAttributeSet extends ElemUse
434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson{
444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    static final long serialVersionUID = -426740318278164496L;
454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * The name attribute specifies the name of the attribute set.
484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @serial
494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public QName m_qname = null;
514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Set the "name" attribute.
544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * The name attribute specifies the name of the attribute set.
554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param name Name attribute to set
574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public void setName(QName name)
594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_qname = name;
614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Get the "name" attribute.
654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * The name attribute specifies the name of the attribute set.
664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return The name attribute of the attribute set
684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public QName getName()
704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return m_qname;
724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Get an int constant identifying the type of element.
764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @see org.apache.xalan.templates.Constants
774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return Token ID of the element
794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public int getXSLToken()
814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return Constants.ELEMNAME_DEFINEATTRIBUTESET;
834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Return the node name.
874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return The name of this element
894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public String getNodeName()
914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return Constants.ELEMNAME_ATTRIBUTESET_STRING;
934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Apply a set of attributes to the element.
974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param transformer non-null reference to the the current transform-time state.
994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
1004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @throws TransformerException
1014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
1024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public void execute(
1034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          TransformerImpl transformer)
1044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            throws TransformerException
1054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
1064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    if (transformer.isRecursiveAttrSet(this))
1084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
1094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      throw new TransformerException(
1104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        XSLMessages.createMessage(
1114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          XSLTErrorResources.ER_XSLATTRSET_USED_ITSELF,
1124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          new Object[]{ m_qname.getLocalPart() }));  //"xsl:attribute-set '"+m_qname.m_localpart+
1134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
1144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    transformer.pushElemAttributeSet(this);
1164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    super.execute(transformer);
1174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    ElemAttribute attr = (ElemAttribute) getFirstChildElem();
1194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    while (null != attr)
1214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
1224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      attr.execute(transformer);
1234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      attr = (ElemAttribute) attr.getNextSiblingElem();
1254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
1264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    transformer.popElemAttributeSet();
1284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
1294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
1314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Add a child to the child list.
1324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * <!ELEMENT xsl:attribute-set (xsl:attribute)*>
1334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * <!ATTLIST xsl:attribute-set
1344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *   name %qname; #REQUIRED
1354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *   use-attribute-sets %qnames; #IMPLIED
1364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * >
1374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
1384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param newChild Child to be added to this node's list of children
1394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
1404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return The child that was just added to the list of children
1414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
1424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @throws DOMException
1434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
1444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public ElemTemplateElement appendChildElem(ElemTemplateElement newChild)
1454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
1464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    int type = ((ElemTemplateElement) newChild).getXSLToken();
1484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    switch (type)
1504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
1514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    case Constants.ELEMNAME_ATTRIBUTE :
1524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      break;
1534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    default :
1544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      error(XSLTErrorResources.ER_CANNOT_ADD,
1554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            new Object[]{ newChild.getNodeName(),
1564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                          this.getNodeName() });  //"Can not add " +((ElemTemplateElement)newChild).m_elemName +
1574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    //" to " + this.m_elemName);
1594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
1604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return super.appendChild(newChild);
1624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
1634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
1654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * This function is called during recomposition to
1664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * control how this element is composed.
1674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param root The root stylesheet for this transformation.
1684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
1694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public void recompose(StylesheetRoot root)
1704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
1714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    root.recomposeAttributeSets(this);
1724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
1734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson}
175