[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