001: /******************************************************************
002: * File: TopGoalIterator.java
003: * Created by: Dave Reynolds
004: * Created on: 30-May-2003
005: *
006: * (c) Copyright 2003, 2004, 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP
007: * [See end of file]
008: * $Id: TopGoalIterator.java,v 1.7 2008/01/02 12:09:45 andy_seaborne Exp $
009: *****************************************************************/package com.hp.hpl.jena.reasoner.rulesys.impl.oldCode;
010:
011: import com.hp.hpl.jena.reasoner.TriplePattern;
012: import com.hp.hpl.jena.reasoner.rulesys.impl.StateFlag;
013:
014: import java.util.Iterator;
015:
016: /**
017: * Wraps up the backward chaining engine as an iterator-like object that can be
018: * used in InfGraphs to implement a "find" operation. It creates
019: * a top level GoalState and pumps that for results until the
020: * agenda is empty.
021: *
022: * @author <a href="mailto:der@hplb.hpl.hp.com">Dave Reynolds</a>
023: * @version $Revision: 1.7 $ on $Date: 2008/01/02 12:09:45 $
024: */
025: public class TopGoalIterator implements Iterator {
026:
027: /** The GoalState which is traversing the top level derivation tree */
028: GoalState goalState;
029:
030: /** The next result to be returned, or null if we have finished */
031: Object lookAhead;
032:
033: /** The parent backward chaining engine */
034: BRuleEngine engine;
035:
036: /**
037: * Constructor. Wraps a top level goal state as an iterator
038: */
039: public TopGoalIterator(BRuleEngine engine, TriplePattern goal) {
040: this .engine = engine;
041: this .goalState = engine.findGoal(goal);
042: moveForward();
043: }
044:
045: /**
046: * Find the next result in the goal state and put it in the
047: * lookahead buffer.
048: */
049: private void moveForward() {
050: lookAhead = goalState.next();
051: if (lookAhead == StateFlag.SUSPEND) {
052: if (engine.next(goalState) != null) {
053: lookAhead = goalState.next();
054: } else {
055: lookAhead = null;
056: }
057: } else if (lookAhead == StateFlag.FAIL) {
058: lookAhead = null;
059: }
060: if (lookAhead == null)
061: close();
062: }
063:
064: /**
065: * @see com.hp.hpl.jena.util.iterator.ClosableIterator#close()
066: */
067: public void close() {
068: goalState.close();
069: engine.halt();
070: }
071:
072: /**
073: * @see java.util.Iterator#hasNext()
074: */
075: public boolean hasNext() {
076: return (lookAhead != null);
077: }
078:
079: /**
080: * @see java.util.Iterator#next()
081: */
082: public Object next() {
083: Object result = lookAhead;
084: moveForward();
085: return result;
086: }
087:
088: /**
089: * @see java.util.Iterator#remove()
090: */
091: public void remove() {
092: throw new UnsupportedOperationException();
093: }
094:
095: }
096:
097: /*
098: (c) Copyright 2003, 2004, 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP
099: All rights reserved.
100:
101: Redistribution and use in source and binary forms, with or without
102: modification, are permitted provided that the following conditions
103: are met:
104:
105: 1. Redistributions of source code must retain the above copyright
106: notice, this list of conditions and the following disclaimer.
107:
108: 2. Redistributions in binary form must reproduce the above copyright
109: notice, this list of conditions and the following disclaimer in the
110: documentation and/or other materials provided with the distribution.
111:
112: 3. The name of the author may not be used to endorse or promote products
113: derived from this software without specific prior written permission.
114:
115: THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
116: IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
117: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
118: IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
119: INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
120: NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
121: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
122: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
123: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
124: THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
125: */
|