[jboss-svn-commits] JBL Code SVN: r30791 - in labs/jbossrules/trunk/drools-pipeline/drools-camel/src: main/java/org/drools/pipeline/camel and 1 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Dec 21 17:02:36 EST 2009
Author: salaboy21
Date: 2009-12-21 17:02:36 -0500 (Mon, 21 Dec 2009)
New Revision: 30791
Added:
labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsXStreamDataFormat.java
labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/pipeline/camel/DroolsCamelContextInit.java
labs/jbossrules/trunk/drools-pipeline/drools-camel/src/test/java/org/drools/camel/component/CamelEndpointWithMarshallersTest.java
Modified:
labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsComponent.java
labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsProxyEndpoint.java
Log:
JBRULES-2347: Drools Pipeline integration with Camel
- DroolsXStreamDataFormat
Modified: labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsComponent.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsComponent.java 2009-12-21 19:38:14 UTC (rev 30790)
+++ labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsComponent.java 2009-12-21 22:02:36 UTC (rev 30791)
@@ -130,4 +130,8 @@
// UuidGenerator.get().generateUuid()
return UUID_PREFIX + counter.incrementAndGet();
}
+ @Override
+ protected void validateParameters(String uri, Map<String, Object> parameters, String optionPrefix) {
+
+ }
}
Modified: labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsProxyEndpoint.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsProxyEndpoint.java 2009-12-21 19:38:14 UTC (rev 30790)
+++ labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsProxyEndpoint.java 2009-12-21 22:02:36 UTC (rev 30791)
@@ -22,6 +22,9 @@
import org.apache.camel.RuntimeCamelException;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultEndpoint;
+import org.apache.camel.spi.DataFormat;
+import org.drools.pipeline.camel.DroolsCamelContextInit;
+import org.drools.vsm.ServiceManager;
public class DroolsProxyEndpoint extends DefaultEndpoint {
@@ -31,7 +34,7 @@
private String marshall;
private String unmarshall;
private RouteBuilder builder;
-
+
public DroolsProxyEndpoint(String endpointUri, String remaining, DroolsComponent component) throws Exception {
super(endpointUri, component);
configure(component, remaining);
@@ -44,10 +47,15 @@
public Producer createProducer() throws Exception {
// let's setup a route first
// we'll come up with a better way later
+ final DataFormat xstream = new DroolsXStreamDataFormat();
+
if (builder == null) {
builder = new RouteBuilder() {
public void configure() throws Exception {
- from("direct:" + id).to("drools:" + uri + "?pipeline=" + id);
+ from("direct:" + id).bean(new DroolsCamelContextInit((ServiceManager)getCamelContext().getRegistry().lookup("sm")))
+ //.unmarshal(xstream)
+ .to("drools:" + uri + "?pipeline=" + id);
+ //.marshal(xstream);
}
};
@@ -66,6 +74,11 @@
id = DroolsComponent.generateUuid();
}
+ @Override
+ public boolean isLenientProperties(){
+ return true;
+ }
+
public String getId() {
return id;
}
Added: labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsXStreamDataFormat.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsXStreamDataFormat.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsXStreamDataFormat.java 2009-12-21 22:02:36 UTC (rev 30791)
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2009 salaboy.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * under the License.
+ */
+
+package org.drools.camel.component;
+
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomReader;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.io.StringReader;
+import javax.xml.parsers.DocumentBuilderFactory;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.DataFormat;
+import org.drools.impl.StatefulKnowledgeSessionImpl;
+import org.drools.impl.StatelessKnowledgeSessionImpl;
+import org.drools.io.Resource;
+import org.drools.reteoo.ReteooRuleBase;
+import org.drools.runtime.CommandExecutor;
+
+import org.drools.runtime.help.BatchExecutionHelper;
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.impl.ServiceManagerPipelineContextImpl;
+import org.drools.runtime.pipeline.impl.XStreamFromXmlVsmTransformer;
+import org.drools.runtime.pipeline.impl.XStreamResolverStrategy;
+import org.drools.vsm.ServiceManager;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+
+/**
+ *
+ * @author salaboy
+ */
+public class DroolsXStreamDataFormat implements DataFormat{
+ private XStreamResolverStrategy xstreamStrategy = null;
+ private final XStreamFromXmlVsmTransformer transformer;
+ private String charset;
+ public DroolsXStreamDataFormat() {
+ xstreamStrategy = new XStreamResolverStrategy() {
+
+ public XStream lookup(String name) {
+ return BatchExecutionHelper.newXStreamMarshaller();
+ }
+ };
+ this.transformer = new XStreamFromXmlVsmTransformer(xstreamStrategy);
+ }
+
+
+
+ public void marshal(Exchange exchange, Object graph, OutputStream stream) throws Exception {
+
+ PipelineContext context = (PipelineContext) exchange.getProperty("drools-context");
+ XStream xstream = (XStream) context.getProperties().get( "xstream-instance" );
+ xstream.setClassLoader(context.getClassLoader());
+ String result = null;
+ try {
+ result = xstream.toXML(exchange.getIn().getBody());
+ } catch (Exception e) {
+ //handleException(this, object, e);
+ e.printStackTrace();
+ }
+
+ byte[] bytes;
+ if (charset != null) {
+ bytes = result.getBytes(charset);
+ } else {
+ bytes = result.getBytes();
+ }
+
+ stream.write(bytes);
+
+
+ }
+
+ public Object unmarshal(Exchange exchange, InputStream stream) throws Exception {
+
+ // this.transformer.processPayload(exchange.getIn().getBody(), (PipelineContext)exchange.getProperty("drools-context"));
+// exchange.getOut().setBody(this.transformer.getPayload());
+// exchange.setProperty("drools-context",this.transformer.getContext() );
+
+
+ PipelineContext context = (PipelineContext) exchange.getProperty("drools-context");
+ //Document d = processTranslate(exchange.getIn().getBody());
+ Document d = exchange.getIn().getBody(Document.class);
+ String name = d.getDocumentElement().getAttribute("lookup");
+ XStream xstream = this.xstreamStrategy.lookup(name);
+ if (xstream == null) {
+ throw new IllegalArgumentException("Unable to lookup XStream parser using name '" + name + "'");
+ }
+ ServiceManagerPipelineContextImpl vsmContext = (ServiceManagerPipelineContextImpl) exchange.getProperty("drools-context");
+ ServiceManager sm = vsmContext.getServiceManager();
+ CommandExecutor executor = sm.lookup(name);
+ if (executor == null) {
+ throw new IllegalArgumentException("Unable to lookup CommandExecutor using name '" + name + "'");
+ }
+ vsmContext.setCommandExecutor(executor);
+ ClassLoader cl = null;
+ if (executor instanceof StatefulKnowledgeSessionImpl) {
+ cl = ((ReteooRuleBase) (( StatefulKnowledgeSessionImpl ) executor).getRuleBase()).getRootClassLoader();
+ xstream.setClassLoader(cl);
+ } else if (executor instanceof StatelessKnowledgeSessionImpl) {
+ cl = ((ReteooRuleBase) (( StatelessKnowledgeSessionImpl ) executor).getRuleBase()).getRootClassLoader();
+ } else {
+ throw new IllegalArgumentException("Unable to set ClassLoader on " + executor);
+ }
+ xstream.setClassLoader(cl);
+ vsmContext.setClassLoader(cl);
+ Object payload = xstream.unmarshal(new DomReader(d));
+
+ context.getProperties().put("xstream-instance", xstream);
+ exchange.setProperty("drools-context", context);
+ return payload;
+ }
+ private Document processTranslate(Object object) {
+ // Create a DOM builder and parse the fragment
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ Document d = null;
+ try {
+ d = factory.newDocumentBuilder().parse((InputSource) null);
+ } catch (Exception e) {
+ }
+ try {
+ if (object instanceof String) {
+ d = factory.newDocumentBuilder().parse(new InputSource(new StringReader((String) object)));
+ } else if (object instanceof Reader) {
+ d = factory.newDocumentBuilder().parse(new InputSource((Reader) object));
+ } else if (object instanceof InputStream) {
+ d = factory.newDocumentBuilder().parse((InputStream) object);
+ } else if (object instanceof Resource) {
+ d = factory.newDocumentBuilder().parse(new InputSource(((Resource) object).getReader()));
+ } else {
+ throw new IllegalArgumentException("signal object must be instance of InputStream or Resource");
+ }
+ } catch (Exception e) {
+ //handleException(this, object, e);
+ e.printStackTrace();
+ }
+ return d;
+ }
+
+
+}
Added: labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/pipeline/camel/DroolsCamelContextInit.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/pipeline/camel/DroolsCamelContextInit.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/pipeline/camel/DroolsCamelContextInit.java 2009-12-21 22:02:36 UTC (rev 30791)
@@ -0,0 +1,28 @@
+package org.drools.pipeline.camel;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Handler;
+import org.drools.runtime.pipeline.impl.ServiceManagerPipelineContextImpl;
+import org.drools.vsm.ServiceManager;
+
+/**
+ * Camel Processor to initialize the drools-camel context
+ *
+ * @author salaboy
+ *
+ */
+public class DroolsCamelContextInit {
+
+ private ServiceManagerPipelineContextImpl context;
+
+ public DroolsCamelContextInit(ServiceManager serviceManager) {
+
+ this.context = new ServiceManagerPipelineContextImpl(serviceManager, null);
+ }
+ @Handler
+ public void initialize(Exchange exchange) throws Exception {
+
+ exchange.setProperty("drools-context", context);
+ }
+
+}
Added: labs/jbossrules/trunk/drools-pipeline/drools-camel/src/test/java/org/drools/camel/component/CamelEndpointWithMarshallersTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/drools-camel/src/test/java/org/drools/camel/component/CamelEndpointWithMarshallersTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/drools-camel/src/test/java/org/drools/camel/component/CamelEndpointWithMarshallersTest.java 2009-12-21 22:02:36 UTC (rev 30791)
@@ -0,0 +1,134 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * under the License.
+ */
+
+package org.drools.camel.component;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.drools.command.CommandFactory;
+import org.drools.command.runtime.rule.GetObjectCommand;
+import org.drools.command.runtime.rule.InsertObjectCommand;
+import org.drools.common.DisconnectedFactHandle;
+import org.drools.common.InternalFactHandle;
+import org.drools.pipeline.camel.Person;
+import org.drools.runtime.ExecutionResults;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.help.BatchExecutionHelper;
+import org.drools.runtime.rule.FactHandle;
+
+public class CamelEndpointWithMarshallersTest extends DroolsCamelTestSupport {
+ private String handle;
+
+ public void testSimple(){
+ }
+
+// public void testSessionInsert() throws Exception {
+//
+// String cmd = "" +
+// "<batch-execution lookup=\"ksession1\">\n" +
+// "<insert out-identifier=\"salaboy\">\n" +
+// "<org.drools.pipeline.camel.Person>\n" +
+// "<name>salaboy</name>\n" +
+// "</org.drools.pipeline.camel.Person>\n" +
+// "</insert>\n" +
+// "<fire-all-rules/>\n" +
+// "</batch-execution>\n";
+//
+// String outXml = new String((byte[])template.requestBody("direct:test-with-session", cmd));
+//
+// ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML(outXml);
+// Person person = (Person) result.getValue("salaboy");
+// assertEquals("salaboy",
+// person.getName());
+//
+// String expectedXml = "<execution-results>\n";
+// expectedXml += " <result identifier=\"salaboy\">\n";
+// expectedXml += " <org.drools.pipeline.camel.Person>\n";
+// expectedXml += " <name>salaboy</name>\n";
+// expectedXml += " </org.drools.pipeline.camel.Person>\n";
+// expectedXml += " </result>\n";
+// expectedXml += " <fact-handle identifier=\"salaboy\" externalForm=\"" + ((InternalFactHandle) result.getFactHandle("salaboy")).toExternalForm() + "\"/>\n";
+// expectedXml += "</execution-results>";
+//
+// assertEquals(expectedXml, outXml);
+//
+// }
+//
+// public void testNoSessionInsert() throws Exception {
+//
+// String cmd = "" +
+// "<batch-execution lookup=\"ksession1\">\n" +
+// "<insert out-identifier=\"salaboy\">\n" +
+// "<org.drools.pipeline.camel.Person>\n" +
+// "<name>salaboy</name>\n" +
+// "</org.drools.pipeline.camel.Person>\n" +
+// "</insert>\n" +
+// "<fire-all-rules/>\n" +
+// "</batch-execution>\n";
+//
+// String outXml = new String((byte[])template.requestBodyAndHeader("direct:test-no-session", cmd,
+// DroolsComponent.DROOLS_LOOKUP, "ksession1"));
+//
+// ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML(outXml);
+// Person person = (Person) result.getValue("salaboy");
+// assertEquals("salaboy",
+// person.getName());
+//
+// String expectedXml = "<execution-results>\n";
+// expectedXml += " <result identifier=\"salaboy\">\n";
+// expectedXml += " <org.drools.pipeline.camel.Person>\n";
+// expectedXml += " <name>salaboy</name>\n";
+// expectedXml += " </org.drools.pipeline.camel.Person>\n";
+// expectedXml += " </result>\n";
+// expectedXml += " <fact-handle identifier=\"salaboy\" externalForm=\"" + ((InternalFactHandle) result.getFactHandle("salaboy")).toExternalForm() + "\"/>\n";
+// expectedXml += "</execution-results>";
+//
+// assertEquals(expectedXml, outXml);
+// }
+
+// public void testSessionGetObject() throws Exception {
+// FactHandle factHandle = new DisconnectedFactHandle(handle);
+// GetObjectCommand cmd = (GetObjectCommand) CommandFactory.newGetObject(factHandle);
+// cmd.setOutIdentifier("rider");
+//
+// ExecutionResults response = (ExecutionResults) template.requestBody("direct:test-with-session", cmd);
+// assertTrue("Expected valid ExecutionResults object", response != null);
+// assertTrue("ExecutionResults missing expected object", response.getValue("rider") != null);
+// assertTrue("FactHandle object not of expected type", response.getValue("rider") instanceof Person);
+// assertEquals("Hadrian", ((Person)response.getValue("rider")).getName());
+// }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ public void configure() throws Exception {
+ from("direct:test-with-session").to("drools://sm/ksession1?dataType=xstream");
+ from("direct:test-no-session").to("drools://sm?pipeline=test-no-session&dataType=xstream");
+ }
+ };
+ }
+
+ @Override
+ protected void configureDroolsContext() {
+ Person me = new Person();
+ me.setName("Hadrian");
+
+ StatefulKnowledgeSession ksession = registerKnowledgeRuntime("ksession1", null);
+ InsertObjectCommand cmd = new InsertObjectCommand(me);
+ cmd.setOutIdentifier("camel-rider");
+ cmd.setReturnObject(false);
+ ExecutionResults results = ksession.execute(cmd);
+ handle = ((FactHandle)results.getFactHandle("camel-rider")).toExternalForm();
+ }
+}
More information about the jboss-svn-commits
mailing list