[jboss-svn-commits] JBL Code SVN: r30496 - in labs/jbossrules/trunk/drools-pipeline/drools-camel/src: test/java/org/drools/camel/component and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Dec 6 23:17:34 EST 2009


Author: hzbarcea
Date: 2009-12-06 23:17:33 -0500 (Sun, 06 Dec 2009)
New Revision: 30496

Modified:
   labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsConverter.java
   labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsEndpoint.java
   labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsPayload.java
   labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsProducer.java
   labs/jbossrules/trunk/drools-pipeline/drools-camel/src/test/java/org/drools/camel/component/CamelEndpointTest.java
Log:
JBRULES-2347 Drools Pipeline integration with Camel
- first working end-to-end test



Modified: labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsConverter.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsConverter.java	2009-12-07 02:11:07 UTC (rev 30495)
+++ labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsConverter.java	2009-12-07 04:17:33 UTC (rev 30496)
@@ -17,17 +17,45 @@
 
 import org.apache.camel.Converter;
 import org.apache.camel.Exchange;
+import org.drools.runtime.ExecutionResults;
+import org.drools.runtime.help.BatchExecutionHelper;
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.impl.XStreamFromXmlVsmTransformer;
+import org.drools.runtime.pipeline.impl.XStreamResolverStrategy;
+import org.drools.runtime.pipeline.impl.XStreamToXmlVsmTransformer;
 import org.w3c.dom.Document;
 
+import com.thoughtworks.xstream.XStream;
+
 @Converter
 public final class DroolsConverter {
+    private XStreamFromXmlVsmTransformer inTransformer;
+    private XStreamToXmlVsmTransformer outTransformer;
 
-    private DroolsConverter() {
-    	// Utility class
+    public DroolsConverter() {
+        // The XStreamFromXmlVsmTransformer will throw an IllegalArgumentException if lookup is null
+        // this *will* be the case if the ksession is specified in the url, so we need a different 
+        // kind of transformer there.
+        inTransformer = new XStreamFromXmlVsmTransformer(new XStreamResolverStrategy() {
+                public XStream lookup(String name) {
+                    return BatchExecutionHelper.newXStreamMarshaller();
+                }
+            });
+        outTransformer = new XStreamToXmlVsmTransformer();
     }
 
     @Converter
-    public static DroolsPayload toVsmPayload(Document payload, Exchange exchange) {
-    	return null;
+    public DroolsPayload toVsmPayload(Document payload, Exchange exchange) {
+    	PipelineContext context = (PipelineContext)exchange.getProperty(DroolsEndpoint.DROOLS_CONTEXT_PROPERTY);
+    	// check for null context and throw CamelRuntimeException?
+    	inTransformer.processPayload(payload, context);
+    	// this was done in the initial example, is it really necessary? why reset the context?
+        exchange.setProperty(DroolsEndpoint.DROOLS_CONTEXT_PROPERTY, inTransformer.getContext());
+        return new DroolsPayload(inTransformer.getPayload());
     }
+
+    @Converter
+    public Object toXmlPayload(ExecutionResults payload, Exchange exchange) {
+        return outTransformer.transform((PipelineContext)exchange.getProperty(DroolsEndpoint.DROOLS_CONTEXT_PROPERTY), payload);
+    }
 }

Modified: labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsEndpoint.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsEndpoint.java	2009-12-07 02:11:07 UTC (rev 30495)
+++ labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsEndpoint.java	2009-12-07 04:17:33 UTC (rev 30496)
@@ -26,11 +26,15 @@
 import org.drools.vsm.ServiceManager;
 
 public class DroolsEndpoint extends DefaultEndpoint {
+    // Property name *must* follow the Camel conventions (see org.apache.camel.Exchange)
+    public static final String DROOLS_CONTEXT_PROPERTY = "CamelDroolsContext";
+
     private String id;
     private String method;
     private CommandExecutor executor;
+    private ServiceManager serviceManager;
 
-    protected DroolsEndpoint(String endpointUri, String remaining, DroolsComponent component) throws URISyntaxException {
+    public DroolsEndpoint(String endpointUri, String remaining, DroolsComponent component) throws URISyntaxException {
         super(endpointUri, component);
         configure(component, remaining);
     }
@@ -40,7 +44,7 @@
     }
 
     public Producer createProducer() throws Exception {
-        return new DroolsProducer(this);
+        return new DroolsProducer(this, serviceManager);
     }
 
     public boolean isSingleton() {
@@ -63,6 +67,10 @@
         return executor;
     }
 
+    public ServiceManager getServiceManager() {
+        return serviceManager;
+    }
+
     protected void configure(DroolsComponent component, String uri) {
         int pos = uri.indexOf('/');
         String smId = (pos < 0) ? uri : uri.substring(0, pos);
@@ -70,17 +78,17 @@
         
         if (smId.length() > 0) {
             // initialize the component if needed
-            ServiceManager sm = component.getServiceManager();
-            if (sm == null) {
+            serviceManager = component.getServiceManager();
+            if (serviceManager == null) {
                 // let's look it up
-                sm = component.getCamelContext().getRegistry().lookup(smId, ServiceManager.class);
-                if (sm == null) {
+                serviceManager = component.getCamelContext().getRegistry().lookup(smId, ServiceManager.class);
+                if (serviceManager == null) {
                     throw new RuntimeCamelException("Could not find ServiceManager with id=\""
                         + smId + "\" in CamelContext. Check configuration.");
                 }
                 // use this ServiceManager
                 component.setServiceManagerId(smId);
-                component.setServiceManager(sm);
+                component.setServiceManager(serviceManager);
             } else if (!smId.equals(component.getServiceManagerId())) {
                 // make sure we deal with the same ServiceManager.
                 // having multiple ServiceManagers instances in the same process is not supported
@@ -91,7 +99,7 @@
             // if id is empty this endpoint is not attached to a CommandExecutor and will have to look it up at runtime.
             if (id.length() > 0) {
                 // lookup command executor on 
-                executor = sm.lookup(id);
+                executor = serviceManager.lookup(id);
                 if (executor == null) {
                     throw new RuntimeCamelException("Failed to instantiate DroolsEndpoint. " 
                         + "Lookup of CommandExecutor with id=\"" + uri + "\" failed. Check configuration.");

Modified: labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsPayload.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsPayload.java	2009-12-07 02:11:07 UTC (rev 30495)
+++ labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsPayload.java	2009-12-07 04:17:33 UTC (rev 30496)
@@ -18,6 +18,13 @@
 public class DroolsPayload {
     private Object value;
 
+    DroolsPayload() {
+    }
+
+    DroolsPayload(Object value) {
+        this.value = value;
+    }
+
     public Object getValue() {
     	return value;
     }

Modified: labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsProducer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsProducer.java	2009-12-07 02:11:07 UTC (rev 30495)
+++ labs/jbossrules/trunk/drools-pipeline/drools-camel/src/main/java/org/drools/camel/component/DroolsProducer.java	2009-12-07 04:17:33 UTC (rev 30496)
@@ -15,26 +15,72 @@
 
 package org.drools.camel.component;
 
-import org.apache.camel.CamelException;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
+import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.TypeConverter;
 import org.apache.camel.impl.DefaultProducer;
+import org.drools.runtime.ExecutionResults;
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.impl.AssignObjectAsResult;
+import org.drools.runtime.pipeline.impl.ExecuteResultHandler;
+import org.drools.runtime.pipeline.impl.ExecutorStage;
+import org.drools.runtime.pipeline.impl.ServiceManagerPipelineContextImpl;
+import org.drools.vsm.ServiceManager;
 import org.w3c.dom.Document;
 
 public class DroolsProducer extends DefaultProducer {
+    private ServiceManager serviceManager;
+    private DroolsConverter converter;
 
-    public DroolsProducer(Endpoint endpoint) {
+    public DroolsProducer(Endpoint endpoint, ServiceManager serviceManager) {
         super(endpoint);
+        this.serviceManager = serviceManager;
+        converter = new DroolsConverter();
     }
 
     public void process(Exchange exchange) throws Exception {
-	    
-        TypeConverter converter = exchange.getContext().getTypeConverter();
-        Document body = exchange.getIn().getBody(Document.class);
-        DroolsPayload payload = converter.convertTo(DroolsPayload.class, exchange, body);
+        ResultHandlerImpl handler = new ResultHandlerImpl();
+
+        exchange.setProperty(DroolsEndpoint.DROOLS_CONTEXT_PROPERTY, 
+            new ServiceManagerPipelineContextImpl(serviceManager, null, handler));
+        
+        // TypeConverter converter = exchange.getContext().getTypeConverter();
+        // DroolsPayload payload = converter.convertTo(DroolsPayload.class, exchange, body);
+        DroolsPayload payload = converter.toVsmPayload(exchange.getIn().getBody(Document.class), exchange);
+        // The value type inside DroolsPayload is BatchExecutionImpl.  We would not need the DroolsPayload wrapper
+        // if the payload would always be something like a subtype of GenericCommand.
         if (payload == null) {
-            // throw new CamelException("foo");
+            throw new RuntimeCamelException("Conversion to a drools payload type failed.");
         }
+        ExecutorStage batchExecution = (ExecutorStage) PipelineFactory.newCommandExecutor();
+        
+        // only need to get the PipelineContext from the exchange property 
+        // if we knew it could have been changed by the converter
+        PipelineContext ctx = (PipelineContext)exchange.getProperty(DroolsEndpoint.DROOLS_CONTEXT_PROPERTY);
+        ExecutionResults results = batchExecution.execute(payload.getValue(), ctx);
+        Object xml = converter.toXmlPayload(results, exchange);
+        
+        AssignObjectAsResult assignResult = (AssignObjectAsResult) PipelineFactory.newAssignObjectAsResult();
+        assignResult.assignResult(ctx, xml);
+        ExecuteResultHandler executeResult = (ExecuteResultHandler) PipelineFactory.newExecuteResultHandler();
+        executeResult.handleResult(ctx, xml);
+        
+        exchange.getOut().setBody(handler.getObject());
     }
+
+    // There are nicer ways of doint this
+    public static class ResultHandlerImpl implements ResultHandler {
+        Object object;
+        
+        public void handleResult(Object object) {
+            this.object = object;
+        }
+        
+        public Object getObject() {
+            return this.object;
+        }
+    }
 }

Modified: labs/jbossrules/trunk/drools-pipeline/drools-camel/src/test/java/org/drools/camel/component/CamelEndpointTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/drools-camel/src/test/java/org/drools/camel/component/CamelEndpointTest.java	2009-12-07 02:11:07 UTC (rev 30495)
+++ labs/jbossrules/trunk/drools-pipeline/drools-camel/src/test/java/org/drools/camel/component/CamelEndpointTest.java	2009-12-07 04:17:33 UTC (rev 30496)
@@ -30,14 +30,13 @@
 import org.drools.runtime.StatefulKnowledgeSession;
 import org.drools.vsm.ServiceManager;
 import org.drools.vsm.local.ServiceManagerLocalClient;
-import org.w3c.dom.Document;
 
 public class CamelEndpointTest extends ContextTestSupport {
     private ServiceManager sm;
 
     public void testBasic() throws Exception {
         String inXml = "";
-        inXml += "<batch-execution>";
+        inXml += "<batch-execution lookup=\"ksession1\">";
         inXml += "  <insert out-identifier='salaboy'>";
         inXml += "    <org.drools.pipeline.camel.Person>";
         inXml += "      <name>salaboy</name>";
@@ -47,7 +46,9 @@
         inXml += "</batch-execution>";
 
         Object response = template.requestBody("direct:in", inXml);
-        // assertEquals("Hello World", response);
+        
+        // Urgh, ugly stuff, but it's getting late...
+        System.out.println(response);
     }
 
     @Override
@@ -96,5 +97,4 @@
 
         return session;
     }
-
 }



More information about the jboss-svn-commits mailing list