Mercurial > repos > pfrommolt > ngsrich
comparison NGSrich_0.5.5/src/org/jdom/Attribute.java @ 0:89ad0a9cca52 default tip
Uploaded
author | pfrommolt |
---|---|
date | Mon, 21 Nov 2011 08:12:19 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:89ad0a9cca52 |
---|---|
1 /*-- | |
2 | |
3 $Id: Attribute.java,v 1.56 2007/11/10 05:28:58 jhunter Exp $ | |
4 | |
5 Copyright (C) 2000-2007 Jason Hunter & Brett McLaughlin. | |
6 All rights reserved. | |
7 | |
8 Redistribution and use in source and binary forms, with or without | |
9 modification, are permitted provided that the following conditions | |
10 are met: | |
11 | |
12 1. Redistributions of source code must retain the above copyright | |
13 notice, this list of conditions, and the following disclaimer. | |
14 | |
15 2. Redistributions in binary form must reproduce the above copyright | |
16 notice, this list of conditions, and the disclaimer that follows | |
17 these conditions in the documentation and/or other materials | |
18 provided with the distribution. | |
19 | |
20 3. The name "JDOM" must not be used to endorse or promote products | |
21 derived from this software without prior written permission. For | |
22 written permission, please contact <request_AT_jdom_DOT_org>. | |
23 | |
24 4. Products derived from this software may not be called "JDOM", nor | |
25 may "JDOM" appear in their name, without prior written permission | |
26 from the JDOM Project Management <request_AT_jdom_DOT_org>. | |
27 | |
28 In addition, we request (but do not require) that you include in the | |
29 end-user documentation provided with the redistribution and/or in the | |
30 software itself an acknowledgement equivalent to the following: | |
31 "This product includes software developed by the | |
32 JDOM Project (http://www.jdom.org/)." | |
33 Alternatively, the acknowledgment may be graphical using the logos | |
34 available at http://www.jdom.org/images/logos. | |
35 | |
36 THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |
37 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |
38 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
39 DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT | |
40 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
41 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
42 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |
43 USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |
44 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
45 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |
46 OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
47 SUCH DAMAGE. | |
48 | |
49 This software consists of voluntary contributions made by many | |
50 individuals on behalf of the JDOM Project and was originally | |
51 created by Jason Hunter <jhunter_AT_jdom_DOT_org> and | |
52 Brett McLaughlin <brett_AT_jdom_DOT_org>. For more information | |
53 on the JDOM Project, please see <http://www.jdom.org/>. | |
54 | |
55 */ | |
56 | |
57 package org.jdom; | |
58 | |
59 import java.io.*; | |
60 | |
61 /** | |
62 * An XML attribute. Methods allow the user to obtain the value of the attribute | |
63 * as well as namespace and type information. | |
64 * | |
65 * @version $Revision: 1.56 $, $Date: 2007/11/10 05:28:58 $ | |
66 * @author Brett McLaughlin | |
67 * @author Jason Hunter | |
68 * @author Elliotte Rusty Harold | |
69 * @author Wesley Biggs | |
70 * @author Victor Toni | |
71 */ | |
72 public class Attribute implements Serializable, Cloneable { | |
73 | |
74 private static final String CVS_ID = | |
75 "@(#) $RCSfile: Attribute.java,v $ $Revision: 1.56 $ $Date: 2007/11/10 05:28:58 $ $Name: jdom_1_1_1 $"; | |
76 | |
77 /** | |
78 * Attribute type: the attribute has not been declared or type | |
79 * is unknown. | |
80 * | |
81 * @see #getAttributeType | |
82 */ | |
83 public final static int UNDECLARED_TYPE = 0; | |
84 | |
85 /** | |
86 * Attribute type: the attribute value is a string. | |
87 * | |
88 * @see #getAttributeType | |
89 */ | |
90 public final static int CDATA_TYPE = 1; | |
91 | |
92 /** | |
93 * Attribute type: the attribute value is a unique identifier. | |
94 * | |
95 * @see #getAttributeType | |
96 */ | |
97 public final static int ID_TYPE = 2; | |
98 | |
99 /** | |
100 * Attribute type: the attribute value is a reference to a | |
101 * unique identifier. | |
102 * | |
103 * @see #getAttributeType | |
104 */ | |
105 public final static int IDREF_TYPE = 3; | |
106 | |
107 /** | |
108 * Attribute type: the attribute value is a list of references to | |
109 * unique identifiers. | |
110 * | |
111 * @see #getAttributeType | |
112 */ | |
113 public final static int IDREFS_TYPE = 4; | |
114 | |
115 /** | |
116 * Attribute type: the attribute value is the name of an entity. | |
117 * | |
118 * @see #getAttributeType | |
119 */ | |
120 public final static int ENTITY_TYPE = 5; | |
121 | |
122 /** | |
123 * <p> | |
124 * Attribute type: the attribute value is a list of entity names. | |
125 * </p> | |
126 * | |
127 * @see #getAttributeType | |
128 */ | |
129 public final static int ENTITIES_TYPE = 6; | |
130 | |
131 /** | |
132 * Attribute type: the attribute value is a name token. | |
133 * <p> | |
134 * According to SAX 2.0 specification, attributes of enumerated | |
135 * types should be reported as "NMTOKEN" by SAX parsers. But the | |
136 * major parsers (Xerces and Crimson) provide specific values | |
137 * that permit to recognize them as {@link #ENUMERATED_TYPE}. | |
138 * | |
139 * @see #getAttributeType | |
140 */ | |
141 public final static int NMTOKEN_TYPE = 7; | |
142 | |
143 /** | |
144 * Attribute type: the attribute value is a list of name tokens. | |
145 * | |
146 * @see #getAttributeType | |
147 */ | |
148 public final static int NMTOKENS_TYPE = 8; | |
149 | |
150 /** | |
151 * Attribute type: the attribute value is the name of a notation. | |
152 * | |
153 * @see #getAttributeType | |
154 */ | |
155 public final static int NOTATION_TYPE = 9; | |
156 | |
157 /** | |
158 * Attribute type: the attribute value is a name token from an | |
159 * enumeration. | |
160 * | |
161 * @see #getAttributeType | |
162 */ | |
163 public final static int ENUMERATED_TYPE = 10; | |
164 | |
165 // Keep the old constant names for one beta cycle to help migration | |
166 | |
167 | |
168 | |
169 /** The local name of the <code>Attribute</code> */ | |
170 protected String name; | |
171 | |
172 /** The <code>{@link Namespace}</code> of the <code>Attribute</code> */ | |
173 protected transient Namespace namespace; | |
174 | |
175 /** The value of the <code>Attribute</code> */ | |
176 protected String value; | |
177 | |
178 /** The type of the <code>Attribute</code> */ | |
179 protected int type = UNDECLARED_TYPE; | |
180 | |
181 /** Parent element, or null if none */ | |
182 protected Element parent; | |
183 | |
184 /** | |
185 * Default, no-args constructor for implementations to use if needed. | |
186 */ | |
187 protected Attribute() {} | |
188 | |
189 /** | |
190 * This will create a new <code>Attribute</code> with the | |
191 * specified (local) name and value, and in the provided | |
192 * <code>{@link Namespace}</code>. | |
193 * | |
194 * @param name <code>String</code> name of <code>Attribute</code>. | |
195 * @param value <code>String</code> value for new attribute. | |
196 * @param namespace <code>Namespace</code> namespace for new attribute. | |
197 * @throws IllegalNameException if the given name is illegal as an | |
198 * attribute name or if if the new namespace is the default | |
199 * namespace. Attributes cannot be in a default namespace. | |
200 * @throws IllegalDataException if the given attribute value is | |
201 * illegal character data (as determined by | |
202 * {@link org.jdom.Verifier#checkCharacterData}). | |
203 */ | |
204 public Attribute(final String name, final String value, final Namespace namespace) { | |
205 this(name, value, UNDECLARED_TYPE, namespace); | |
206 } | |
207 | |
208 /** | |
209 * This will create a new <code>Attribute</code> with the | |
210 * specified (local) name, value, and type, and in the provided | |
211 * <code>{@link Namespace}</code>. | |
212 * | |
213 * @param name <code>String</code> name of <code>Attribute</code>. | |
214 * @param value <code>String</code> value for new attribute. | |
215 * @param type <code>int</code> type for new attribute. | |
216 * @param namespace <code>Namespace</code> namespace for new attribute. | |
217 * @throws IllegalNameException if the given name is illegal as an | |
218 * attribute name or if if the new namespace is the default | |
219 * namespace. Attributes cannot be in a default namespace. | |
220 * @throws IllegalDataException if the given attribute value is | |
221 * illegal character data (as determined by | |
222 * {@link org.jdom.Verifier#checkCharacterData}) or | |
223 * if the given attribute type is not one of the | |
224 * supported types. | |
225 */ | |
226 public Attribute(final String name, final String value, final int type, final Namespace namespace) { | |
227 setName(name); | |
228 setValue(value); | |
229 setAttributeType(type); | |
230 setNamespace(namespace); | |
231 } | |
232 | |
233 /** | |
234 * This will create a new <code>Attribute</code> with the | |
235 * specified (local) name and value, and does not place | |
236 * the attribute in a <code>{@link Namespace}</code>. | |
237 * <p> | |
238 * <b>Note</b>: This actually explicitly puts the | |
239 * <code>Attribute</code> in the "empty" <code>Namespace</code> | |
240 * (<code>{@link Namespace#NO_NAMESPACE}</code>). | |
241 * | |
242 * @param name <code>String</code> name of <code>Attribute</code>. | |
243 * @param value <code>String</code> value for new attribute. | |
244 * @throws IllegalNameException if the given name is illegal as an | |
245 * attribute name. | |
246 * @throws IllegalDataException if the given attribute value is | |
247 * illegal character data (as determined by | |
248 * {@link org.jdom.Verifier#checkCharacterData}). | |
249 */ | |
250 public Attribute(final String name, final String value) { | |
251 this(name, value, UNDECLARED_TYPE, Namespace.NO_NAMESPACE); | |
252 } | |
253 | |
254 /** | |
255 * This will create a new <code>Attribute</code> with the | |
256 * specified (local) name, value and type, and does not place | |
257 * the attribute in a <code>{@link Namespace}</code>. | |
258 * <p> | |
259 * <b>Note</b>: This actually explicitly puts the | |
260 * <code>Attribute</code> in the "empty" <code>Namespace</code> | |
261 * (<code>{@link Namespace#NO_NAMESPACE}</code>). | |
262 * | |
263 * @param name <code>String</code> name of <code>Attribute</code>. | |
264 * @param value <code>String</code> value for new attribute. | |
265 * @param type <code>int</code> type for new attribute. | |
266 * @throws IllegalNameException if the given name is illegal as an | |
267 * attribute name. | |
268 * @throws IllegalDataException if the given attribute value is | |
269 * illegal character data (as determined by | |
270 * {@link org.jdom.Verifier#checkCharacterData}) or | |
271 * if the given attribute type is not one of the | |
272 * supported types. | |
273 */ | |
274 public Attribute(final String name, final String value, final int type) { | |
275 this(name, value, type, Namespace.NO_NAMESPACE); | |
276 } | |
277 | |
278 /** | |
279 * This will return the parent of this <code>Attribute</code>. | |
280 * If there is no parent, then this returns <code>null</code>. | |
281 * | |
282 * @return parent of this <code>Attribute</code> | |
283 */ | |
284 public Element getParent() { | |
285 return parent; | |
286 } | |
287 | |
288 /** | |
289 * This retrieves the owning <code>{@link Document}</code> for | |
290 * this Attribute, or null if not a currently a member of a | |
291 * <code>{@link Document}</code>. | |
292 * | |
293 * @return <code>Document</code> owning this Attribute, or null. | |
294 */ | |
295 public Document getDocument() { | |
296 final Element parentElement = getParent(); | |
297 if (parentElement != null) { | |
298 return parentElement.getDocument(); | |
299 } | |
300 | |
301 return null; | |
302 } | |
303 | |
304 /** | |
305 * This will set the parent of this <code>Attribute</code>. | |
306 * | |
307 * @param parent <code>Element</code> to be new parent. | |
308 * @return this <code>Attribute</code> modified. | |
309 */ | |
310 protected Attribute setParent(final Element parent) { | |
311 this.parent = parent; | |
312 return this; | |
313 } | |
314 | |
315 /** | |
316 * This detaches the <code>Attribute</code> from its parent, or does | |
317 * nothing if the <code>Attribute</code> has no parent. | |
318 * | |
319 * @return <code>Attribute</code> - this <code>Attribute</code> modified. | |
320 */ | |
321 public Attribute detach() { | |
322 final Element parentElement = getParent(); | |
323 if (parentElement != null) { | |
324 parentElement.removeAttribute(getName(),getNamespace()); | |
325 } | |
326 | |
327 return this; | |
328 } | |
329 | |
330 /** | |
331 * This will retrieve the local name of the | |
332 * <code>Attribute</code>. For any XML attribute | |
333 * which appears as | |
334 * <code>[namespacePrefix]:[attributeName]</code>, | |
335 * the local name of the attribute would be | |
336 * <code>[attributeName]</code>. When the attribute | |
337 * has no namespace, the local name is simply the attribute | |
338 * name. | |
339 * <p> | |
340 * To obtain the namespace prefix for this | |
341 * attribute, the | |
342 * <code>{@link #getNamespacePrefix()}</code> | |
343 * method should be used. | |
344 * | |
345 * @return <code>String</code> - name of this attribute, | |
346 * without any namespace prefix. | |
347 */ | |
348 public String getName() { | |
349 return name; | |
350 } | |
351 | |
352 /** | |
353 * This sets the local name of the <code>Attribute</code>. | |
354 * | |
355 * @param name the new local name to set | |
356 * @return <code>Attribute</code> - the attribute modified. | |
357 * @throws IllegalNameException if the given name is illegal as an | |
358 * attribute name. | |
359 */ | |
360 public Attribute setName(final String name) { | |
361 final String reason = Verifier.checkAttributeName(name); | |
362 if (reason != null) { | |
363 throw new IllegalNameException(name, "attribute", reason); | |
364 } | |
365 this.name = name; | |
366 return this; | |
367 } | |
368 | |
369 /** | |
370 * This will retrieve the qualified name of the <code>Attribute</code>. | |
371 * For any XML attribute whose name is | |
372 * <code>[namespacePrefix]:[elementName]</code>, | |
373 * the qualified name of the attribute would be | |
374 * everything (both namespace prefix and | |
375 * element name). When the attribute has no | |
376 * namespace, the qualified name is simply the attribute's | |
377 * local name. | |
378 * <p> | |
379 * To obtain the local name of the attribute, the | |
380 * <code>{@link #getName()}</code> method should be used. | |
381 * <p> | |
382 * To obtain the namespace prefix for this attribute, | |
383 * the <code>{@link #getNamespacePrefix()}</code> | |
384 * method should be used. | |
385 * | |
386 * @return <code>String</code> - full name for this element. | |
387 */ | |
388 public String getQualifiedName() { | |
389 // Note: Any changes here should be reflected in | |
390 // XMLOutputter.printQualifiedName() | |
391 final String prefix = namespace.getPrefix(); | |
392 | |
393 // no prefix found | |
394 if ((prefix == null) || ("".equals(prefix))) { | |
395 return getName(); | |
396 } else { | |
397 return new StringBuffer(prefix) | |
398 .append(':') | |
399 .append(getName()) | |
400 .toString(); | |
401 } | |
402 } | |
403 | |
404 /** | |
405 * This will retrieve the namespace prefix of the | |
406 * <code>Attribute</code>. For any XML attribute | |
407 * which appears as | |
408 * <code>[namespacePrefix]:[attributeName]</code>, | |
409 * the namespace prefix of the attribute would be | |
410 * <code>[namespacePrefix]</code>. When the attribute | |
411 * has no namespace, an empty <code>String</code> is returned. | |
412 * | |
413 * @return <code>String</code> - namespace prefix of this | |
414 * attribute. | |
415 */ | |
416 public String getNamespacePrefix() { | |
417 return namespace.getPrefix(); | |
418 } | |
419 | |
420 /** | |
421 * This returns the URI mapped to this <code>Attribute</code>'s | |
422 * prefix. If no mapping is found, an empty <code>String</code> is | |
423 * returned. | |
424 * | |
425 * @return <code>String</code> - namespace URI for this <code>Attribute</code>. | |
426 */ | |
427 public String getNamespaceURI() { | |
428 return namespace.getURI(); | |
429 } | |
430 | |
431 /** | |
432 * This will return this <code>Attribute</code>'s | |
433 * <code>{@link Namespace}</code>. | |
434 * | |
435 * @return <code>Namespace</code> - Namespace object for this <code>Attribute</code> | |
436 */ | |
437 public Namespace getNamespace() { | |
438 return namespace; | |
439 } | |
440 | |
441 /** | |
442 * This sets this <code>Attribute</code>'s <code>{@link Namespace}</code>. | |
443 * If the provided namespace is null, the attribute will have no namespace. | |
444 * The namespace must have a prefix. | |
445 * | |
446 * @param namespace the new namespace | |
447 * @return <code>Element</code> - the element modified. | |
448 * @throws IllegalNameException if the new namespace is the default | |
449 * namespace. Attributes cannot be in a default namespace. | |
450 */ | |
451 public Attribute setNamespace(Namespace namespace) { | |
452 if (namespace == null) { | |
453 namespace = Namespace.NO_NAMESPACE; | |
454 } | |
455 | |
456 // Verify the attribute isn't trying to be in a default namespace | |
457 // Attributes can't be in a default namespace | |
458 if (namespace != Namespace.NO_NAMESPACE && | |
459 "".equals(namespace.getPrefix())) { | |
460 throw new IllegalNameException("", "attribute namespace", | |
461 "An attribute namespace without a prefix can only be the " + | |
462 "NO_NAMESPACE namespace"); | |
463 } | |
464 this.namespace = namespace; | |
465 return this; | |
466 } | |
467 | |
468 /** | |
469 * This will return the actual textual value of this | |
470 * <code>Attribute</code>. This will include all text | |
471 * within the quotation marks. | |
472 * | |
473 * @return <code>String</code> - value for this attribute. | |
474 */ | |
475 public String getValue() { | |
476 return value; | |
477 } | |
478 | |
479 /** | |
480 * This will set the value of the <code>Attribute</code>. | |
481 * | |
482 * @param value <code>String</code> value for the attribute. | |
483 * @return <code>Attribute</code> - this Attribute modified. | |
484 * @throws IllegalDataException if the given attribute value is | |
485 * illegal character data (as determined by | |
486 * {@link org.jdom.Verifier#checkCharacterData}). | |
487 */ | |
488 public Attribute setValue(final String value) { | |
489 final String reason = Verifier.checkCharacterData(value); | |
490 if (reason != null) { | |
491 throw new IllegalDataException(value, "attribute", reason); | |
492 } | |
493 this.value = value; | |
494 return this; | |
495 } | |
496 | |
497 /** | |
498 * This will return the actual declared type of this | |
499 * <code>Attribute</code>. | |
500 * | |
501 * @return <code>int</code> - type for this attribute. | |
502 */ | |
503 public int getAttributeType() { | |
504 return type; | |
505 } | |
506 | |
507 /** | |
508 * This will set the type of the <code>Attribute</code>. | |
509 * | |
510 * @param type <code>int</code> type for the attribute. | |
511 * @return <code>Attribute</code> - this Attribute modified. | |
512 * @throws IllegalDataException if the given attribute type is | |
513 * not one of the supported types. | |
514 */ | |
515 public Attribute setAttributeType(final int type) { | |
516 if ((type < UNDECLARED_TYPE) || (type > ENUMERATED_TYPE)) { | |
517 throw new IllegalDataException(String.valueOf(type), | |
518 "attribute", "Illegal attribute type"); | |
519 } | |
520 this.type = type; | |
521 return this; | |
522 } | |
523 | |
524 /** | |
525 * This returns a <code>String</code> representation of the | |
526 * <code>Attribute</code>, suitable for debugging. | |
527 * | |
528 * @return <code>String</code> - information about the | |
529 * <code>Attribute</code> | |
530 */ | |
531 public String toString() { | |
532 return new StringBuffer() | |
533 .append("[Attribute: ") | |
534 .append(getQualifiedName()) | |
535 .append("=\"") | |
536 .append(value) | |
537 .append("\"") | |
538 .append("]") | |
539 .toString(); | |
540 } | |
541 | |
542 /** | |
543 * This tests for equality of this <code>Attribute</code> to the supplied | |
544 * <code>Object</code>. | |
545 * | |
546 * @param ob <code>Object</code> to compare to. | |
547 * @return <code>boolean</code> - whether the <code>Attribute</code> is | |
548 * equal to the supplied <code>Object</code>. | |
549 */ | |
550 public final boolean equals(final Object ob) { | |
551 return (ob == this); | |
552 } | |
553 | |
554 /** | |
555 * This returns the hash code for this <code>Attribute</code>. | |
556 * | |
557 * @return <code>int</code> - hash code. | |
558 */ | |
559 public final int hashCode() { | |
560 return super.hashCode(); | |
561 } | |
562 | |
563 /** | |
564 * This will return a clone of this <code>Attribute</code>. | |
565 * | |
566 * @return <code>Object</code> - clone of this <code>Attribute</code>. | |
567 */ | |
568 public Object clone() { | |
569 Attribute attribute = null; | |
570 try { | |
571 attribute = (Attribute) super.clone(); | |
572 } | |
573 catch (final CloneNotSupportedException ignore) { | |
574 // Won't happen | |
575 } | |
576 | |
577 // Name, namespace, and value are references to imutable objects | |
578 // and are copied by super.clone() (aka Object.clone()) | |
579 | |
580 // super.clone() copies reference to set parent to null | |
581 attribute.parent = null; | |
582 return attribute; | |
583 } | |
584 | |
585 ///////////////////////////////////////////////////////////////// | |
586 // Convenience Methods below here | |
587 ///////////////////////////////////////////////////////////////// | |
588 | |
589 /** | |
590 * This gets the value of the attribute, in | |
591 * <code>int</code> form, and if no conversion | |
592 * can occur, throws a | |
593 * <code>{@link DataConversionException}</code> | |
594 * | |
595 * @return <code>int</code> value of attribute. | |
596 * @throws DataConversionException when conversion fails. | |
597 */ | |
598 public int getIntValue() throws DataConversionException { | |
599 try { | |
600 return Integer.parseInt(value.trim()); | |
601 } catch (final NumberFormatException e) { | |
602 throw new DataConversionException(name, "int"); | |
603 } | |
604 } | |
605 | |
606 /** | |
607 * This gets the value of the attribute, in | |
608 * <code>long</code> form, and if no conversion | |
609 * can occur, throws a | |
610 * <code>{@link DataConversionException}</code> | |
611 * | |
612 * @return <code>long</code> value of attribute. | |
613 * @throws DataConversionException when conversion fails. | |
614 */ | |
615 public long getLongValue() throws DataConversionException { | |
616 try { | |
617 return Long.parseLong(value.trim()); | |
618 } catch (final NumberFormatException e) { | |
619 throw new DataConversionException(name, "long"); | |
620 } | |
621 } | |
622 | |
623 /** | |
624 * This gets the value of the attribute, in | |
625 * <code>float</code> form, and if no conversion | |
626 * can occur, throws a | |
627 * <code>{@link DataConversionException}</code> | |
628 * | |
629 * @return <code>float</code> value of attribute. | |
630 * @throws DataConversionException when conversion fails. | |
631 */ | |
632 public float getFloatValue() throws DataConversionException { | |
633 try { | |
634 // Avoid Float.parseFloat() to support JDK 1.1 | |
635 return Float.valueOf(value.trim()).floatValue(); | |
636 } catch (final NumberFormatException e) { | |
637 throw new DataConversionException(name, "float"); | |
638 } | |
639 } | |
640 | |
641 /** | |
642 * This gets the value of the attribute, in | |
643 * <code>double</code> form, and if no conversion | |
644 * can occur, throws a | |
645 * <code>{@link DataConversionException}</code> | |
646 * | |
647 * @return <code>double</code> value of attribute. | |
648 * @throws DataConversionException when conversion fails. | |
649 */ | |
650 public double getDoubleValue() throws DataConversionException { | |
651 try { | |
652 // Avoid Double.parseDouble() to support JDK 1.1 | |
653 return Double.valueOf(value.trim()).doubleValue(); | |
654 } catch (final NumberFormatException e) { | |
655 // Specially handle INF and -INF that Double.valueOf doesn't do | |
656 String v = value.trim(); | |
657 if ("INF".equals(v)) { | |
658 return Double.POSITIVE_INFINITY; | |
659 } | |
660 if ("-INF".equals(v)) { | |
661 return Double.NEGATIVE_INFINITY; | |
662 } | |
663 throw new DataConversionException(name, "double"); | |
664 } | |
665 } | |
666 | |
667 /** | |
668 * This gets the effective boolean value of the attribute, or throws a | |
669 * <code>{@link DataConversionException}</code> if a conversion can't be | |
670 * performed. True values are: "true", "on", "1", and "yes". False | |
671 * values are: "false", "off", "0", and "no". Values are trimmed before | |
672 * comparison. Values other than those listed here throw the exception. | |
673 * | |
674 * @return <code>boolean</code> value of attribute. | |
675 * @throws DataConversionException when conversion fails. | |
676 */ | |
677 public boolean getBooleanValue() throws DataConversionException { | |
678 final String valueTrim = value.trim(); | |
679 if ( | |
680 (valueTrim.equalsIgnoreCase("true")) || | |
681 (valueTrim.equalsIgnoreCase("on")) || | |
682 (valueTrim.equalsIgnoreCase("1")) || | |
683 (valueTrim.equalsIgnoreCase("yes"))) { | |
684 return true; | |
685 } else if ( | |
686 (valueTrim.equalsIgnoreCase("false")) || | |
687 (valueTrim.equalsIgnoreCase("off")) || | |
688 (valueTrim.equalsIgnoreCase("0")) || | |
689 (valueTrim.equalsIgnoreCase("no")) | |
690 ) { | |
691 return false; | |
692 } else { | |
693 throw new DataConversionException(name, "boolean"); | |
694 } | |
695 } | |
696 | |
697 // Support a custom Namespace serialization so no two namespace | |
698 // object instances may exist for the same prefix/uri pair | |
699 private void writeObject(final ObjectOutputStream out) throws IOException { | |
700 | |
701 out.defaultWriteObject(); | |
702 | |
703 // We use writeObject() and not writeUTF() to minimize space | |
704 // This allows for writing pointers to already written strings | |
705 out.writeObject(namespace.getPrefix()); | |
706 out.writeObject(namespace.getURI()); | |
707 } | |
708 | |
709 private void readObject(final ObjectInputStream in) | |
710 throws IOException, ClassNotFoundException { | |
711 | |
712 in.defaultReadObject(); | |
713 | |
714 namespace = Namespace.getNamespace( | |
715 (String) in.readObject(), (String) in.readObject()); | |
716 } | |
717 } |