001    /* AttributeList.java --
002       Copyright (C) 2005 Free Software Foundation, Inc.
003    
004    This file is part of GNU Classpath.
005    
006    GNU Classpath is free software; you can redistribute it and/or modify
007    it under the terms of the GNU General Public License as published by
008    the Free Software Foundation; either version 2, or (at your option)
009    any later version.
010    
011    GNU Classpath is distributed in the hope that it will be useful, but
012    WITHOUT ANY WARRANTY; without even the implied warranty of
013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
014    General Public License for more details.
015    
016    You should have received a copy of the GNU General Public License
017    along with GNU Classpath; see the file COPYING.  If not, write to the
018    Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
019    02110-1301 USA.
020    
021    Linking this library statically or dynamically with other modules is
022    making a combined work based on this library.  Thus, the terms and
023    conditions of the GNU General Public License cover the whole
024    combination.
025    
026    As a special exception, the copyright holders of this library give you
027    permission to link this library with independent modules to produce an
028    executable, regardless of the license terms of these independent
029    modules, and to copy and distribute the resulting executable under
030    terms of your choice, provided that you also meet, for each linked
031    independent module, the terms and conditions of the license of that
032    module.  An independent module is a module which is not derived from
033    or based on this library.  If you modify this library, you may extend
034    this exception to your version of the library, but you are not
035    obligated to do so.  If you do not wish to do so, delete this
036    exception statement from your version. */
037    
038    
039    package javax.swing.text.html.parser;
040    
041    import gnu.javax.swing.text.html.parser.support.gnuStringIntMapper;
042    
043    import java.io.Serializable;
044    
045    import java.util.Enumeration;
046    import java.util.Vector;
047    
048    /**
049     * <p>
050     * Stores the attribute information, obtained by parsing SGML (DTD) tag
051     * <code>&lt;!ATTLIST .. &gt;</code></p>
052     * <p>
053     * Elements can have a associated named properties (attributes) having the
054     * assigned values. The element start tag can have any number of attribute
055     * value pairs, separated by spaces. They can appear in any order.
056     * SGML requires you to delimit the attribute values using either double (")
057     * or single (') quotation marks.  In HTML, it is possible
058     * (but not recommended) to specify the value of an attribute without
059     * quotation marks. Such attribute value may only contain
060     * letters, digits, hyphens (-) and periods (.) .
061     * </p>
062     * <p>
063     * The <code>AttributeList</code> defines a single attribute that additionally
064     * has a pointer referencing the possible subsequent attribute.
065     * The whole structure is just a simple linked list, storing all attributes of
066     * some <code>Element</code>.
067     * Use the <code>getNext()</code> method repeatedly to see all attributes in
068     * the list.
069     * </p>
070     * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
071     */
072    public final class AttributeList
073      implements DTDConstants, Serializable
074    {
075      /** Maps between type names and they string values. */
076      private static final gnuStringIntMapper mapper =
077        new gnuStringIntMapper()
078        {
079          protected void create()
080          {
081            add("CDATA", DTDConstants.CDATA);
082            add("ENTITY", DTDConstants.ENTITY);
083            add("ENTITIES", DTDConstants.ENTITIES);
084            add("ID", DTDConstants.ID);
085            add("IDREF", DTDConstants.IDREF);
086            add("IDREFS", DTDConstants.IDREFS);
087            add("NAME", DTDConstants.NAME);
088            add("NAMES", DTDConstants.NAMES);
089            add("NMTOKEN", DTDConstants.NMTOKEN);
090            add("NMTOKENS", DTDConstants.NMTOKENS);
091            add("NOTATION", DTDConstants.NOTATION);
092            add("NUMBER", DTDConstants.NUMBER);
093            add("NUMBERS", DTDConstants.NUMBERS);
094            add("NUTOKEN", DTDConstants.NUTOKEN);
095            add("NUTOKENS", DTDConstants.NUTOKENS);
096          }
097        };
098    
099      /** Use serialVersionUID for interoperability. */
100      private static final long serialVersionUID = -1361214058742015233L;
101    
102      /**
103       * The value of ( = pointer to ) the next attribute in the linked list,
104       * storing all attributes of some Element. Contains null for the
105       * last attribute.
106       */
107      public AttributeList next;
108    
109      /**
110       * The name of the attribute. The attribute names are case insensitive.
111       */
112      public String name;
113    
114      /**
115       * The default value of this attribute. Equals to null if no default value
116       * is specified.
117       */
118      public String value;
119    
120      /**
121       * The explicit set of the allowed values of this attribute. Equals to
122       * null, if this parameter was not specified.
123       * Values, defined in DTD, are case insensitive.
124       */
125      public Vector<?> values;
126    
127      /**
128       * The modifier of this attribute. This field contains one of the
129       * following DTD constants:
130       * <ul>
131       * <li> REQUIRED if the attribute value is always required,</li>
132       * <li> IMPLIED if the user agent must supply the default value itself,</li>
133       * <li> FIXED if the attribute value is fixed to some value and cannot
134       * be changed.</li>
135       * <li> DEFAULT if the attribute default value has been supplied.</li>
136       * <li> CURRENT the value that at any point in the document is
137       * the last value supplied for that element. A value is required to be
138       * supplied for the first* occurrence of an element</li>
139       * <li> CONREF specifies the IDREF value of
140       * the reference to content in another location of the document.
141       * The element with this attribute is empty, the content from
142       * that another location must be used instead.</li>
143       * </ul>
144       */
145      public int modifier;
146    
147      /**
148       * The type of the attribute. The possible values of this field
149       * (NUMBER, NAME, ID, CDATA and so on) are defined in DTDConstants.
150       */
151      public int type;
152    
153      /**
154       * Creates the attribute with the given name, initializing other fields
155       * to the default values ( 0 and null ).
156       *
157       * @param a_name The name of the attribute.
158       */
159      public AttributeList(String a_name)
160      {
161        name = a_name;
162      }
163    
164      /**
165       * Creates the attribute with the given properties.
166       * @param a_name The name of the attribute
167       * @param a_type The type of the attribute. The possible values are defined
168       * in <code> DTDConstants</code>.
169       * @param a_modifier The modifier of this attribute. The possible values
170       * are defined in <code> DTDConstants</code>.
171       * @param a_default The default value of this attribute
172       * @param allowed_values The explicit set of the allowed values of
173       * this attribute
174       * @param a_next The value of the subsequent instance of the AttributeList,
175       * representing the next attribute definition for the same element.
176       * Equals to null for the last attribute definition.
177       */
178      public AttributeList(String a_name, int a_type, int a_modifier,
179                           String a_default, Vector<?> allowed_values,
180                           AttributeList a_next
181                          )
182      {
183        this(a_name);
184        type = a_type;
185        modifier = a_modifier;
186        value = a_default;
187        values = allowed_values;
188        next = a_next;
189      }
190    
191      /**
192       * Get the modifier of this attribute. This field contains one of the
193       * following DTD constants:
194       * <ul>
195       * <li> REQUIRED if the attribute value is always required,</li>
196       * <li> IMPLIED if the user agent must supply the default value itself,</li>
197       * <li> FIXED if the attribute value is fixed to some value and cannot
198       * be changed.</li>
199       * <li> DEFAULT if the attribute default value has been supplied.</li>
200       * <li> CURRENT the value that at any point in the document is
201       * the last value supplied for that element. A value is required to be
202       * supplied for the first* occurrence of an element</li>
203       * <li> CONREF specifies the IDREF value of
204       * the reference to content in another location of the document.
205       * The element with this attribute is empty, the content from
206       * that another location must be used instead.</li>
207       * </ul>
208       */
209      public int getModifier()
210      {
211        return modifier;
212      }
213    
214      /**
215       * Get the name of the attribute.
216       * The value is returned as it was supplied to a
217       * constructor, preserving the character case.
218       */
219      public String getName()
220      {
221        return name;
222      }
223    
224      /**
225       * Get the value of ( = pointer to ) the next attribute in the linked list,
226       * storing all attributes of some Element. Contains null for the
227       * last attribute.
228       */
229      public AttributeList getNext()
230      {
231        return next;
232      }
233    
234      /**
235       * Get the type of the attribute. The possible values of this field
236       * (NUMBER, NAME, ID, CDATA and so on) are defined in DTDConstants.
237       */
238      public int getType()
239      {
240        return type;
241      }
242    
243      /**
244       * Get the default value of this attribute.
245       */
246      public String getValue()
247      {
248        return value;
249      }
250    
251      /**
252       * Get the allowed values of this attribute.
253       */
254      public Enumeration<?> getValues()
255      {
256        return (values != null) ? values.elements() : null;
257      }
258    
259      /**
260       * Converts a string value, representing a valid SGLM attribute type,
261       * into the corresponding value, defined in DTDConstants.
262       * @param typeName the name of the type (character case is ignored).
263       * @return a value from DTDConstants or DTDConstants.ANY if the
264       * string is not representing a known type. The known attribute types
265       * in this implementation are CDATA, ENTITY, ENTITIES, ID, IDREF, IDREFS,
266       *  NAME, NAMES, NMTOKEN, NMTOKENS, NOTATION, NUMBER, NUMBERS, NUTOKEN and
267       *  NUTOKENS.
268       * @throws NullPointerException if the passed parameter is null.
269       */
270      public static int name2type(String typeName)
271      {
272        return mapper.get(typeName.toUpperCase());
273      }
274    
275      /**
276       * Returns the attribute name.
277       */
278      public String toString()
279      {
280        return name;
281      }
282    
283      /**
284       * Converts a value from DTDConstants into the string representation.
285       * @param type - an integer value of the public static integer field,
286       * defined in the DTDConstants class.
287       * @return a corresponding SGML DTD keyword (UPPERCASE) or null if there
288       * are no attribute type constant having the given value.
289       */
290      public static String type2name(int type)
291      {
292        return mapper.get(type);
293      }
294    }