001: /******************************************************************
002: * File: FinderUtil.java
003: * Created by: Dave Reynolds
004: * Created on: 18-Jan-03
005: *
006: * (c) Copyright 2003, 2004, 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP
007: * [See end of file]
008: * $Id: FinderUtil.java,v 1.11 2008/01/02 12:07:00 andy_seaborne Exp $
009: *****************************************************************/package com.hp.hpl.jena.reasoner;
010:
011: import com.hp.hpl.jena.util.iterator.*;
012:
013: /**
014: * Some simple helper methods used when working with Finders,
015: * particularly to compose them into cascade sequences.
016: * The cascades are designed to cope with null Finders as well.
017: *
018: * @author <a href="mailto:der@hplb.hpl.hp.com">Dave Reynolds</a>
019: * @version $Revision: 1.11 $ on $Date: 2008/01/02 12:07:00 $
020: */
021: public class FinderUtil {
022:
023: /**
024: * Create a continuation object which is a cascade of two
025: * continuation objects.
026: * @param first the first Graph/Finder to try
027: * @param second the second Graph/Finder to try
028: */
029: public static Finder cascade(Finder first, Finder second) {
030: if (first == null
031: || (first instanceof FGraph && ((FGraph) first)
032: .getGraph() == null))
033: return second;
034: if (second == null
035: || (second instanceof FGraph && ((FGraph) second)
036: .getGraph() == null))
037: return first;
038: return new Cascade(first, second);
039: }
040:
041: /**
042: * Create a continuation object which is a cascade of three
043: * continuation objects.
044: * @param first the first Graph/Finder to try
045: * @param second the second Graph/Finder to try
046: * @param third the third Graph/Finder to try
047: */
048: public static Finder cascade(Finder first, Finder second,
049: Finder third) {
050: return new Cascade(first, cascade(second, third));
051: }
052:
053: /**
054: * Create a continuation object which is a cascade of four
055: * continuation objects.
056: * @param first the first Graph/Finder to try
057: * @param second the second Graph/Finder to try
058: * @param third the third Graph/Finder to try
059: * @param fourth the third Graph/Finder to try
060: */
061: public static Finder cascade(Finder first, Finder second,
062: Finder third, Finder fourth) {
063: return new Cascade(first, cascade(second,
064: cascade(third, fourth)));
065: }
066:
067: /**
068: * Inner class used to implement cascades of two continuation objects
069: */
070: private static class Cascade implements Finder {
071: /** the first Graph/Finder to try */
072: Finder first;
073:
074: /** the second Graph/Finder to try */
075: Finder second;
076:
077: /**
078: * Constructor
079: */
080: Cascade(Finder first, Finder second) {
081: this .first = first;
082: this .second = second;
083: }
084:
085: /**
086: * Basic pattern lookup interface.
087: * @param pattern a TriplePattern to be matched against the data
088: * @return a ClosableIterator over all Triples in the data set
089: * that match the pattern
090: */
091: public ExtendedIterator find(TriplePattern pattern) {
092: if (second == null) {
093: return first.find(pattern);
094: } else if (first == null) {
095: return second.find(pattern);
096: } else {
097: return first.findWithContinuation(pattern, second);
098: }
099: }
100:
101: /**
102: * Extended find interface used in situations where the implementator
103: * may or may not be able to answer the complete query. It will
104: * attempt to answer the pattern but if its answers are not known
105: * to be complete then it will also pass the request on to the nested
106: * Finder to append more results.
107: * @param pattern a TriplePattern to be matched against the data
108: * @param continuation either a Finder or a normal Graph which
109: * will be asked for additional match results if the implementor
110: * may not have completely satisfied the query.
111: */
112: public ExtendedIterator findWithContinuation(
113: TriplePattern pattern, Finder continuation) {
114: return (FinderUtil.cascade(first, second, continuation))
115: .find(pattern);
116: }
117:
118: /**
119: * Return true if the given pattern occurs somewhere in the find sequence.
120: */
121: public boolean contains(TriplePattern pattern) {
122: ClosableIterator it = find(pattern);
123: boolean result = it.hasNext();
124: it.close();
125: return result;
126: }
127:
128: }
129: }
130:
131: /*
132: (c) Copyright 2003, 2004, 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP
133: All rights reserved.
134:
135: Redistribution and use in source and binary forms, with or without
136: modification, are permitted provided that the following conditions
137: are met:
138:
139: 1. Redistributions of source code must retain the above copyright
140: notice, this list of conditions and the following disclaimer.
141:
142: 2. Redistributions in binary form must reproduce the above copyright
143: notice, this list of conditions and the following disclaimer in the
144: documentation and/or other materials provided with the distribution.
145:
146: 3. The name of the author may not be used to endorse or promote products
147: derived from this software without specific prior written permission.
148:
149: THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
150: IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
151: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
152: IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
153: INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
154: NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
155: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
156: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
157: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
158: THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
159: */
|