KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > dom4j > Element


1 /*
2  * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
3  *
4  * This software is open source.
5  * See the bottom of this file for the licence.
6  */

7
8 package org.dom4j;
9
10 import java.util.Iterator JavaDoc;
11 import java.util.List JavaDoc;
12 import java.util.Map JavaDoc;
13
14 /**
15  * <p>
16  * <code>Element</code> interface defines an XML element. An element can have
17  * declared namespaces, attributes, child nodes and textual content.
18  * </p>
19  *
20  * <p>
21  * Some of this interface is optional. Some implementations may be read-only and
22  * not support being modified. Some implementations may not support the parent
23  * relationship and methods such as {@link #getParent}or {@link#getDocument}.
24  * </p>
25  *
26  * @author <a HREF="mailto:jstrachan@apache.org">James Strachan </a>
27  * @version $Revision: 1.47 $
28  */

29 public interface Element extends Branch {
30     // Name and namespace related methods
31
// -------------------------------------------------------------------------
32

33     /**
34      * <p>
35      * Returns the <code>QName</code> of this element which represents the
36      * local name, the qualified name and the <code>Namespace</code>.
37      * </p>
38      *
39      * @return the <code>QName</code> associated with this element
40      */

41     QName getQName();
42
43     /**
44      * <p>
45      * Sets the <code>QName</code> of this element which represents the local
46      * name, the qualified name and the <code>Namespace</code>.
47      * </p>
48      *
49      * @param qname
50      * is the <code>QName</code> to be associated with this element
51      */

52     void setQName(QName qname);
53
54     /**
55      * <p>
56      * Returns the <code>Namespace</code> of this element if one exists
57      * otherwise <code>Namespace.NO_NAMESPACE</code> is returned.
58      * </p>
59      *
60      * @return the <code>Namespace</code> associated with this element
61      */

62     Namespace getNamespace();
63
64     /**
65      * <p>
66      * Returns the <code>QName</code> for the given qualified name, using the
67      * namespace URI in scope for the given prefix of the qualified name or the
68      * default namespace if the qualified name has no prefix.
69      * </p>
70      *
71      * @param qualifiedName
72      * DOCUMENT ME!
73      *
74      * @return the <code>QName</code> for the given qualified name
75      */

76     QName getQName(String JavaDoc qualifiedName);
77
78     /**
79      * <p>
80      * Returns the <code>Namespace</code> which is mapped to the given prefix
81      * or null if it could not be found.
82      * </p>
83      *
84      * @param prefix
85      * DOCUMENT ME!
86      *
87      * @return the <code>Namespace</code> associated with the given prefix
88      */

89     Namespace getNamespaceForPrefix(String JavaDoc prefix);
90
91     /**
92      * <p>
93      * Returns the <code>Namespace</code> which is mapped to the given URI or
94      * null if it could not be found. If there is more than one
95      * <code>Namespace</code> mapped to the URI, which of them will be
96      * returned is undetermined.
97      * </p>
98      *
99      * @param uri
100      * DOCUMENT ME!
101      *
102      * @return the <code>Namespace</code> associated with the given URI
103      */

104     Namespace getNamespaceForURI(String JavaDoc uri);
105
106     /**
107      * <p>
108      * Returns the all namespaces which are mapped to the given URI or an empty
109      * list if no such namespaces could be found.
110      * </p>
111      *
112      * @param uri
113      * DOCUMENT ME!
114      *
115      * @return the namespaces associated with the given URI
116      *
117      * @since 1.5
118      */

119     List JavaDoc getNamespacesForURI(String JavaDoc uri);
120
121     /**
122      * <p>
123      * Returns the namespace prefix of this element if one exists otherwise an
124      * empty <code>String</code> is returned.
125      * </p>
126      *
127      * @return the prefix of the <code>Namespace</code> of this element or an
128      * empty <code>String</code>
129      */

130     String JavaDoc getNamespacePrefix();
131
132     /**
133      * <p>
134      * Returns the URI mapped to the namespace of this element if one exists
135      * otherwise an empty <code>String</code> is returned.
136      * </p>
137      *
138      * @return the URI for the <code>Namespace</code> of this element or an
139      * empty <code>String</code>
140      */

141     String JavaDoc getNamespaceURI();
142
143     /**
144      * <p>
145      * Returns the fully qualified name of this element. This will be the same
146      * as the value returned from {@link #getName}if this element has no
147      * namespace attached to this element or an expression of the form
148      *
149      * <pre>
150      * getNamespacePrefix() + &quot;:&quot; + getName()
151      * </pre>
152      *
153      * will be returned.
154      * </p>
155      *
156      * @return the fully qualified name of the element.
157      */

158     String JavaDoc getQualifiedName();
159
160     /**
161      * <p>
162      * Returns any additional namespaces declarations for this element other
163      * than namespace returned via the {@link #getNamespace()}method. If no
164      * additional namespace declarations are present for this element then an
165      * empty list will be returned. The list is backed by the element such that
166      * changes to the list will be reflected in the element though the reverse
167      * is not the case.
168      * </p>
169      *
170      * @return a list of any additional namespace declarations.
171      */

172     List JavaDoc additionalNamespaces();
173
174     /**
175      * <p>
176      * Returns all the namespaces declared by this element. If no namespaces are
177      * declared for this element then an empty list will be returned. The list
178      * is backed by the element such that changes to the list will be reflected
179      * in the element though the reverse is not the case.
180      * </p>
181      *
182      * @return a list of namespaces declared for this element.
183      */

184     List JavaDoc declaredNamespaces();
185
186     // Builder methods
187
// -------------------------------------------------------------------------
188

189     /**
190      * <p>
191      * Adds the attribute value of the given local name. If an attribute already
192      * exists for the given name it will be replaced. Attributes with null
193      * values are silently ignored. If the value of the attribute is null then
194      * this method call will remove any attributes with the given name.
195      * </p>
196      *
197      * @param name
198      * is the name of the attribute whose value is to be added or
199      * updated
200      * @param value
201      * is the attribute's value
202      *
203      * @return this <code>Element</code> instance.
204      */

205     Element addAttribute(String JavaDoc name, String JavaDoc value);
206
207     /**
208      * <p>
209      * Adds the attribute value of the given fully qualified name. If an
210      * attribute already exists for the given name it will be replaced.
211      * Attributes with null values are silently ignored. If the value of the
212      * attribute is null then this method call will remove any attributes with
213      * the given name.
214      * </p>
215      *
216      * @param qName
217      * is the fully qualified name of the attribute whose value is to
218      * be added or updated
219      * @param value
220      * is the attribute's value
221      *
222      * @return this <code>Element</code> instance.
223      */

224     Element addAttribute(QName qName, String JavaDoc value);
225
226     /**
227      * Adds a new <code>Comment</code> node with the given text to this
228      * element.
229      *
230      * @param comment
231      * is the text for the <code>Comment</code> node.
232      *
233      * @return this <code>Element</code> instance.
234      */

235     Element addComment(String JavaDoc comment);
236
237     /**
238      * Adds a new <code>CDATA</code> node with the given text to this element.
239      *
240      * @param cdata
241      * is the text for the <code>CDATA</code> node.
242      *
243      * @return this <code>Element</code> instance.
244      */

245     Element addCDATA(String JavaDoc cdata);
246
247     /**
248      * Adds a new <code>Entity</code> node with the given name and text to
249      * this element and returns a reference to the new node.
250      *
251      * @param name
252      * is the name for the <code>Entity</code> node.
253      * @param text
254      * is the text for the <code>Entity</code> node.
255      *
256      * @return this <code>Element</code> instance.
257      */

258     Element addEntity(String JavaDoc name, String JavaDoc text);
259
260     /**
261      * Adds a namespace to this element for use by its child content
262      *
263      * @param prefix
264      * is the prefix to use, which should not be null or blank
265      * @param uri
266      * is the namespace URI
267      *
268      * @return this <code>Element</code> instance.
269      */

270     Element addNamespace(String JavaDoc prefix, String JavaDoc uri);
271
272     /**
273      * Adds a processing instruction for the given target
274      *
275      * @param target
276      * is the target of the processing instruction
277      * @param text
278      * is the textual data (key/value pairs) of the processing
279      * instruction
280      *
281      * @return this <code>Element</code> instance.
282      */

283     Element addProcessingInstruction(String JavaDoc target, String JavaDoc text);
284
285     /**
286      * Adds a processing instruction for the given target
287      *
288      * @param target
289      * is the target of the processing instruction
290      * @param data
291      * is a Map of the key / value pairs of the processing
292      * instruction
293      *
294      * @return this <code>Element</code> instance.
295      */

296     Element addProcessingInstruction(String JavaDoc target, Map JavaDoc data);
297
298     /**
299      * Adds a new <code>Text</code> node with the given text to this element.
300      *
301      * @param text
302      * is the text for the <code>Text</code> node.
303      *
304      * @return this <code>Element</code> instance.
305      */

306     Element addText(String JavaDoc text);
307
308     // Typesafe modifying methods
309
// -------------------------------------------------------------------------
310

311     /**
312      * Adds the given <code>Attribute</code> to this element. If the given
313      * node already has a parent defined then an
314      * <code>IllegalAddException</code> will be thrown. Attributes with null
315      * values are silently ignored.
316      *
317      * <p>
318      * If the value of the attribute is null then this method call will remove
319      * any attributes with the QName of this attribute.
320      * </p>
321      *
322      * @param attribute
323      * is the attribute to be added
324      */

325     void add(Attribute attribute);
326
327     /**
328      * Adds the given <code>CDATA</code> to this element. If the given node
329      * already has a parent defined then an <code>IllegalAddException</code>
330      * will be thrown.
331      *
332      * @param cdata
333      * is the CDATA to be added
334      */

335     void add(CDATA cdata);
336
337     /**
338      * Adds the given <code>Entity</code> to this element. If the given node
339      * already has a parent defined then an <code>IllegalAddException</code>
340      * will be thrown.
341      *
342      * @param entity
343      * is the entity to be added
344      */

345     void add(Entity entity);
346
347     /**
348      * Adds the given <code>Text</code> to this element. If the given node
349      * already has a parent defined then an <code>IllegalAddException</code>
350      * will be thrown.
351      *
352      * @param text
353      * is the text to be added
354      */

355     void add(Text text);
356
357     /**
358      * Adds the given <code>Namespace</code> to this element. If the given
359      * node already has a parent defined then an
360      * <code>IllegalAddException</code> will be thrown.
361      *
362      * @param namespace
363      * is the namespace to be added
364      */

365     void add(Namespace namespace);
366
367     /**
368      * Removes the given <code>Attribute</code> from this element.
369      *
370      * @param attribute
371      * is the attribute to be removed
372      *
373      * @return true if the attribute was removed
374      */

375     boolean remove(Attribute attribute);
376
377     /**
378      * Removes the given <code>CDATA</code> if the node is an immediate child
379      * of this element. If the given node is not an immediate child of this
380      * element then the {@link Node#detach()}method should be used instead.
381      *
382      * @param cdata
383      * is the CDATA to be removed
384      *
385      * @return true if the cdata was removed
386      */

387     boolean remove(CDATA cdata);
388
389     /**
390      * Removes the given <code>Entity</code> if the node is an immediate child
391      * of this element. If the given node is not an immediate child of this
392      * element then the {@link Node#detach()}method should be used instead.
393      *
394      * @param entity
395      * is the entity to be removed
396      *
397      * @return true if the entity was removed
398      */

399     boolean remove(Entity entity);
400
401     /**
402      * Removes the given <code>Namespace</code> if the node is an immediate
403      * child of this element. If the given node is not an immediate child of
404      * this element then the {@link Node#detach()}method should be used
405      * instead.
406      *
407      * @param namespace
408      * is the namespace to be removed
409      *
410      * @return true if the namespace was removed
411      */

412     boolean remove(Namespace namespace);
413
414     /**
415      * Removes the given <code>Text</code> if the node is an immediate child
416      * of this element. If the given node is not an immediate child of this
417      * element then the {@link Node#detach()}method should be used instead.
418      *
419      * @param text
420      * is the text to be removed
421      *
422      * @return true if the text was removed
423      */

424     boolean remove(Text text);
425
426     // Text methods
427
// -------------------------------------------------------------------------
428

429     /**
430      * Returns the text value of this element without recursing through child
431      * elements. This method iterates through all {@link Text},{@link CDATA}
432      * and {@link Entity}nodes that this element contains and appends the text
433      * values together.
434      *
435      * @return the textual content of this Element. Child elements are not
436      * navigated. This method does not return null;
437      */

438     String JavaDoc getText();
439
440     /**
441      * DOCUMENT ME!
442      *
443      * @return the trimmed text value where whitespace is trimmed and normalised
444      * into single spaces. This method does not return null.
445      */

446     String JavaDoc getTextTrim();
447
448     /**
449      * Returns the XPath string-value of this node. The behaviour of this method
450      * is defined in the <a HREF="http://www.w3.org/TR/xpath">XPath
451      * specification </a>. This method returns the string-value of all the
452      * contained {@link Text},{@link CDATA},{@link Entity}and {@link
453      * Element} nodes all appended together.
454      *
455      * @return the text from all the child Text and Element nodes appended
456      * together.
457      */

458     String JavaDoc getStringValue();
459
460     /**
461      * Accesses the data of this element which may implement data typing
462      * bindings such as XML Schema or Java Bean bindings or will return the same
463      * value as {@link #getText}
464      *
465      * @return DOCUMENT ME!
466      */

467     Object JavaDoc getData();
468
469     /**
470      * Sets the data value of this element if this element supports data binding
471      * or calls {@link #setText}if it doesn't
472      *
473      * @param data
474      * DOCUMENT ME!
475      */

476     void setData(Object JavaDoc data);
477
478     // Attribute methods
479
// -------------------------------------------------------------------------
480

481     /**
482      * <p>
483      * Returns the {@link Attribute}instances this element contains as a backed
484      * {@link List}so that the attributes may be modified directly using the
485      * {@link List}interface. The <code>List</code> is backed by the
486      * <code>Element</code> so that changes to the list are reflected in the
487      * element and vice versa.
488      * </p>
489      *
490      * @return the attributes that this element contains as a <code>List</code>
491      */

492     List JavaDoc attributes();
493
494     /**
495      * Sets the attributes that this element contains
496      *
497      * @param attributes
498      * DOCUMENT ME!
499      */

500     void setAttributes(List JavaDoc attributes);
501
502     /**
503      * DOCUMENT ME!
504      *
505      * @return the number of attributes this element contains
506      */

507     int attributeCount();
508
509     /**
510      * DOCUMENT ME!
511      *
512      * @return an iterator over the attributes of this element
513      */

514     Iterator JavaDoc attributeIterator();
515
516     /**
517      * Returns the attribute at the specified indexGets the
518      *
519      * @param index
520      * DOCUMENT ME!
521      *
522      * @return the attribute at the specified index where index &gt;= 0 and
523      * index &lt; number of attributes or throws an
524      * IndexOutOfBoundsException if the index is not within the
525      * allowable range
526      */

527     Attribute attribute(int index);
528
529     /**
530      * Returns the attribute with the given name
531      *
532      * @param name
533      * DOCUMENT ME!
534      *
535      * @return the attribute for the given local name in any namespace. If there
536      * are more than one attributes with the given local name in
537      * different namespaces then the first one is returned.
538      */

539     Attribute attribute(String JavaDoc name);
540
541     /**
542      * DOCUMENT ME!
543      *
544      * @param qName
545      * is the fully qualified name
546      *
547      * @return the attribute for the given fully qualified name or null if it
548      * could not be found.
549      */

550     Attribute attribute(QName qName);
551
552     /**
553      * <p>
554      * This returns the attribute value for the attribute with the given name
555      * and any namespace or null if there is no such attribute or the empty
556      * string if the attribute value is empty.
557      * </p>
558      *
559      * @param name
560      * is the name of the attribute value to be returnd
561      *
562      * @return the value of the attribute, null if the attribute does not exist
563      * or the empty string
564      */

565     String JavaDoc attributeValue(String JavaDoc name);
566
567     /**
568      * <p>
569      * This returns the attribute value for the attribute with the given name
570      * and any namespace or the default value if there is no such attribute
571      * value.
572      * </p>
573      *
574      * @param name
575      * is the name of the attribute value to be returnd
576      * @param defaultValue
577      * is the default value to be returned if the attribute has no
578      * value defined.
579      *
580      * @return the value of the attribute or the defaultValue if the attribute
581      * has no value defined.
582      */

583     String JavaDoc attributeValue(String JavaDoc name, String JavaDoc defaultValue);
584
585     /**
586      * <p>
587      * This returns the attribute value for the attribute with the given fully
588      * qualified name or null if there is no such attribute or the empty string
589      * if the attribute value is empty.
590      * </p>
591      *
592      * @param qName
593      * is the fully qualified name
594      *
595      * @return the value of the attribute, null if the attribute does not exist
596      * or the empty string
597      */

598     String JavaDoc attributeValue(QName qName);
599
600     /**
601      * <p>
602      * This returns the attribute value for the attribute with the given fully
603      * qualified name or the default value if there is no such attribute value.
604      * </p>
605      *
606      * @param qName
607      * is the fully qualified name
608      * @param defaultValue
609      * is the default value to be returned if the attribute has no
610      * value defined.
611      *
612      * @return the value of the attribute or the defaultValue if the attribute
613      * has no value defined.
614      */

615     String JavaDoc attributeValue(QName qName, String JavaDoc defaultValue);
616
617     /**
618      * <p>
619      * Sets the attribute value of the given local name.
620      * </p>
621      *
622      * @param name
623      * is the name of the attribute whose value is to be added or
624      * updated
625      * @param value
626      * is the attribute's value
627      *
628      * @deprecated As of version 0.5. Please use {@link
629      * #addAttribute(String,String)} instead. WILL BE REMOVED IN
630      * dom4j-1.6 !!
631      */

632     void setAttributeValue(String JavaDoc name, String JavaDoc value);
633
634     /**
635      * <p>
636      * Sets the attribute value of the given fully qualified name.
637      * </p>
638      *
639      * @param qName
640      * is the fully qualified name of the attribute whose value is to
641      * be added or updated
642      * @param value
643      * is the attribute's value
644      *
645      * @deprecated As of version 0.5. Please use {@link
646      * #addAttribute(QName,String)} instead. WILL BE REMOVED IN
647      * dom4j-1.6 !!
648      */

649     void setAttributeValue(QName qName, String JavaDoc value);
650
651     // Content methods
652
// -------------------------------------------------------------------------
653

654     /**
655      * Returns the first element for the given local name and any namespace.
656      *
657      * @param name
658      * DOCUMENT ME!
659      *
660      * @return the first element with the given local name
661      */

662     Element element(String JavaDoc name);
663
664     /**
665      * Returns the first element for the given fully qualified name.
666      *
667      * @param qName
668      * is the fully qualified name to search for
669      *
670      * @return the first element with the given fully qualified name
671      */

672     Element element(QName qName);
673
674     /**
675      * <p>
676      * Returns the elements contained in this element. If this element does not
677      * contain any elements then this method returns an empty list. The list is
678      * backed by the element such that changes to the list will be reflected in
679      * the element though the reverse is not the case.
680      * </p>
681      *
682      * @return a list of all the elements in this element.
683      */

684     List JavaDoc elements();
685
686     /**
687      * <p>
688      * Returns the elements contained in this element with the given local name
689      * and any namespace. If no elements are found then this method returns an
690      * empty list. The list is backed by the element such that changes to the
691      * list will be reflected in the element though the reverse is not the case.
692      * </p>
693      *
694      * @param name
695      * DOCUMENT ME!
696      *
697      * @return a list of all the elements in this element for the given local
698      * name
699      */

700     List JavaDoc elements(String JavaDoc name);
701
702     /**
703      * <p>
704      * Returns the elements contained in this element with the given fully
705      * qualified name. If no elements are found then this method returns an
706      * empty list. The list is backed by the element such that changes to the
707      * list will be reflected in the element though the reverse is not the case.
708      * </p>
709      *
710      * @param qName
711      * is the fully qualified name to search for
712      *
713      * @return a list of all the elements in this element for the given fully
714      * qualified name.
715      */

716     List JavaDoc elements(QName qName);
717
718     /**
719      * Returns an iterator over all this elements child elements.
720      *
721      * @return an iterator over the contained elements
722      */

723     Iterator JavaDoc elementIterator();
724
725     /**
726      * Returns an iterator over the elements contained in this element which
727      * match the given local name and any namespace.
728      *
729      * @param name
730      * DOCUMENT ME!
731      *
732      * @return an iterator over the contained elements matching the given local
733      * name
734      */

735     Iterator JavaDoc elementIterator(String JavaDoc name);
736
737     /**
738      * Returns an iterator over the elements contained in this element which
739      * match the given fully qualified name.
740      *
741      * @param qName
742      * is the fully qualified name to search for
743      *
744      * @return an iterator over the contained elements matching the given fully
745      * qualified name
746      */

747     Iterator JavaDoc elementIterator(QName qName);
748
749     // Helper methods
750
// -------------------------------------------------------------------------
751

752     /**
753      * DOCUMENT ME!
754      *
755      * @return true if this element is the root element of a document and this
756      * element supports the parent relationship else false.
757      */

758     boolean isRootElement();
759
760     /**
761      * <p>
762      * Returns true if this <code>Element</code> has mixed content. Mixed
763      * content means that an element contains both textual data and child
764      * elements.
765      * </p>
766      *
767      * @return true if this element contains mixed content.
768      */

769     boolean hasMixedContent();
770
771     /**
772      * <p>
773      * Returns true if this <code>Element</code> has text only content.
774      * </p>
775      *
776      * @return true if this element is empty or only contains text content.
777      */

778     boolean isTextOnly();
779
780     /**
781      * Appends the attributes of the given element to me. This method behaves
782      * like the {@link java.util.Collection#addAll(java.util.Collection)}
783      * method.
784      *
785      * @param element
786      * is the element whose attributes will be added to me.
787      */

788     void appendAttributes(Element element);
789
790     /**
791      * <p>
792      * Creates a deep copy of this element The new element is detached from its
793      * parent, and getParent() on the clone will return null.
794      * </p>
795      *
796      * @return a new deep copy Element
797      */

798     Element createCopy();
799
800     /**
801      * <p>
802      * Creates a deep copy of this element with the given local name The new
803      * element is detached from its parent, and getParent() on the clone will
804      * return null.
805      * </p>
806      *
807      * @param name
808      * DOCUMENT ME!
809      *
810      * @return a new deep copy Element
811      */

812     Element createCopy(String JavaDoc name);
813
814     /**
815      * <p>
816      * Creates a deep copy of this element with the given fully qualified name.
817      * The new element is detached from its parent, and getParent() on the clone
818      * will return null.
819      * </p>
820      *
821      * @param qName
822      * DOCUMENT ME!
823      *
824      * @return a new deep copy Element
825      */

826     Element createCopy(QName qName);
827
828     String JavaDoc elementText(String JavaDoc name);
829
830     String JavaDoc elementText(QName qname);
831
832     String JavaDoc elementTextTrim(String JavaDoc name);
833
834     String JavaDoc elementTextTrim(QName qname);
835
836     /**
837      * Returns a node at the given index suitable for an XPath result set. This
838      * means the resulting Node will either be null or it will support the
839      * parent relationship.
840      *
841      * @param index
842      * DOCUMENT ME!
843      *
844      * @return the Node for the given index which will support the parent
845      * relationship or null if there is not a node at the given index.
846      */

847     Node getXPathResult(int index);
848 }
849
850 /*
851  * Redistribution and use of this software and associated documentation
852  * ("Software"), with or without modification, are permitted provided that the
853  * following conditions are met:
854  *
855  * 1. Redistributions of source code must retain copyright statements and
856  * notices. Redistributions must also contain a copy of this document.
857  *
858  * 2. Redistributions in binary form must reproduce the above copyright notice,
859  * this list of conditions and the following disclaimer in the documentation
860  * and/or other materials provided with the distribution.
861  *
862  * 3. The name "DOM4J" must not be used to endorse or promote products derived
863  * from this Software without prior written permission of MetaStuff, Ltd. For
864  * written permission, please contact dom4j-info@metastuff.com.
865  *
866  * 4. Products derived from this Software may not be called "DOM4J" nor may
867  * "DOM4J" appear in their names without prior written permission of MetaStuff,
868  * Ltd. DOM4J is a registered trademark of MetaStuff, Ltd.
869  *
870  * 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org
871  *
872  * THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND
873  * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
874  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
875  * ARE DISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE
876  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
877  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
878  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
879  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
880  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
881  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
882  * POSSIBILITY OF SUCH DAMAGE.
883  *
884  * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
885  */

886
Popular Tags