001: /*
002: * Copyright (C) 1999-2004 <A href="http://www-ist.massey.ac.nz/JBDietrich" target="_top">Jens Dietrich</a>
003: *
004: * This library is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License as published by the Free Software Foundation; either
007: * version 2 of the License, or (at your option) any later version.
008: *
009: * This library is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public
015: * License along with this library; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: */
018: package org.mandarax.examples.crm;
019:
020: import org.mandarax.examples.crm.domainmodel.Customer;
021: import org.mandarax.examples.crm.domainmodel.Discount;
022: import org.mandarax.kernel.Derivation;
023: import org.mandarax.kernel.InferenceEngine;
024: import org.mandarax.kernel.InferenceException;
025: import org.mandarax.kernel.KnowledgeBase;
026: import org.mandarax.kernel.Predicate;
027: import org.mandarax.kernel.Query;
028: import org.mandarax.kernel.ResultSet;
029: import org.mandarax.reference.ResolutionInferenceEngine;
030: import org.mandarax.util.LogicFactorySupport;
031:
032: /**
033: * The rule based disount calculator. Internally, the discount is calculated by issuing a query
034: * to the inference engine. This class encapsulates the inference engine and most of
035: * the mandarax logic, in a EJB context this would be a classic session bean.
036: * @author <A href="http://www-ist.massey.ac.nz/JBDietrich" target="_top">Jens Dietrich</A>
037: * @version 3.4 <7 March 05>
038: * @since 1.2
039: */
040: public class DiscountCalculator extends LogicFactorySupport {
041:
042: private ResultSet result = null;
043:
044: // the name of the variable we use in queries .. could be any string
045: private static final String QUERY_VARIABLE = "DISCOUNT?";
046:
047: /**
048: * Constructor.
049: */
050: public DiscountCalculator() {
051: super ();
052: }
053:
054: /**
055: * Calculate the discount for a customer c using the knowledge base kb.
056: * @param c the customer
057: * @param kb the knowledge base
058: */
059: public void calculateDiscount(Customer c, KnowledgeBase kb) {
060:
061: // build query
062: Predicate p = PredicatesAndFunctions.getPredicateGetDiscount();
063: Query query = query(fact(p, c, QUERY_VARIABLE), "get discount");
064:
065: // issue query
066: InferenceEngine ie = new ResolutionInferenceEngine();
067:
068: try {
069: result = ie.query(query, kb, InferenceEngine.ONE,
070: InferenceEngine.BUBBLE_EXCEPTIONS);
071: result.next();
072: } catch (InferenceException x) {
073: System.err.println("Inference Error, details:");
074: x.printStackTrace(System.err);
075: }
076: }
077:
078: /**
079: * Get the derivation used to calculate the result
080: * @return the derivation used to calculate the discount
081: */
082: public Derivation getDerivation() {
083: try {
084: return (result == null) ? null : (Derivation) result
085: .getProof();
086: } catch (InferenceException x) {
087: return null;
088: }
089: }
090:
091: /**
092: * Get the calculated discount
093: * @return the calculated discount
094: */
095: public Discount getDiscount() {
096: try {
097: return (result == null) ? null : (Discount) result
098: .getResult(Discount.class, QUERY_VARIABLE);
099: } catch (InferenceException x) {
100: return null;
101: }
102: }
103:
104: /**
105: * Reset the calculator. Should be used between queries if the same instance is used
106: * for multiple queries.
107: */
108: public void reset() {
109: result = null;
110: }
111: }
|