// SAX default implementation for AttributeList. // http://www.saxproject.org // No warranty; no copyright -- use this as you will. // $Id: AttributeListImpl.java,v 1.6 2002/01/30 20:52:22 dbrownell Exp $ package org.xml.sax.helpers; import java.util.ArrayList; import org.xml.sax.AttributeList; /** * Default implementation for AttributeList. * * <blockquote> * <em>This module, both source code and documentation, is in the * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em> * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a> * for further information. * </blockquote> * * <p>AttributeList implements the deprecated SAX1 {@link * org.xml.sax.AttributeList AttributeList} interface, and has been * replaced by the new SAX2 {@link org.xml.sax.helpers.AttributesImpl * AttributesImpl} interface.</p> * * <p>This class provides a convenience implementation of the SAX * {@link org.xml.sax.AttributeList AttributeList} interface. This * implementation is useful both for SAX parser writers, who can use * it to provide attributes to the application, and for SAX application * writers, who can use it to create a persistent copy of an element's * attribute specifications:</p> * * <pre> * private AttributeList myatts; * * public void startElement (String name, AttributeList atts) * { * // create a persistent copy of the attribute list * // for use outside this method * myatts = new AttributeListImpl(atts); * [...] * } * </pre> * * <p>Please note that SAX parsers are not required to use this * class to provide an implementation of AttributeList; it is * supplied only as an optional convenience. In particular, * parser writers are encouraged to invent more efficient * implementations.</p> * * @deprecated This class implements a deprecated interface, * {@link org.xml.sax.AttributeList AttributeList}; * that interface has been replaced by * {@link org.xml.sax.Attributes Attributes}, * which is implemented in the * {@link org.xml.sax.helpers.AttributesImpl * AttributesImpl} helper class. * @since SAX 1.0 * @author David Megginson * @version 2.0.1 (sax2r2) * @see org.xml.sax.AttributeList * @see org.xml.sax.DocumentHandler#startElement */ @Deprecated public class AttributeListImpl implements AttributeList { /** * Create an empty attribute list. * * <p>This constructor is most useful for parser writers, who * will use it to create a single, reusable attribute list that * can be reset with the clear method between elements.</p> * * @see #addAttribute * @see #clear */ public AttributeListImpl () { } /** * Construct a persistent copy of an existing attribute list. * * <p>This constructor is most useful for application writers, * who will use it to create a persistent copy of an existing * attribute list.</p> * * @param atts The attribute list to copy * @see org.xml.sax.DocumentHandler#startElement */ public AttributeListImpl (AttributeList atts) { setAttributeList(atts); } //////////////////////////////////////////////////////////////////// // Methods specific to this class. //////////////////////////////////////////////////////////////////// /** * Set the attribute list, discarding previous contents. * * <p>This method allows an application writer to reuse an * attribute list easily.</p> * * @param atts The attribute list to copy. */ public void setAttributeList (AttributeList atts) { int count = atts.getLength(); clear(); for (int i = 0; i < count; i++) { addAttribute(atts.getName(i), atts.getType(i), atts.getValue(i)); } } /** * Add an attribute to an attribute list. * * <p>This method is provided for SAX parser writers, to allow them * to build up an attribute list incrementally before delivering * it to the application.</p> * * @param name The attribute name. * @param type The attribute type ("NMTOKEN" for an enumeration). * @param value The attribute value (must not be null). * @see #removeAttribute * @see org.xml.sax.DocumentHandler#startElement */ public void addAttribute(String name, String type, String value) { names.add(name); types.add(type); values.add(value); } /** * Remove an attribute from the list. * * <p>SAX application writers can use this method to filter an * attribute out of an AttributeList. Note that invoking this * method will change the length of the attribute list and * some of the attribute's indices.</p> * * <p>If the requested attribute is not in the list, this is * a no-op.</p> * * @param name The attribute name. * @see #addAttribute */ public void removeAttribute(String name) { int i = names.indexOf(name); if (i != -1) { names.remove(i); types.remove(i); values.remove(i); } } /** * Clear the attribute list. * * <p>SAX parser writers can use this method to reset the attribute * list between DocumentHandler.startElement events. Normally, * it will make sense to reuse the same AttributeListImpl object * rather than allocating a new one each time.</p> * * @see org.xml.sax.DocumentHandler#startElement */ public void clear() { names.clear(); types.clear(); values.clear(); } //////////////////////////////////////////////////////////////////// // Implementation of org.xml.sax.AttributeList //////////////////////////////////////////////////////////////////// /** * Return the number of attributes in the list. * * @return The number of attributes in the list. * @see org.xml.sax.AttributeList#getLength */ public int getLength() { return names.size(); } /** * Get the name of an attribute (by position). * * @param i The position of the attribute in the list. * @return The attribute name as a string, or null if there * is no attribute at that position. * @see org.xml.sax.AttributeList#getName(int) */ public String getName(int i) { if (i < 0 || i >= names.size()) { return null; } return names.get(i); } /** * Get the type of an attribute (by position). * * @param i The position of the attribute in the list. * @return The attribute type as a string ("NMTOKEN" for an * enumeration, and "CDATA" if no declaration was * read), or null if there is no attribute at * that position. * @see org.xml.sax.AttributeList#getType(int) */ public String getType(int i) { if (i < 0 || i >= types.size()) { return null; } return types.get(i); } /** * Get the value of an attribute (by position). * * @param i The position of the attribute in the list. * @return The attribute value as a string, or null if * there is no attribute at that position. * @see org.xml.sax.AttributeList#getValue(int) */ public String getValue(int i) { if (i < 0 || i >= values.size()) { return null; } return values.get(i); } /** * Get the type of an attribute (by name). * * @param name The attribute name. * @return The attribute type as a string ("NMTOKEN" for an * enumeration, and "CDATA" if no declaration was * read). * @see org.xml.sax.AttributeList#getType(java.lang.String) */ public String getType(String name) { return getType(names.indexOf(name)); } /** * Get the value of an attribute (by name). * * @param name The attribute name. * @return the named attribute's value or null, if the attribute does not * exist. * @see org.xml.sax.AttributeList#getValue(java.lang.String) */ public String getValue(String name) { return getValue(names.indexOf(name)); } //////////////////////////////////////////////////////////////////// // Internal state. //////////////////////////////////////////////////////////////////// private ArrayList<String> names = new ArrayList<String>(); private ArrayList<String> types = new ArrayList<String>(); private ArrayList<String> values = new ArrayList<String>(); } // end of AttributeListImpl.java