KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > xml > sax > ext > Attributes2Impl


1 // Attributes2Impl.java - extended AttributesImpl
2
// http://www.saxproject.org
3
// Public Domain: no warranty.
4
// $Id: Attributes2Impl.java,v 1.1.2.1 2004/05/01 08:34:43 jsuttor Exp $
5

6 package org.xml.sax.ext;
7
8 import org.xml.sax.Attributes JavaDoc;
9 import org.xml.sax.helpers.AttributesImpl JavaDoc;
10
11
12 /**
13  * SAX2 extension helper for additional Attributes information,
14  * implementing the {@link Attributes2} interface.
15  *
16  * <blockquote>
17  * <em>This module, both source code and documentation, is in the
18  * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em>
19  * </blockquote>
20  *
21  * <p>This is not part of core-only SAX2 distributions.</p>
22  *
23  * <p>The <em>specified</em> flag for each attribute will always
24  * be true, unless it has been set to false in the copy constructor
25  * or using {@link #setSpecified}.
26  * Similarly, the <em>declared</em> flag for each attribute will
27  * always be false, except for defaulted attributes (<em>specified</em>
28  * is false), non-CDATA attributes, or when it is set to true using
29  * {@link #setDeclared}.
30  * If you change an attribute's type by hand, you may need to modify
31  * its <em>declared</em> flag to match.
32  * </p>
33  *
34  * @since SAX 2.0 (extensions 1.1 alpha)
35  * @author David Brownell
36  * @version TBS
37  */

38 public class Attributes2Impl extends AttributesImpl JavaDoc implements Attributes2 JavaDoc
39 {
40     private boolean declared [];
41     private boolean specified [];
42
43
44     /**
45      * Construct a new, empty Attributes2Impl object.
46      */

47     public Attributes2Impl () { }
48
49
50     /**
51      * Copy an existing Attributes or Attributes2 object.
52      * If the object implements Attributes2, values of the
53      * <em>specified</em> and <em>declared</em> flags for each
54      * attribute are copied.
55      * Otherwise the flag values are defaulted to assume no DTD was used,
56      * unless there is evidence to the contrary (such as attributes with
57      * type other than CDATA, which must have been <em>declared</em>).
58      *
59      * <p>This constructor is especially useful inside a
60      * {@link org.xml.sax.ContentHandler#startElement startElement} event.</p>
61      *
62      * @param atts The existing Attributes object.
63      */

64     public Attributes2Impl (Attributes JavaDoc atts)
65     {
66     super (atts);
67     }
68
69
70     ////////////////////////////////////////////////////////////////////
71
// Implementation of Attributes2
72
////////////////////////////////////////////////////////////////////
73

74
75     /**
76      * Returns the current value of the attribute's "declared" flag.
77      */

78     // javadoc mostly from interface
79
public boolean isDeclared (int index)
80     {
81     if (index < 0 || index >= getLength ())
82         throw new ArrayIndexOutOfBoundsException JavaDoc (
83         "No attribute at index: " + index);
84     return declared [index];
85     }
86
87
88     /**
89      * Returns the current value of the attribute's "declared" flag.
90      */

91     // javadoc mostly from interface
92
public boolean isDeclared (String JavaDoc uri, String JavaDoc localName)
93     {
94     int index = getIndex (uri, localName);
95
96     if (index < 0)
97         throw new IllegalArgumentException JavaDoc (
98         "No such attribute: local=" + localName
99         + ", namespace=" + uri);
100     return declared [index];
101     }
102
103
104     /**
105      * Returns the current value of the attribute's "declared" flag.
106      */

107     // javadoc mostly from interface
108
public boolean isDeclared (String JavaDoc qName)
109     {
110     int index = getIndex (qName);
111
112     if (index < 0)
113         throw new IllegalArgumentException JavaDoc (
114         "No such attribute: " + qName);
115     return declared [index];
116     }
117
118
119     /**
120      * Returns the current value of an attribute's "specified" flag.
121      *
122      * @param index The attribute index (zero-based).
123      * @return current flag value
124      * @exception java.lang.ArrayIndexOutOfBoundsException When the
125      * supplied index does not identify an attribute.
126      */

127     public boolean isSpecified (int index)
128     {
129     if (index < 0 || index >= getLength ())
130         throw new ArrayIndexOutOfBoundsException JavaDoc (
131         "No attribute at index: " + index);
132     return specified [index];
133     }
134
135
136     /**
137      * Returns the current value of an attribute's "specified" flag.
138      *
139      * @param uri The Namespace URI, or the empty string if
140      * the name has no Namespace URI.
141      * @param localName The attribute's local name.
142      * @return current flag value
143      * @exception java.lang.IllegalArgumentException When the
144      * supplied names do not identify an attribute.
145      */

146     public boolean isSpecified (String JavaDoc uri, String JavaDoc localName)
147     {
148     int index = getIndex (uri, localName);
149
150     if (index < 0)
151         throw new IllegalArgumentException JavaDoc (
152         "No such attribute: local=" + localName
153         + ", namespace=" + uri);
154     return specified [index];
155     }
156
157
158     /**
159      * Returns the current value of an attribute's "specified" flag.
160      *
161      * @param qName The XML qualified (prefixed) name.
162      * @return current flag value
163      * @exception java.lang.IllegalArgumentException When the
164      * supplied name does not identify an attribute.
165      */

166     public boolean isSpecified (String JavaDoc qName)
167     {
168     int index = getIndex (qName);
169
170     if (index < 0)
171         throw new IllegalArgumentException JavaDoc (
172         "No such attribute: " + qName);
173     return specified [index];
174     }
175
176
177     ////////////////////////////////////////////////////////////////////
178
// Manipulators
179
////////////////////////////////////////////////////////////////////
180

181
182     /**
183      * Copy an entire Attributes object. The "specified" flags are
184      * assigned as true, and "declared" flags as false (except when
185      * an attribute's type is not CDATA),
186      * unless the object is an Attributes2 object.
187      * In that case those flag values are all copied.
188      *
189      * @see AttributesImpl#setAttributes
190      */

191     public void setAttributes (Attributes JavaDoc atts)
192     {
193     int length = atts.getLength ();
194
195     super.setAttributes (atts);
196     declared = new boolean [length];
197     specified = new boolean [length];
198
199     if (atts instanceof Attributes2 JavaDoc) {
200         Attributes2 JavaDoc a2 = (Attributes2 JavaDoc) atts;
201         for (int i = 0; i < length; i++) {
202         declared [i] = a2.isDeclared (i);
203         specified [i] = a2.isSpecified (i);
204         }
205     } else {
206         for (int i = 0; i < length; i++) {
207         declared [i] = !"CDATA".equals (atts.getType (i));
208         specified [i] = true;
209         }
210     }
211     }
212
213
214     /**
215      * Add an attribute to the end of the list, setting its
216      * "specified" flag to true. To set that flag's value
217      * to false, use {@link #setSpecified}.
218      *
219      * <p>Unless the attribute <em>type</em> is CDATA, this attribute
220      * is marked as being declared in the DTD. To set that flag's value
221      * to true for CDATA attributes, use {@link #setDeclared}.
222      *
223      * @see AttributesImpl#addAttribute
224      */

225     public void addAttribute (String JavaDoc uri, String JavaDoc localName, String JavaDoc qName,
226                   String JavaDoc type, String JavaDoc value)
227     {
228     super.addAttribute (uri, localName, qName, type, value);
229
230     int length = getLength ();
231
232     if (length < specified.length) {
233         boolean newFlags [];
234
235         newFlags = new boolean [length];
236         System.arraycopy (declared, 0, newFlags, 0, declared.length);
237         declared = newFlags;
238
239         newFlags = new boolean [length];
240         System.arraycopy (specified, 0, newFlags, 0, specified.length);
241         specified = newFlags;
242     }
243
244     specified [length - 1] = true;
245     declared [length - 1] = !"CDATA".equals (type);
246     }
247
248
249     // javadoc entirely from superclass
250
public void removeAttribute (int index)
251     {
252     int origMax = getLength () - 1;
253
254     super.removeAttribute (index);
255     if (index != origMax) {
256         System.arraycopy (declared, index + 1, declared, index,
257             origMax - index);
258         System.arraycopy (specified, index + 1, specified, index,
259             origMax - index);
260     }
261     }
262
263
264     /**
265      * Assign a value to the "declared" flag of a specific attribute.
266      * This is normally needed only for attributes of type CDATA,
267      * including attributes whose type is changed to or from CDATA.
268      *
269      * @param index The index of the attribute (zero-based).
270      * @param value The desired flag value.
271      * @exception java.lang.ArrayIndexOutOfBoundsException When the
272      * supplied index does not identify an attribute.
273      * @see #setType
274      */

275     public void setDeclared (int index, boolean value)
276     {
277     if (index < 0 || index >= getLength ())
278         throw new ArrayIndexOutOfBoundsException JavaDoc (
279         "No attribute at index: " + index);
280     declared [index] = value;
281     }
282
283
284     /**
285      * Assign a value to the "specified" flag of a specific attribute.
286      * This is the only way this flag can be cleared, except clearing
287      * by initialization with the copy constructor.
288      *
289      * @param index The index of the attribute (zero-based).
290      * @param value The desired flag value.
291      * @exception java.lang.ArrayIndexOutOfBoundsException When the
292      * supplied index does not identify an attribute.
293      */

294     public void setSpecified (int index, boolean value)
295     {
296     if (index < 0 || index >= getLength ())
297         throw new ArrayIndexOutOfBoundsException JavaDoc (
298         "No attribute at index: " + index);
299     specified [index] = value;
300     }
301 }
302
Popular Tags