001 // This file is part of the Attempto Java Packages.
002 // Copyright 2008, Attempto Group, University of Zurich (see http://attempto.ifi.uzh.ch).
003 //
004 // The Attempto Java Packages is free software: you can redistribute it and/or modify it under the
005 // terms of the GNU Lesser General Public License as published by the Free Software Foundation,
006 // either version 3 of the License, or (at your option) any later version.
007 //
008 // The Attempto Java Packages is distributed in the hope that it will be useful, but WITHOUT ANY
009 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
010 // PURPOSE. See the GNU Lesser General Public License for more details.
011 //
012 // You should have received a copy of the GNU Lesser General Public License along with the Attempto
013 // Java Packages. If not, see http://www.gnu.org/licenses/.
014
015 package ch.uzh.ifi.attempto.acewiki.core.ontology;
016
017 import java.util.ArrayList;
018 import java.util.List;
019
020 /**
021 * This abstract class represents a concept (other terminologies call it "unary relation", "class",
022 * or "type").
023 *
024 * @author Tobias Kuhn
025 */
026 public abstract class Concept extends OntologyElement {
027
028 private List<Individual> individualsCache;
029 private long individualsCacheStateID = -1;
030
031 private List<Concept> superConceptsCache;
032 private long superConceptsCacheStateID = -1;
033
034 private List<Concept> subConceptsCache;
035 private long subConceptsCacheStateID = -1;
036
037 /**
038 * Initializes the concept.
039 */
040 protected Concept() {
041 }
042
043 /**
044 * Returns all individuals that belong to this concept.
045 *
046 * @return A list of all individuals of this concept.
047 * @see Ontology#getIndividuals(Concept)
048 */
049 public synchronized List<Individual> getIndividuals() {
050 Ontology o = getOntology();
051 if (individualsCacheStateID != o.getStateID()) {
052 individualsCache = o.getIndividuals(this);
053 individualsCacheStateID = o.getStateID();
054 }
055 return new ArrayList<Individual>(individualsCache);
056 }
057
058 /**
059 * Returns true if the individuals of this concept are cached and do not have
060 * to be recalculated.
061 *
062 * @return true if the individuals are cached.
063 */
064 public boolean areIndividualsCached() {
065 return individualsCacheStateID == getOntology().getStateID();
066 }
067
068 /**
069 * Returns all super-concepts of this concept.
070 *
071 * @return A list of all super-concepts.
072 * @see Ontology#getSuperConcepts(Concept)
073 */
074 public synchronized List<Concept> getSuperConcepts() {
075 Ontology o = getOntology();
076 if (superConceptsCacheStateID != o.getStateID()) {
077 superConceptsCache = o.getSuperConcepts(this);
078 superConceptsCacheStateID = o.getStateID();
079 }
080 return new ArrayList<Concept>(superConceptsCache);
081 }
082
083 /**
084 * Returns true if the suber-concepts of this concept are cached and do not have
085 * to be recalculated.
086 *
087 * @return true if the super-concepts are cached.
088 */
089 public boolean areSuperConceptsCached() {
090 return superConceptsCacheStateID == getOntology().getStateID();
091 }
092
093 /**
094 * Returns all sub-concepts of this concept.
095 *
096 * @return A list of all sub-concepts.
097 * @see Ontology#getSubConcepts(Concept)
098 */
099 public synchronized List<Concept> getSubConcepts() {
100 Ontology o = getOntology();
101 if (subConceptsCacheStateID != o.getStateID()) {
102 subConceptsCache = o.getSubConcepts(this);
103 subConceptsCacheStateID = o.getStateID();
104 }
105 return new ArrayList<Concept>(subConceptsCache);
106 }
107
108 /**
109 * Returns true if the sub-concepts of this concept are cached and do not have
110 * to be recalculated.
111 *
112 * @return true if the sub-concepts are cached.
113 */
114 public boolean areSubConceptsCached() {
115 return subConceptsCacheStateID == getOntology().getStateID();
116 }
117
118 }