[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