001: /******************************************************************
002: * File: RETETerminal.java
003: * Created by: Dave Reynolds
004: * Created on: 09-Jun-2003
005: *
006: * (c) Copyright 2003, 2004, 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP
007: * [See end of file]
008: * $Id: RETETerminal.java,v 1.18 2008/01/02 12:06:16 andy_seaborne Exp $
009: *****************************************************************/package com.hp.hpl.jena.reasoner.rulesys.impl;
010:
011: import com.hp.hpl.jena.reasoner.rulesys.*;
012: import java.util.*;
013: import org.apache.commons.logging.Log;
014: import org.apache.commons.logging.LogFactory;
015:
016: /**
017: * The final node in a RETE graph. It runs the builtin guard clauses
018: * and then, if the token passes, executes the head operations.
019: *
020: * @author <a href="mailto:der@hplb.hpl.hp.com">Dave Reynolds</a>
021: * @version $Revision: 1.18 $ on $Date: 2008/01/02 12:06:16 $
022: */
023: public class RETETerminal implements RETESinkNode {
024:
025: /** Context containing the specific rule and parent graph */
026: protected RETERuleContext context;
027:
028: protected static Log logger = LogFactory.getLog(FRuleEngine.class);
029:
030: /**
031: * Constructor.
032: * @param rule the rule which this terminal should fire.
033: * @param engine the parent rule engine through which the deductions and recursive network can be reached.
034: * @param graph the wider encompasing infGraph needed to for the RuleContext
035: */
036: public RETETerminal(Rule rule, RETEEngine engine,
037: ForwardRuleInfGraphI graph) {
038: context = new RETERuleContext(graph, engine);
039: context.rule = rule;
040: }
041:
042: /**
043: * Constructor. Used internally for cloning.
044: * @param rule the rule which this terminal should fire.
045: * @param engine the parent rule engine through which the deductions and recursive network can be reached.
046: * @param graph the wider encompasing infGraph needed to for the RuleContext
047: */
048: protected RETETerminal(RETERuleContext context) {
049: this .context = context;
050: }
051:
052: /**
053: * Change the engine/graph to which this terminal should deliver its results.
054: */
055: public void setContext(RETEEngine engine, ForwardRuleInfGraphI graph) {
056: Rule rule = context.getRule();
057: context = new RETERuleContext(graph, engine);
058: context.setRule(rule);
059: }
060:
061: /**
062: * Propagate a token to this node.
063: * @param env a set of variable bindings for the rule being processed.
064: * @param isAdd distinguishes between add and remove operations.
065: */
066: public void fire(BindingVector env, boolean isAdd) {
067: Rule rule = context.getRule();
068: context.setEnv(env);
069:
070: if (!context.shouldFire(isAdd))
071: return;
072:
073: // Now fire the rule
074: context.getEngine().requestRuleFiring(rule, env, isAdd);
075: }
076:
077: /**
078: * Clone this node in the network.
079: * @param netCopy a map from RETENode to cloned instance
080: * @param context the new context to which the network is being ported
081: */
082: public RETENode clone(Map netCopy, RETERuleContext contextIn) {
083: RETETerminal clone = (RETETerminal) netCopy.get(this );
084: if (clone == null) {
085: RETERuleContext newContext = new RETERuleContext(
086: (ForwardRuleInfGraphI) contextIn.getGraph(),
087: contextIn.getEngine());
088: newContext.setRule(context.getRule());
089: clone = new RETETerminal(newContext);
090: netCopy.put(this , clone);
091: }
092: return clone;
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: */
|