001 /* 002 * hammurapi-rules @mesopotamia.version@ 003 * Hammurapi rules engine. 004 * Copyright (C) 2005 Hammurapi Group 005 * 006 * This program is free software; you can redistribute it and/or 007 * modify it under the terms of the GNU Lesser General Public 008 * License as published by the Free Software Foundation; either 009 * version 2 of the License, or (at your option) any later version. 010 * 011 * This program is distributed in the hope that it will be useful, 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 014 * Lesser General Public License for more details. 015 * 016 * You should have received a copy of the GNU Lesser General Public 017 * License along with this library; if not, write to the Free Software 018 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 019 * 020 * URL: http://http://www.hammurapi.biz 021 * e-Mail: support@hammurapi.biz 022 */ 023 package biz.hammurapi.rules; 024 025 import java.util.Collection; 026 027 import biz.hammurapi.config.ComponentBase; 028 import biz.hammurapi.config.ConfigurationException; 029 import biz.hammurapi.dispatch.InvocationTarget; 030 031 032 public abstract class AbstractRule extends ComponentBase implements InvocationTarget { 033 034 private String name; 035 private String description; 036 037 public String getName() { 038 return name; 039 } 040 041 /** 042 * This method is invoked by rule container to set rule name. 043 * Rule name is used to retrieve collections from collection 044 * manager. 045 * @param name 046 */ 047 public void setName(String name) { 048 this.name=name; 049 } 050 051 public AbstractRule() { 052 super(); 053 // TODO Auto-generated constructor stub 054 } 055 056 public String getDescription() { 057 return description; 058 } 059 060 public void setDescription(String description) { 061 this.description = description; 062 } 063 064 /** 065 * Adds new fact to knowledge base. 066 * Returning value from inference methods has the same effect. 067 * @param fact 068 */ 069 protected void post(Object fact) { 070 ((KnowledgeBase) owner).add(fact); 071 } 072 073 /** 074 * Removes object from knowledge base. 075 * handle manager. 076 * @param obj 077 */ 078 protected void remove(Object obj) { 079 ((KnowledgeBase) owner).remove(obj); 080 } 081 082 /** 083 * Updates fact. 084 * Removes conclusions made on the old fact from the knowledge base 085 * and makes conclusions based on the new object state. 086 * @param oldObject 087 * @param newObject 088 */ 089 protected void update(Object fact) { 090 ((KnowledgeBase) owner).remove(fact); 091 ((KnowledgeBase) owner).add(fact); 092 } 093 094 public String toString() { 095 return "["+getClass().getName()+"] "+getName()+" - "+getDescription(); 096 } 097 098 public abstract Collection getRemoveHandlers(); 099 100 public void start() throws ConfigurationException { 101 this.collectionManager=(CollectionManager) get("/collection-manager"); 102 if (getName()==null) { 103 throw new ConfigurationException("Rule name must not be null"); 104 } 105 if (!(owner instanceof KnowledgeBase)) { 106 throw new ConfigurationException("Rule container (ruleset) must implement "+KnowledgeBase.class); 107 } 108 } 109 110 public void stop() { 111 // Override this method to release resources. 112 } 113 114 /** 115 * Convenience method to retrieve collection from the collection manager. 116 * @param setName 117 * @return 118 */ 119 protected Collection getCollection(String collectionName, Object lock) { 120 return collectionManager.get(name, collectionName, lock); 121 } 122 123 private CollectionManager collectionManager; 124 125 /** 126 * Invoked in rule session reset() method. 127 * Subclasses can put cleanup logic here. 128 */ 129 public void reset() { 130 // No op 131 } 132 133 }