1 /*
   2  * Copyright (c) 2000, 2005, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 // SAX default implementation for AttributeList.
  27 // http://www.saxproject.org
  28 // No warranty; no copyright -- use this as you will.
  29 // $Id: AttributeListImpl.java,v 1.2 2004/11/03 22:53:08 jsuttor Exp $
  30 
  31 package org.xml.sax.helpers;
  32 
  33 import org.xml.sax.AttributeList;
  34 
  35 import java.util.Vector;
  36 
  37 
  38 /**
  39  * Default implementation for AttributeList.
  40  *
  41  * <blockquote>
  42  * <em>This module, both source code and documentation, is in the
  43  * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
  44  * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a>
  45  * for further information.
  46  * </blockquote>
  47  *
  48  * <p>AttributeList implements the deprecated SAX1 {@link
  49  * org.xml.sax.AttributeList AttributeList} interface, and has been
  50  * replaced by the new SAX2 {@link org.xml.sax.helpers.AttributesImpl
  51  * AttributesImpl} interface.</p>
  52  *
  53  * <p>This class provides a convenience implementation of the SAX
  54  * {@link org.xml.sax.AttributeList AttributeList} interface.  This
  55  * implementation is useful both for SAX parser writers, who can use
  56  * it to provide attributes to the application, and for SAX application
  57  * writers, who can use it to create a persistent copy of an element's
  58  * attribute specifications:</p>
  59  *
  60  * <pre>
  61  * private AttributeList myatts;
  62  *
  63  * public void startElement (String name, AttributeList atts)
  64  * {
  65  *              // create a persistent copy of the attribute list
  66  *              // for use outside this method
  67  *   myatts = new AttributeListImpl(atts);
  68  *   [...]
  69  * }
  70  * </pre>
  71  *
  72  * <p>Please note that SAX parsers are not required to use this
  73  * class to provide an implementation of AttributeList; it is
  74  * supplied only as an optional convenience.  In particular,
  75  * parser writers are encouraged to invent more efficient
  76  * implementations.</p>
  77  *
  78  * @deprecated This class implements a deprecated interface,
  79  *             {@link org.xml.sax.AttributeList AttributeList};
  80  *             that interface has been replaced by
  81  *             {@link org.xml.sax.Attributes Attributes},
  82  *             which is implemented in the
  83  *             {@link org.xml.sax.helpers.AttributesImpl
  84  *            AttributesImpl} helper class.
  85  * @since SAX 1.0
  86  * @author David Megginson
  87  * @see org.xml.sax.AttributeList
  88  * @see org.xml.sax.DocumentHandler#startElement
  89  */
  90 public class AttributeListImpl implements AttributeList
  91 {
  92 
  93     /**
  94      * Create an empty attribute list.
  95      *
  96      * <p>This constructor is most useful for parser writers, who
  97      * will use it to create a single, reusable attribute list that
  98      * can be reset with the clear method between elements.</p>
  99      *
 100      * @see #addAttribute
 101      * @see #clear
 102      */
 103     public AttributeListImpl ()
 104     {
 105     }
 106 
 107 
 108     /**
 109      * Construct a persistent copy of an existing attribute list.
 110      *
 111      * <p>This constructor is most useful for application writers,
 112      * who will use it to create a persistent copy of an existing
 113      * attribute list.</p>
 114      *
 115      * @param atts The attribute list to copy
 116      * @see org.xml.sax.DocumentHandler#startElement
 117      */
 118     public AttributeListImpl (AttributeList atts)
 119     {
 120         setAttributeList(atts);
 121     }
 122 
 123 
 124 
 125     ////////////////////////////////////////////////////////////////////
 126     // Methods specific to this class.
 127     ////////////////////////////////////////////////////////////////////
 128 
 129 
 130     /**
 131      * Set the attribute list, discarding previous contents.
 132      *
 133      * <p>This method allows an application writer to reuse an
 134      * attribute list easily.</p>
 135      *
 136      * @param atts The attribute list to copy.
 137      */
 138     public void setAttributeList (AttributeList atts)
 139     {
 140         int count = atts.getLength();
 141 
 142         clear();
 143 
 144         for (int i = 0; i < count; i++) {
 145             addAttribute(atts.getName(i), atts.getType(i), atts.getValue(i));
 146         }
 147     }
 148 
 149 
 150     /**
 151      * Add an attribute to an attribute list.
 152      *
 153      * <p>This method is provided for SAX parser writers, to allow them
 154      * to build up an attribute list incrementally before delivering
 155      * it to the application.</p>
 156      *
 157      * @param name The attribute name.
 158      * @param type The attribute type ("NMTOKEN" for an enumeration).
 159      * @param value The attribute value (must not be null).
 160      * @see #removeAttribute
 161      * @see org.xml.sax.DocumentHandler#startElement
 162      */
 163     public void addAttribute (String name, String type, String value)
 164     {
 165         names.addElement(name);
 166         types.addElement(type);
 167         values.addElement(value);
 168     }
 169 
 170 
 171     /**
 172      * Remove an attribute from the list.
 173      *
 174      * <p>SAX application writers can use this method to filter an
 175      * attribute out of an AttributeList.  Note that invoking this
 176      * method will change the length of the attribute list and
 177      * some of the attribute's indices.</p>
 178      *
 179      * <p>If the requested attribute is not in the list, this is
 180      * a no-op.</p>
 181      *
 182      * @param name The attribute name.
 183      * @see #addAttribute
 184      */
 185     public void removeAttribute (String name)
 186     {
 187         int i = names.indexOf(name);
 188 
 189         if (i >= 0) {
 190             names.removeElementAt(i);
 191             types.removeElementAt(i);
 192             values.removeElementAt(i);
 193         }
 194     }
 195 
 196 
 197     /**
 198      * Clear the attribute list.
 199      *
 200      * <p>SAX parser writers can use this method to reset the attribute
 201      * list between DocumentHandler.startElement events.  Normally,
 202      * it will make sense to reuse the same AttributeListImpl object
 203      * rather than allocating a new one each time.</p>
 204      *
 205      * @see org.xml.sax.DocumentHandler#startElement
 206      */
 207     public void clear ()
 208     {
 209         names.removeAllElements();
 210         types.removeAllElements();
 211         values.removeAllElements();
 212     }
 213 
 214 
 215 
 216     ////////////////////////////////////////////////////////////////////
 217     // Implementation of org.xml.sax.AttributeList
 218     ////////////////////////////////////////////////////////////////////
 219 
 220 
 221     /**
 222      * Return the number of attributes in the list.
 223      *
 224      * @return The number of attributes in the list.
 225      * @see org.xml.sax.AttributeList#getLength
 226      */
 227     public int getLength ()
 228     {
 229         return names.size();
 230     }
 231 
 232 
 233     /**
 234      * Get the name of an attribute (by position).
 235      *
 236      * @param i The position of the attribute in the list.
 237      * @return The attribute name as a string, or null if there
 238      *         is no attribute at that position.
 239      * @see org.xml.sax.AttributeList#getName(int)
 240      */
 241     public String getName (int i)
 242     {
 243         if (i < 0) {
 244             return null;
 245         }
 246         try {
 247             return (String)names.elementAt(i);
 248         } catch (ArrayIndexOutOfBoundsException e) {
 249             return null;
 250         }
 251     }
 252 
 253 
 254     /**
 255      * Get the type of an attribute (by position).
 256      *
 257      * @param i The position of the attribute in the list.
 258      * @return The attribute type as a string ("NMTOKEN" for an
 259      *         enumeration, and "CDATA" if no declaration was
 260      *         read), or null if there is no attribute at
 261      *         that position.
 262      * @see org.xml.sax.AttributeList#getType(int)
 263      */
 264     public String getType (int i)
 265     {
 266         if (i < 0) {
 267             return null;
 268         }
 269         try {
 270             return (String)types.elementAt(i);
 271         } catch (ArrayIndexOutOfBoundsException e) {
 272             return null;
 273         }
 274     }
 275 
 276 
 277     /**
 278      * Get the value of an attribute (by position).
 279      *
 280      * @param i The position of the attribute in the list.
 281      * @return The attribute value as a string, or null if
 282      *         there is no attribute at that position.
 283      * @see org.xml.sax.AttributeList#getValue(int)
 284      */
 285     public String getValue (int i)
 286     {
 287         if (i < 0) {
 288             return null;
 289         }
 290         try {
 291             return (String)values.elementAt(i);
 292         } catch (ArrayIndexOutOfBoundsException e) {
 293             return null;
 294         }
 295     }
 296 
 297 
 298     /**
 299      * Get the type of an attribute (by name).
 300      *
 301      * @param name The attribute name.
 302      * @return The attribute type as a string ("NMTOKEN" for an
 303      *         enumeration, and "CDATA" if no declaration was
 304      *         read).
 305      * @see org.xml.sax.AttributeList#getType(java.lang.String)
 306      */
 307     public String getType (String name)
 308     {
 309         return getType(names.indexOf(name));
 310     }
 311 
 312 
 313     /**
 314      * Get the value of an attribute (by name).
 315      *
 316      * @param name The attribute name.
 317      * @see org.xml.sax.AttributeList#getValue(java.lang.String)
 318      */
 319     public String getValue (String name)
 320     {
 321         return getValue(names.indexOf(name));
 322     }
 323 
 324 
 325 
 326     ////////////////////////////////////////////////////////////////////
 327     // Internal state.
 328     ////////////////////////////////////////////////////////////////////
 329 
 330     Vector names = new Vector();
 331     Vector types = new Vector();
 332     Vector values = new Vector();
 333 
 334 }
 335 
 336 // end of AttributeListImpl.java