[jboss-svn-commits] JBL Code SVN: r21624 - in labs/jbossrules/trunk/drools-server/src: main/java/org/drools/server and 3 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Tue Aug 19 02:37:26 EDT 2008
Author: michael.neale at jboss.com
Date: 2008-08-19 02:37:26 -0400 (Tue, 19 Aug 2008)
New Revision: 21624
Added:
labs/jbossrules/trunk/drools-server/src/main/java/org/drools/server/KnowledgeStatelessServlet.java
labs/jbossrules/trunk/drools-server/src/main/webapp/
labs/jbossrules/trunk/drools-server/src/main/webapp/WEB-INF/
labs/jbossrules/trunk/drools-server/src/main/webapp/WEB-INF/web.xml
labs/jbossrules/trunk/drools-server/src/test/java/org/drools/server/KnowledgeServiceServletTest.java
Removed:
labs/jbossrules/trunk/drools-server/src/main/java/org/drools/server/RuleService.java
labs/jbossrules/trunk/drools-server/src/test/java/org/drools/server/RuleServiceTest.java
Log:
more rule service fun
Added: labs/jbossrules/trunk/drools-server/src/main/java/org/drools/server/KnowledgeStatelessServlet.java
===================================================================
--- labs/jbossrules/trunk/drools-server/src/main/java/org/drools/server/KnowledgeStatelessServlet.java (rev 0)
+++ labs/jbossrules/trunk/drools-server/src/main/java/org/drools/server/KnowledgeStatelessServlet.java 2008-08-19 06:37:26 UTC (rev 21624)
@@ -0,0 +1,205 @@
+package org.drools.server;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.drools.Person;
+import org.drools.RuleBase;
+import org.drools.StatelessSession;
+import org.drools.agent.RuleAgent;
+import org.drools.common.InternalRuleBase;
+
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
+
+/**
+ * This provides a stateless service for dealing with rules/knowledge bases.
+ *
+ * Supported operations are:
+ *
+ * POST: this will execute the service and return the results.
+ *
+ * Content-Type: by default XML will be assumed, if application/json is used, then JSON will be used instead.
+ *
+ * URIs:
+ *
+ * http://server/drools-server/knowledgebase/{configName}
+ *
+ * {configName} is the name of the rule agent configuration to load - this is generally a properties file located in the root of the classpath
+ * for this app.
+ *
+ * @author Michael Neale
+ */
+public class KnowledgeStatelessServlet extends HttpServlet {
+
+
+ private static final long serialVersionUID = -8239975288596976901L;
+ static XStream xmlInstance = configureXStream(false);
+ static XStream jsonInstance = configureXStream(true);
+ static Map<String, RuleAgent> cachedAgents = new HashMap<String, RuleAgent>();
+ static Pattern urlPattern = Pattern.compile(".*knowledgebase/(.*)");
+
+ @Override
+ protected void doPost(HttpServletRequest request, HttpServletResponse resp)
+ throws ServletException, IOException {
+ String uri = request.getRequestURI();
+ String contentType = request.getContentType();
+ resp.setContentType(contentType);
+ Matcher m = urlPattern.matcher(uri);
+ if (!m.matches()) {
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "URI needs to be of the form /knowledgebase/{configName}");
+ return;
+ }
+ RuleBase rb = getRuleBase(m.group(1));
+ if (contentType != null && (contentType.indexOf("json") > -1)) {
+ //do json version
+ doService(request.getInputStream(), resp.getOutputStream(), rb, true);
+ } else {
+ //xml version
+ doService(request.getInputStream(), resp.getOutputStream(), rb, true);
+ }
+ }
+
+
+
+ RuleBase getRuleBase(String configName) {
+ if (cachedAgents.containsKey(configName)) {
+ return cachedAgents.get(configName).getRuleBase();
+ } else {
+ synchronized (cachedAgents) {
+ if (!cachedAgents.containsKey(configName)) {
+ RuleAgent ag = RuleAgent.newRuleAgent(configName + ".properties");
+ cachedAgents.put(configName, ag);
+ }
+ return cachedAgents.get(configName).getRuleBase();
+ }
+ }
+ }
+
+
+
+
+ void doService(InputStream inputStream,
+ OutputStream outputStream, RuleBase rb, boolean json) {
+ InternalRuleBase irb = (InternalRuleBase) rb;
+ ClassLoader originalCL = Thread.currentThread().getContextClassLoader();
+ try {
+ ClassLoader cl = irb.getRootClassLoader();
+ Thread.currentThread().setContextClassLoader(cl);
+
+ XStream xs = (json) ? jsonInstance : xmlInstance;
+ ServiceRequestMessage req = (ServiceRequestMessage) xs.fromXML(inputStream);
+ StatelessSession session = rb.newStatelessSession();
+ if (req.globals != null) {
+ for (NamedFact nf : req.globals) {
+ session.setGlobal(nf.id, nf.fact);
+ }
+ }
+ List<Object> facts = new ArrayList<Object>();
+ if (req.inFacts != null) {
+ for (AnonFact f : req.inFacts) {
+ facts.add(f.fact);
+ }
+ }
+ if (req.inOutFacts != null) {
+ for (NamedFact nf : req.inOutFacts) {
+ facts.add(nf.fact);
+ }
+ }
+
+ session.execute(facts);
+
+ ServiceResponseMessage res = new ServiceResponseMessage();
+ if (req.globals != null) {
+ res.globals = req.globals;
+ }
+ if (req.inOutFacts != null) {
+ res.inOutFacts = req.inOutFacts;
+ }
+
+ xs.toXML(res, outputStream);
+
+
+
+ } finally {
+ Thread.currentThread().setContextClassLoader(originalCL);
+ }
+ }
+
+
+ static XStream configureXStream(boolean json) {
+ if (json) {
+ XStream xs = new XStream(new JettisonMappedXmlDriver());
+ alias(xs);
+ return xs;
+
+ } else {
+ XStream xs = new XStream();
+ alias(xs);
+ return xs;
+ }
+ }
+
+ private static void alias(XStream xs) {
+ xs.alias("knowledgebase-request", ServiceRequestMessage.class);
+ xs.alias("knowledgebase-response", ServiceResponseMessage.class);
+ xs.alias("named-fact", NamedFact.class);
+ xs.alias("anon-fact", AnonFact.class);
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+ private void sample() {
+ XStream xs = configureXStream(true);
+
+ ServiceRequestMessage req = new ServiceRequestMessage();
+
+ req.globals = new NamedFact[1];
+ req.inFacts = new AnonFact[1];
+ req.inOutFacts = new NamedFact[1];
+ req.globals[0] = new NamedFact("jo", new Person("Jo", "Chocolote"));
+ //req.inFacts[0] = new AnonFact(new Person("Mike", "beer"));
+ req.inFacts[0] = new AnonFact(new Person("Mike", "wine"));
+ req.inOutFacts[0] = new NamedFact("mark", new Person("Mark", "Cheese"));
+
+ String requestMessage = xs.toXML(req);
+
+ ServiceRequestMessage req_ = (ServiceRequestMessage) xs.fromXML(requestMessage);
+ String requestMessage_ = xs.toXML(req_);
+
+ System.out.println(requestMessage);
+
+ if (!requestMessage_.equals(requestMessage)) throw new RuntimeException("fail !");
+ }
+
+
+
+ public static void main(String[] args) throws ServletException, IOException {
+ KnowledgeStatelessServlet rs = new KnowledgeStatelessServlet();
+ rs.sample();
+
+ }
+
+
+}
Deleted: labs/jbossrules/trunk/drools-server/src/main/java/org/drools/server/RuleService.java
===================================================================
--- labs/jbossrules/trunk/drools-server/src/main/java/org/drools/server/RuleService.java 2008-08-19 06:34:15 UTC (rev 21623)
+++ labs/jbossrules/trunk/drools-server/src/main/java/org/drools/server/RuleService.java 2008-08-19 06:37:26 UTC (rev 21624)
@@ -1,154 +0,0 @@
-package org.drools.server;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.servlet.ServletException;
-import javax.servlet.ServletInputStream;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.drools.Person;
-import org.drools.RuleBase;
-import org.drools.StatefulSession;
-import org.drools.StatelessSession;
-import org.drools.common.InternalRuleBase;
-
-import com.thoughtworks.xstream.XStream;
-import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
-
-public class RuleService extends HttpServlet {
-
-
- static XStream xmlInstance = configureXStream(false);
- static XStream jsonInstance = configureXStream(true);
-
-
- @Override
- protected void doPost(HttpServletRequest request, HttpServletResponse resp)
- throws ServletException, IOException {
-
- String uri = request.getRequestURI();
- RuleBase rb = getRuleBaseFromURI(uri);
-
- //doService(request.getInputStream(), resp.getOutputStream(), rb);
-
-
- //sample();
-
-
- }
-
- void doService(InputStream inputStream,
- OutputStream outputStream, RuleBase rb, boolean json) {
- InternalRuleBase irb = (InternalRuleBase) rb;
- ClassLoader originalCL = Thread.currentThread().getContextClassLoader();
- try {
- ClassLoader cl = irb.getRootClassLoader();
- Thread.currentThread().setContextClassLoader(cl);
-
- XStream xs = (json) ? jsonInstance : xmlInstance;
- ServiceRequestMessage req = (ServiceRequestMessage) xs.fromXML(inputStream);
- StatelessSession session = rb.newStatelessSession();
- if (req.globals != null) {
- for (NamedFact nf : req.globals) {
- session.setGlobal(nf.id, nf.fact);
- }
- }
- List<Object> facts = new ArrayList<Object>();
- if (req.inFacts != null) {
- for (AnonFact f : req.inFacts) {
- facts.add(f.fact);
- }
- }
- if (req.inOutFacts != null) {
- for (NamedFact nf : req.inOutFacts) {
- facts.add(nf.fact);
- }
- }
-
- session.execute(facts);
-
- ServiceResponseMessage res = new ServiceResponseMessage();
- if (req.globals != null) {
- res.globals = req.globals;
- }
- if (req.inOutFacts != null) {
- res.inOutFacts = req.inOutFacts;
- }
-
- xs.toXML(res, outputStream);
-
-
-
- } finally {
- Thread.currentThread().setContextClassLoader(originalCL);
- }
- }
-
- private RuleBase getRuleBaseFromURI(String uri) {
-
- return null;
- }
-
-
-
-
-
-
- private void sample() {
- XStream xs = configureXStream(true);
-
- ServiceRequestMessage req = new ServiceRequestMessage();
-
- req.globals = new NamedFact[1];
- req.inFacts = new AnonFact[1];
- req.inOutFacts = new NamedFact[1];
- req.globals[0] = new NamedFact("jo", new Person("Jo", "Chocolote"));
- //req.inFacts[0] = new AnonFact(new Person("Mike", "beer"));
- req.inFacts[0] = new AnonFact(new Person("Mike", "wine"));
- req.inOutFacts[0] = new NamedFact("mark", new Person("Mark", "Cheese"));
-
- String requestMessage = xs.toXML(req);
-
- ServiceRequestMessage req_ = (ServiceRequestMessage) xs.fromXML(requestMessage);
- String requestMessage_ = xs.toXML(req_);
-
- System.out.println(requestMessage);
-
- if (!requestMessage_.equals(requestMessage)) throw new RuntimeException("fail !");
- }
-
- static XStream configureXStream(boolean json) {
- if (json) {
- XStream xs = new XStream(new JettisonMappedXmlDriver());
- alias(xs);
- return xs;
-
- } else {
- XStream xs = new XStream();
- alias(xs);
- return xs;
- }
- }
-
- private static void alias(XStream xs) {
- xs.alias("knowledgebase-request", ServiceRequestMessage.class);
- xs.alias("knowledgebase-response", ServiceResponseMessage.class);
- xs.alias("named-fact", NamedFact.class);
- xs.alias("anon-fact", AnonFact.class);
- }
-
- public static void main(String[] args) throws ServletException, IOException {
- RuleService rs = new RuleService();
- rs.sample();
-
- }
-
-
-}
Added: labs/jbossrules/trunk/drools-server/src/main/webapp/WEB-INF/web.xml
===================================================================
--- labs/jbossrules/trunk/drools-server/src/main/webapp/WEB-INF/web.xml (rev 0)
+++ labs/jbossrules/trunk/drools-server/src/main/webapp/WEB-INF/web.xml 2008-08-19 06:37:26 UTC (rev 21624)
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
+<web-app>
+
+ <display-name>JBoss Drools Execution Server</display-name>
+
+ <servlet>
+ <servlet-name>statelessService</servlet-name>
+ <servlet-class>org.drools.server.KnowledgeStatelessServlet</servlet-class>
+ </servlet>
+
+
+ <servlet-mapping>
+ <servlet-name>statelessService</servlet-name>
+ <url-pattern>/knowledgebase/*</url-pattern>
+ </servlet-mapping>
+
+ <session-config>
+ <session-timeout>10</session-timeout>
+ </session-config>
+
+
+</web-app>
Property changes on: labs/jbossrules/trunk/drools-server/src/main/webapp/WEB-INF/web.xml
___________________________________________________________________
Name: svn:eol-style
+ native
Copied: labs/jbossrules/trunk/drools-server/src/test/java/org/drools/server/KnowledgeServiceServletTest.java (from rev 21614, labs/jbossrules/trunk/drools-server/src/test/java/org/drools/server/RuleServiceTest.java)
===================================================================
--- labs/jbossrules/trunk/drools-server/src/test/java/org/drools/server/KnowledgeServiceServletTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-server/src/test/java/org/drools/server/KnowledgeServiceServletTest.java 2008-08-19 06:37:26 UTC (rev 21624)
@@ -0,0 +1,78 @@
+package org.drools.server;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.regex.Matcher;
+
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.compiler.PackageBuilder;
+import org.drools.server.KnowledgeStatelessServlet;
+
+import junit.framework.TestCase;
+
+public class KnowledgeServiceServletTest extends TestCase {
+
+
+ public void testSample() throws Exception {
+
+ PackageBuilder pb = new PackageBuilder();
+ pb.addPackageFromDrl(new InputStreamReader(getClass().getResourceAsStream("test_rules1.drl")));
+ assertFalse(pb.hasErrors());
+
+ RuleBase rb = RuleBaseFactory.newRuleBase();
+ rb.addPackage(pb.getPackage());
+
+ KnowledgeStatelessServlet serv = new KnowledgeStatelessServlet();
+
+ final InputStream inXML = getClass().getResourceAsStream("sample_request.xml");
+ ByteArrayOutputStream outStream = new ByteArrayOutputStream();
+
+
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+
+ serv.doService(inXML, outStream, rb, false);
+
+ String result = new String(outStream.toByteArray());
+
+ assertTrue(result.indexOf("<id>prs</id>") > -1);
+ assertTrue(result.indexOf("<id>result</id>") > -1);
+ assertTrue(result.indexOf("<name>Jo</name>") > -1);
+ assertTrue(result.indexOf("<status>crazy</status>") > -1);
+ assertTrue(result.indexOf("<value>42</value>") > -1);
+ assertTrue(result.indexOf("<explanation>just cause it is</explanation>") > -1);
+
+ assertSame(cl, Thread.currentThread().getContextClassLoader());
+
+
+ InputStream inJSON = getClass().getResourceAsStream("sample_request.json");
+ outStream = new ByteArrayOutputStream();
+ serv.doService(inJSON, outStream, rb, true);
+
+ result = new String(outStream.toByteArray());
+
+ assertTrue(result.indexOf("\"id\":\"prs\"") > -1);
+ assertTrue(result.indexOf("\"id\":\"result\"") > -1);
+ assertTrue(result.indexOf("\"status\":\"crazy\"") > -1);
+
+
+ }
+
+ public void testInitialise() {
+ KnowledgeStatelessServlet rs = new KnowledgeStatelessServlet();
+ assertNotNull(rs.jsonInstance);
+ assertNotNull(rs.xmlInstance);
+
+ }
+
+ public void testURLPattern() {
+ Matcher m = KnowledgeStatelessServlet.urlPattern.matcher("foo/knowledgebase/whee");
+ assertTrue(m.matches());
+ assertEquals("whee", m.group(1));
+ m = KnowledgeStatelessServlet.urlPattern.matcher("foo/knowledgebase");
+ assertFalse(m.matches());
+ }
+
+
+}
Deleted: labs/jbossrules/trunk/drools-server/src/test/java/org/drools/server/RuleServiceTest.java
===================================================================
--- labs/jbossrules/trunk/drools-server/src/test/java/org/drools/server/RuleServiceTest.java 2008-08-19 06:34:15 UTC (rev 21623)
+++ labs/jbossrules/trunk/drools-server/src/test/java/org/drools/server/RuleServiceTest.java 2008-08-19 06:37:26 UTC (rev 21624)
@@ -1,68 +0,0 @@
-package org.drools.server;
-
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-import org.drools.RuleBase;
-import org.drools.RuleBaseFactory;
-import org.drools.compiler.PackageBuilder;
-import org.drools.server.RuleService;
-
-import junit.framework.TestCase;
-
-public class RuleServiceTest extends TestCase {
-
-
- public void testSample() throws Exception {
-
- PackageBuilder pb = new PackageBuilder();
- pb.addPackageFromDrl(new InputStreamReader(getClass().getResourceAsStream("test_rules1.drl")));
- assertFalse(pb.hasErrors());
-
- RuleBase rb = RuleBaseFactory.newRuleBase();
- rb.addPackage(pb.getPackage());
-
- RuleService serv = new RuleService();
-
- final InputStream inXML = getClass().getResourceAsStream("sample_request.xml");
- ByteArrayOutputStream outStream = new ByteArrayOutputStream();
-
-
- ClassLoader cl = Thread.currentThread().getContextClassLoader();
-
- serv.doService(inXML, outStream, rb, false);
-
- String result = new String(outStream.toByteArray());
-
- assertTrue(result.indexOf("<id>prs</id>") > -1);
- assertTrue(result.indexOf("<id>result</id>") > -1);
- assertTrue(result.indexOf("<name>Jo</name>") > -1);
- assertTrue(result.indexOf("<status>crazy</status>") > -1);
- assertTrue(result.indexOf("<value>42</value>") > -1);
- assertTrue(result.indexOf("<explanation>just cause it is</explanation>") > -1);
-
- assertSame(cl, Thread.currentThread().getContextClassLoader());
-
-
- InputStream inJSON = getClass().getResourceAsStream("sample_request.json");
- outStream = new ByteArrayOutputStream();
- serv.doService(inJSON, outStream, rb, true);
-
- result = new String(outStream.toByteArray());
-
- assertTrue(result.indexOf("\"id\":\"prs\"") > -1);
- assertTrue(result.indexOf("\"id\":\"result\"") > -1);
- assertTrue(result.indexOf("\"status\":\"crazy\"") > -1);
-
-
- }
-
- public void testInitialise() {
- RuleService rs = new RuleService();
- assertNotNull(rs.jsonInstance);
- assertNotNull(rs.xmlInstance);
-
- }
-
-}
More information about the jboss-svn-commits
mailing list