[seam-commits] Seam SVN: r11370 - in branches/community/Seam_2_2_Drools5: examples/drools/resources and 3 other directories.

seam-commits at lists.jboss.org seam-commits at lists.jboss.org
Wed Aug 12 15:32:00 EDT 2009


Author: tsurdilovic
Date: 2009-08-12 15:31:59 -0400 (Wed, 12 Aug 2009)
New Revision: 11370

Added:
   branches/community/Seam_2_2_Drools5/examples/drools/resources/numberguesschangeset.xml
   branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam/drools/KnowledgeAgent.java
Modified:
   branches/community/Seam_2_2_Drools5/examples/build.xml
   branches/community/Seam_2_2_Drools5/examples/drools/resources/WEB-INF/components.xml
   branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam/drools-2.2.xsd
   branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam/drools/KnowledgeBase.java
   branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam/drools/StatefulKnowledgeSession.java
Log:
Drools5 Integration

Modified: branches/community/Seam_2_2_Drools5/examples/build.xml
===================================================================
--- branches/community/Seam_2_2_Drools5/examples/build.xml	2009-08-12 14:59:52 UTC (rev 11369)
+++ branches/community/Seam_2_2_Drools5/examples/build.xml	2009-08-12 19:31:59 UTC (rev 11370)
@@ -466,6 +466,7 @@
 		<include name="seam.quartz.properties" />
 		<include name="*.drl" />
 		<include name="*.properties"/>
+		<include name="*.xml"/>
 		<include name="META-INF/persistence.xml" />
 		<include name="META-INF/ejb-jar.xml" />
 		<include name="META-INF/orm.xml" />

Modified: branches/community/Seam_2_2_Drools5/examples/drools/resources/WEB-INF/components.xml
===================================================================
--- branches/community/Seam_2_2_Drools5/examples/drools/resources/WEB-INF/components.xml	2009-08-12 14:59:52 UTC (rev 11369)
+++ branches/community/Seam_2_2_Drools5/examples/drools/resources/WEB-INF/components.xml	2009-08-12 19:31:59 UTC (rev 11370)
@@ -15,7 +15,14 @@
     	</drools:rule-resources>	
     </drools:knowledge-base>
     
-    <drools:stateful-knowledge-session name="ksession" knowledge-base="#{kbase}" knowledge-session-config="ksessionconfig.properties">
+    <drools:knowledge-agent name="kagent" agent-name="myAgent" scan-resources="true" scan-directories="false" 
+    	monitor-change-set-events="true" scan-interval="30">
+    	<drools:change-sets>
+    		<value>classpath:numberguesschangeset.xml</value>
+    	</drools:change-sets>
+    </drools:knowledge-agent>
+    
+    <drools:stateful-knowledge-session name="ksession" knowledge-base="#{kagent}" knowledge-session-config="ksessionconfig.properties">
     	<drools:event-listeners>
     		<value>org.drools.event.rule.DebugAgendaEventListener</value>
     		<value>org.drools.event.rule.DebugWorkingMemoryEventListener</value>

Added: branches/community/Seam_2_2_Drools5/examples/drools/resources/numberguesschangeset.xml
===================================================================
--- branches/community/Seam_2_2_Drools5/examples/drools/resources/numberguesschangeset.xml	                        (rev 0)
+++ branches/community/Seam_2_2_Drools5/examples/drools/resources/numberguesschangeset.xml	2009-08-12 19:31:59 UTC (rev 11370)
@@ -0,0 +1,7 @@
+<change-set xmlns='http://drools.org/drools-5.0/change-set'
+            xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'
+            xs:schemaLocation='http://drools.org/drools-5.0/change-set drools-change-set-5.0.xsd' >
+	<add>
+		<resource source='classpath:numberguess.drl' type='DRL' />
+	</add>
+</change-set>
\ No newline at end of file

Added: branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam/drools/KnowledgeAgent.java
===================================================================
--- branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam/drools/KnowledgeAgent.java	                        (rev 0)
+++ branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam/drools/KnowledgeAgent.java	2009-08-12 19:31:59 UTC (rev 11370)
@@ -0,0 +1,238 @@
+package org.jboss.seam.drools;
+
+import java.io.InputStream;
+import java.util.Properties;
+import java.util.regex.Pattern;
+
+import org.drools.SystemEventListenerFactory;
+import org.drools.agent.KnowledgeAgentConfiguration;
+import org.drools.agent.KnowledgeAgentFactory;
+import org.drools.io.ResourceChangeScannerConfiguration;
+import org.drools.io.ResourceFactory;
+import org.drools.io.impl.ResourceChangeNotifierImpl;
+import org.drools.io.impl.ResourceChangeScannerImpl;
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.Create;
+import org.jboss.seam.annotations.Destroy;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.annotations.Unwrap;
+import org.jboss.seam.annotations.intercept.BypassInterceptors;
+import org.jboss.seam.core.ResourceLoader;
+import org.jboss.seam.core.Expressions.ValueExpression;
+import org.jboss.seam.log.LogProvider;
+import org.jboss.seam.log.Logging;
+
+/**
+ * Manager component for a KnowledgeBase loaded from a drools KnowledgeAgent
+ * 
+ * @author Tihomir Surdilovic
+ */
+ at Scope(ScopeType.APPLICATION)
+ at BypassInterceptors
+public class KnowledgeAgent
+{
+   private static final LogProvider log = Logging.getLogProvider(RuleAgent.class);
+   private static final Pattern COLON = Pattern.compile(":");
+   private static final int RESOURCE_PATH = 0;
+   private static final int RESOURCE = 1;
+   private static final String RESOURCE_TYPE_URL = "url";
+   private static final String RESOURCE_TYPE_FILE = "file";
+   private static final String RESOURCE_TYPE_CLASSPATH = "classpath";
+   
+   private org.drools.agent.KnowledgeAgent kagent;
+   private String agentName;
+   private String scanResources;
+   private String scanDirectories;
+   private String newInstance;
+   private String monitorChangeSetEvents;
+   private String knowledgeAgentConfig;
+   private String scanInterval;
+   private String[] changeSets; 
+   private ValueExpression<org.drools.KnowledgeBase> knowledgeBase;
+     
+   @Create
+   public void createAgent() throws Exception
+   {
+      ResourceFactory.getResourceChangeScannerService().start();
+      ResourceFactory.getResourceChangeNotifierService().start();
+
+      if(scanInterval != null) {
+         ResourceChangeScannerConfiguration sconf = ResourceFactory.getResourceChangeScannerService().newResourceChangeScannerConfiguration();
+         log.info("Setting drools.resource.scanner.interval to " + scanInterval);
+         sconf.setProperty( "drools.resource.scanner.interval", scanInterval);
+         ResourceFactory.getResourceChangeScannerService().configure( sconf );
+      }
+      
+      KnowledgeAgentConfiguration kagentConf;
+      if(knowledgeAgentConfig != null) {
+         Properties kagentProp = new Properties();
+         InputStream stream = ResourceLoader.instance().getResourceAsStream(knowledgeAgentConfig);
+         if (stream==null) {
+            throw new IllegalStateException("could not locate knowledgeAgent configuration: " + knowledgeAgentConfig);
+         }            
+         kagentProp.load(stream);
+         log.info("loading knowledge agent config properties: " + kagentProp.toString());
+         stream.close();
+         kagentConf = KnowledgeAgentFactory.newKnowledgeAgentConfiguration(kagentProp);
+      } else {
+         kagentConf = KnowledgeAgentFactory.newKnowledgeAgentConfiguration();
+         if(scanResources != null) {
+            log.info("Setting drools.agent.scanResources to " + scanResources);
+            kagentConf.setProperty("drools.agent.scanResources", scanResources);
+         }
+         if(scanDirectories != null) {
+            log.info("Setting drools.agent.scanDirectories to " + scanDirectories);
+            kagentConf.setProperty("drools.agent.scanDirectories", scanDirectories);
+         }
+         if(newInstance != null) {
+            log.info("Setting drools.agent.newInstance to " + newInstance);
+            kagentConf.setProperty("drools.agent.newInstance", newInstance);
+         }
+         if(monitorChangeSetEvents != null) {
+            log.info("Setting drools.agent.monitorChangeSetEvents to " + monitorChangeSetEvents);
+            kagentConf.setProperty("drools.agent.monitorChangeSetEvents", monitorChangeSetEvents);
+         }
+      }
+      
+      if(agentName == null) {
+         log.info("Invalid knowledge agent name. Setting to default.");
+         agentName = "seamAgent";
+      }
+      
+      if(knowledgeBase != null) {
+         kagent = KnowledgeAgentFactory.newKnowledgeAgent(agentName, knowledgeBase.getValue(), kagentConf);
+      } else {
+         kagent = KnowledgeAgentFactory.newKnowledgeAgent(agentName, kagentConf);
+      }
+      
+      if(changeSets != null) {
+         for(String changeSet : changeSets) {
+            applyChangeSet(kagent, changeSet);
+         }
+      }
+      
+     kagent.setSystemEventListener(SystemEventListenerFactory.getSystemEventListener());
+   }
+   
+   private void applyChangeSet(org.drools.agent.KnowledgeAgent kagent, String changeSet) {
+      String[] resourceParts = COLON.split(changeSet.trim());
+      
+      if(resourceParts.length != 2) {
+         log.error("Unable to use changeset: " + changeSet);
+      } else {
+         log.info("New changeset path: " + resourceParts[0]);
+         log.info("New changeset location: " + resourceParts[1]);
+         
+         if(resourceParts[RESOURCE_PATH].equals(RESOURCE_TYPE_URL)) {           
+            kagent.applyChangeSet(ResourceFactory.newUrlResource(resourceParts[RESOURCE]));
+         } else if(resourceParts[RESOURCE_PATH].equals(RESOURCE_TYPE_FILE)) {
+            kagent.applyChangeSet(ResourceFactory.newFileResource(resourceParts[RESOURCE]));
+         } else if(resourceParts[RESOURCE_PATH].equals(RESOURCE_TYPE_CLASSPATH)) {
+            kagent.applyChangeSet(ResourceFactory.newClassPathResource(resourceParts[RESOURCE]));
+         } else {
+            log.error("Unable to use resource path: " + resourceParts[RESOURCE_PATH]);
+         }
+      }
+   }
+   
+   @Unwrap
+   public org.drools.KnowledgeBase getKnowledgeBase()
+   {
+      return kagent.getKnowledgeBase();
+   }
+   
+   @Destroy
+   public void destroy() {
+      ResourceFactory.getResourceChangeNotifierService().stop();
+      ResourceFactory.getResourceChangeScannerService().stop();
+      ((ResourceChangeNotifierImpl) ResourceFactory.getResourceChangeNotifierService()).reset();
+      ((ResourceChangeScannerImpl) ResourceFactory.getResourceChangeScannerService()).reset();
+   }
+
+   public String getAgentName()
+   {
+      return agentName;
+   }
+
+   public void setAgentName(String agentName)
+   {
+      this.agentName = agentName;
+   }
+
+   public String getScanResources()
+   {
+      return scanResources;
+   }
+
+   public void setScanResources(String scanResources)
+   {
+      this.scanResources = scanResources;
+   }
+
+   public String getScanDirectories()
+   {
+      return scanDirectories;
+   }
+
+   public void setScanDirectories(String scanDirectories)
+   {
+      this.scanDirectories = scanDirectories;
+   }
+
+   public String getNewInstance()
+   {
+      return newInstance;
+   }
+
+   public void setNewInstance(String newInstance)
+   {
+      this.newInstance = newInstance;
+   }
+
+   public String getMonitorChangeSetEvents()
+   {
+      return monitorChangeSetEvents;
+   }
+
+   public void setMonitorChangeSetEvents(String monitorChangeSetEvents)
+   {
+      this.monitorChangeSetEvents = monitorChangeSetEvents;
+   }
+
+   public String getKnowledgeAgentConfig()
+   {
+      return knowledgeAgentConfig;
+   }
+
+   public void setKnowledgeAgentConfig(String knowledgeAgentConfig)
+   {
+      this.knowledgeAgentConfig = knowledgeAgentConfig;
+   }
+
+   public String getScanInterval()
+   {
+      return scanInterval;
+   }
+
+   public void setScanInterval(String scanInterval)
+   {
+      this.scanInterval = scanInterval;
+   }
+
+   public void setKnowledgeBase(ValueExpression<org.drools.KnowledgeBase> knowledgeBase)
+   {
+      this.knowledgeBase = knowledgeBase;
+   }
+
+   public String[] getChangeSets()
+   {
+      return changeSets;
+   }
+
+   public void setChangeSets(String[] changeSets)
+   {
+      this.changeSets = changeSets;
+   }
+
+   
+}

Modified: branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam/drools/KnowledgeBase.java
===================================================================
--- branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam/drools/KnowledgeBase.java	2009-08-12 14:59:52 UTC (rev 11369)
+++ branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam/drools/KnowledgeBase.java	2009-08-12 19:31:59 UTC (rev 11370)
@@ -58,6 +58,7 @@
          }
          kbuilderProp.load(stream);
          log.info("loading knowledge builder config properties: " + kbuilderProp.toString());
+         stream.close();
          kbuilderconfig = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(kbuilderProp, null);
       } else {
          kbuilderconfig = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
@@ -89,6 +90,7 @@
          }
          kbaseProp.load(stream);
          log.info("loading knowledge base config properties: " + kbaseProp.toString());
+         stream.close();
          kbaseconfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(kbaseProp, null);
       } else {
          kbaseconfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
@@ -145,13 +147,13 @@
    protected void addResource(KnowledgeBuilder kbuilder, String resource) {
       String[] resourceParts = COLON.split(resource.trim());
       
-      log.info("New resource path: " + resourceParts[0]);
-      log.info("New resource location: " + resourceParts[1]);
-      log.info("New resource type: " + resourceParts[2]);
-      
       if(resourceParts.length != 3) {
          log.error("Unable to use resource: " + resource);
       } else {
+         log.info("New resource path: " + resourceParts[0]);
+         log.info("New resource location: " + resourceParts[1]);
+         log.info("New resource type: " + resourceParts[2]);
+         
          ResourceType resourceType = ResourceType.getResourceType(resourceParts[RESOURCE_TYPE]);
          if(resourceParts[RESOURCE_PATH].equals(RESOURCE_TYPE_URL)) {
             kbuilder.add(ResourceFactory.newUrlResource(resourceParts[RESOURCE]), resourceType);

Modified: branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam/drools/StatefulKnowledgeSession.java
===================================================================
--- branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam/drools/StatefulKnowledgeSession.java	2009-08-12 14:59:52 UTC (rev 11369)
+++ branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam/drools/StatefulKnowledgeSession.java	2009-08-12 19:31:59 UTC (rev 11370)
@@ -58,6 +58,7 @@
             }            
             ksessionProp.load(stream);
             log.info("loading knowledge session config properties: " + ksessionProp.toString());
+            stream.close();
             ksessionconfig = KnowledgeBaseFactory.newKnowledgeSessionConfiguration(ksessionProp);
          } else {
             ksessionconfig = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();

Modified: branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam/drools-2.2.xsd
===================================================================
--- branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam/drools-2.2.xsd	2009-08-12 14:59:52 UTC (rev 11369)
+++ branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam/drools-2.2.xsd	2009-08-12 19:31:59 UTC (rev 11370)
@@ -98,5 +98,28 @@
         <xs:attribute name="knowledge-session-config" type="components:string"/>
     </xs:attributeGroup>
     <xs:element name="globals" type="components:multiValuedProperty"/>
-
+    
+    <xs:element name="knowledge-agent">
+        <xs:annotation>
+            <xs:documentation>Drools KnowledgeAgent</xs:documentation>
+        </xs:annotation>
+        <xs:complexType mixed="true">
+        	<xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element minOccurs="0" maxOccurs="1" ref="drools:change-sets"/>
+            </xs:choice>
+            <xs:attributeGroup ref="components:attlist.component"/>
+            <xs:attributeGroup ref="drools:attlist.KnowledgeAgent"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.KnowledgeAgent">
+        <xs:attribute name="knowledge-base" type="components:expressionType"/>
+        <xs:attribute name="agent-name" type="components:string"/>
+        <xs:attribute name="scan-resources" type="components:string"/>
+        <xs:attribute name="scan-directories" type="components:string"/>
+        <xs:attribute name="new-instance" type="components:string"/>
+        <xs:attribute name="monitor-change-set-events" type="components:string"/>
+        <xs:attribute name="knowledge-agent-config" type="components:string"/>
+        <xs:attribute name="scan-interval" type="components:string"/>
+    </xs:attributeGroup>
+	<xs:element name="change-sets" type="components:multiValuedProperty"/>
 </xs:schema>



More information about the seam-commits mailing list