KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > hp > hpl > jena > ontology > OntProperty


1 /*****************************************************************************
2  * Source code information
3  * -----------------------
4  * Original author Ian Dickinson, HP Labs Bristol
5  * Author email Ian.Dickinson@hp.com
6  * Package Jena 2
7  * Web http://sourceforge.net/projects/jena/
8  * Created 10 Feb 2003
9  * Filename $RCSfile: OntProperty.java,v $
10  * Revision $Revision: 1.16 $
11  * Release status $State: Exp $
12  *
13  * Last modified on $Date: 2005/04/11 16:41:41 $
14  * by $Author: ian_dickinson $
15  *
16  * (c) Copyright 2002, 2003, 2004, 2005 Hewlett-Packard Development Company, LP
17  * footer for full conditions)
18  * ****************************************************************************/

19
20 // Package
21
///////////////
22
package com.hp.hpl.jena.ontology;
23
24
25 // Imports
26
///////////////
27
import com.hp.hpl.jena.rdf.model.*;
28 import com.hp.hpl.jena.util.iterator.ExtendedIterator;
29
30
31
32 /**
33  * <p>
34  * Interface encapsulating a property in an ontology. This is an extension to the
35  * standard {@link Property} interface, adding a collection of convenience methods
36  * for accessing the additional semantic features of properties in OWL, RDFS and DAML+OIL,
37  * such as domain, range, inverse, etc. Not all such capabilities exist in all
38  * supported ontology languages.
39  * </p>
40  *
41  * @author Ian Dickinson, HP Labs
42  * (<a HREF="mailto:Ian.Dickinson@hp.com" >email</a>)
43  * @version CVS $Id: OntProperty.java,v 1.16 2005/04/11 16:41:41 ian_dickinson Exp $
44  */

45 public interface OntProperty
46     extends OntResource, Property
47 {
48     // Constants
49
//////////////////////////////////
50

51
52     // External signature methods
53
//////////////////////////////////
54

55     // subPropertyOf
56

57     /**
58      * <p>Assert that this property is sub-property of the given property. Any existing
59      * statements for <code>subPropertyOf</code> will be removed.</p>
60      * @param prop The property that this property is a sub-property of
61      * @exception OntProfileException If the {@link Profile#SUB_PROPERTY_OF()} property is not supported in the current language profile.
62      */

63     public void setSuperProperty( Property prop );
64
65     /**
66      * <p>Add a super-property of this property.</p>
67      * @param prop A property that is a super-property of this property.
68      * @exception OntProfileException If the {@link Profile#SUB_PROPERTY_OF()} property is not supported in the current language profile.
69      */

70     public void addSuperProperty( Property prop );
71
72     /**
73      * <p>Answer a property that is the super-property of this property. If there is
74      * more than one such property, an arbitrary selection is made.</p>
75      * @return A super-property of this property
76      * @exception OntProfileException If the {@link Profile#SUB_PROPERTY_OF()} property is not supported in the current language profile.
77      */

78     public OntProperty getSuperProperty();
79
80     /**
81      * <p>Answer an iterator over all of the properties that are declared to be super-properties of
82      * this property. Each element of the iterator will be an {@link OntProperty}.</p>
83      * @return An iterator over the super-properties of this property.
84      * @exception OntProfileException If the {@link Profile#SUB_PROPERTY_OF()} property is not supported in the current language profile.
85      */

86     public ExtendedIterator listSuperProperties();
87
88     /**
89      * <p>Answer an iterator over all of the properties that are declared to be super-properties of
90      * this property. Each element of the iterator will be an {@link OntProperty}.</p>
91      * @param direct If true, only answer the direcly adjacent properties in the
92      * property hierarchy: i&#046;e&#046; eliminate any property for which there is a longer route
93      * to reach that child under the super-property relation.
94      * @return An iterator over the super-properties of this property.
95      * @exception OntProfileException If the {@link Profile#SUB_PROPERTY_OF()} property is not supported in the current language profile.
96      */

97     public ExtendedIterator listSuperProperties( boolean direct );
98
99     /**
100      * <p>Answer true if the given property is a super-property of this property.</p>
101      * @param prop A property to test.
102      * @param direct If true, only consider the direcly adjacent properties in the
103      * property hierarchy
104      * @return True if the given property is a super-property of this property.
105      * @exception OntProfileException If the {@link Profile#SUB_PROPERTY_OF()} property is not supported in the current language profile.
106      */

107     public boolean hasSuperProperty( Property prop, boolean direct );
108
109     /**
110      * <p>Remove the given property from the super-properties of this property. If this statement
111      * is not true of the current model, nothing happens.</p>
112      * @param prop A property to be removed from the super-properties of this property
113      * @exception OntProfileException If the {@link Profile#SUB_PROPERTY_OF()} property is not supported in the current language profile.
114      */

115     public void removeSuperProperty( Property prop );
116
117     /**
118      * <p>Assert that this property is super-property of the given property. Any existing
119      * statements for <code>subPropertyOf</code> on <code>prop</code> will be removed.</p>
120      * @param prop The property that is a sub-property of this property
121      * @exception OntProfileException If the {@link Profile#SUB_PROPERTY_OF()} property is not supported in the current language profile.
122      */

123     public void setSubProperty( Property prop );
124
125     /**
126      * <p>Add a sub-property of this property.</p>
127      * @param prop A property that is a sub-property of this property.
128      * @exception OntProfileException If the {@link Profile#SUB_PROPERTY_OF()} property is not supported in the current language profile.
129      */

130     public void addSubProperty( Property prop );
131
132     /**
133      * <p>Answer a property that is the sub-property of this property. If there is
134      * more than one such property, an arbitrary selection is made.</p>
135      * @return A sub-property of this property
136      * @exception OntProfileException If the {@link Profile#SUB_PROPERTY_OF()} property is not supported in the current language profile.
137      */

138     public OntProperty getSubProperty();
139
140     /**
141      * <p>Answer an iterator over all of the properties that are declared to be sub-properties of
142      * this property. Each element of the iterator will be an {@link OntProperty}.</p>
143      * @return An iterator over the sub-properties of this property.
144      * @exception OntProfileException If the {@link Profile#SUB_PROPERTY_OF()} property is not supported in the current language profile.
145      */

146     public ExtendedIterator listSubProperties();
147
148     /**
149      * <p>Answer an iterator over all of the properties that are declared to be sub-properties of
150      * this property. Each element of the iterator will be an {@link OntProperty}.</p>
151      * @param direct If true, only answer the direcly adjacent properties in the
152      * property hierarchy: i&#046;e&#046; eliminate any property for which there is a longer route
153      * to reach that child under the sub-property relation.
154      * @return An iterator over the sub-properties of this property.
155      * @exception OntProfileException If the {@link Profile#SUB_PROPERTY_OF()} property is not supported in the current language profile.
156      */

157     public ExtendedIterator listSubProperties( boolean direct );
158
159     /**
160      * <p>Answer true if the given property is a sub-property of this property.</p>
161      * @param prop A property to test.
162      * @param direct If true, only consider the direcly adjacent properties in the
163      * property hierarchy
164      * @return True if the given property is a sub-property of this property.
165      * @exception OntProfileException If the {@link Profile#SUB_PROPERTY_OF()} property is not supported in the current language profile.
166      */

167     public boolean hasSubProperty( Property prop, boolean direct );
168
169     /**
170      * <p>Remove the given property from the sub-properties of this property. If this statement
171      * is not true of the current model, nothing happens.</p>
172      * @param prop A property to be removed from the sub-properties of this property
173      * @exception OntProfileException If the {@link Profile#SUB_PROPERTY_OF()} property is not supported in the current language profile.
174      */

175     public void removeSubProperty( Property prop );
176
177     // domain
178

179     /**
180      * <p>Assert that the given resource represents the class of individuals that form the
181      * domain of this property. Any existing <code>domain</code> statements for this property are removed.</p>
182      * @param res The resource that represents the domain class for this property.
183      * @exception OntProfileException If the {@link Profile#DOMAIN()} property is not supported in the current language profile.
184      */

185     public void setDomain( Resource res );
186
187     /**
188      * <p>Add a resource representing the domain of this property.</p>
189      * @param res A resource that represents a domain class for this property.
190      * @exception OntProfileException If the {@link Profile#DOMAIN()} property is not supported in the current language profile.
191      */

192     public void addDomain( Resource res );
193
194     /**
195      * <p>Answer a resource that represents the domain class of this property. If there is
196      * more than one such resource, an arbitrary selection is made.</p>
197      * @return An resource representing the class that forms the domain of this property
198      * @exception OntProfileException If the {@link Profile#DOMAIN()} property is not supported in the current language profile.
199      */

200     public OntResource getDomain();
201
202     /**
203      * <p>Answer an iterator over all of the declared domain classes of this property.
204      * Each element of the iterator will be an {@link OntResource}.</p>
205      * @return An iterator over the classes that form the domain of this property.
206      * @exception OntProfileException If the {@link Profile#DOMAIN()} property is not supported in the current language profile.
207      */

208     public ExtendedIterator listDomain();
209
210     /**
211      * <p>Answer true if the given resource a class specifying the domain of this property.</p>
212      * @param res A resource representing a class
213      * @return True if the given resource is one of the domain classes of this property.
214      * @exception OntProfileException If the {@link Profile#DOMAIN()} property is not supported in the current language profile.
215      */

216     public boolean hasDomain( Resource res );
217
218     /**
219      * <p>Remove the given class from the stated domain(s) of this property. If this statement
220      * is not true of the current model, nothing happens.</p>
221      * @param cls A class to be removed from the declared domain(s) of this property
222      * @exception OntProfileException If the {@link Profile#DOMAIN()} property is not supported in the current language profile.
223      */

224     public void removeDomain( Resource cls );
225
226
227     // range
228

229     /**
230      * <p>Assert that the given resource represents the class of individuals that form the
231      * range of this property. Any existing <code>range</code> statements for this property are removed.</p>
232      * @param res The resource that represents the range class for this property.
233      * @exception OntProfileException If the {@link Profile#RANGE()} property is not supported in the current language profile.
234      */

235     public void setRange( Resource res );
236
237     /**
238      * <p>Add a resource representing the range of this property.</p>
239      * @param res A resource that represents a range class for this property.
240      * @exception OntProfileException If the {@link Profile#RANGE()} property is not supported in the current language profile.
241      */

242     public void addRange( Resource res );
243
244     /**
245      * <p>Answer a resource that represents the range class of this property. If there is
246      * more than one such resource, an arbitrary selection is made.</p>
247      * @return An resource representing the class that forms the range of this property
248      * @exception OntProfileException If the {@link Profile#RANGE()} property is not supported in the current language profile.
249      */

250     public OntResource getRange();
251
252     /**
253      * <p>Answer an iterator over all of the declared range classes of this property.
254      * Each element of the iterator will be an {@link OntResource}.</p>
255      * @return An iterator over the classes that form the range of this property.
256      * @exception OntProfileException If the {@link Profile#RANGE()} property is not supported in the current language profile.
257      */

258     public ExtendedIterator listRange();
259
260     /**
261      * <p>Answer true if the given resource a class specifying the range of this property.</p>
262      * @param res A resource representing a class
263      * @return True if the given resource is one of the range classes of this property.
264      * @exception OntProfileException If the {@link Profile#RANGE()} property is not supported in the current language profile.
265      */

266     public boolean hasRange( Resource res );
267
268     /**
269      * <p>Remove the given class from the stated range(s) of this property. If this statement
270      * is not true of the current model, nothing happens.</p>
271      * @param cls A class to be removed from the declared range(s) of this property
272      * @exception OntProfileException If the {@link Profile#RANGE()} property is not supported in the current language profile.
273      */

274     public void removeRange( Resource cls );
275
276
277     // relationships between properties
278

279     // equivalentProperty
280

281     /**
282      * <p>Assert that the given property is equivalent to this property. Any existing
283      * statements for <code>equivalentProperty</code> will be removed.</p>
284      * @param prop The property that this property is a equivalent to.
285      * @exception OntProfileException If the {@link Profile#EQUIVALENT_PROPERTY()} property is not supported in the current language profile.
286      */

287     public void setEquivalentProperty( Property prop );
288
289     /**
290      * <p>Add a property that is equivalent to this property.</p>
291      * @param prop A property that is equivalent to this property.
292      * @exception OntProfileException If the {@link Profile#EQUIVALENT_PROPERTY()} property is not supported in the current language profile.
293      */

294     public void addEquivalentProperty( Property prop );
295
296     /**
297      * <p>Answer a property that is equivalent to this property. If there is
298      * more than one such property, an arbitrary selection is made.</p>
299      * @return A property equivalent to this property
300      * @exception OntProfileException If the {@link Profile#EQUIVALENT_PROPERTY()} property is not supported in the current language profile.
301      */

302     public OntProperty getEquivalentProperty();
303
304     /**
305      * <p>Answer an iterator over all of the properties that are declared to be equivalent properties to
306      * this property. Each element of the iterator will be an {@link OntProperty}.</p>
307      * @return An iterator over the properties equivalent to this property.
308      * @exception OntProfileException If the {@link Profile#EQUIVALENT_PROPERTY()} property is not supported in the current language profile.
309      */

310     public ExtendedIterator listEquivalentProperties();
311
312     /**
313      * <p>Answer true if the given property is equivalent to this property.</p>
314      * @param prop A property to test for
315      * @return True if the given property is equivalent to this property.
316      * @exception OntProfileException If the {@link Profile#EQUIVALENT_PROPERTY()} property is not supported in the current language profile.
317      */

318     public boolean hasEquivalentProperty( Property prop );
319
320     /**
321      * <p>Remove the statement that this property and the given property are
322      * equivalent. If this statement
323      * is not true of the current model, nothing happens.</p>
324      * @param prop A property that may be declared to be equivalent to this property
325      * @exception OntProfileException If the {@link Profile#EQUIVALENT_PROPERTY()} property is not supported in the current language profile.
326      */

327     public void removeEquivalentProperty( Property prop );
328
329
330     // inverseProperty
331

332     /**
333      * <p>Assert that this property is the inverse of the given property. Any existing
334      * statements for <code>inverseOf</code> will be removed.</p>
335      * @param prop The property that this property is a inverse to.
336      * @exception OntProfileException If the {@link Profile#INVERSE_OF()} property is not supported in the current language profile.
337      */

338     public void setInverseOf( Property prop );
339
340     /**
341      * <p>Add a property that this property is the inverse of.</p>
342      * @param prop A property that is the inverse of this property.
343      * @exception OntProfileException If the {@link Profile#INVERSE_OF()} property is not supported in the current language profile.
344      */

345     public void addInverseOf( Property prop );
346
347     /**
348      * <p>Answer a property of which this property is the inverse, if known,
349      * or null if there is no such property. If there is
350      * more than one such property, an arbitrary selection is made.</p>
351      * <p>Note that this method is slightly different to {@link #getInverse}. See
352      * the Javadoc on {@link #getInverse} for a detailed explanation.</p>
353      * @return A property which this property is the inverse of, or null.
354      * @exception OntProfileException If the {@link Profile#INVERSE_OF()} property is not supported in the current language profile.
355      */

356     public OntProperty getInverseOf();
357
358     /**
359      * <p>Answer an iterator over all of the properties that this property is declared to be the inverse of.
360      * Each element of the iterator will be an {@link OntProperty}.</p>
361      * @return An iterator over the properties inverse to this property.
362      * @exception OntProfileException If the {@link Profile#INVERSE_OF()} property is not supported in the current language profile.
363      */

364     public ExtendedIterator listInverseOf();
365
366     /**
367      * <p>Answer true if this property is the inverse of the given property.</p>
368      * @param prop A property to test for
369      * @return True if the this property is the inverse of the the given property.
370      * @exception OntProfileException If the {@link Profile#INVERSE_OF()} property is not supported in the current language profile.
371      */

372     public boolean isInverseOf( Property prop );
373
374     /**
375      * <p>Remove the statement that this property is the inverse of the given property. If this statement
376      * is not true of the current model, nothing happens.</p>
377      * @param prop A property that may be declared to be inverse to this property
378      * @exception OntProfileException If the {@link Profile#INVERSE_OF()} property is not supported in the current language profile.
379      */

380     public void removeInverseProperty( Property prop );
381
382
383     // view conversion functions
384

385     /**
386      * <p>Answer a view of this property as a functional property</p>
387      * @return This property, but viewed as a FunctionalProperty node
388      * @exception ConversionException if the resource cannot be converted to a functional property
389      * given the lanuage profile and the current state of the underlying model.
390      */

391     public FunctionalProperty asFunctionalProperty();
392
393     /**
394      * <p>Answer a view of this property as a datatype property</p>
395      * @return This property, but viewed as a DatatypeProperty node
396      * @exception ConversionException if the resource cannot be converted to a datatype property
397      * given the lanuage profile and the current state of the underlying model.
398      */

399     public DatatypeProperty asDatatypeProperty();
400
401     /**
402      * <p>Answer a view of this property as an object property</p>
403      * @return This property, but viewed as an ObjectProperty node
404      * @exception ConversionException if the resource cannot be converted to an object property
405      * given the lanuage profile and the current state of the underlying model.
406      */

407     public ObjectProperty asObjectProperty();
408
409     /**
410      * <p>Answer a view of this property as a transitive property</p>
411      * @return This property, but viewed as a TransitiveProperty node
412      * @exception ConversionException if the resource cannot be converted to a transitive property
413      * given the lanuage profile and the current state of the underlying model.
414      */

415     public TransitiveProperty asTransitiveProperty();
416
417     /**
418      * <p>Answer a view of this property as an inverse functional property</p>
419      * @return This property, but viewed as an InverseFunctionalProperty node
420      * @exception ConversionException if the resource cannot be converted to an inverse functional property
421      * given the lanuage profile and the current state of the underlying model.
422      */

423     public InverseFunctionalProperty asInverseFunctionalProperty();
424
425     /**
426      * <p>Answer a view of this property as a symmetric property</p>
427      * @return This property, but viewed as a SymmetricProperty node
428      * @exception ConversionException if the resource cannot be converted to a symmetric property
429      * given the lanuage profile and the current state of the underlying model.
430      */

431     public SymmetricProperty asSymmetricProperty();
432
433     // conversion functions
434

435     /**
436      * <p>Answer a facet of this property as a functional property, adding additional information to the model if necessary.</p>
437      * @return This property, but converted to a FunctionalProperty facet
438      */

439     public FunctionalProperty convertToFunctionalProperty();
440
441     /**
442      * <p>Answer a facet of this property as a datatype property, adding additional information to the model if necessary.</p>
443      * @return This property, but converted to a DatatypeProperty facet
444      */

445     public DatatypeProperty convertToDatatypeProperty();
446
447     /**
448      * <p>Answer a facet of this property as an object property, adding additional information to the model if necessary.</p>
449      * @return This property, but converted to an ObjectProperty facet
450      */

451     public ObjectProperty convertToObjectProperty();
452
453     /**
454      * <p>Answer a facet of this property as a transitive property, adding additional information to the model if necessary.</p>
455      * @return This property, but converted to a TransitiveProperty facet
456      */

457     public TransitiveProperty convertToTransitiveProperty();
458
459     /**
460      * <p>Answer a facet of this property as an inverse functional property, adding additional information to the model if necessary.</p>
461      * @return This property, but converted to an InverseFunctionalProperty facet
462      */

463     public InverseFunctionalProperty convertToInverseFunctionalProperty();
464
465     /**
466      * <p>Answer a facet of this property as a symmetric property, adding additional information to the model if necessary.</p>
467      * @return This property, but converted to a SymmetricProperty facet
468      */

469     public SymmetricProperty convertToSymmetricProperty();
470
471
472     // tests on property sub-types
473

474     /**
475      * <p>Answer true if this property is a functional property</p>
476      * @return True if this this property has an <code>rdf:type</code> that defines it as a functional property.
477      */

478     public boolean isFunctionalProperty();
479
480     /**
481      * <p>Answer true if this property is a datatype property</p>
482      * @return True if this this property has an <code>rdf:type</code> that defines it as a datatype property.
483      */

484     public boolean isDatatypeProperty();
485
486     /**
487      * <p>Answer true if this property is an object property</p>
488      * @return True if this this property has an <code>rdf:type</code> that defines it as an object property.
489      */

490     public boolean isObjectProperty();
491
492     /**
493      * <p>Answer true if this property is a transitive property</p>
494      * @return True if this this property has an <code>rdf:type</code> that defines it as a transitive property.
495      */

496     public boolean isTransitiveProperty();
497
498     /**
499      * <p>Answer true if this property is an inverse functional property</p>
500      * @return True if this this property has an <code>rdf:type</code> that defines it as an inverse functional property.
501      */

502     public boolean isInverseFunctionalProperty();
503
504     /**
505      * <p>Answer true if this property is a symmetric property</p>
506      * @return True if this this property has an <code>rdf:type</code> that defines it as a symmetric property.
507      */

508     public boolean isSymmetricProperty();
509
510     /**
511      * <p>Answer the property that has declared itself to be the inverse of this property,
512      * if any such property is defined.
513      * If no such property is defined,
514      * return null. If more than one inverse is defined, return an abritrary selection.</p>
515      * <p>Note that this method is slightly different from {@link #getInverseOf}. Suppose that
516      * we have:</p>
517      * <pre>
518      * :p an owl:ObjectProperty.
519      * :q an owl:ObjectProperty.
520      * :p owl:inverseOf :q.
521      * </pre>
522      * <p>Then, <code>getInverse()</code> called on the <code>OntProperty</code>
523      * corresponding to <code>q</code> will return <code>p</code>, since <code>q</code>
524      * declares itself to be <code>p</code>'s inverse. However, <em>unless an OWL
525      * reasoner is used</em>, calling <code>getInverse()</code> on <code>p</code>
526      * will return <code>null</code>. Conversely, absent a reasoner,
527      * <code>{@link #getInverseOf}</code> on <code>p</code> will return <code>q</code>,
528      * but will return null when called on <code>q</code>. In the presence of an OWL
529      * reasoner, <code>getInverse()</code> and <code>getInverseOf()</code> are
530      * equivalent, since <code>owl:inverseOf</code> is a symmetric property.
531      * </p>
532      *
533      * @return The property that is the inverse of this property, or null.
534      */

535     public OntProperty getInverse();
536
537     /**
538      * <p>Answer an iterator over the properties that are defined to be inverses of this property.</p>
539      * @return An iterator over the properties that declare themselves the <code>inverseOf</code> this property.
540      */

541     public ExtendedIterator listInverse();
542
543     /**
544      * <p>Answer true if there is at least one inverse property for this property.</p>
545      * @return True if property has an inverse.
546      */

547     public boolean hasInverse();
548
549     // Miscellaneous other properties
550

551     /**
552      * <p>Answer an iterator of all of the classes in this ontology, such
553      * that each returned class has this property as one of its
554      * properties in {@link OntClass#listDeclaredProperties()}. This
555      * simulates a frame-like view of properties and classes; for more
556      * details see the <a HREF="../../../../../../how-to/rdf-frames.html">
557      * RDF frames howto</a>.</p>
558      * @return An iterator of the classes having this property as one
559      * of their declared properties
560      */

561     public ExtendedIterator listDeclaringClasses();
562
563     /**
564      * <p>Answer an iterator of all of the classes in this ontology, such
565      * that each returned class has this property as one of its
566      * properties in {@link OntClass#listDeclaredProperties(boolean)}. This
567      * simulates a frame-like view of properties and classes; for more
568      * details see the <a HREF="../../../../../../how-to/rdf-frames.html">
569      * RDF frames howto</a>.</p>
570      * @param direct If true, use only </em>direct</em> associations between classes
571      * and properties
572      * @return An iterator of the classes having this property as one
573      * of their declared properties
574      */

575     public ExtendedIterator listDeclaringClasses( boolean direct );
576 }
577
578
579 /*
580     (c) Copyright 2002, 2003, 2004, 2005 Hewlett-Packard Development Company, LP
581     All rights reserved.
582
583     Redistribution and use in source and binary forms, with or without
584     modification, are permitted provided that the following conditions
585     are met:
586
587     1. Redistributions of source code must retain the above copyright
588        notice, this list of conditions and the following disclaimer.
589
590     2. Redistributions in binary form must reproduce the above copyright
591        notice, this list of conditions and the following disclaimer in the
592        documentation and/or other materials provided with the distribution.
593
594     3. The name of the author may not be used to endorse or promote products
595        derived from this software without specific prior written permission.
596
597     THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
598     IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
599     OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
600     IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
601     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
602     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
603     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
604     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
605     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
606     THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
607 */

608
609
Popular Tags