001: /*****************************************************************************
002: * Source code information
003: * -----------------------
004: * Original author Ian Dickinson, HP Labs Bristol
005: * Author email Ian.Dickinson@hp.com
006: * Package Jena 2
007: * Web http://sourceforge.net/projects/jena/
008: * Created 28-Apr-2003
009: * Filename $RCSfile: ComplementClassImpl.java,v $
010: * Revision $Revision: 1.17 $
011: * Release status $State: Exp $
012: *
013: * Last modified on $Date: 2008/01/23 12:47:00 $
014: * by $Author: ian_dickinson $
015: *
016: * (c) Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP
017: * (see footer for full conditions)
018: *****************************************************************************/package com.hp.hpl.jena.ontology.impl;
019:
020: // Imports
021: ///////////////
022: import java.util.Iterator;
023:
024: import com.hp.hpl.jena.enhanced.*;
025: import com.hp.hpl.jena.graph.Node;
026: import com.hp.hpl.jena.ontology.*;
027: import com.hp.hpl.jena.rdf.model.*;
028: import com.hp.hpl.jena.util.iterator.ExtendedIterator;
029:
030: /**
031: * <p>
032: * Implementation of a node representing a complement class description.
033: * </p>
034: *
035: * @author Ian Dickinson, HP Labs
036: * (<a href="mailto:Ian.Dickinson@hp.com" >email</a>)
037: * @version CVS $Id: ComplementClassImpl.java,v 1.17 2008/01/23 12:47:00 ian_dickinson Exp $
038: */
039: public class ComplementClassImpl extends OntClassImpl implements
040: ComplementClass {
041: // Constants
042: //////////////////////////////////
043:
044: // Static variables
045: //////////////////////////////////
046:
047: /**
048: * A factory for generating ComplementClass facets from nodes in enhanced graphs.
049: * Note: should not be invoked directly by user code: use
050: * {@link com.hp.hpl.jena.rdf.model.RDFNode#as as()} instead.
051: */
052: public static Implementation factory = new Implementation() {
053: public EnhNode wrap(Node n, EnhGraph eg) {
054: if (canWrap(n, eg)) {
055: return new ComplementClassImpl(n, eg);
056: } else {
057: throw new ConversionException("Cannot convert node "
058: + n + " to ComplementClass");
059: }
060: }
061:
062: public boolean canWrap(Node node, EnhGraph eg) {
063: // node will support being an ComplementClass facet if it has rdf:type owl:Class and an owl:complementOf statement (or equivalents)
064: Profile profile = (eg instanceof OntModel) ? ((OntModel) eg)
065: .getProfile()
066: : null;
067: Property comp = (profile == null) ? null : profile
068: .COMPLEMENT_OF();
069:
070: return (profile != null)
071: && profile.isSupported(node, eg, OntClass.class)
072: && comp != null
073: && eg.asGraph().contains(node, comp.asNode(),
074: Node.ANY);
075: }
076: };
077:
078: // Instance variables
079: //////////////////////////////////
080:
081: // Constructors
082: //////////////////////////////////
083:
084: /**
085: * <p>
086: * Construct a complement class node represented by the given node in the given graph.
087: * </p>
088: *
089: * @param n The node that represents the resource
090: * @param g The enh graph that contains n
091: */
092: public ComplementClassImpl(Node n, EnhGraph g) {
093: super (n, g);
094: }
095:
096: // External signature methods
097: //////////////////////////////////
098:
099: // operand
100:
101: /**
102: * <p>Assert that the operands for this boolean class expression are the classes
103: * in the given list. Any existing
104: * statements for the operator will be removed.</p>
105: * @param operands The list of operands to this expression.
106: * @exception Always throws UnsupportedOperationException since a complement expression takes only
107: * a single argument.
108: */
109: public void setOperands(RDFList operands) {
110: throw new UnsupportedOperationException(
111: "ComplementClass takes a single operand, not a list.");
112: }
113:
114: /**
115: * <p>Set the class that the class represented by this class expression is
116: * a complement of. Any existing value for <code>complementOf</code> will
117: * be replaced.</p>
118: * @param cls The class that this class is a complement of.
119: */
120: public void setOperand(Resource cls) {
121: setPropertyValue(getProfile().COMPLEMENT_OF(), "COMPLEMENT_OF",
122: cls);
123: }
124:
125: /**
126: * <p>Add a class the operands of this boolean expression.</p>
127: * @param cls A class that will be added to the operands of this Boolean expression
128: * @exception Always throws UnsupportedOperationException since a complement expression takes only
129: * a single argument.
130: */
131: public void addOperand(Resource cls) {
132: throw new UnsupportedOperationException(
133: "ComplementClass is only defined for a single operand.");
134: }
135:
136: /**
137: * <p>Add all of the classes from the given iterator to the operands of this boolean expression.</p>
138: * @param classes A iterator over classes that will be added to the operands of this Boolean expression
139: * @exception Always throws UnsupportedOperationException since a complement expression takes only
140: * a single argument.
141: */
142: public void addOperands(Iterator classes) {
143: throw new UnsupportedOperationException(
144: "ComplementClass is only defined for a single operand.");
145: }
146:
147: /**
148: * <p>Answer the list of operands for this Boolean class expression.</p>
149: * @return A list of the operands of this expression.
150: * @exception OntProfileException If the operand property is not supported in the current language profile.
151: */
152: public RDFList getOperands() {
153: throw new UnsupportedOperationException(
154: "ComplementClass takes a single operand, not a list.");
155: }
156:
157: /**
158: * <p>Answer an iterator over all of the clases that are the operands of this
159: * Boolean class expression. Each element of the iterator will be an {@link OntClass}.</p>
160: * @return An iterator over the operands of the expression.
161: * @exception OntProfileException If the operand property is not supported in the current language profile.
162: */
163: public ExtendedIterator listOperands() {
164: return listAs(getProfile().COMPLEMENT_OF(), "COMPLEMENT_OF",
165: OntClass.class);
166: }
167:
168: /**
169: * <p>Answer true if this Boolean class expression has the given class as an operand.</p>
170: * @param cls A class to test
171: * @return True if the given class is an operand to this expression.
172: * @exception OntProfileException If the operand property is not supported in the current language profile.
173: */
174: public boolean hasOperand(Resource cls) {
175: return hasPropertyValue(getProfile().COMPLEMENT_OF(),
176: "COMPLEMENT_OF", cls);
177: }
178:
179: /**
180: * <p>Answer the class that the class described by this class description
181: * is a complement of.</p>
182: * @return The class that this class is a complement of.
183: */
184: public OntClass getOperand() {
185: return (OntClass) objectAs(getProfile().COMPLEMENT_OF(),
186: "COMPLEMENT_OF", OntClass.class);
187: }
188:
189: /**
190: * <p>Remove the given resource from the operands of this class expression.</p>
191: * @param res An resource to be removed from the operands of this class expression
192: */
193: public void removeOperand(Resource res) {
194: removePropertyValue(getProfile().COMPLEMENT_OF(),
195: "COMPLEMENT_OF", res);
196: }
197:
198: /**
199: * <p>Answer the property that is used to construct this boolean expression, for example
200: * {@link Profile#UNION_OF()}.</p>
201: * @return {@link Profile#COMPLEMENT_OF()}
202: */
203: public Property operator() {
204: return getProfile().COMPLEMENT_OF();
205: }
206:
207: // Internal implementation methods
208: //////////////////////////////////
209:
210: //==============================================================================
211: // Inner class definitions
212: //==============================================================================
213:
214: }
215:
216: /*
217: (c) Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP
218: All rights reserved.
219:
220: Redistribution and use in source and binary forms, with or without
221: modification, are permitted provided that the following conditions
222: are met:
223:
224: 1. Redistributions of source code must retain the above copyright
225: notice, this list of conditions and the following disclaimer.
226:
227: 2. Redistributions in binary form must reproduce the above copyright
228: notice, this list of conditions and the following disclaimer in the
229: documentation and/or other materials provided with the distribution.
230:
231: 3. The name of the author may not be used to endorse or promote products
232: derived from this software without specific prior written permission.
233:
234: THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
235: IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
236: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
237: IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
238: INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
239: NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
240: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
241: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
242: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
243: THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
244: */
|