[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