View Javadoc

    1   /*
    2    * Copyright 2002,2004 The Apache Software Foundation.
    3    *
    4    * Licensed under the Apache License, Version 2.0 (the "License");
    5    * you may not use this file except in compliance with the License.
    6    * You may obtain a copy of the License at
    7    *
    8    *      http://www.apache.org/licenses/LICENSE-2.0
    9    *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  package org.apache.commons.jelly.impl;
    17
    18  import org.apache.commons.jelly.DynaTagSupport;
    19  import org.apache.commons.jelly.JellyTagException;
    20  import org.apache.commons.jelly.XMLOutput;
    21
    22  import org.xml.sax.SAXException;
    23  import org.xml.sax.helpers.AttributesImpl;
    24
    25  /***
    26   * <p><code>StaticTag</code> represents a static XML element
    27   * which echos itself to XMLOutput when it is invoked.</p>
    28   *
    29   * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
    30   * @version $Revision: 155420 $
    31   */
    32
    33  public class StaticTag extends DynaTagSupport {
    34
    35      /*** The namespace URI */
    36      private String uri;
    37
    38      /*** The qualified name */
    39      private String qname;
    40
    41      /*** The local name */
    42      private String localName;
    43
    44      /*** The XML Attributes */
    45      private AttributesImpl attributes = new AttributesImpl();
    46
    47      public StaticTag() {
    48      }
    49
    50      public StaticTag(String uri, String localName, String qname) {
    51          this.uri = uri;
    52          this.localName = localName;
    53          this.qname = qname;
    54      }
    55
    56      public String toString() {
    57          return super.toString() + "[qname=" + qname + ";attributes=" + attributes + "]";
    58      }
    59
    60      // Tag interface
    61      //-------------------------------------------------------------------------
    62      public void doTag(XMLOutput output) throws JellyTagException {
    63          try {
    64              output.startElement(uri, localName, qname, attributes);
    65              invokeBody(output);
    66              output.endElement(uri, localName, qname);
    67          } catch (SAXException e) {
    68              throw new JellyTagException(e);
    69          }
    70      }
    71
    72      // DynaTag interface
    73      //-------------------------------------------------------------------------
    74      public void setAttribute(String name, Object value) throws JellyTagException {
    75          // ### we'll assume that all attributes are in no namespace!
    76          // ### this is severely limiting!
    77          // ### - Tag attributes should allow for namespace aware
    78          int index = attributes.getIndex("", name);
    79          if (index >= 0) {
    80              attributes.removeAttribute(index);
    81          }
    82          // treat null values as no attribute
    83          if (value != null) {
    84              attributes.addAttribute("", name, name, "CDATA", value.toString());
    85          }
    86      }
    87
    88      // Properties
    89      //-------------------------------------------------------------------------
    90      public String getUri() {
    91          return uri;
    92      }
    93
    94      public void setUri(String uri) {
    95          this.uri = uri;
    96      }
    97
    98      public String getQName() {
    99          return qname;
    100     }
    101
    102     public void setQName(String qname) {
    103         this.qname = qname;
    104         int idx = qname.indexOf(':');
    105         if (idx >= 0) {
    106             this.localName = qname.substring(idx + 1);
    107         }
    108         else {
    109             this.localName = qname;
    110         }
    111     }
    112
    113     public String getLocalName() {
    114         return localName;
    115     }
    116
    117     public void setLocalName(String localName) {
    118         this.localName = localName;
    119         // FIXME This just doesn't seem right or work...
    120         if (qname == null || !qname.endsWith(localName)) {
    121             localName = qname;
    122         }
    123     }
    124 }