[seam-commits] Seam SVN: r11431 - in branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam: drools and 1 other directory.

seam-commits at lists.jboss.org seam-commits at lists.jboss.org
Wed Aug 26 15:12:36 EDT 2009


Author: tsurdilovic
Date: 2009-08-26 15:12:36 -0400 (Wed, 26 Aug 2009)
New Revision: 11431

Added:
   branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam/drools/StatelessKnowledgeSession.java
Modified:
   branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam/drools-2.2.xsd
Log:
Drools5 Integration.

Added: branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam/drools/StatelessKnowledgeSession.java
===================================================================
--- branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam/drools/StatelessKnowledgeSession.java	                        (rev 0)
+++ branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam/drools/StatelessKnowledgeSession.java	2009-08-26 19:12:36 UTC (rev 11431)
@@ -0,0 +1,158 @@
+package org.jboss.seam.drools;
+
+import java.io.InputStream;
+import java.util.Properties;
+
+import org.drools.KnowledgeBaseFactory;
+import org.drools.event.process.ProcessEventListener;
+import org.drools.event.rule.AgendaEventListener;
+import org.drools.event.rule.WorkingMemoryEventListener;
+import org.drools.logger.KnowledgeRuntimeLogger;
+import org.drools.logger.KnowledgeRuntimeLoggerFactory;
+import org.drools.runtime.KnowledgeSessionConfiguration;
+import org.drools.spi.GlobalResolver;
+import org.jboss.seam.ScopeType;
+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;
+
+/**
+ * A conversation-scoped Drools StatelessKnowledgeSession for a named KnowledgeBase
+ * 
+ * @author Tihomir Surdilovic
+ *
+ */
+ at Scope(ScopeType.CONVERSATION)
+ at BypassInterceptors
+public class StatelessKnowledgeSession
+{
+   private static final LogProvider log = Logging.getLogProvider(org.jboss.seam.drools.StatelessKnowledgeSession.class);
+   
+   private ValueExpression<org.drools.KnowledgeBase> knowledgeBase;
+   private String[] eventListeners;
+   private String knowledgeSessionConfig;
+   private String auditLog;
+   
+   private org.drools.runtime.StatelessKnowledgeSession ksession;
+   private KnowledgeRuntimeLogger krLogger;
+   
+   @Unwrap
+   public org.drools.runtime.StatelessKnowledgeSession getStatelessKnowledgeSession() throws Exception {
+      if(ksession == null) {   
+         KnowledgeSessionConfiguration ksessionconfig;
+         if(knowledgeSessionConfig != null) {
+            Properties ksessionProp = new Properties();
+            InputStream stream = ResourceLoader.instance().getResourceAsStream(knowledgeSessionConfig);
+            if (stream==null) {
+               throw new IllegalStateException("could not locate knowledgeSession configuration: " + knowledgeSessionConfig);
+            }            
+            ksessionProp.load(stream);
+            log.info("loading knowledge session config properties: " + ksessionProp.toString());
+            stream.close();
+            ksessionconfig = KnowledgeBaseFactory.newKnowledgeSessionConfiguration(ksessionProp);
+         } else {
+            ksessionconfig = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
+         }
+         
+         ksession = knowledgeBase.getValue().newStatelessKnowledgeSession(ksessionconfig);
+         
+         ksession.getGlobals().setDelegate(new SeamDelegate());
+         
+         if(eventListeners != null) {
+            for(String eventListener : eventListeners) {
+               setEventListener(ksession, eventListener);
+            }
+         }
+         
+         if(auditLog != null) {
+            auditLog+=System.currentTimeMillis();
+            log.info("Setting auding log: " + auditLog);
+            krLogger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, auditLog);
+         }
+      }
+
+      return ksession;
+   }
+   
+   protected GlobalResolver createGlobalResolver(GlobalResolver delegate)
+   {
+      return new SeamGlobalResolver(delegate);
+   }
+   
+   protected void setEventListener(org.drools.runtime.StatelessKnowledgeSession ksession, String eventListener) {
+      try {
+         Class eventListenerClass = Class.forName(eventListener);
+         Object eventListenerObject = eventListenerClass.newInstance();
+        
+         if(eventListenerObject instanceof WorkingMemoryEventListener) {
+            ksession.addEventListener((WorkingMemoryEventListener) eventListenerObject);
+         } else if(eventListenerObject instanceof AgendaEventListener) {
+            ksession.addEventListener((AgendaEventListener) eventListenerObject);
+         } else if(eventListenerObject instanceof ProcessEventListener) {
+            ksession.addEventListener((ProcessEventListener) eventListenerObject);
+         } else {
+            log.warn("event Listener " + eventListener + " is not of valid type");
+         }
+      } catch(Exception e) {
+         log.warn("error adding event listener " + eventListener);
+      }
+   }
+   
+   public boolean clearDirty()
+   {
+      return true;
+   }
+   
+   @Destroy
+   public void destroy()
+   {
+      if(krLogger != null) {
+         krLogger.close();
+      }
+   }
+
+   public ValueExpression<org.drools.KnowledgeBase> getKnowledgeBase()
+   {
+      return knowledgeBase;
+   }
+
+   public void setKnowledgeBase(ValueExpression<org.drools.KnowledgeBase> knowledgeBase)
+   {
+      this.knowledgeBase = knowledgeBase;
+   }
+
+   public String[] getEventListeners()
+   {
+      return eventListeners;
+   }
+
+   public void setEventListeners(String[] eventListeners)
+   {
+      this.eventListeners = eventListeners;
+   }
+
+   public String getKnowledgeSessionConfig()
+   {
+      return knowledgeSessionConfig;
+   }
+
+   public void setKnowledgeSessionConfig(String knowledgeSessionConfig)
+   {
+      this.knowledgeSessionConfig = knowledgeSessionConfig;
+   }
+
+   public String getAuditLog()
+   {
+      return auditLog;
+   }
+
+   public void setAuditLog(String auditLog)
+   {
+      this.auditLog = auditLog;
+   }   
+}

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-26 10:59:14 UTC (rev 11430)
+++ branches/community/Seam_2_2_Drools5/src/main/org/jboss/seam/drools-2.2.xsd	2009-08-26 19:12:36 UTC (rev 11431)
@@ -105,7 +105,26 @@
 		<xs:attribute name="fact-provider" type="components:expressionType"/>
 		<xs:attribute name="audit-log" type="components:string"/>
 	</xs:attributeGroup>
-	<xs:element name="globals" type="components:multiValuedProperty" />
+	
+	<xs:element name="stateless-knowledge-session">
+		<xs:annotation>
+			<xs:documentation>Drools StatelessKnowledgeSession</xs:documentation>
+		</xs:annotation>
+		<xs:complexType mixed="true">
+			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element minOccurs="0" maxOccurs="1"
+					ref="drools:event-listeners" />
+			</xs:choice>
+			<xs:attributeGroup ref="components:attlist.component" />
+			<xs:attributeGroup ref="drools:attlist.StatelessKnowledgeSession" />
+		</xs:complexType>
+	</xs:element>
+	<xs:attributeGroup name="attlist.StatelessKnowledgeSession">
+		<xs:attribute name="knowledge-base" type="components:expressionType" />
+		<xs:attribute name="event-listeners" type="components:string" />
+		<xs:attribute name="knowledge-session-config" type="components:string" />
+		<xs:attribute name="audit-log" type="components:string"/>
+	</xs:attributeGroup>
 
 	<xs:element name="knowledge-agent">
 		<xs:annotation>



More information about the seam-commits mailing list