[jboss-svn-commits] JBL Code SVN: r33975 - in labs/jbossrules/trunk/drools-pipeline: src and 22 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Fri Jul 16 22:23:50 EDT 2010
Author: mark.proctor at jboss.com
Date: 2010-07-16 22:23:49 -0400 (Fri, 16 Jul 2010)
New Revision: 33975
Added:
labs/jbossrules/trunk/drools-pipeline/src/
labs/jbossrules/trunk/drools-pipeline/src/main/
labs/jbossrules/trunk/drools-pipeline/src/main/java/
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/dataloaders/
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/CommandTranslator.java
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/DroolsSmooksConfiguration.java
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbFromXmlTransformer.java
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbToXmlTransformer.java
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbTransformerProviderImpl.java
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsMessenger.java
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsMessengerProviderImpl.java
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsUnwrapMessageObject.java
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsUnwrapText.java
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JxlsTransformer.java
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/ListMapping.java
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/NamedXstreamLookupStrategy.java
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/ResultTranslator.java
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/Root.java
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksFromSourceTransformer.java
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksToSourceTransformer.java
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksTransformerProviderImpl.java
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlGridTransformer.java
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlTransformer.java
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamResolverStrategy.java
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamToXmlGridTransformer.java
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamToXmlTransformer.java
labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamTransformerProviderImpl.java
labs/jbossrules/trunk/drools-pipeline/src/main/resources/
labs/jbossrules/trunk/drools-pipeline/src/main/resources/batch-execution.xsd
labs/jbossrules/trunk/drools-pipeline/src/test/
labs/jbossrules/trunk/drools-pipeline/src/test/java/
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/ChangeCollector.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/Cheese.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/Person.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/TestVariable.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/dataloaders/
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Company.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Department.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Employee.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JSonBatchExecutionTest.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbFactTest.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbGlobalTest.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbSimpleJmsMessengerTest.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbTest.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JxlsTest.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleConsumer.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleJmsMessengerTest.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleProducer.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmookStatefulSessionTest.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmookStatelessSessionTest.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmooksFactTest.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmooksGlobalTest.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamBatchExecutionTest.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamFactTest.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamGlobalTest.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamStatefulSessionTest.java
labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamStatelessSessionTest.java
labs/jbossrules/trunk/drools-pipeline/src/test/resources/
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/dataloaders/
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/dataloaders/smooks/
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/SmooksDirectRoot.xml
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/SmooksNestedIterable.xml
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/XStreamDirectRoot.xml
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/XStreamNestedIterable.xml
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/data.xml
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/departmentData.xls
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/departments.xml
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/order.xml
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/order.xsd
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/smooks-config.xml
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test.xsd
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_JXLS.drl
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_Jaxb.drl
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_SmooksDirectRoot.drl
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_SmooksNestedIterable.drl
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_XStreamDirectRoot.drl
labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_XStreamNestedIterable.drl
Log:
JBRULES-2347 Camel
-merging all the pipelien modueles, to simplify the build, as they are only kept around now for legacy users.
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/CommandTranslator.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/CommandTranslator.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/CommandTranslator.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,234 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+
+import org.drools.command.Setter;
+import org.drools.command.impl.GenericCommand;
+import org.drools.command.runtime.BatchExecutionCommand;
+import org.drools.command.runtime.SetGlobalCommand;
+import org.drools.command.runtime.process.SignalEventCommand;
+import org.drools.command.runtime.process.StartProcessCommand;
+import org.drools.command.runtime.rule.FireAllRulesCommand;
+import org.drools.command.runtime.rule.InsertElementsCommand;
+import org.drools.command.runtime.rule.InsertObjectCommand;
+import org.drools.command.runtime.rule.ModifyCommand;
+import org.drools.command.runtime.rule.QueryCommand;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ *
+ * @author Wolfgang Laun
+ */
+public class CommandTranslator {
+ private Map<Class<?>, CommandTransformer> class2trans;
+
+ public CommandTranslator(){
+ class2trans = new HashMap<Class<?>, CommandTransformer>();
+ class2trans.put(BatchExecutionCommand.class, new BatchExecutionTransformer());
+ class2trans.put(InsertElementsCommand.class, new InsertElementsTransformer());
+ class2trans.put(InsertObjectCommand.class, new InsertObjectTransformer());
+ class2trans.put(ModifyCommand.class, new ModifyObjectTransformer());
+ class2trans.put(QueryCommand.class, new QueryTransformer());
+ class2trans.put(SetGlobalCommand.class, new SetGlobalTransformer());
+ class2trans.put(SignalEventCommand.class, new SignalEventTransformer());
+ class2trans.put(StartProcessCommand.class, new StartProcessTransformer());
+ class2trans.put(FireAllRulesCommand.class, new FireAllRulesTransformer());
+ }
+
+ /**
+ * Transforms a list of XML elements representing Drools command objects
+ * to a list of <tt>Command<?></tt> objects. Application objects
+ * are unmarshalled, using an <tt>Unmarshaller</tt> object derived from
+ * the object's class.
+ *
+ * @param xmlCmds the list of XML elements representing Drools command objects
+ * @return
+ * @return a list of <tt>Command<?></tt> objects
+ */
+ public GenericCommand<?> transform(BatchExecutionCommand batchExecution, Unmarshaller unmarshaller) {
+ CommandTransformer commandTransformer = class2trans.get(batchExecution.getClass());
+ return commandTransformer.transform(this, batchExecution, unmarshaller);
+ }
+
+ protected CommandTransformer getCommandTransformer(Class<?> clazz) {
+ return class2trans.get(clazz);
+ }
+
+ protected Object makeObject(Node node, Unmarshaller unmarshaller) {
+ Object obj = null;
+ try {
+ obj = unmarshaller.unmarshal(node);
+ } catch (JAXBException e) {
+ // TODO: remove this
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+ return obj;
+ }
+}
+
+
+/**
+ * Abstract base class for all command transformers.
+ */
+abstract class CommandTransformer {
+ abstract GenericCommand<?> transform(CommandTranslator ct, Object o , Unmarshaller unmarshaller);
+}
+
+/**
+ * Class for transforming a BatchExecution command.
+ */
+class BatchExecutionTransformer extends CommandTransformer {
+ public GenericCommand<?> transform(CommandTranslator cmdTrans, Object o , Unmarshaller unmarshaller) {
+ BatchExecutionCommand be = (BatchExecutionCommand)o;
+ List<GenericCommand<?>> xmlCmds = be.getCommands();
+ for (ListIterator<GenericCommand<?>> i = xmlCmds.listIterator(); i.hasNext();) {
+ GenericCommand<?> cmd = i.next();
+ CommandTransformer ct = cmdTrans.getCommandTransformer(cmd.getClass());
+ if (ct != null) {
+ i.set(ct.transform(cmdTrans, cmd, unmarshaller));
+ }
+ }
+ return be;
+ }
+}
+
+/**
+ * Class for transforming an InsertElements command.
+ */
+class InsertElementsTransformer extends CommandTransformer {
+ public GenericCommand<?> transform(CommandTranslator ct, Object o, Unmarshaller unmarshaller) {
+ InsertElementsCommand insertElementsCmd = (InsertElementsCommand)o;
+ List<Object> objectsList = new ArrayList<Object>(insertElementsCmd.getObjects().size());
+
+ for (Object obj : insertElementsCmd.getObjects()) {
+ if (obj instanceof Node) {
+ objectsList.add(ct.makeObject((Node) obj, unmarshaller));
+ } else {
+ objectsList.add(obj);
+ }
+ }
+
+ insertElementsCmd.setObjects(objectsList);
+ return insertElementsCmd;
+ }
+}
+
+/**
+ * Class for transforming a InsertObject command.
+ */
+class InsertObjectTransformer extends CommandTransformer {
+ public GenericCommand<?> transform(CommandTranslator ct, Object o, Unmarshaller unmarshaller) {
+ InsertObjectCommand io = (InsertObjectCommand)o;
+ Object object = io.getObject();
+ if (object instanceof Element) {
+ Element el = (Element)object;
+ Object obj = ct.makeObject(el , unmarshaller);
+ io.setObject(obj);
+ }
+ return io;
+ }
+}
+
+/**
+ * Class for transforming a ModifyObject command.
+ */
+class ModifyObjectTransformer extends CommandTransformer {
+ public GenericCommand<?> transform(CommandTranslator ct, Object o, Unmarshaller unmarshaller) {
+ ModifyCommand mo = (ModifyCommand)o;
+ List<?> setters = mo.getSetters();
+ List<Setter> convertedSetters = new ArrayList<Setter>();
+ for (Object node : setters) {
+ Setter setter;
+ if (node instanceof Element) {
+ setter = (Setter) ct.makeObject((Element)node, unmarshaller);
+ }
+ else {
+ setter = (Setter) node;
+ }
+ convertedSetters.add(setter);
+ }
+ mo.setSetters(convertedSetters);
+ return mo;
+ }
+}
+
+/**
+ * Class for transforming a FireAllRules command.
+ */
+class FireAllRulesTransformer extends CommandTransformer {
+ public GenericCommand<?> transform(CommandTranslator ct, Object o, Unmarshaller unmarshaller) {
+ return (FireAllRulesCommand)o;
+ }
+}
+
+/**
+ * Class for transforming a Query command.
+ */
+class QueryTransformer extends CommandTransformer {
+ public GenericCommand<?> transform(CommandTranslator ct, Object o, Unmarshaller unmarshaller) {
+ QueryCommand q = (QueryCommand)o;
+ for (ListIterator<Object> i = q.getArguments().listIterator(); i.hasNext();) {
+ Object object = i.next();
+ if (object instanceof Element) {
+ i.set(ct.makeObject((Element) object, unmarshaller));
+ }
+ }
+ return q;
+ }
+}
+
+/**
+ * Class for transforming a SetGlobal command.
+ */
+class SetGlobalTransformer extends CommandTransformer {
+ public GenericCommand<?> transform(CommandTranslator ct, Object o, Unmarshaller unmarshaller) {
+ SetGlobalCommand sg = (SetGlobalCommand)o;
+ Object object = sg.getObject();
+ if (object instanceof Element) {
+ Element el = (Element)object;
+ Object obj = ct.makeObject(el , unmarshaller);
+ sg.setObject(obj);
+ }
+ return sg;
+ }
+}
+
+/**
+ * Class for transforming a SignalEvent command.
+ */
+class SignalEventTransformer extends CommandTransformer {
+ public GenericCommand<?> transform(CommandTranslator ct, Object o, Unmarshaller unmarshaller) {
+ SignalEventCommand se = (SignalEventCommand)o;
+ Object ev = se.getEvent();
+ if (ev != null) {
+ Object obj = ct.makeObject((Element)ev , unmarshaller);
+ se.setEvent(obj);
+ }
+ return se;
+ }
+}
+
+/**
+ * Class for transforming a StartProcess command.
+ */
+class StartProcessTransformer extends CommandTransformer {
+ public GenericCommand<?> transform( CommandTranslator ct, Object o, Unmarshaller unmarshaller ) {
+ StartProcessCommand sp = (StartProcessCommand)o;
+ for (Map.Entry<String, Object> entry: sp.getParameters().entrySet()) {
+ Object obj = entry.getValue();
+ if (obj instanceof Element) {
+ entry.setValue(ct.makeObject((Element) obj, unmarshaller));
+ }
+ }
+ return sp;
+ }
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/DroolsSmooksConfiguration.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/DroolsSmooksConfiguration.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/DroolsSmooksConfiguration.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,23 @@
+package org.drools.runtime.pipeline.impl;
+
+public class DroolsSmooksConfiguration {
+ private String rootId;
+
+ public DroolsSmooksConfiguration() {
+ this.rootId = "root";
+ }
+
+ public DroolsSmooksConfiguration(String rootId) {
+ this.rootId = rootId;
+ }
+
+ public void setRootId(String rootId) {
+ this.rootId = rootId;
+ }
+
+ public String getRootId() {
+ return rootId;
+ }
+
+
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbFromXmlTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbFromXmlTransformer.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbFromXmlTransformer.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,61 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.File;
+import java.io.InputStream;
+import java.io.Reader;
+import java.io.StringReader;
+
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.transform.Source;
+
+import org.drools.io.Resource;
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.Transformer;
+import org.xml.sax.InputSource;
+
+public class JaxbFromXmlTransformer extends BaseEmitter
+ implements
+ Transformer {
+ private Unmarshaller unmarshaller;
+
+ public JaxbFromXmlTransformer(Unmarshaller unmarshaller) {
+ this.unmarshaller = unmarshaller;
+ }
+
+ public void receive(Object object,
+ PipelineContext context) {
+ Object result = null;
+ try {
+ if ( object instanceof File ) {
+ result = this.unmarshaller.unmarshal( (File) object );
+ } else if ( object instanceof!
InputStream ) {
+ result = this.unmarshaller.unmarshal( (InputStream) object );
+ } else if ( object instanceof Reader ) {
+ result = this.unmarshaller.unmarshal( (Reader) object );
+ } else if ( object instanceof Source ) {
+ result = this.unmarshaller.unmarshal( (Source) object );
+ } else if ( object instanceof InputSource ) {
+ result = this.unmarshaller.unmarshal( (InputSource) object );
+ } else if ( object instanceof Resource ) {
+ result = this.unmarshaller.unmarshal( (( Resource ) object).getReader() );
+ } else if ( object instanceof String ) {
+ result = this.unmarshaller.unmarshal( new StringReader( ( String ) object ) );
+ } else {
+ throw new IllegalArgumentException( "signal object must be instance of File, InputStream, Reader, Source, InputSource, Resource, String" );
+ }
+ !
} catch ( Exception e ) {
+ handleException( t!
his,
+
object,
+ e );
+ }
+
+ if ( result instanceof JAXBElement ) {
+ result = ((JAXBElement) object).getValue();
+ }
+
+ emit( result,
+ context );
+ }
+
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbToXmlTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbToXmlTransformer.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbToXmlTransformer.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,38 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.StringWriter;
+
+import javax.xml.bind.Marshaller;
+
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.Transformer;
+
+public class JaxbToXmlTransformer extends BaseEmitter
+ implements
+ Transformer {
+ private Marshaller marshaller;
+
+ public JaxbToXmlTransformer(Marshaller marshaller) {
+ this.marshaller = marshaller;
+ }
+
+ public void receive(Object object,
+ PipelineContext context) {
+ Object result = null;
+ try {
+ StringWriter stringWriter = new StringWriter();
+
+ this.marshaller.marshal( object, stringWriter );
+
+ result = stringWriter.getBuffer().toString();
+ } catch ( Exception e ) {
+ handleException( this,
+ object,
+ e );
+ }
+
+ emit( result,
+ context );
+ }
+
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbTransformerProviderImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbTransformerProviderImpl.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JaxbTransformerProviderImpl.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,20 @@
+/**
+ *
+ */
+package org.drools.runtime.pipeline.impl;
+
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+
+import org.drools.runtime.pipeline.JaxbTransformerProvider;
+import org.drools.runtime.pipeline.Transformer;
+
+public class JaxbTransformerProviderImpl implements JaxbTransformerProvider {
+ public Transformer newJaxbFromXmlTransformer(Unmarshaller unmarshaller) {
+ return new JaxbFromXmlTransformer( unmarshaller );
+ }
+
+ public Transformer newJaxbToXmlTransformer(Marshaller marshaller) {
+ return new JaxbToXmlTransformer( marshaller );
+ }
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsMessenger.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsMessenger.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsMessenger.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,150 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.Properties;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.Session;
+import javax.naming.InitialContext;
+
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.ResultHandlerFactory;
+import org.drools.runtime.pipeline.Service;
+
+public class JmsMessenger extends BaseService
+ implements
+ Service {
+ private ConnectionFactory connectionFactory;
+ private Destination destination;
+ private MessageConsumer consumer;
+ private Connection connection;
+ private Session session;
+
+ private ResultHandlerFactory resultHandlerFactory;
+ private Pipeline pipeline;
+
+ private Thread thread;
+
+ private JmsMessengerRunner jmsFeederRunner;
+
+ public JmsMessenger(Pipeline pipeline,
+ Properties properties,
+ String destinationName,
+ ResultHandlerFactory resultHandlerFactory) {
+ super();
+ this.pipeline = pipeline;
+ this.resultHandlerFactory = resultHandlerFactory;
+
+ try {
+ InitialContext jndiContext = new InitialContext( properties );
+ this.connectionFactory = (ConnectionFactory) jndiContext.lookup( "ConnectionFactory" );
+ this.destination = (Destination) jndiContext.lookup( destinationName );
+ } catch ( Exception e ) {
+ throw new RuntimeException( "Unable to instantiate JmsFeeder",
+ e );
+ }
+ }
+
+ public void start() {
+ try {
+ this.connection = this.connectionFactory.createConnection();
+ this.session = this.connection.createSession( false,
+ Session.AUTO_ACKNOWLEDGE );
+ this.consumer = this.session.createConsumer( destination );
+
+ this.connection.start();
+ } catch ( Exception e ) {
+ handleException( this,
+ null,
+ e );
+ }
+ this.jmsFeederRunner = new JmsMessengerRunner( this,
+ this.consumer,
+ this.pipeline,
+ this.resultHandlerFactory );
+ this.jmsFeederRunner.setRun( true );
+ this.thread = new Thread( this.jmsFeederRunner );
+ this.thread.start();
+ }
+
+ public void stop() {
+ try {
+ this.jmsFeederRunner.setRun( false );
+ // this will interrupt the receive()
+ this.consumer.close();
+ this.connection.stop();
+ } catch ( JMSException e ) {
+ handleException( this,
+ null,
+ e );
+ }
+ }
+
+ // public void run() {
+ // while ( this.run ) {
+ // Message msg = null;
+ // try {
+ // msg = this.consumer.receive();
+ // System.out.println( "msg received : " + msg );
+ // // emit( msg,
+ // // new EntryPointPipelineContext( this.entryPoint ) );
+ // } catch ( JMSException e ) {
+ // handleException( this,
+ // msg,
+ // e );
+ // }
+ // }
+ // }
+
+ public static class JmsMessengerRunner
+ implements
+ Runnable {
+ private JmsMessenger feeder;
+ private MessageConsumer consumer;
+ private Pipeline pipeline;
+ private ResultHandlerFactory resultHandlerFactory;
+ private volatile boolean run;
+
+ public JmsMessengerRunner(JmsMessenger feeder,
+ MessageConsumer consumer,
+ Pipeline pipeline,
+ ResultHandlerFactory resultHandlerFactory) {
+ super();
+ this.feeder = feeder;
+ this.consumer = consumer;
+ this.pipeline = pipeline;
+ this.resultHandlerFactory = resultHandlerFactory;
+ }
+
+ public void run() {
+ while ( this.run ) {
+ Message msg = null;
+ try {
+ msg = this.consumer.receive();
+ if ( msg != null ) {
+ if ( this.resultHandlerFactory != null ) {
+ pipeline.insert( msg,
+ this.resultHandlerFactory.newResultHandler() );
+ } else {
+ pipeline.insert( msg,
+ null );
+ }
+ }
+ } catch ( JMSException e ) {
+ this.feeder.handleException( this.feeder,
+ msg,
+ e );
+ }
+ }
+ }
+
+ public void setRun(boolean run) {
+ this.run = run;
+ }
+
+ }
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsMessengerProviderImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsMessengerProviderImpl.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsMessengerProviderImpl.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,31 @@
+/**
+ *
+ */
+package org.drools.runtime.pipeline.impl;
+
+import java.util.Properties;
+
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.JmsMessengerProvider;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.ResultHandlerFactory;
+import org.drools.runtime.pipeline.Service;
+
+public class JmsMessengerProviderImpl
+ implements
+ JmsMessengerProvider {
+ public Service newJmsMessenger(Pipeline pipeline,
+ Properties properties,
+ String destinationName,
+ ResultHandlerFactory resultHandlerFactory) {
+ return new JmsMessenger( pipeline,
+ properties,
+ destinationName,
+ resultHandlerFactory );
+ }
+
+ public Action newJmsUnwrapMessageObject() {
+ return new JmsUnwrapMessageObject();
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsUnwrapMessageObject.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsUnwrapMessageObject.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsUnwrapMessageObject.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,28 @@
+package org.drools.runtime.pipeline.impl;
+
+import javax.jms.JMSException;
+import javax.jms.ObjectMessage;
+
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.Receiver;
+
+public class JmsUnwrapMessageObject extends BaseEmitter
+ implements
+ Action,
+ Receiver {
+
+ public void receive(Object object,
+ PipelineContext context) {
+ try {
+ Object result = ((ObjectMessage) object).getObject();
+ emit( result,
+ context );
+ } catch ( JMSException e ) {
+ handleException( this,
+ object,
+ e );
+ }
+ }
+
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsUnwrapText.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsUnwrapText.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JmsUnwrapText.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,28 @@
+package org.drools.runtime.pipeline.impl;
+
+import javax.jms.JMSException;
+import javax.jms.TextMessage;
+
+import org.drools.runtime.pipeline.Emitter;
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.Receiver;
+
+public class JmsUnwrapText extends BaseEmitter
+ implements
+ Receiver,
+ Emitter {
+
+ public void receive(Object object,
+ PipelineContext context) {
+ try {
+ String string = ((TextMessage) object).getText();
+ emit( string,
+ context );
+ } catch ( JMSException e ) {
+ handleException( this,
+ object,
+ e );
+ }
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JxlsTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JxlsTransformer.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/JxlsTransformer.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,99 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.InputStream;
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+import net.sf.jxls.reader.XLSReadMessage;
+import net.sf.jxls.reader.XLSReadStatus;
+import net.sf.jxls.reader.XLSReader;
+
+import org.drools.io.Resource;
+import org.drools.runtime.pipeline.JxlsTransformerProvider;
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.Transformer;
+import org.mvel2.MVEL;
+import org.mvel2.ParserContext;
+import org.mvel2.compiler.ExpressionCompiler;
+
+public class JxlsTransformer extends BaseEmitter
+ implements
+ Transformer {
+
+ private XLSReader xlsReader;
+ private Serializable expr;
+ private String text;
+
+ public JxlsTransformer(XLSReader xlsReader,
+ String text) {
+ super();
+ this.xlsReader = xlsReader;
+ this.text = text;
+ }
+
+ public void receive(Object object,
+ PipelineContext context) {
+ ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader( context.getClassLoader() );
+
+ if ( expr == null ) {
+ // create MVEL compilation
+ final ParserContext parserContext = new ParserContext();
+ parserContext.setStrictTypeEnforcement( false );
+
+ ExpressionCompiler compiler = new ExpressionCompiler( this.text );
+ this.expr = compiler.compile( parserContext );
+ }
+
+ XLSReadStatus readStatus = null;
+ Map<String, Object> beans = null;
+ try {
+ beans = (Map<String, Object>) MVEL.executeExpression( this.expr,
+ object );
+
+ // error check beans
+ if ( beans == null || !(beans instanceof Map) ) {
+ throw new RuntimeException( "Bean map expression must evaluate to a populated Map interface" );
+ }
+
+ if ( object instanceof InputStream ) {
+ readStatus = xlsReader.read( (InputStream) object,
+ beans );
+ } else if ( object instanceof Resource ) {
+ readStatus = xlsReader.read( ((Resource) object).getInputStream(),
+ beans );
+ } else {
+ throw new IllegalArgumentException( "signal object must be instance of InputStream or Resource" );
+ }
+
+ // error check xls reader
+ if ( readStatus == null || !readStatus.isStatusOK() ) {
+ StringBuilder builder = new StringBuilder();
+ builder.append( "Unable to parse resource with XLS:\n" );
+ for ( XLSReadMessage message : ((List<XLSReadMessage>) readStatus.getReadMessages()) ) {
+ builder.append( message.getMessage() + "\n" );
+ }
+ throw new RuntimeException( "Unable to parse resource with XLS:\n" + builder.toString() );
+ }
+
+ } catch ( Exception e ) {
+ handleException( this,
+ object,
+ e );
+ }
+
+ Thread.currentThread().setContextClassLoader( originalClassLoader );
+ emit( beans,
+ context );
+ }
+
+ //
+ public static class JxlsTransformerProviderImpl implements JxlsTransformerProvider {
+ public Transformer newJxlsTransformer(XLSReader xlsReader,
+ String text) {
+ return new JxlsTransformer( xlsReader, text );
+ }
+ }
+
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/ListMapping.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/ListMapping.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/ListMapping.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,86 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+public class ListMapping {
+
+ public static void main(String[] args) throws Exception {
+ Object asd = new Person("lucaz");
+ Field fieldName = asd.getClass().getDeclaredField("name");
+ fieldName.setAccessible(true);
+ String fieldValue = (String) fieldName.get(asd);
+ System.out.println("fieldValue = " + fieldValue);
+
+// Object object = fieldName.get(asd);
+// System.out.println(object);
+
+// Course course = new Course();
+//
+// course.addPerson(new Person("lucas"));
+// course.addPerson(new Person("jose"));
+//
+// Class<?>[] classes = {Person.class, Course.class};
+//
+// JAXBContext jaxb = JAXBContext.newInstance(classes);
+//
+// Marshaller xmlConverter = jaxb.createMarshaller();
+// xmlConverter.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+// xmlConverter.marshal(course, System.out);
+
+ }
+
+}
+
+ at XmlRootElement
+
+class Course {
+
+// @XmlElementWrapper(name="persons")
+ @XmlElement(name="person")
+ private List<Person> persons = new ArrayList<Person>();
+
+ public Course() {
+ }
+
+ public void addPerson(Person person) {
+ persons.add(person);
+ }
+
+ public List<Person> getPersons() {
+ return this.persons;
+ }
+
+}
+
+ at XmlRootElement(name="person")
+class Person {
+
+ @XmlAttribute
+ private String name;
+
+ public Person() {
+ }
+
+ public Person(String name) {
+ this.setName(name);
+ }
+
+ @Override
+ public String toString() {
+ return getName();
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/NamedXstreamLookupStrategy.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/NamedXstreamLookupStrategy.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/NamedXstreamLookupStrategy.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,23 @@
+/**
+ *
+ */
+package org.drools.runtime.pipeline.impl;
+
+import java.util.Map;
+
+import com.thoughtworks.xstream.XStream;
+
+public class NamedXstreamLookupStrategy
+ implements
+ XStreamResolverStrategy {
+ private Map<String, XStream> xstreams;
+
+ public NamedXstreamLookupStrategy(Map<String, XStream> xstreams) {
+ this.xstreams = xstreams;
+ }
+
+ public XStream lookup(String name) {
+ return this.xstreams.get( name );
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/ResultTranslator.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/ResultTranslator.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/ResultTranslator.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,96 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.transform.TransformerException;
+
+import org.drools.FactHandle;
+import org.drools.base.ClassObjectType;
+import org.drools.base.DroolsQuery;
+import org.drools.common.DisconnectedFactHandle;
+import org.drools.rule.Declaration;
+import org.drools.runtime.impl.ExecutionResultImpl;
+import org.drools.runtime.rule.QueryResultsRow;
+import org.drools.runtime.rule.impl.FlatQueryResults;
+import org.drools.runtime.rule.impl.NativeQueryResults;
+import org.drools.spi.ObjectType;
+import org.drools.xml.jaxb.util.JaxbListWrapper;
+
+public class ResultTranslator {
+
+ private Object convert(Object obj) {
+ if (obj instanceof FactHandle && !(obj instanceof DisconnectedFactHandle)) {
+ return new DisconnectedFactHandle(((FactHandle) obj).toExternalForm());
+ }
+
+ if (obj instanceof NativeQueryResults) {
+ NativeQueryResults nativeQueryResults = (NativeQueryResults) obj;
+ List<Declaration> declrs = new ArrayList<Declaration>();
+ HashMap<String, Integer> identifiers = new HashMap<String, Integer>( );
+
+ for ( String identifier : nativeQueryResults.getIdentifiers() ) {
+ // we don't want to marshall the query parameters
+ Declaration declr = nativeQueryResults.getDeclarations().get( identifier );
+ ObjectType objectType = declr.getPattern().getObjectType();
+ if ( objectType instanceof ClassObjectType &&
+ ((ClassObjectType) objectType).getClassType() == DroolsQuery.class ) {
+ continue;
+ }
+ declrs.add(declr);
+ identifiers.put(identifier, declrs.size() - 1);
+ }
+
+ ArrayList<ArrayList<Object>> results = new ArrayList<ArrayList<Object>>( nativeQueryResults.size() );
+ ArrayList<ArrayList<org.drools.runtime.rule.FactHandle>> factHandles = new ArrayList<ArrayList<org.drools.runtime.rule.FactHandle>> ( nativeQueryResults.size() );
+ for (QueryResultsRow row : nativeQueryResults) {
+ ArrayList<Object> objectList = new ArrayList<Object>();
+ ArrayList<org.drools.runtime.rule.FactHandle> factHandleList = new ArrayList<org.drools.runtime.rule.FactHandle>();
+ for (int i = 0; i < declrs.size(); i++) {
+ objectList.add(convert(row.get(declrs.get(i).getIdentifier())));
+ factHandleList.add(new DisconnectedFactHandle(row.getFactHandle(declrs.get(i).getIdentifier()).toExternalForm()));
+ }
+ factHandles.add(factHandleList);
+ results.add(objectList);
+ }
+
+ return new FlatQueryResults(identifiers, results, factHandles);
+ }
+
+ Class<? extends Object> vClass = obj.getClass();
+ if (List.class.isAssignableFrom(vClass) && !JaxbListWrapper.class.equals(vClass)) {
+ JaxbListWrapper<Object> wrapper = new JaxbListWrapper<Object>(((List<?>) obj).size());
+ for (Object item : ((List<?>) obj)) {
+ wrapper.add(convert(item));
+ }
+ return wrapper;
+ }
+ return obj;
+ }
+
+ public String transform( ExecutionResultImpl executionResult, Marshaller marshaller ) throws JAXBException, TransformerException{
+
+ //TODO {bauna} remove this try
+ try {
+ StringWriter writer = new StringWriter();
+ for (Map.Entry<String, Object> entry : executionResult.getFactHandles().entrySet()) {
+ entry.setValue(convert(entry.getValue()));
+ }
+
+ for (Map.Entry<String, Object> entry : executionResult.getResults().entrySet()) {
+ entry.setValue(convert(entry.getValue()));
+ }
+ marshaller.marshal(executionResult, writer);
+ return writer.toString();
+ } catch (Throwable e) {
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+ }
+
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/Root.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/Root.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/Root.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,21 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.List;
+
+public class Root {
+ private List children;
+
+ public Root() {
+
+ }
+
+ public List getChildren() {
+ return children;
+ }
+
+ public void setChildren(List children) {
+ this.children = children;
+ }
+
+
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksFromSourceTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksFromSourceTransformer.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksFromSourceTransformer.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,68 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.InputStream;
+import java.io.Reader;
+
+import javax.xml.transform.Source;
+import javax.xml.transform.stream.StreamSource;
+
+import org.drools.io.Resource;
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.pipeline.impl.BaseEmitter;
+import org.milyn.Smooks;
+import org.milyn.container.ExecutionContext;
+import org.milyn.payload.JavaResult;
+import org.milyn.payload.StringSource;
+
+public class SmooksFromSourceTransformer extends BaseEmitter
+ implements
+ Transformer {
+ private Smooks smooks;
+ private DroolsSmooksConfiguration configuration;
+
+ public SmooksFromSourceTransformer(Smooks smooks,
+ DroolsSmooksConfiguration configuration) {
+ this.smooks = smooks;
+ this.configuration = configuration;
+
+ }
+
+ public void receive(Object object,
+ PipelineContext context) {
+ this.smooks.setClassLoader( context.getClassLoader() );
+ Object result = null;
+ try {
+ JavaResult javaResult = new JavaResult();
+ ExecutionContext executionContext = this.smooks.createExecutionContext();
+
+ Source source = null;
+ if ( object instanceof Source ) {
+ source = ( Source ) object;
+ } else if ( object instanceof InputStream ) {
+ source = new StreamSource( ( InputStream ) object );
+ } else if ( object instanceof Reader ) {
+ source = new StreamSource( ( Reader ) object );
+ } else if ( object instanceof Resource ) {
+ source = new StreamSource( ( ( Resource ) object).getReader() );
+ } else if ( object instanceof String ) {
+ source = new StringSource( (String) object);
+ } else {
+ throw new IllegalArgumentException( "signal object must be instance of Source, InputStream, Reader, Resource or String" );
+ }
+
+ this.smooks.filter( source,
+ javaResult,
+ executionContext );
+
+ result = javaResult.getBean( this.configuration.getRootId() );
+ } catch ( Exception e ) {
+ handleException( this,
+ object,
+ e );
+ }
+ emit( result,
+ context );
+ }
+
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksToSourceTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksToSourceTransformer.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksToSourceTransformer.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,62 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.InputStream;
+import java.io.Reader;
+
+import javax.xml.transform.Source;
+import javax.xml.transform.stream.StreamSource;
+
+import org.drools.io.Resource;
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.SmooksTransformerProvider;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.pipeline.impl.BaseEmitter;
+import org.milyn.Smooks;
+import org.milyn.container.ExecutionContext;
+import org.milyn.payload.JavaResult;
+import org.milyn.payload.JavaSource;
+import org.milyn.payload.StringResult;
+
+public class SmooksToSourceTransformer extends BaseEmitter
+ implements
+ Transformer {
+ private Smooks smooks;
+
+ public SmooksToSourceTransformer(Smooks smooks) {
+ this.smooks = smooks;
+ }
+
+ public void receive(Object object,
+ PipelineContext context) {
+ this.smooks.setClassLoader( context.getClassLoader() );
+ Object result = null;
+ try {
+ StringResult stringResult = new StringResult();
+ ExecutionContext executionContext = this.smooks.createExecutionContext();
+
+ this.smooks.filter( new JavaSource( object ),
+ stringResult,
+ executionContext );
+
+ result = stringResult.getResult();
+ } catch ( Exception e ) {
+ handleException( this,
+ object,
+ e );
+ }
+ emit( result,
+ context );
+ }
+
+// public static class SmooksTransformerProviderImpl
+// implements
+// SmooksTransformerProvider {
+// public Transformer newSmooksTransformer(Smooks smooks,
+// String rootId) {
+// DroolsSmooksConfiguration conf = new DroolsSmooksConfiguration( rootId );
+// return new SmooksToSourceTransformer( smooks,
+// conf );
+// }
+// }
+
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksTransformerProviderImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksTransformerProviderImpl.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/SmooksTransformerProviderImpl.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,21 @@
+/**
+ *
+ */
+package org.drools.runtime.pipeline.impl;
+
+import org.drools.runtime.pipeline.SmooksTransformerProvider;
+import org.drools.runtime.pipeline.Transformer;
+import org.milyn.Smooks;
+
+public class SmooksTransformerProviderImpl implements SmooksTransformerProvider {
+ public Transformer newSmooksFromSourceTransformer(Smooks smooks,
+ String rootId) {
+ DroolsSmooksConfiguration conf = new DroolsSmooksConfiguration( rootId );
+ return new SmooksFromSourceTransformer( smooks,
+ conf );
+ }
+
+ public Transformer newSmooksToSourceTransformer(Smooks smooks) {
+ return new SmooksToSourceTransformer( smooks );
+ }
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlGridTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlGridTransformer.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlGridTransformer.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,118 @@
+/**
+ *
+ */
+package org.drools.runtime.pipeline.impl;
+
+import java.io.InputStream;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.drools.builder.DirectoryLookupFactoryService;
+import org.drools.core.util.StringUtils;
+import org.drools.grid.ExecutionNode;
+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.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.Transformer;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomReader;
+
+public class XStreamFromXmlGridTransformer extends BaseEmitter
+ implements
+ Transformer {
+
+ private XStreamResolverStrategy strategy;
+ private Object payload;
+ private PipelineContext context;
+
+ private static Pattern p = Pattern.compile("[\"']?lookup[\"']?\\s*[:=]\\s*[\"']([^\"']+)[\"']");
+
+ public XStreamFromXmlGridTransformer(XStreamResolverStrategy strategy) {
+ this.strategy = strategy;
+ }
+
+ public void receive(Object object,
+ PipelineContext context) {
+ this.payload = processPayload(object, context);
+ emit( this.payload,
+ context );
+ }
+
+ public Object processPayload(Object object, PipelineContext context) {
+
+ try {
+ String str ;
+ if ( object instanceof String ) {
+ str = (String) object;
+ } else if ( object instanceof Reader ) {
+ str = StringUtils.toString( ((Reader)object) );
+ } else if ( object instanceof InputStream ) {
+ str = StringUtils.toString( ((InputStream)object) );
+ } else if ( object instanceof Resource ) {
+ str = StringUtils.toString( ((Resource) object).getReader());
+ } else {
+ throw new IllegalArgumentException( "signal object must be instance of String, Reader, InputStream or Resource, was: " + object );
+ }
+
+ Matcher m = p.matcher( str );
+ String name = null;
+ if ( m.find() ) {
+ name = m.group( 1 );
+ }
+
+ XStream xstream = this.strategy.lookup(name);
+ if (xstream == null) {
+ throw new IllegalArgumentException("Unable to lookup XStream parser using name '" + name + "'");
+ }
+ ExecutionNodePipelineContextImpl executionNodeContext = (ExecutionNodePipelineContextImpl) context;
+ ExecutionNode node = executionNodeContext.getExecutionNode();
+ CommandExecutor executor = node.get(DirectoryLookupFactoryService.class).lookup(name);
+ if (executor == null) {
+ throw new IllegalArgumentException("Unable to lookup CommandExecutor using name '" + name + "'");
+ }
+ executionNodeContext.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);
+ executionNodeContext.setClassLoader(cl);
+ payload = xstream.fromXML( ((String) object) );
+ context.getProperties().put("xstream-instance", xstream);
+ this.context = context;
+ } catch (Exception e) {
+ handleException(this, object, e);
+ }
+ return payload;
+ }
+
+ public Object getPayload() {
+ return payload;
+ }
+
+ public void setPayload(Object payload) {
+ this.payload = payload;
+ }
+
+ public PipelineContext getContext() {
+ return context;
+ }
+
+ public void setContext(PipelineContext context) {
+ this.context = context;
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlTransformer.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlTransformer.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,50 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.InputStream;
+import java.io.Reader;
+
+import org.drools.io.Resource;
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.Transformer;
+
+import com.thoughtworks.xstream.XStream;
+
+public class XStreamFromXmlTransformer extends BaseEmitter
+ implements
+ Transformer {
+ private XStream xstream;
+
+ public XStreamFromXmlTransformer(XStream xstream) {
+ this.xstream = xstream;
+
+ }
+
+ public void receive(Object object,
+ PipelineContext context) {
+ this.xstream.setClassLoader( context.getClassLoader() );
+ Object result = null;
+ try {
+ if ( object instanceof String ) {
+ result = this.xstream.fromXML( ( String ) object );
+ } else if ( object instanceof Reader ) {
+ result = this.xstream.fromXML( ( Reader ) object );
+ } else if ( object instanceof InputStream ) {
+ result = this.xstream.fromXML( ( InputStream ) object );
+ } else if ( object instanceof Resource ) {
+ result = this.xstream.fromXML( (( Resource ) object).getReader() );
+ } else {
+ throw new IllegalArgumentException( "signal object must be instance of InputStream or Resource" );
+ }
+ } catch ( Exception e ) {
+ handleException( this,
+ object,
+ e );
+ }
+ emit( result,
+ context );
+ }
+
+ public void sniff(Reader reader) {
+
+ }
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamResolverStrategy.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamResolverStrategy.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamResolverStrategy.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,10 @@
+/**
+ *
+ */
+package org.drools.runtime.pipeline.impl;
+
+import com.thoughtworks.xstream.XStream;
+
+public interface XStreamResolverStrategy {
+ XStream lookup(String name);
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamToXmlGridTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamToXmlGridTransformer.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamToXmlGridTransformer.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,43 @@
+/**
+ *
+ */
+package org.drools.runtime.pipeline.impl;
+
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.Transformer;
+
+import com.thoughtworks.xstream.XStream;
+
+public class XStreamToXmlGridTransformer extends BaseEmitter
+ implements
+ Transformer {
+ Object result = null;
+ public void receive(Object object,
+ PipelineContext context) {
+ this.result = transform(context, object);
+
+ emit( result,
+ context );
+ }
+
+ public Object transform(PipelineContext context, Object object) {
+ XStream xstream = (XStream) context.getProperties().get( "xstream-instance" );
+ xstream.setClassLoader(context.getClassLoader());
+ Object result = null;
+ try {
+ result = xstream.toXML(object);
+ } catch (Exception e) {
+ handleException(this, object, e);
+ }
+ return result;
+ }
+
+ public Object getResult() {
+ return result;
+ }
+
+ public void setResult(Object result) {
+ this.result = result;
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamToXmlTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamToXmlTransformer.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamToXmlTransformer.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,35 @@
+package org.drools.runtime.pipeline.impl;
+
+import org.drools.runtime.pipeline.PipelineContext;
+import org.drools.runtime.pipeline.Transformer;
+
+import com.thoughtworks.xstream.XStream;
+
+
+
+public class XStreamToXmlTransformer extends BaseEmitter
+ implements
+ Transformer {
+ private XStream xstream;
+
+ public XStreamToXmlTransformer(XStream xstream) {
+ this.xstream = xstream;
+
+ }
+
+ public void receive(Object object,
+ PipelineContext context) {
+ this.xstream.setClassLoader( context.getClassLoader() );
+ Object result = null;
+ try {
+ result = this.xstream.toXML( object );
+ } catch ( Exception e ) {
+ handleException( this,
+ object,
+ e );
+ }
+ emit( result,
+ context );
+ }
+
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamTransformerProviderImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamTransformerProviderImpl.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/java/org/drools/runtime/pipeline/impl/XStreamTransformerProviderImpl.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,19 @@
+/**
+ *
+ */
+package org.drools.runtime.pipeline.impl;
+
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.pipeline.XStreamTransformerProvider;
+
+import com.thoughtworks.xstream.XStream;
+
+public class XStreamTransformerProviderImpl implements XStreamTransformerProvider {
+ public Transformer newXStreamFromXmlTransformer(XStream xstream) {
+ return new XStreamFromXmlTransformer( xstream );
+ }
+
+ public Transformer newXStreamToXmlTransformer(XStream xstream) {
+ return new XStreamToXmlTransformer( xstream );
+ }
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/main/resources/batch-execution.xsd
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/main/resources/batch-execution.xsd (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/main/resources/batch-execution.xsd 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://drools.org/drools-5.0/batch-execution" xmlns:batch-execution="http://drools.org/drools-5.0/batch-execution">
+
+ <xs:annotation id="fact-instance-structure">
+ <xs:documentation>
+
+ Data for fact instances are demonstrated below. The "shape" of these are driven by the module defined in the knowledge base.
+ These are simple structures representing the state of the object (type co-ercision is done by the server).
+
+ </xs:documentation>
+ <xs:appinfo>
+ <ExamplePackage.ExampleFact>
+ <ExampleField1>sample value 1</ExampleField1>
+ <ExampleField2>sample value 2</ExampleField2>
+ </ExamplePackage.ExampleFact>
+ <ExamplePackage.ExampleFact2>
+ <ExampleField1>sample value 1</ExampleField1>
+ <ExampleField2>sample value 2</ExampleField2>
+ </ExamplePackage.ExampleFact2>
+ </xs:appinfo>
+ <xs:documentation>It is possible for fields to contain nested objects as their value. Also, a field can have a "reference"
+ attribute which has an xpath expression to the referred value if necessary.</xs:documentation>
+ </xs:annotation>
+
+
+ <xs:element name="batch-execution">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="batch-execution:set-global"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="batch-execution:startProcess"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="batch-execution:insert-elements"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="batch-execution:get-objects"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="batch-execution:fire-all-rules"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="batch-execution:insert"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="batch-execution:get-global"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="batch-execution:query"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="set-global">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:annotation><xs:appinfo>fact-instance-structure</xs:appinfo></xs:annotation>
+ <xs:any/>
+ </xs:sequence>
+ <xs:attribute name="identifier" use="required" type="xs:string"/>
+ <xs:attribute name="out" type="xs:boolean"/>
+ <xs:attribute name="out-identifier" type="xs:string"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="startProcess">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="batch-execution:parameter"/>
+ </xs:sequence>
+ <xs:attribute name="processId" use="required" type="xs:string"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="parameter">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:annotation><xs:appinfo>fact-instance-structure</xs:appinfo></xs:annotation>
+ <xs:any/>
+ </xs:sequence>
+ <xs:attribute name="identifier" use="required" type="xs:string"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="insert-elements">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:annotation><xs:appinfo>fact-instance-structure</xs:appinfo></xs:annotation>
+ <xs:any />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="get-objects">
+ <xs:complexType>
+ <xs:attribute name="out-identifier" use="required" type="xs:string"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="fire-all-rules">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="insert">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:annotation><xs:appinfo>fact-instance-structure</xs:appinfo></xs:annotation>
+ <xs:any/>
+ </xs:sequence>
+ <xs:attribute name="out-identifier" type="xs:string"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="get-global">
+ <xs:complexType>
+ <xs:attribute name="identifier" use="required" type="xs:string"/>
+ <xs:attribute name="out-identifier" use="required" type="xs:string"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="query">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:annotation><xs:appinfo>Fact instance structure</xs:appinfo></xs:annotation>
+ <xs:any minOccurs="0"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required" type="xs:string"/>
+ <xs:attribute name="out-identifier" use="required" type="xs:string"/>
+ </xs:complexType>
+ </xs:element>
+
+</xs:schema>
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/ChangeCollector.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/ChangeCollector.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/ChangeCollector.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,51 @@
+package org.drools;
+
+import org.drools.event.rule.WorkingMemoryEventListener;
+import org.drools.event.rule.ObjectInsertedEvent;
+import org.drools.event.rule.ObjectUpdatedEvent;
+import org.drools.event.rule.ObjectRetractedEvent;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Michael Neale
+ */
+public class ChangeCollector implements WorkingMemoryEventListener {
+
+ private List<String> retracted;
+ private List changes;
+
+
+
+
+ public List<String> getRetracted() {
+ return retracted;
+ }
+
+
+ public List getChanges() {
+ return changes;
+ }
+
+
+ public void objectInserted(ObjectInsertedEvent event) {
+
+ }
+
+ public void objectUpdated(ObjectUpdatedEvent event) {
+ if (changes == null) changes = new ArrayList();
+ if (event.getObject() instanceof Cheese) {
+ Cheese c = (Cheese) event.getObject();
+ changes.add(c);
+ }
+ }
+
+ public void objectRetracted(ObjectRetractedEvent event) {
+ if (retracted == null) retracted = new ArrayList<String>();
+ if (event.getOldObject() instanceof Cheese) {
+ Cheese c = (Cheese) event.getOldObject();
+ retracted.add(c.getType());
+ }
+ }
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/Cheese.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/Cheese.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/Cheese.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,122 @@
+package org.drools;
+
+
+import java.io.Serializable;
+import java.util.Date;
+
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * 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.
+ */
+
+public class Cheese
+ implements
+ Serializable {
+
+ public static final String STILTON = "stilton";
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 400L;
+ private String type;
+ private int price;
+ private int oldPrice;
+ private Date usedBy;
+
+ public Cheese() {
+
+ }
+
+ public Cheese(final String type) {
+ super();
+ this.type = type;
+ this.price = 0;
+ }
+
+ public Cheese(final String type,
+ final int price) {
+ super();
+ this.type = type;
+ this.price = price;
+ }
+
+ public Cheese(final String type,
+ final int price,
+ final int oldPrice ) {
+ super();
+ this.type = type;
+ this.price = price;
+ this.oldPrice = oldPrice;
+ }
+
+ public int getPrice() {
+ return this.price;
+ }
+
+ public String getType() {
+ return this.type;
+ }
+
+ public void setType(final String type) {
+ this.type = type;
+ }
+
+ public void setPrice(final int price) {
+ this.price = price;
+ }
+
+ public String toString() {
+ return "Cheese( type='" + this.type + "', price=" + this.price + " )";
+ }
+
+ public int hashCode() {
+ final int PRIME = 31;
+ int result = 1;
+ result = PRIME * result + price;
+ result = PRIME * result + ((type == null) ? 0 : type.hashCode());
+ return result;
+ }
+
+ public boolean equals(Object obj) {
+ if ( this == obj ) return true;
+ if ( obj == null ) return false;
+ if ( getClass() != obj.getClass() ) return false;
+ final Cheese other = (Cheese) obj;
+ if ( price != other.price ) return false;
+ if ( type == null ) {
+ if ( other.type != null ) return false;
+ } else if ( !type.equals( other.type ) ) return false;
+ return true;
+ }
+
+ public int getOldPrice() {
+ return oldPrice;
+ }
+
+ public void setOldPrice(int oldPrice) {
+ this.oldPrice = oldPrice;
+ }
+
+ public Date getUsedBy() {
+ return usedBy;
+ }
+
+ public void setUsedBy(Date usedBy) {
+ this.usedBy = usedBy;
+ }
+
+
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/Person.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/Person.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/Person.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,269 @@
+package org.drools;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Person
+ implements
+ Serializable {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 400L;
+ private String name;
+ private String likes;
+ private int age;
+ private BigDecimal bigDecimal;
+ private BigInteger bigInteger;
+ private String hair;
+
+ private char sex;
+
+ private boolean alive;
+
+ private String status;
+
+ private Cheese cheese;
+
+ private List addresses = new ArrayList();
+
+// public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+// name = (String)in.readObject();
+// likes = (String)in.readObject();
+// age = in.readInt();
+// bigDecimal = (BigDecimal)in.readObject();
+// bigInteger = (BigInteger)in.readObject();
+// hair = (String)in.readObject();
+// sex = in.readChar();
+// alive = in.readBoolean();
+// status = (String)in.readObject();
+// cheese = (Cheese)in.readObject();
+// addresses = (List)in.readObject();
+// }
+//
+// public void writeExternal(ObjectOutput out) throws IOException {
+// out.writeObject(name);
+// out.writeObject(likes);
+// out.writeObject(bigDecimal);
+// out.writeObject(bigInteger);
+// out.writeObject(hair);
+// out.writeChar(sex);
+// out.writeBoolean(alive);
+// out.writeObject(status);
+// out.writeObject(cheese);
+// out.writeObject(addresses);
+// }
+
+ public List getAddresses() {
+ return addresses;
+ }
+
+ public void setAddresses(List addresses) {
+ this.addresses = addresses;
+ }
+
+ public Person() {
+
+ }
+
+ public Person(String name,
+ int age) {
+ super();
+ this.name = name;
+ this.age = age;
+ }
+
+ public Person(final String name) {
+ this( name,
+ "",
+ 0 );
+ }
+
+ public Person(final String name,
+ final String likes) {
+ this( name,
+ likes,
+ 0 );
+ }
+
+ public Person(final String name,
+ final String likes,
+ final int age) {
+ this.name = name;
+ this.likes = likes;
+ this.age = age;
+ }
+
+ /* (non-Javadoc)
+ * @see org.drools.PersonInterface#getStatus()
+ */
+ public String getStatus() {
+ return this.status;
+ }
+
+ /* (non-Javadoc)
+ * @see org.drools.PersonInterface#setStatus(java.lang.String)
+ */
+ public void setStatus(final String status) {
+ this.status = status;
+ }
+
+ /* (non-Javadoc)
+ * @see org.drools.PersonInterface#getLikes()
+ */
+ public String getLikes() {
+ return this.likes;
+ }
+
+ /* (non-Javadoc)
+ * @see org.drools.PersonInterface#getName()
+ */
+ public String getName() {
+ return this.name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ /* (non-Javadoc)
+ * @see org.drools.PersonInterface#getAge()
+ */
+ public int getAge() {
+ return this.age;
+ }
+
+ public void setAge(final int age) {
+ this.age = age;
+ }
+
+ /* (non-Javadoc)
+ * @see org.drools.PersonInterface#isAlive()
+ */
+ public boolean isAlive() {
+ return this.alive;
+ }
+
+ /* (non-Javadoc)
+ * @see org.drools.PersonInterface#setAlive(boolean)
+ */
+ public void setAlive(final boolean alive) {
+ this.alive = alive;
+ }
+
+ /* (non-Javadoc)
+ * @see org.drools.PersonInterface#getSex()
+ */
+ public char getSex() {
+ return this.sex;
+ }
+
+ /* (non-Javadoc)
+ * @see org.drools.PersonInterface#setSex(char)
+ */
+ public void setSex(final char sex) {
+ this.sex = sex;
+ }
+
+ public String getHair() {
+ return this.hair;
+ }
+
+ public void setHair(final String hair) {
+ this.hair = hair;
+ }
+
+ public String toString() {
+ return "[Person name='" + this.name + "']";
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public int hashCode() {
+ final int PRIME = 31;
+ int result = 1;
+ result = PRIME * result + this.age;
+ result = PRIME * result + (this.alive ? 1231 : 1237);
+ result = PRIME * result + ((this.name == null) ? 0 : this.name.hashCode());
+ result = PRIME * result + this.sex;
+ return result;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public boolean equals(final Object obj) {
+ if ( this == obj ) {
+ return true;
+ }
+ if ( obj == null ) {
+ return false;
+ }
+ if ( getClass() != obj.getClass() ) {
+ return false;
+ }
+ final Person other = (Person) obj;
+ if ( this.age != other.age ) {
+ return false;
+ }
+ if ( this.alive != other.alive ) {
+ return false;
+ }
+ if ( this.name == null ) {
+ if ( other.name != null ) {
+ return false;
+ }
+ } else if ( !this.name.equals( other.name ) ) {
+ return false;
+ }
+ if ( this.sex != other.sex ) {
+ return false;
+ }
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.drools.PersonInterface#getBigDecimal()
+ */
+ public BigDecimal getBigDecimal() {
+ return this.bigDecimal;
+ }
+
+ /* (non-Javadoc)
+ * @see org.drools.PersonInterface#setBigDecimal(java.math.BigDecimal)
+ */
+ public void setBigDecimal(final BigDecimal bigDecimal) {
+ this.bigDecimal = bigDecimal;
+ }
+
+ /* (non-Javadoc)
+ * @see org.drools.PersonInterface#getBigInteger()
+ */
+ public BigInteger getBigInteger() {
+ return this.bigInteger;
+ }
+
+ /* (non-Javadoc)
+ * @see org.drools.PersonInterface#setBigInteger(java.math.BigInteger)
+ */
+ public void setBigInteger(final BigInteger bigInteger) {
+ this.bigInteger = bigInteger;
+ }
+
+ public void setLikes(final String likes) {
+ this.likes = likes;
+ }
+
+ public Cheese getCheese() {
+ return this.cheese;
+ }
+
+ public void setCheese(final Cheese cheese) {
+ this.cheese = cheese;
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/TestVariable.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/TestVariable.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/TestVariable.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,22 @@
+/**
+ *
+ */
+package org.drools;
+
+public class TestVariable {
+
+ private String name;
+
+ public TestVariable(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Company.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Company.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Company.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,59 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Sample Department bean to demostrate main excel export features
+ * author: Leonid Vysochyn
+ */
+public class Company {
+ private String name;
+ private Employee chief = new Employee();
+ private List employee = new ArrayList();
+
+ public Company() {
+ }
+
+ public Company(String name) {
+ this.name = name;
+ }
+
+ public Company(String name, Employee chief, List staff) {
+ this.name = name;
+ this.chief = chief;
+ this.employee = staff;
+ }
+
+ public void addEmployee(Employee employee) {
+ this.employee.add(employee);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Employee getChief() {
+ return chief;
+ }
+
+ public void setChief(Employee chief) {
+ this.chief = chief;
+ }
+
+ public List getEmployee() {
+ return employee;
+ }
+
+ public void setEmployee(List staff) {
+ this.employee = employee;
+ }
+
+ public String toString() {
+ return "[Company name : " + this.name + " chief : " + this.chief + " staff : " + this.employee + "]";
+ }
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Department.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Department.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Department.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,59 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Sample Department bean to demostrate main excel export features
+ * author: Leonid Vysochyn
+ */
+public class Department {
+ private String name;
+ private Employee chief = new Employee();
+ private List staff = new ArrayList();
+
+ public Department() {
+ }
+
+ public Department(String name) {
+ this.name = name;
+ }
+
+ public Department(String name, Employee chief, List staff) {
+ this.name = name;
+ this.chief = chief;
+ this.staff = staff;
+ }
+
+ public void addEmployee(Employee employee) {
+ this.staff.add(employee);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Employee getChief() {
+ return chief;
+ }
+
+ public void setChief(Employee chief) {
+ this.chief = chief;
+ }
+
+ public List getStaff() {
+ return staff;
+ }
+
+ public void setStaff(List staff) {
+ this.staff = staff;
+ }
+
+ public String toString() {
+ return "[Department name : " + this.name + " chief : " + this.chief + " staff : " + this.staff + "]";
+ }
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Employee.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Employee.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/Employee.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,120 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Sample Employee bean to demostrate simple export features
+ * @author Leonid Vysochyn
+ */
+public class Employee {
+ private String name;
+ private Integer age;
+ private Double payment;
+ private Double bonus;
+ private Date birthDate;
+ private Employee superior;
+ private List notes;
+ private String id;
+
+
+ public Employee() {
+ }
+
+ public List getNotes() {
+ return notes;
+ }
+
+ public void setNotes(List notes) {
+ this.notes = notes;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public Employee(String name, Integer age, Double payment, Double bonus) {
+ this.name = name;
+ this.age = age;
+ this.payment = payment;
+ this.bonus = bonus;
+ }
+
+ public Employee(String name, int age, double payment, double bonus, Date birthDate) {
+ this.name = name;
+ this.age = new Integer(age);
+ this.payment = new Double(payment);
+ this.bonus = new Double(bonus);
+ this.birthDate = birthDate;
+ }
+
+ public Employee(String name, Double payment, Double bonus) {
+ this.name = name;
+ this.payment = payment;
+ this.bonus = bonus;
+ }
+
+ public Employee(String name, int age, double payment, double bonus) {
+ this.name = name;
+ this.age = new Integer(age);
+ this.payment = new Double(payment);
+ this.bonus = new Double(bonus);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Integer getAge() {
+ return age;
+ }
+
+ public void setAge(Integer age) {
+ this.age = age;
+ }
+
+ public Double getPayment() {
+ return payment;
+ }
+
+ public void setPayment(Double payment) {
+ this.payment = payment;
+ }
+
+ public Double getBonus() {
+ return bonus;
+ }
+
+ public void setBonus(Double bonus) {
+ this.bonus = bonus;
+ }
+
+ public Date getBirthDate() {
+ return birthDate;
+ }
+
+ public void setBirthDate(Date birthDate) {
+ this.birthDate = birthDate;
+ }
+
+ public Employee getSuperior() {
+ return superior;
+ }
+
+ public void setSuperior(Employee superior) {
+ this.superior = superior;
+ }
+
+ public String toString() {
+ return "[Employee name : " + this.name + "]";
+ }
+
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JSonBatchExecutionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JSonBatchExecutionTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JSonBatchExecutionTest.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,1992 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.custommonkey.xmlunit.Diff;
+import org.custommonkey.xmlunit.XMLAssert;
+import org.custommonkey.xmlunit.XMLUnit;
+import org.custommonkey.xmlunit.examples.RecursiveElementNameAndTextQualifier;
+import org.drools.ChangeCollector;
+import org.drools.Cheese;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.KnowledgeBaseFactoryService;
+import org.drools.Person;
+import org.drools.TestVariable;
+import org.drools.builder.DirectoryLookupFactoryService;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.KnowledgeBuilderFactoryService;
+import org.drools.builder.ResourceType;
+import org.drools.command.runtime.rule.ModifyCommand;
+import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalRuleBase;
+import org.drools.definition.KnowledgePackage;
+import org.drools.grid.ExecutionNode;
+import org.drools.grid.local.LocalConnection;
+import org.drools.impl.StatefulKnowledgeSessionImpl;
+import org.drools.io.Resource;
+import org.drools.io.ResourceFactory;
+import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.instance.context.variable.VariableScopeInstance;
+import org.drools.runtime.ExecutionResults;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.StatelessKnowledgeSession;
+import org.drools.runtime.help.BatchExecutionHelper;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.process.ProcessInstance;
+import org.drools.runtime.process.WorkItem;
+import org.drools.runtime.process.WorkItemHandler;
+import org.drools.runtime.process.WorkItemManager;
+import org.drools.runtime.process.WorkflowProcessInstance;
+import org.drools.runtime.rule.FactHandle;
+import org.xml.sax.SAXException;
+
+import com.thoughtworks.xstream.XStream;
+
+public class JSonBatchExecutionTest extends TestCase {
+
+ protected void setUp() throws Exception {
+ XMLUnit.setIgnoreComments( true );
+ XMLUnit.setIgnoreWhitespace( true );
+ XMLUnit.setIgnoreAttributeOrder( true );
+ XMLUnit.setNormalizeWhitespace( true );
+ XMLUnit.setNormalize( true );
+ }
+
+ private void assertXMLEqual(String expectedXml,
+ String resultXml) {
+ try {
+ Diff diff = new Diff( expectedXml,
+ resultXml );
+ diff.overrideElementQualifier( new RecursiveElementNameAndTextQualifier() );
+ XMLAssert.assertXMLEqual( diff,
+ true );
+ } catch ( Exception e ) {
+ throw new RuntimeException( "XML Assertion failure",
+ e );
+ }
+ }
+
+ public void testListenForChanges() throws Exception {
+
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "import org.drools.ChangeCollector \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese(price==25) \n";
+ str += " \n";
+ str += " then \n";
+ str += "end\n";
+
+ str += "rule rule2 \n";
+ str += " when \n";
+ str += " p : Person(name=='mic') \n";
+ str += " c : Cheese(price != 42) \n";
+ str += " \n";
+ str += " then \n";
+ str += " c.setPrice( 42 ); \n";
+ str += " update(c); \n";
+ str += "end\n";
+
+ str += "rule rule3 \n";
+ str += " when \n";
+ str += " p : Person(name=='mark') \n";
+ str += " c : Cheese(price == 42) \n";
+ str += " \n";
+ str += " then \n";
+ str += " retract(c); \n";
+ str += "end\n";
+
+ str += "rule ruleBootStrap \n";
+ str += "salience 10000\n";
+ str += " when \n";
+ str += " $c : ChangeCollector() \n";
+ str += " \n";
+ str += " then \n";
+ str += " kcontext.getKnowledgeRuntime().addEventListener($c); \n";
+ str += "end\n";
+
+ str += "rule ruleCleanup \n";
+ str += "salience -10000\n";
+ str += " when \n";
+ str += " $c : ChangeCollector() \n";
+ str += " \n";
+ str += " then \n";
+ str += " kcontext.getKnowledgeRuntime().removeEventListener($c); \n";
+ str += " retract($c); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += "{\"insert\":{\"object\":{\"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, \"out-identifier\":\"outStilton\" } }";
+ inXml += ", {\"fire-all-rules\":\"\"}";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+
+ StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+
+ inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += " {\"insert\":{\"object\":{\"org.drools.Person\":{\"name\":\"mic\"} }, \"out-identifier\":\"person\" } }";
+ inXml += ", {\"insert\":{\"object\":{\"org.drools.ChangeCollector\":{} }, \"out-identifier\":\"changes\" } }";
+ inXml += ", {\"fire-all-rules\":\"\"}";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+
+
+ resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+ outXml = roundTripFromXml( outXml );
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+ result = ( ExecutionResults ) roundTripFromObject( result );
+ ChangeCollector collector = ( ChangeCollector ) result.getValue( "changes" );
+ Cheese c = ( Cheese ) collector.getChanges().get( 0 );
+ assertEquals( 42, c.getPrice() );
+
+ inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += " {\"insert\":{\"object\":{\"org.drools.Person\":{\"name\":\"mark\"} }, \"out-identifier\":\"person\" } }";
+ inXml += ", {\"insert\":{\"object\":{\"org.drools.ChangeCollector\":{} }, \"out-identifier\":\"changes\" } }";
+ inXml += ", {\"fire-all-rules\":\"\"}";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+
+ resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+
+ outXml = (String) resultHandler.getObject();
+ outXml = roundTripFromXml( outXml );
+
+ result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+ result = ( ExecutionResults ) roundTripFromObject( result );
+ collector = ( ChangeCollector ) result.getValue( "changes" );
+ assertEquals( "stilton", collector.getRetracted().get( 0 ) );
+
+ }
+
+ public void testInsertWithDefaults() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += "{\"insert\":{\"object\":{\"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, \"out-identifier\":\"outStilton\" } }";
+ inXml += ", {\"fire-all-rules\":\"\"}";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+
+
+ StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+ outXml = roundTripFromXml( outXml );
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+ result = ( ExecutionResults ) roundTripFromObject( result );
+
+ Cheese stilton = (Cheese) result.getValue( "outStilton" );
+ assertEquals( 30,
+ stilton.getPrice() );
+
+ FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
+ stilton = (Cheese) ksession.getObject( factHandle );
+ assertEquals( 30,
+ stilton.getPrice() );
+
+// String expectedXml = "";
+// expectedXml = "{\"execution-results\":{\"results\":{\"outStilton\":{\"org.drools.Cheese\":{\"type\":\"stilton\",\"oldPrice\":0,\"price\":30}}},\"fact-handles\":{\"outStilton\":\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\"}}}";
+// String expectedXml = "";
+// expectedXml += "<execution-results>\n";
+// expectedXml += " <result identifier=\"outStilton\">\n";
+// expectedXml += " <org.drools.Cheese>\n";
+// expectedXml += " <type>stilton</type>\n";
+// expectedXml += " <oldPrice>0</oldPrice>\n";
+// expectedXml += " <price>30</price>\n";
+// expectedXml += " </org.drools.Cheese>\n";
+// expectedXml += " </result>\n";
+// expectedXml += " <fact-handle identifier=\"outStilton\" externalForm=\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\" /> \n";
+// expectedXml += "</execution-results>\n";
+//
+// assertXMLEqual( expectedXml,
+// outXml );
+// JSONAssert.assertEquals( expectedXml, outXml );
+ }
+
+ public void testInsertWithReturnObjectFalse() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += "{\"insert\":{\"object\":{\"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, \"return-object\":false, \"out-identifier\":\"outStilton\" } }";
+ inXml += ", {\"fire-all-rules\":\"\"}";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+
+ StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+ outXml = roundTripFromXml( outXml );
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+ result = ( ExecutionResults ) roundTripFromObject ( result );
+ assertNull( result.getValue( "outStilton" ) );
+
+ FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
+ Cheese stilton = (Cheese) ksession.getObject( factHandle );
+ assertEquals( 30,
+ stilton.getPrice() );
+
+// String expectedXml = "";
+// expectedXml += "<execution-results>\n";
+// expectedXml += " <fact-handle identifier=\"outStilton\" externalForm=\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\" /> \n";
+// expectedXml += "</execution-results>\n";
+//
+// assertXMLEqual( expectedXml,
+// outXml );
+ }
+
+ public void testGetObject() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += "{\"insert\":{\"object\":{\"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, \"out-identifier\":\"outStilton\" } }";
+ inXml += ", {\"fire-all-rules\":{\"max\":10}}";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+
+
+ StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+ outXml = roundTripFromXml( outXml );
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+ result = ( ExecutionResults) roundTripFromObject( result );
+
+ Cheese stilton = (Cheese) result.getValue( "outStilton" );
+ assertEquals( 30,
+ stilton.getPrice() );
+
+ FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
+ inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += " {\"get-object\":{ ";
+ inXml += " \"out-identifier\":'outStilton',";
+ inXml += " \"fact-handle\":'" + factHandle.toExternalForm() + "'}}";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ outXml = (String) resultHandler.getObject();
+ outXml = roundTripFromXml( outXml );
+
+ result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+ result = ( ExecutionResults) roundTripFromObject( result );
+ stilton = (Cheese) result.getValue( "outStilton" );
+ assertEquals( 30,
+ stilton.getPrice() );
+ }
+
+ public void testRetractObject() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += "{\"insert\":{\"object\":{\"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, \"out-identifier\":\"outStilton\" } }";
+ inXml += ", {\"fire-all-rules\":{\"max\":10}}";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+
+ StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+ outXml = roundTripFromXml( outXml );
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+ result = ( ExecutionResults) roundTripFromObject( result );
+
+ Cheese stilton = (Cheese) result.getValue( "outStilton" );
+ assertEquals( 30,
+ stilton.getPrice() );
+
+ FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
+ inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += " { \"retract\":{\"fact-handle\":'" + factHandle.toExternalForm() + "'}}";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+
+ inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += " {\"get-object\":{ ";
+ inXml += " \"out-identifier\":'outStilton',";
+ inXml += " \"fact-handle\":'" + factHandle.toExternalForm() + "'}}";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ outXml = (String) resultHandler.getObject();
+ result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+ result = ( ExecutionResults) roundTripFromObject( result );
+ assertNull( result.getValue( "outStilton" ) );
+ }
+
+ public void testModifyObject() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += "{\"insert\":{\"object\":{\"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, \"out-identifier\":\"outStilton\" } }";
+ inXml += ", {\"fire-all-rules\":\"\"}";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+
+ StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+ outXml = roundTripFromXml( outXml );
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+ result = ( ExecutionResults ) roundTripFromObject( result );
+ Cheese stilton = (Cheese) result.getValue( "outStilton" );
+ assertEquals( 30,
+ stilton.getPrice() );
+
+ FactHandle factHandle = ((FactHandle) result.getFactHandle( "outStilton" ));
+//
+// String expectedXml = "";
+// expectedXml += "<execution-results>\n";
+// expectedXml += " <result identifier=\"outStilton\">\n";
+// expectedXml += " <org.drools.Cheese>\n";
+// expectedXml += " <type>stilton</type>\n";
+// expectedXml += " <oldPrice>0</oldPrice>\n";
+// expectedXml += " <price>30</price>\n";
+// expectedXml += " </org.drools.Cheese>\n";
+// expectedXml += " </result>\n";
+// expectedXml += " <fact-handle identifier=\"outStilton\" externalForm=\"" + factHandle.toExternalForm() + "\" /> \n";
+// expectedXml += "</execution-results>\n";
+//
+// assertXMLEqual( expectedXml,
+// outXml );
+
+ inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += " {\"modify\":{\"fact-handle\":'" + factHandle.toExternalForm() + "'";
+ inXml += ", \"setters\":[{\"accessor\":\"oldPrice\",\"set\":42}, {\"accessor\":\"price\",\"set\":50}]";
+ inXml += "} }";
+ inXml += ", {\"fire-all-rules\":\"\"}";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += " {\"get-object\":{ ";
+ inXml += " \"out-identifier\":'outCheddar',";
+ inXml += " \"fact-handle\":'" + factHandle.toExternalForm() + "'}}";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ outXml = (String) resultHandler.getObject();
+ outXml = roundTripFromXml( outXml );
+ result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+ result = ( ExecutionResults ) roundTripFromObject ( result );
+ Cheese cheddar = (Cheese) result.getValue( "outCheddar" );
+ assertEquals( 42,
+ cheddar.getOldPrice() );
+ assertEquals( 55,
+ cheddar.getPrice() );
+
+ //now test for code injection:
+ ModifyCommand.ALLOW_MODIFY_EXPRESSIONS = false;
+ inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += " {\"modify\":{\"fact-handle\":'" + factHandle.toExternalForm() + "'";
+ inXml += ", \"setters\":[{\"accessor\":\"type\",\"set\":\"44; System.exit(1);\"}, {\"accessor\":\"price\",\"set\":50}]";
+ inXml += "} }";
+ inXml += ", {\"fire-all-rules\":\"\"}";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ outXml = (String) resultHandler.getObject();
+ result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+ ModifyCommand.ALLOW_MODIFY_EXPRESSIONS = true;
+
+ }
+
+ public void testInsertElements() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "global java.util.List list1 \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n";
+ str += " list1.add( $c );";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += " {\"set-global\":{\"identifier\":\"list1\",\"out\"=true";
+ inXml += " ,\"object\":{\"list\":{\"object\":[]}}";
+ inXml += " } } "; //
+ inXml += ", {\"insert-elements\":{\"objects\":[";
+ inXml += " { \"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, ";
+ inXml += " { \"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":30,\"oldPrice\":0}} ";
+ inXml += " ]}}";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+
+ StatelessKnowledgeSession ksession = getSession2( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipeline( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+ outXml = roundTripFromXml( outXml );
+
+// String expectedXml = "";
+// expectedXml += "<execution-results>\n";
+// expectedXml += " <result identifier='list'>\n";
+// expectedXml += " <list>\n";
+// expectedXml += " <org.drools.Cheese>\n";
+// expectedXml += " <type>stilton</type>\n";
+// expectedXml += " <price>35</price>\n";
+// expectedXml += " <oldPrice>0</oldPrice>\n";
+// expectedXml += " </org.drools.Cheese>\n";
+// expectedXml += " <org.drools.Cheese>\n";
+// expectedXml += " <type>stilton</type>\n";
+// expectedXml += " <price>30</price>\n";
+// expectedXml += " <oldPrice>0</oldPrice>\n";
+// expectedXml += " </org.drools.Cheese>\n";
+// expectedXml += " </list>\n";
+// expectedXml += " </result>\n";
+// expectedXml += "</execution-results>\n";
+//
+// assertXMLEqual( expectedXml,
+// outXml );
+//
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+ result = ( ExecutionResults ) roundTripFromObject( result );
+ List list = (List) result.getValue( "list1" );
+ Cheese stilton25 = new Cheese( "stilton",
+ 30 );
+ Cheese stilton30 = new Cheese( "stilton",
+ 35 );
+
+ Set expectedList = new HashSet();
+ expectedList.add( stilton25 );
+ expectedList.add( stilton30 );
+
+ assertEquals( expectedList,
+ new HashSet( list ) );
+ }
+
+ public void testFactHandleReturn() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "global java.util.List list1 \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " System.err.println(42); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += " {\"get-global\":{\"identifier\":\"list1\",\"out-identifier\":\"out-list\"}}";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+
+ StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ FactHandle fh = ksession.insert( new Person( "mic",
+ 42 ) );
+ List<FactHandle> list = new ArrayList<FactHandle>();
+ list.add( fh );
+
+ ksession.setGlobal( "list1",
+ list );
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+ outXml = roundTripFromXml( outXml );
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+ result = ( ExecutionResults ) roundTripFromObject( result );
+ List outList = ( List ) result.getValue( "out-list" );
+ assertEquals( 1, outList.size() );
+ assertEquals( fh.toExternalForm(), ((FactHandle)outList.get(0)).toExternalForm() );
+ assertNotSame( fh, outList.get( 0 ));
+
+
+// System.err.println( outXml );
+// String expectedXml = "";
+// expectedXml += "<execution-results>\n" + " <result identifier=\"out-list\">\n" + " <list>\n" + " <fact-handle externalForm=\"" + fh.toExternalForm() + "\"/>\n" + " </list>\n" + " </result>\n" + "</execution-results>";
+//
+// assertXMLEqual( expectedXml,
+// outXml );
+
+ }
+
+ public void testInsertElementsWithReturnObjects() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "global java.util.List list1 \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n";
+ str += " list1.add( $c );";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += " {\"set-global\":{\"identifier\":\"list1\",\"out\"=true";
+ inXml += " ,\"object\":{\"list\":{\"object\":[]}}";
+ inXml += " } } "; //
+ inXml += ", {\"insert-elements\":{\"out-identifier\":\"myfacts\",\"return-objects\":true,\"objects\":[";
+ inXml += " { \"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, ";
+ inXml += " { \"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":30,\"oldPrice\":0}} ";
+ inXml += " ]}}";
+ inXml += ", {\"fire-all-rules\":\"\"}";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+
+ StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+ outXml = roundTripFromXml( outXml );
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+ result = ( ExecutionResults) roundTripFromObject( result );
+
+ List list1 = ( List ) result.getValue( "list1" );
+ assertEquals( 2, list1.size() );
+ assertTrue( list1.contains( new Cheese("stilton", 35) ) );
+ assertTrue( list1.contains( new Cheese("stilton", 30) ) );
+
+ List myFacts = ( List ) result.getValue( "myfacts" );
+ assertEquals( 2, list1.size() );
+ assertTrue( myFacts.contains( new Cheese("stilton", 35) ) );
+ assertTrue( myFacts.contains( new Cheese("stilton", 30) ) );
+
+ List factHandles = ( List ) result.getFactHandle( "myfacts" );
+ List list = new ArrayList();
+ list.add( ksession.getObject( ((InternalFactHandle)factHandles.get( 0 )) ) );
+ list.add( ksession.getObject( ((InternalFactHandle)factHandles.get( 1 )) ) );
+ assertTrue( list.contains( new Cheese("stilton", 35) ) );
+ assertTrue( list.contains( new Cheese("stilton", 30) ) );
+
+
+// String expectedXml = "";
+// expectedXml += "<execution-results>\n";
+// expectedXml += " <result identifier='list'>\n";
+// expectedXml += " <list>\n";
+// expectedXml += " <org.drools.Cheese>\n";
+// expectedXml += " <type>stilton</type>\n";
+// expectedXml += " <price>35</price>\n";
+// expectedXml += " <oldPrice>0</oldPrice>\n";
+// expectedXml += " </org.drools.Cheese>\n";
+// expectedXml += " <org.drools.Cheese>\n";
+// expectedXml += " <type>stilton</type>\n";
+// expectedXml += " <price>30</price>\n";
+// expectedXml += " <oldPrice>0</oldPrice>\n";
+// expectedXml += " </org.drools.Cheese>\n";
+// expectedXml += " </list>\n";
+// expectedXml += " </result>\n";
+//
+// expectedXml += " <result identifier=\"myfacts\">\n";
+// expectedXml += " <list>\n";
+// expectedXml += " <org.drools.Cheese reference=\"../../../result/list/org.drools.Cheese[2]\"/>\n";
+// expectedXml += " <org.drools.Cheese reference=\"../../../result/list/org.drools.Cheese\"/>\n";
+// expectedXml += " </list>\n";
+// expectedXml += " </result>\n";
+// expectedXml += " <fact-handles identifier=\"myfacts\">\n";
+// for ( FactHandle factHandle : factHandles ) {
+// if ( ((Cheese) ksession.getObject( factHandle )).getPrice() == 30 ) {
+// expectedXml += " <fact-handle externalForm=\"" + factHandle.toExternalForm() + "\"/>\n";
+// }
+// }
+//
+// for ( FactHandle factHandle : factHandles ) {
+// if ( ((Cheese) ksession.getObject( factHandle )).getPrice() == 35 ) {
+// expectedXml += " <fact-handle externalForm=\"" + factHandle.toExternalForm() + "\"/>\n";
+// }
+// }
+// expectedXml += " </fact-handles>\n";
+//
+// expectedXml += "</execution-results>\n";
+//
+// assertXMLEqual( expectedXml,
+// outXml );
+ }
+
+ public void testSetGlobal() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "global java.util.List list1 \n";
+ str += "global java.util.List list2 \n";
+ str += "global java.util.List list3 \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( 30 ); \n";
+ str += " list1.add( $c ); \n";
+ str += " list2.add( $c ); \n";
+ str += " list3.add( $c ); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += " {\"set-global\":{\"identifier\":\"list1\"";
+ inXml += " ,\"object\":{\"list\":{\"object\":[]}}";
+ inXml += "} } ";
+ inXml += ", {\"set-global\":{\"identifier\":\"list2\",\"out\"=true";
+ inXml += " ,\"object\":{\"list\":{\"object\":[]}}";
+ inXml += "} } ";
+ inXml += ", {\"set-global\":{\"identifier\":\"list3\",\"out-identifier\"=\"outList3\"";
+ inXml += " ,\"object\":{\"list\":{\"object\":[]}}";
+ inXml += "} } ";
+ inXml += ", {\"insert\":{\"object\":{\"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":5}}, \"out-identifier\":\"outStilton\" } }";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+
+ StatelessKnowledgeSession ksession = getSession2( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipeline( ksession ).insert( inXml,
+ resultHandler );
+
+ String outXml = (String) resultHandler.getObject();
+ outXml = roundTripFromXml( outXml );
+
+// String expectedXml = "";
+// expectedXml += "<execution-results>\n";
+// expectedXml += " <result identifier='list2'>\n";
+// expectedXml += " <list>\n";
+// expectedXml += " <org.drools.Cheese>\n";
+// expectedXml += " <type>stilton</type>\n";
+// expectedXml += " <price>30</price>\n";
+// expectedXml += " <oldPrice>0</oldPrice>\n";
+// expectedXml += " </org.drools.Cheese>\n";
+// expectedXml += " </list>\n";
+// expectedXml += " </result>\n";
+// expectedXml += " <result identifier='outList3'>\n";
+// expectedXml += " <list>\n";
+// expectedXml += " <org.drools.Cheese reference='../../../result/list/org.drools.Cheese'/>\n";
+// expectedXml += " </list>\n";
+// expectedXml += " </result>\n";
+// expectedXml += "</execution-results>\n";
+//
+// assertXMLEqual( expectedXml,
+// outXml );
+//
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+ Cheese stilton = new Cheese( "stilton",
+ 30 );
+
+ assertNull( result.getValue( "list1" ) );
+
+ List list2 = (List) result.getValue( "list2" );
+ assertEquals( 1,
+ list2.size() );
+ assertEquals( stilton,
+ list2.get( 0 ) );
+
+ List list3 = (List) result.getValue( "outList3" );
+ assertEquals( 1,
+ list3.size() );
+ assertEquals( stilton,
+ list3.get( 0 ) );
+ }
+
+ public void testGetGlobal() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "global java.util.List list1 \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " list1.add( $c ); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += " {\"set-global\":{\"identifier\":\"list1\",\"out\"=true";
+ inXml += " ,\"object\":{\"list\":{\"object\":[]}}";
+ inXml += " } } "; //
+ inXml += ", {\"insert\":{\"object\":{\"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, \"out-identifier\":\"outStilton\" } }";
+ inXml += ", {\"get-global\":{\"identifier\":\"list1\",\"out-identifier\"=\"out-list\"}}";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+
+ StatelessKnowledgeSession ksession = getSession2( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipeline( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+ outXml = roundTripFromXml( outXml );
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+ result = ( ExecutionResults ) roundTripFromObject( result );
+ List resultsList = ( List ) result.getValue("out-list");
+ assertEquals(1, resultsList.size() );
+ assertEquals(new Cheese("stilton",25), resultsList.get(0));
+
+// String expectedXml = "";
+// expectedXml += "<execution-results>\n";
+// expectedXml += " <result identifier=\"out-list\">\n";
+// expectedXml += " <list>\n";
+// expectedXml += " <org.drools.Cheese>\n";
+// expectedXml += " <type>stilton</type>\n";
+// expectedXml += " <price>25</price>\n";
+// expectedXml += " <oldPrice>0</oldPrice>\n";
+// expectedXml += " </org.drools.Cheese>\n";
+// expectedXml += " </list>\n";
+// expectedXml += " </result>\n";
+// expectedXml += "</execution-results>\n";
+//
+// assertXMLEqual( expectedXml,
+// outXml );
+ }
+
+ public void testGetObjects() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n";
+ str += "end\n";
+
+ String inXml ="";
+ inXml = "{\"batch-execution\":{\"commands\":[";
+ inXml += " {\"insert-elements\":{\"objects\":[";
+ inXml += " { \"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, ";
+ inXml += " { \"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":30,\"oldPrice\":0}} ";
+ inXml += " ]}}";
+ inXml += ", {\"get-objects\":{\"out-identifier\":\"list1\"}}";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+
+ StatelessKnowledgeSession ksession = getSession2( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipeline( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+ outXml = roundTripFromXml( outXml );
+
+// String expectedXml = "";
+// expectedXml += "<execution-results>";
+// expectedXml += " <result identifier='list'>";
+// expectedXml += " <list>";
+// expectedXml += " <org.drools.Cheese>";
+// expectedXml += " <type>stilton</type>";
+// expectedXml += " <price>30</price>";
+// expectedXml += " <oldPrice>0</oldPrice>";
+// expectedXml += " </org.drools.Cheese>";
+// expectedXml += " <org.drools.Cheese>";
+// expectedXml += " <type>stilton</type>";
+// expectedXml += " <price>35</price>";
+// expectedXml += " <oldPrice>0</oldPrice>";
+// expectedXml += " </org.drools.Cheese>";
+// expectedXml += " </list>";
+// expectedXml += " </result>";
+// expectedXml += "</execution-results>";
+//
+// assertXMLEqual( expectedXml,
+// outXml );
+//
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+ result = ( ExecutionResults ) roundTripFromObject( result );
+ List list = (List) result.getValue( "list1" );
+ Cheese stilton25 = new Cheese( "stilton",
+ 30 );
+ Cheese stilton30 = new Cheese( "stilton",
+ 35 );
+
+ Set expectedList = new HashSet();
+ expectedList.add( stilton25 );
+ expectedList.add( stilton30 );
+
+ assertEquals( expectedList,
+ new HashSet( list ) );
+ }
+
+ public void testQuery() throws Exception {
+ String str = "";
+ str += "package org.drools.test \n";
+ str += "import org.drools.Cheese \n";
+ str += "query cheeses \n";
+ str += " stilton : Cheese(type == 'stilton') \n";
+ str += " cheddar : Cheese(type == 'cheddar', price == stilton.price) \n";
+ str += "end\n";
+ str += "query cheesesWithParams(String a, String b) \n";
+ str += " stilton : Cheese(type == a) \n";
+ str += " cheddar : Cheese(type == b, price == stilton.price) \n";
+ str += "end\n";
+
+ String inXml ="";
+ inXml = "{\"batch-execution\":{\"commands\":[";
+ inXml += " {\"insert-elements\":{\"objects\":[";
+ inXml += " { \"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":2}}, ";
+ inXml += " { \"org.drools.Cheese\":{\"type\":\"cheddar\",\"price\":1}}, ";
+ inXml += " { \"org.drools.Cheese\":{\"type\":\"cheddar\",\"price\":2}}, ";
+ inXml += " { \"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":1}} ";
+ inXml += " ]}}";
+ inXml += ", {\"query\":{\"out-identifier\":\"cheeses\",\"name\":\"cheeses\"}}";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+
+ StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+ outXml = roundTripFromXml( outXml );
+
+// Iterator<QueryResultsRow> it1 = ksession.getQueryResults( "cheeses" ).iterator();
+// Iterator<QueryResultsRow> it2 = ksession.getQueryResults( "cheesesWithParams",
+// new String[]{"stilton", "cheddar"} ).iterator();
+// QueryResultsRow row = null;
+//
+// String expectedXml = "";
+// expectedXml += "<execution-results>\n";
+// expectedXml += " <result identifier='cheeses'>\n";
+// expectedXml += " <query-results>\n";
+// expectedXml += " <identifiers>\n";
+// expectedXml += " <identifier>stilton</identifier>\n";
+// expectedXml += " <identifier>cheddar</identifier>\n";
+// expectedXml += " </identifiers>\n";
+// expectedXml += " <row>\n";
+// row = it1.next();
+// expectedXml += " <org.drools.Cheese>\n";
+// expectedXml += " <type>stilton</type>\n";
+// expectedXml += " <price>1</price>\n";
+// expectedXml += " <oldPrice>0</oldPrice>\n";
+// expectedXml += " </org.drools.Cheese>\n";
+// expectedXml += " <fact-handle externalForm='" + row.getFactHandle( "stilton" ).toExternalForm() + "' />";
+// expectedXml += " <org.drools.Cheese>\n";
+// expectedXml += " <type>cheddar</type>\n";
+// expectedXml += " <price>1</price>\n";
+// expectedXml += " <oldPrice>0</oldPrice>\n";
+// expectedXml += " </org.drools.Cheese>\n";
+// expectedXml += " <fact-handle externalForm='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+// expectedXml += " </row>\n";
+// expectedXml += " <row>\n";
+// row = it1.next();
+// expectedXml += " <org.drools.Cheese>\n";
+// expectedXml += " <type>stilton</type>\n";
+// expectedXml += " <price>2</price>\n";
+// expectedXml += " <oldPrice>0</oldPrice>\n";
+// expectedXml += " </org.drools.Cheese>\n";
+// expectedXml += " <fact-handle externalForm='" + row.getFactHandle( "stilton" ).toExternalForm() + "' />";
+// expectedXml += " <org.drools.Cheese>\n";
+// expectedXml += " <type>cheddar</type>\n";
+// expectedXml += " <price>2</price>\n";
+// expectedXml += " <oldPrice>0</oldPrice>\n";
+// expectedXml += " </org.drools.Cheese>\n";
+// expectedXml += " <fact-handle externalForm='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+// expectedXml += " </row>\n";
+// expectedXml += " </query-results>\n";
+// expectedXml += " </result>\n";
+// expectedXml += " <result identifier='cheeses2'>\n";
+// expectedXml += " <query-results>\n";
+// expectedXml += " <identifiers>\n";
+// expectedXml += " <identifier>stilton</identifier>\n";
+// expectedXml += " <identifier>cheddar</identifier>\n";
+// expectedXml += " </identifiers>\n";
+// expectedXml += " <row>\n";
+// row = it2.next();
+// expectedXml += " <org.drools.Cheese reference=\"../../../../result/query-results/row/org.drools.Cheese\"/>\n";
+// expectedXml += " <fact-handle externalForm='" + row.getFactHandle( "stilton" ).toExternalForm() + "' />";
+// expectedXml += " <org.drools.Cheese reference=\"../../../../result/query-results/row/org.drools.Cheese[2]\"/>\n";
+// expectedXml += " <fact-handle externalForm='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+// expectedXml += " </row>\n";
+// expectedXml += " <row>\n";
+// row = it2.next();
+// expectedXml += " <org.drools.Cheese reference=\"../../../../result/query-results/row[2]/org.drools.Cheese\"/>\n";
+// expectedXml += " <fact-handle externalForm='" + row.getFactHandle( "stilton" ).toExternalForm() + "' />";
+// expectedXml += " <org.drools.Cheese reference=\"../../../../result/query-results/row[2]/org.drools.Cheese[2]\"/>\n";
+// expectedXml += " <fact-handle externalForm='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+// expectedXml += " </row>\n";
+// expectedXml += " </query-results>\n";
+// expectedXml += " </result>\n";
+// expectedXml += "</execution-results>\n";
+//
+// assertXMLEqual( expectedXml,
+// outXml );
+//
+ ExecutionResults batchResult = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+ batchResult = ( ExecutionResults ) roundTripFromObject( batchResult );
+
+ Cheese stilton1 = new Cheese( "stilton",
+ 1 );
+ Cheese cheddar1 = new Cheese( "cheddar",
+ 1 );
+ Cheese stilton2 = new Cheese( "stilton",
+ 2 );
+ Cheese cheddar2 = new Cheese( "cheddar",
+ 2 );
+
+ Set set = new HashSet();
+ List list = new ArrayList();
+ list.add( stilton1 );
+ list.add( cheddar1 );
+ set.add( list );
+
+ list = new ArrayList();
+ list.add( stilton2 );
+ list.add( cheddar2 );
+ set.add( list );
+
+ org.drools.runtime.rule.QueryResults results = (org.drools.runtime.rule.QueryResults) batchResult.getValue( "cheeses" );
+ assertEquals( 2,
+ results.size() );
+ assertEquals( 2,
+ results.getIdentifiers().length );
+ Set newSet = new HashSet();
+ for ( org.drools.runtime.rule.QueryResultsRow result : results ) {
+ list = new ArrayList();
+ list.add( result.get( "stilton" ) );
+ list.add( result.get( "cheddar" ) );
+ newSet.add( list );
+ }
+ assertEquals( set,
+ newSet );
+ }
+
+ public void testManualFireAllRules() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "global java.util.List list1 \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n";
+ str += " list1.add( $c );";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += " {\"set-global\":{\"identifier\":\"list1\",\"out\"=true";
+ inXml += " ,\"object\":{\"list\":{\"object\":[]}}";
+ inXml += " } } "; //
+ inXml += ", {\"insert-elements\":{\"objects\":[";
+ inXml += " { \"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, ";
+ inXml += " { \"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":30,\"oldPrice\":0}} ";
+ inXml += " ]}}";
+ inXml += ", {\"fire-all-rules\":\"\"}";
+ inXml += ", {\"insert\":{\"object\":{\"org.drools.Cheese\":{\"type\":\"brie\",\"price\":10,\"oldPrice\":0}}, \"out-identifier\":\"outBrie\" } }";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+
+ StatelessKnowledgeSession ksession = getSession2( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipeline( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+
+ FactHandle factHandle = (FactHandle) ((ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml )).getFactHandle( "outBrie" );
+
+// String expectedXml = "";
+// expectedXml += "<execution-results>\n";
+// expectedXml += " <result identifier='list'>\n";
+// expectedXml += " <list>\n";
+// expectedXml += " <org.drools.Cheese>\n";
+// expectedXml += " <type>stilton</type>\n";
+// expectedXml += " <price>35</price>\n";
+// expectedXml += " <oldPrice>0</oldPrice>\n";
+// expectedXml += " </org.drools.Cheese>\n";
+// expectedXml += " <org.drools.Cheese>\n";
+// expectedXml += " <type>stilton</type>\n";
+// expectedXml += " <price>30</price>\n";
+// expectedXml += " <oldPrice>0</oldPrice>\n";
+// expectedXml += " </org.drools.Cheese>\n";
+// expectedXml += " </list>\n";
+// expectedXml += " </result>\n";
+// expectedXml += " <result identifier='outBrie'>\n";
+// expectedXml += " <org.drools.Cheese>\n";
+// expectedXml += " <type>brie</type>\n";
+// expectedXml += " <price>10</price>\n";
+// expectedXml += " <oldPrice>5</oldPrice>\n";
+// expectedXml += " </org.drools.Cheese>\n";
+// expectedXml += " </result>\n";
+// expectedXml += " <fact-handle identifier=\"outBrie\" externalForm=\"" + factHandle.toExternalForm() + "\" /> \n";
+// expectedXml += "</execution-results>\n";
+// assertXMLEqual( expectedXml,
+// outXml );
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+ result = (ExecutionResults) roundTripFromObject( result );
+
+ // brie should not have been added to the list
+ List list = (List) result.getValue( "list1" );
+ Cheese stilton25 = new Cheese( "stilton",
+ 30 );
+ Cheese stilton30 = new Cheese( "stilton",
+ 35 );
+
+ Set expectedList = new HashSet();
+ expectedList.add( stilton25 );
+ expectedList.add( stilton30 );
+
+ assertEquals( expectedList,
+ new HashSet( list ) );
+
+ // brie should not have changed
+ Cheese brie10 = new Cheese( "brie",
+ 10 );
+ brie10.setOldPrice( 5 );
+ assertEquals( brie10,
+ result.getValue( "outBrie" ) );
+ }
+
+ public void testProcess() throws SAXException,
+ IOException {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ String str = "";
+ str += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+ str += "<process xmlns=\"http://drools.org/drools-5.0/process\"\n";
+ str += " xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+ str += " xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n";
+ str += " type=\"RuleFlow\" name=\"flow\" id=\"org.drools.actions\" package-name=\"org.drools\" version=\"1\" >\n";
+ str += "\n";
+ str += " <header>\n";
+ str += " <imports>\n";
+ str += " <import name=\"org.drools.TestVariable\" />\n";
+ str += " </imports>\n";
+ str += " <globals>\n";
+ str += " <global identifier=\"list1\" type=\"java.util.List\" />\n";
+ str += " </globals>\n";
+ str += " <variables>\n";
+ str += " <variable name=\"person\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"TestVariable\" />\n";
+ str += " </variable>\n";
+ str += " </variables>\n";
+ str += " </header>\n";
+ str += "\n";
+ str += " <nodes>\n";
+ str += " <start id=\"1\" name=\"Start\" />\n";
+ str += " <actionNode id=\"2\" name=\"MyActionNode\" >\n";
+ str += " <action type=\"expression\" dialect=\"mvel\" >System.out.println(\"Triggered\");\n";
+ str += "list1.add(person.name);\n";
+ str += "</action>\n";
+ str += " </actionNode>\n";
+ str += " <end id=\"3\" name=\"End\" />\n";
+ str += " </nodes>\n";
+ str += "\n";
+ str += " <connections>\n";
+ str += " <connection from=\"1\" to=\"2\" />\n";
+ str += " <connection from=\"2\" to=\"3\" />\n";
+ str += " </connections>\n" + "\n";
+ str += "</process>";
+
+ Reader source = new StringReader( str );
+ kbuilder.add( ResourceFactory.newReaderResource( source ),
+ ResourceType.DRF );
+ if ( kbuilder.hasErrors() ) {
+ fail( kbuilder.getErrors().toString() );
+ }
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
+ List<String> list = new ArrayList<String>();
+ ksession.setGlobal( "list1",
+ list );
+ TestVariable person = new TestVariable( "John Doe" );
+
+ String inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += " {\"start-process\":";
+ inXml += " {\"process-id\":\"org.drools.actions\",";
+ inXml += " \"parameters\":[";
+ inXml += " {\"identifier\":\"person\",";
+ inXml += " \"object\":{\"@class\":\"org.drools.TestVariable\",";
+ inXml += " \"name\":\"John Doe\"}}]}},";
+ inXml += " {\"get-global\":{\"identifier\":\"list1\",\"out-identifier\":\"out-list\"}}]}}";
+ inXml = roundTripFromXml( inXml );
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipeline( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+ outXml = roundTripFromXml( outXml );
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+ result = (ExecutionResults) roundTripFromObject( result );
+ list = (List) result.getValue( "out-list" );
+
+ assertEquals( 1,
+ list.size() );
+ assertEquals( "John Doe",
+ list.get( 0 ) );
+
+// String expectedXml = "";
+// expectedXml += "<execution-results>\n";
+// expectedXml += " <result identifier=\"out-list\">\n";
+// expectedXml += " <list>\n";
+// expectedXml += " <string>John Doe</string>\n";
+// expectedXml += " </list>\n";
+// expectedXml += " </result>\n";
+// expectedXml += "</execution-results>\n";
+//
+// assertXMLEqual( expectedXml,
+// outXml );
+ }
+
+ public void testProcessInstanceSignalEvent() throws Exception {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ String str = "";
+ str += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+ str += "<process xmlns=\"http://drools.org/drools-5.0/process\"\n";
+ str += " xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+ str += " xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n";
+ str += " type=\"RuleFlow\" name=\"flow\" id=\"org.drools.event\" package-name=\"org.drools\" version=\"1\" >\n";
+ str += "\n";
+ str += " <header>\n";
+ str += " <variables>\n";
+ str += " <variable name=\"MyVar\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " <value>SomeText</value>\n";
+ str += " </variable>\n";
+ str += " </variables>\n";
+ str += " </header>\n";
+ str += "\n";
+ str += " <nodes>\n";
+ str += " <start id=\"1\" name=\"Start\" />\n";
+ str += " <eventNode id=\"2\" name=\"Event\" variableName=\"MyVar\" >\n";
+ str += " <eventFilters>\n";
+ str += " <eventFilter type=\"eventType\" eventType=\"MyEvent\" />\n";
+ str += " </eventFilters>\n";
+ str += " </eventNode>\n";
+ str += " <join id=\"3\" name=\"Join\" type=\"1\" />\n";
+ str += " <end id=\"4\" name=\"End\" />\n";
+ str += " </nodes>\n";
+ str += "\n";
+ str += " <connections>\n";
+ str += " <connection from=\"1\" to=\"3\" />\n";
+ str += " <connection from=\"2\" to=\"3\" />\n";
+ str += " <connection from=\"3\" to=\"4\" />\n";
+ str += " </connections>\n";
+ str += "\n";
+ str += "</process>";
+
+ kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+ ResourceType.DRF );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+ ProcessInstance processInstance = ksession.startProcess( "org.drools.event" );
+ assertEquals( ProcessInstance.STATE_ACTIVE,
+ processInstance.getState() );
+
+ String inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += "{\"signal-event\":{\"process-instance-id\":" + processInstance.getId() +",\"event-type\":\"MyEvent\"";
+ inXml += " ,\"object\":{\"string\":[\"MyValue\"]} } }";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+
+ getPipelineStateful( ksession ).insert( inXml,
+ new ResultHandlerImpl() );
+
+ assertEquals( ProcessInstance.STATE_COMPLETED,
+ processInstance.getState() );
+ assertEquals( "MyValue",
+ ((VariableScopeInstance) ((org.drools.process.instance.ProcessInstance) processInstance).getContextInstance( VariableScope.VARIABLE_SCOPE )).getVariable( "MyVar" ) );
+ }
+
+ public void testProcessRuntimeSignalEvent() throws Exception {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ String str = "";
+ str += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+ str += "<process xmlns=\"http://drools.org/drools-5.0/process\"\n";
+ str += " xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+ str += " xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n";
+ str += " type=\"RuleFlow\" name=\"flow\" id=\"org.drools.event\" package-name=\"org.drools\" version=\"1\" >\n";
+ str += "\n";
+ str += " <header>\n";
+ str += " <variables>\n";
+ str += " <variable name=\"MyVar\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " <value>SomeText</value>\n";
+ str += " </variable>\n";
+ str += " </variables>\n";
+ str += " </header>\n";
+ str += "\n";
+ str += " <nodes>\n";
+ str += " <start id=\"1\" name=\"Start\" />\n";
+ str += " <eventNode id=\"2\" name=\"Event\" scope=\"external\" variableName=\"MyVar\" >\n";
+ str += " <eventFilters>\n";
+ str += " <eventFilter type=\"eventType\" eventType=\"MyEvent\" />\n";
+ str += " </eventFilters>\n";
+ str += " </eventNode>\n";
+ str += " <join id=\"3\" name=\"Join\" type=\"1\" />\n";
+ str += " <end id=\"4\" name=\"End\" />\n";
+ str += " </nodes>\n";
+ str += "\n";
+ str += " <connections>\n";
+ str += " <connection from=\"1\" to=\"3\" />\n";
+ str += " <connection from=\"2\" to=\"3\" />\n";
+ str += " <connection from=\"3\" to=\"4\" />\n";
+ str += " </connections>\n";
+ str += "\n";
+ str += "</process>";
+
+ kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+ ResourceType.DRF );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+ ProcessInstance processInstance = ksession.startProcess( "org.drools.event" );
+ assertEquals( ProcessInstance.STATE_ACTIVE,
+ processInstance.getState() );
+
+ String inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += " {\"signal-event\":{\"event-type\":\"MyEvent\"";
+ inXml += " ,\"object\":{\"string\":[\"MyValue\"]} } }";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+
+ getPipelineStateful( ksession ).insert( inXml,
+ new ResultHandlerImpl() );
+
+ assertEquals( ProcessInstance.STATE_COMPLETED,
+ processInstance.getState() );
+ assertEquals( "MyValue",
+ ((VariableScopeInstance) ((org.drools.process.instance.ProcessInstance) processInstance).getContextInstance( VariableScope.VARIABLE_SCOPE )).getVariable( "MyVar" ) );
+ }
+
+ public void testCompleteWorkItem() {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ String str = "";
+ str += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+ str += "<process xmlns=\"http://drools.org/drools-5.0/process\"\n";
+ str += " xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+ str += " xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n";
+ str += " type=\"RuleFlow\" name=\"flow\" id=\"org.drools.actions\" package-name=\"org.drools\" version=\"1\" >\n";
+ str += "\n";
+ str += " <header>\n";
+ str += " <variables>\n";
+ str += " <variable name=\"UserName\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " <value>John Doe</value>\n";
+ str += " </variable>\n";
+ str += " <variable name=\"Person\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"org.drools.Person\" />\n";
+ str += " </variable>\n";
+ str += " <variable name=\"MyObject\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"java.lang.Object\" />\n";
+ str += " </variable>\n";
+ str += " <variable name=\"Number\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.IntegerDataType\" />\n";
+ str += " </variable>\n";
+ str += " </variables>\n";
+ str += " </header>\n";
+ str += "\n";
+ str += " <nodes>\n";
+ str += " <start id=\"1\" name=\"Start\" />\n";
+ str += " <workItem id=\"2\" name=\"HumanTask\" >\n";
+ str += " <work name=\"Human Task\" >\n";
+ str += " <parameter name=\"ActorId\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " <value>#{UserName}</value>\n";
+ str += " </parameter>\n";
+ str += " <parameter name=\"Content\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " <value>#{Person.name}</value>\n";
+ str += " </parameter>\n";
+ str += " <parameter name=\"TaskName\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " <value>Do something</value>\n";
+ str += " </parameter>\n";
+ str += " <parameter name=\"Priority\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " </parameter>\n";
+ str += " <parameter name=\"Comment\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " </parameter>\n";
+ str += " <parameter name=\"Attachment\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"java.lang.Object\" />\n";
+ str += " </parameter>\n";
+ str += " </work>\n";
+ str += " <mapping type=\"in\" from=\"MyObject\" to=\"Attachment\" />";
+ str += " <mapping type=\"in\" from=\"Person.name\" to=\"Comment\" />";
+ str += " <mapping type=\"out\" from=\"Result\" to=\"MyObject\" />";
+ str += " <mapping type=\"out\" from=\"Result.length()\" to=\"Number\" />";
+ str += " </workItem>\n";
+ str += " <end id=\"3\" name=\"End\" />\n";
+ str += " </nodes>\n";
+ str += "\n";
+ str += " <connections>\n";
+ str += " <connection from=\"1\" to=\"2\" />\n";
+ str += " <connection from=\"2\" to=\"3\" />\n";
+ str += " </connections>\n";
+ str += "\n";
+ str += "</process>";
+
+ Reader source = new StringReader( str );
+ kbuilder.add( ResourceFactory.newReaderResource( source ),
+ ResourceType.DRF );
+
+ Collection<KnowledgePackage> kpkgs = kbuilder.getKnowledgePackages();
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kpkgs );
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+ TestWorkItemHandler handler = new TestWorkItemHandler();
+ ksession.getWorkItemManager().registerWorkItemHandler( "Human Task",
+ handler );
+ Map<String, Object> parameters = new HashMap<String, Object>();
+ parameters.put( "UserName",
+ "John Doe" );
+ Person person = new Person();
+ person.setName( "John Doe" );
+ parameters.put( "Person",
+ person );
+ WorkflowProcessInstance processInstance = (WorkflowProcessInstance) ksession.startProcess( "org.drools.actions",
+ parameters );
+ assertEquals( ProcessInstance.STATE_ACTIVE,
+ processInstance.getState() );
+ WorkItem workItem = handler.getWorkItem();
+ assertNotNull( workItem );
+ assertEquals( "John Doe",
+ workItem.getParameter( "ActorId" ) );
+ assertEquals( "John Doe",
+ workItem.getParameter( "Content" ) );
+ assertEquals( "John Doe",
+ workItem.getParameter( "Comment" ) );
+
+ assertEquals( WorkItem.PENDING,
+ workItem.getState() );
+
+ String inXml = "";
+ inXml = "{\"complete-work-item\":{\"id\":" + workItem.getId() + "}}";
+ inXml = roundTripFromXml( inXml );
+ getPipelineStateful( ksession ).insert( inXml,
+ new ResultHandlerImpl() );
+
+ assertEquals( WorkItem.COMPLETED,
+ workItem.getState() );
+
+ assertEquals( ProcessInstance.STATE_COMPLETED,
+ processInstance.getState() );
+
+ parameters = new HashMap<String, Object>();
+ parameters.put( "UserName",
+ "Jane Doe" );
+ parameters.put( "MyObject",
+ "SomeString" );
+ person = new Person();
+ person.setName( "Jane Doe" );
+ parameters.put( "Person",
+ person );
+ processInstance = (WorkflowProcessInstance) ksession.startProcess( "org.drools.actions",
+ parameters );
+ assertEquals( ProcessInstance.STATE_ACTIVE,
+ processInstance.getState() );
+ workItem = handler.getWorkItem();
+ assertNotNull( workItem );
+ assertEquals( "Jane Doe",
+ workItem.getParameter( "ActorId" ) );
+ assertEquals( "SomeString",
+ workItem.getParameter( "Attachment" ) );
+ assertEquals( "Jane Doe",
+ workItem.getParameter( "Content" ) );
+ assertEquals( "Jane Doe",
+ workItem.getParameter( "Comment" ) );
+
+ assertEquals( WorkItem.PENDING,
+ workItem.getState() );
+
+ inXml = "{\"complete-work-item\":{\"id\":" + workItem.getId() + ",\"results\":{\"identifier\":\"Result\",\"object\":{\"@class\":\"string\",\"$\":\"SomeOtherString\"}}}}";
+ inXml = roundTripFromXml( inXml );
+
+ getPipelineStateful( ksession ).insert( inXml,
+ new ResultHandlerImpl() );
+
+ assertEquals( WorkItem.COMPLETED,
+ workItem.getState() );
+
+ assertEquals( ProcessInstance.STATE_COMPLETED,
+ processInstance.getState() );
+ assertEquals( "SomeOtherString",
+ processInstance.getVariable( "MyObject" ) );
+ assertEquals( 15,
+ processInstance.getVariable( "Number" ) );
+ }
+
+ public void testAbortWorkItem() {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ String str = "";
+ str += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+ str += "<process xmlns=\"http://drools.org/drools-5.0/process\"\n";
+ str += " xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+ str += " xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n";
+ str += " type=\"RuleFlow\" name=\"flow\" id=\"org.drools.actions\" package-name=\"org.drools\" version=\"1\" >\n";
+ str += "\n";
+ str += " <header>\n";
+ str += " <variables>\n";
+ str += " <variable name=\"UserName\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " <value>John Doe</value>\n";
+ str += " </variable>\n";
+ str += " <variable name=\"Person\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"org.drools.Person\" />\n";
+ str += " </variable>\n";
+ str += " <variable name=\"MyObject\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"java.lang.Object\" />\n";
+ str += " </variable>\n";
+ str += " <variable name=\"Number\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.IntegerDataType\" />\n";
+ str += " </variable>\n";
+ str += " </variables>\n";
+ str += " </header>\n";
+ str += "\n";
+ str += " <nodes>\n";
+ str += " <start id=\"1\" name=\"Start\" />\n";
+ str += " <workItem id=\"2\" name=\"HumanTask\" >\n";
+ str += " <work name=\"Human Task\" >\n";
+ str += " <parameter name=\"ActorId\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " <value>#{UserName}</value>\n";
+ str += " </parameter>\n";
+ str += " <parameter name=\"Content\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " <value>#{Person.name}</value>\n";
+ str += " </parameter>\n";
+ str += " <parameter name=\"TaskName\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " <value>Do something</value>\n";
+ str += " </parameter>\n";
+ str += " <parameter name=\"Priority\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " </parameter>\n";
+ str += " <parameter name=\"Comment\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " </parameter>\n";
+ str += " <parameter name=\"Attachment\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"java.lang.Object\" />\n";
+ str += " </parameter>\n";
+ str += " </work>\n";
+ str += " <mapping type=\"in\" from=\"MyObject\" to=\"Attachment\" />";
+ str += " <mapping type=\"in\" from=\"Person.name\" to=\"Comment\" />";
+ str += " <mapping type=\"out\" from=\"Result\" to=\"MyObject\" />";
+ str += " <mapping type=\"out\" from=\"Result.length()\" to=\"Number\" />";
+ str += " </workItem>\n";
+ str += " <end id=\"3\" name=\"End\" />\n";
+ str += " </nodes>\n";
+ str += "\n";
+ str += " <connections>\n";
+ str += " <connection from=\"1\" to=\"2\" />\n";
+ str += " <connection from=\"2\" to=\"3\" />\n";
+ str += " </connections>\n";
+ str += "\n";
+ str += "</process>";
+
+ Reader source = new StringReader( str );
+ kbuilder.add( ResourceFactory.newReaderResource( source ),
+ ResourceType.DRF );
+
+ Collection<KnowledgePackage> kpkgs = kbuilder.getKnowledgePackages();
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kpkgs );
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+ TestWorkItemHandler handler = new TestWorkItemHandler();
+ ksession.getWorkItemManager().registerWorkItemHandler( "Human Task",
+ handler );
+ Map<String, Object> parameters = new HashMap<String, Object>();
+ parameters.put( "UserName",
+ "John Doe" );
+ Person person = new Person();
+ person.setName( "John Doe" );
+ parameters.put( "Person",
+ person );
+ WorkflowProcessInstance processInstance = (WorkflowProcessInstance) ksession.startProcess( "org.drools.actions",
+ parameters );
+ assertEquals( ProcessInstance.STATE_ACTIVE,
+ processInstance.getState() );
+ WorkItem workItem = handler.getWorkItem();
+ assertNotNull( workItem );
+
+ assertEquals( WorkItem.PENDING,
+ workItem.getState() );
+
+ String inXml = "{\"abort-work-item\":{\"id\":" + workItem.getId() + "}}";
+ inXml = roundTripFromXml( inXml );
+ getPipelineStateful( ksession ).insert( inXml,
+ new ResultHandlerImpl() );
+
+ assertEquals( WorkItem.ABORTED,
+ workItem.getState() );
+ }
+
+ public static class TestWorkItemHandler
+ implements
+ WorkItemHandler {
+ private WorkItem workItem;
+
+ public void executeWorkItem(WorkItem workItem,
+ WorkItemManager manager) {
+ this.workItem = workItem;
+ }
+
+ public void abortWorkItem(WorkItem workItem,
+ WorkItemManager manager) {
+ }
+
+ public WorkItem getWorkItem() {
+ return workItem;
+ }
+ }
+
+ public void testInsertObjectWithDeclaredFact() throws Exception {
+ String str = "";
+ str += "package org.foo \n";
+ str += "declare Whee \n\ttype: String\n\tprice: Integer\n\toldPrice: Integer\nend\n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Whee() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += "{\"insert\":{\"object\":{\"org.foo.Whee\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, \"out-identifier\":\"outStilton\" } }";
+ inXml += ", {\"fire-all-rules\":\"\"}";
+ inXml += "]}}";
+ //inXml = roundTripFromXml( inXml ); // can't round trip, as dosn't have the correct class loader
+
+ StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+
+ ClassLoader cl = ((InternalRuleBase) ((StatefulKnowledgeSessionImpl) ksession).getRuleBase()).getRootClassLoader();
+ XStream xstream = BatchExecutionHelper.newJSonMarshaller();
+ xstream.setClassLoader( cl );
+ FactHandle factHandle = (FactHandle) ((ExecutionResults) xstream.fromXML( outXml )).getFactHandle( "outStilton" );
+ assertNotNull( factHandle );
+
+ Object object = ((ExecutionResults) xstream.fromXML( outXml )).getValue( "outStilton" );
+ assertEquals( "org.foo.Whee", object.getClass().getName() );
+
+// String expectedXml = "";
+// expectedXml += "<execution-results>\n";
+// expectedXml += " <result identifier=\"outStilton\">\n";
+// expectedXml += " <org.foo.Whee>\n";
+// expectedXml += " <type>stilton</type>\n";
+// expectedXml += " <oldPrice>0</oldPrice>\n";
+// expectedXml += " <price>30</price>\n";
+// expectedXml += " </org.foo.Whee>\n";
+// expectedXml += " </result>\n";
+// expectedXml += " <fact-handle identifier=\"outStilton\" externalForm=\"" + factHandle.toExternalForm() + "\" /> \n";
+// expectedXml += "</execution-results>\n";
+//
+// assertXMLEqual( expectedXml,
+// outXml );
+
+ }
+
+ public void testInsertObjectStateful() throws Exception {
+ String str = "";
+ str += "package org.foo \n";
+ str += "declare Whee \n\ttype: String\n\tprice: Integer\n\toldPrice: Integer\nend\n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Whee(price < 30) \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n update($c);\n";
+ str += "end\n";
+ str += "query results\n";
+ str += " w: Whee(price > 0)";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "{\"batch-execution\":{\"commands\":[";
+ inXml += "{\"insert\":{\"object\":{\"org.foo.Whee\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}} } }";
+ inXml += "]}}";
+ //inXml = roundTripFromXml( inXml ); // can't round trip, as dosn't have the correct class loader
+
+ StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ inXml = "{\"batch-execution\":{\"commands\":[";
+ inXml += " {\"query\":{\"out-identifier\":\"matchingthings\",\"name\":\"results\"}}";
+ inXml += "]}}";
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+
+ //we have not fired the rules yet
+ assertTrue( outXml.indexOf( "\"price\":25" ) >= 0 );
+
+ getPipelineStateful( ksession ).insert( "{\"fire-all-rules\":\"\"}",
+ resultHandler );
+
+ //ok lets try that again...
+ inXml = "{\"batch-execution\":{\"commands\":[";
+ inXml += " {\"query\":{\"out-identifier\":\"matchingthings\",\"name\":\"results\"}}";
+ inXml += "]}}";
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ outXml = (String) resultHandler.getObject();
+ assertTrue( outXml.indexOf( "\"price\":30" ) >= 0 );
+ }
+
+ public void testVsmPipeline() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "{\"batch-execution\":{\"lookup\":\"ksession1\", \"commands\":[";
+ inXml += "{\"insert\":{\"object\":{\"org.drools.Cheese\":{\"type\":\"stilton\",\"price\":25,\"oldPrice\":0}}, \"out-identifier\":\"outStilton\" } }";
+ inXml += ", {\"fire-all-rules\":\"\"}";
+ inXml += "]}}";
+ inXml = roundTripFromXml( inXml );
+
+ LocalConnection connection = new LocalConnection();
+ ExecutionNode node = connection.getExecutionNode(null);
+
+ StatefulKnowledgeSession ksession = getExecutionNodeSessionStateful(node, ResourceFactory.newByteArrayResource( str.getBytes() ) );
+
+ node.get(DirectoryLookupFactoryService.class).register("ksession1", ksession);
+
+ XStreamResolverStrategy xstreamStrategy = new XStreamResolverStrategy() {
+ public XStream lookup(String name) {
+ return BatchExecutionHelper.newJSonMarshaller();
+ }
+ };
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineSessionStateful(node, xstreamStrategy).insert(inXml, resultHandler);
+ String outXml = (String) resultHandler.getObject();
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newJSonMarshaller().fromXML( outXml );
+ Cheese stilton = (Cheese) result.getValue( "outStilton" );
+ assertEquals( 30,
+ stilton.getPrice() );
+
+ FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
+ stilton = (Cheese) ksession.getObject( factHandle );
+ assertEquals( 30,
+ stilton.getPrice() );
+
+// String expectedXml = "";
+// expectedXml += "<execution-results>\n";
+// expectedXml += " <result identifier=\"outStilton\">\n";
+// expectedXml += " <org.drools.Cheese>\n";
+// expectedXml += " <type>stilton</type>\n";
+// expectedXml += " <oldPrice>0</oldPrice>\n";
+// expectedXml += " <price>30</price>\n";
+// expectedXml += " </org.drools.Cheese>\n";
+// expectedXml += " </result>\n";
+// expectedXml += " <fact-handle identifier=\"outStilton\" externalForm=\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\" /> \n";
+// expectedXml += "</execution-results>\n";
+//
+// assertXMLEqual( expectedXml,
+// outXml );
+ }
+
+ private Pipeline getPipeline(StatelessKnowledgeSession ksession) {
+ Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+ Action assignResult = PipelineFactory.newAssignObjectAsResult();
+ assignResult.setReceiver( executeResultHandler );
+
+ Transformer outTransformer = PipelineFactory.newXStreamToXmlTransformer( BatchExecutionHelper.newJSonMarshaller() );
+ outTransformer.setReceiver( assignResult );
+
+ KnowledgeRuntimeCommand batchExecution = PipelineFactory.newCommandExecutor();
+ batchExecution.setReceiver( outTransformer );
+
+ Transformer inTransformer = PipelineFactory.newXStreamFromXmlTransformer( BatchExecutionHelper.newJSonMarshaller() );
+ inTransformer.setReceiver( batchExecution );
+
+ Pipeline pipeline = PipelineFactory.newStatelessKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( inTransformer );
+
+ return pipeline;
+ }
+
+
+
+ private Pipeline getPipelineStateful(StatefulKnowledgeSession ksession) {
+ Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+ Action assignResult = PipelineFactory.newAssignObjectAsResult();
+ assignResult.setReceiver( executeResultHandler );
+
+ Transformer outTransformer = PipelineFactory.newXStreamToXmlTransformer( BatchExecutionHelper.newJSonMarshaller() );
+ outTransformer.setReceiver( assignResult );
+
+ KnowledgeRuntimeCommand batchExecution = PipelineFactory.newCommandExecutor();
+ batchExecution.setReceiver( outTransformer );
+
+ Transformer inTransformer = PipelineFactory.newXStreamFromXmlTransformer( BatchExecutionHelper.newJSonMarshaller() );
+ inTransformer.setReceiver( batchExecution );
+
+ Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( inTransformer );
+
+ return pipeline;
+ }
+
+ private Pipeline getPipelineSessionStateful(ExecutionNode node, XStreamResolverStrategy xstreamResolverStrategy) {
+ Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+ Action assignResult = PipelineFactory.newAssignObjectAsResult();
+ assignResult.setReceiver( executeResultHandler );
+
+ //Transformer outTransformer = PipelineFactory.newXStreamToXmlTransformer( BatchExecutionHelper.newXStreamMarshaller() );
+ Transformer outTransformer = new XStreamToXmlGridTransformer();
+ outTransformer.setReceiver( assignResult );
+
+ KnowledgeRuntimeCommand batchExecution = PipelineFactory.newCommandExecutor();
+ batchExecution.setReceiver( outTransformer );
+
+ //Transformer inTransformer = PipelineFactory.newXStreamFromXmlTransformer( BatchExecutionHelper.newXStreamMarshaller() );
+ Transformer inTransformer = new XStreamFromXmlGridTransformer( xstreamResolverStrategy );
+ inTransformer.setReceiver( batchExecution );
+
+// Transformer domTransformer = new ToXmlNodeTransformer();
+// domTransformer.setReceiver( inTransformer );
+
+ //Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ Pipeline pipeline = new ExecutionNodePipelineImpl( node );
+
+ pipeline.setReceiver( inTransformer );
+
+ return pipeline;
+ }
+
+ public static class ResultHandlerImpl
+ implements
+ ResultHandler {
+ Object object;
+
+ public void handleResult(Object object) {
+ this.object = object;
+ }
+
+ public Object getObject() {
+ return this.object;
+ }
+ }
+
+ private StatelessKnowledgeSession getSession2(Resource resource) throws Exception {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( resource,
+ ResourceType.DRL );
+
+ if ( kbuilder.hasErrors() ) {
+ fail( kbuilder.getErrors().toString() );
+ }
+
+ assertFalse( kbuilder.hasErrors() );
+ Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+
+ kbase.addKnowledgePackages( pkgs );
+ StatelessKnowledgeSession session = kbase.newStatelessKnowledgeSession();
+
+ return session;
+ }
+
+ private StatefulKnowledgeSession getSessionStateful(Resource resource) throws Exception {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( resource,
+ ResourceType.DRL );
+
+ if ( kbuilder.hasErrors() ) {
+ System.out.println( kbuilder.getErrors() );
+ }
+
+ assertFalse( kbuilder.hasErrors() );
+ Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+
+ kbase.addKnowledgePackages( pkgs );
+ StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession();
+
+ return session;
+ }
+
+ private StatefulKnowledgeSession getExecutionNodeSessionStateful(ExecutionNode node, Resource resource) throws Exception {
+ KnowledgeBuilder kbuilder = node.get(KnowledgeBuilderFactoryService.class).newKnowledgeBuilder();
+ kbuilder.add( resource,
+ ResourceType.DRL );
+
+ if ( kbuilder.hasErrors() ) {
+ System.out.println( kbuilder.getErrors() );
+ }
+
+ assertFalse( kbuilder.hasErrors() );
+ Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
+
+ KnowledgeBase kbase = node.get(KnowledgeBaseFactoryService.class).newKnowledgeBase();
+
+ kbase.addKnowledgePackages( pkgs );
+ StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession();
+
+ return session;
+ }
+
+ public String roundTripFromXml(String inXml) {
+ Object object = BatchExecutionHelper.newJSonMarshaller().fromXML( inXml );
+ inXml = BatchExecutionHelper.newJSonMarshaller().toXML( object );
+ object = BatchExecutionHelper.newJSonMarshaller().fromXML( inXml );
+ return BatchExecutionHelper.newJSonMarshaller().toXML( object );
+ }
+
+ public Object roundTripFromObject(Object object) {
+ String xml = BatchExecutionHelper.newJSonMarshaller().toXML( object );
+ object = BatchExecutionHelper.newJSonMarshaller().fromXML( xml );
+ xml = BatchExecutionHelper.newJSonMarshaller().toXML( object );
+ return BatchExecutionHelper.newJSonMarshaller().fromXML( xml );
+
+ }
+
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbFactTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbFactTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbFactTest.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,133 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.InputStreamReader;
+import java.util.Map;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+
+import junit.framework.TestCase;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.JaxbConfiguration;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.builder.help.KnowledgeBuilderHelper;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.rule.FactHandle;
+import org.drools.core.util.StringUtils;
+
+import com.sun.tools.xjc.Language;
+import com.sun.tools.xjc.Options;
+
+public class JaxbFactTest extends TestCase {
+ public void testFact() throws Exception {
+ Options xjcOpts = new Options();
+ xjcOpts.setSchemaLanguage( Language.XMLSCHEMA );
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ JaxbConfiguration jaxbConf = KnowledgeBuilderFactory.newJaxbConfiguration( xjcOpts, "xsd" );
+
+ kbuilder.add( ResourceFactory.newClassPathResource( "order.xsd",
+ getClass() ), ResourceType.XSD,
+ jaxbConf );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ kbuilder.add( ResourceFactory.newClassPathResource( "test_Jaxb.drl",
+ getClass() ),
+ ResourceType.DRL );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+ Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+ KnowledgeRuntimeCommand insertStage = PipelineFactory.newStatefulKnowledgeSessionInsert();
+ insertStage.setReceiver( executeResultHandler );
+
+ JAXBContext jaxbCtx = KnowledgeBuilderHelper.newJAXBContext( jaxbConf.getClasses().toArray( new String[jaxbConf.getClasses().size()] ),
+ kbase );
+
+ Unmarshaller unmarshaller = jaxbCtx.createUnmarshaller();
+ Transformer transformer = PipelineFactory.newJaxbFromXmlTransformer( unmarshaller );
+ transformer.setReceiver( insertStage );
+
+ Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( transformer );
+
+ String xml = StringUtils.readFileAsString( new InputStreamReader( getClass().getResourceAsStream( "order.xml" ) ) );
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ pipeline.insert( xml,
+ resultHandler );
+
+ FactHandle factHandle = (FactHandle) ((Map) resultHandler.getObject()).keySet().iterator().next();
+ assertNotNull( factHandle );
+
+ // now round trip that fact
+ Action executeResult = PipelineFactory.newExecuteResultHandler();
+
+ Action assignAsResult = PipelineFactory.newAssignObjectAsResult();
+ assignAsResult.setReceiver( executeResult );
+
+ //transformer = PipelineFactory.newXStreamToXmlTransformer( xstream );
+ Marshaller marshaller = jaxbCtx.createMarshaller();
+ transformer = PipelineFactory.newJaxbToXmlTransformer( marshaller );
+ transformer.setReceiver( assignAsResult );
+
+ KnowledgeRuntimeCommand getObject = PipelineFactory.newStatefulKnowledgeSessionGetObject();
+ getObject.setReceiver( transformer );
+
+ pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( getObject );
+
+ resultHandler = new ResultHandlerImpl();
+ pipeline.insert( factHandle,
+ resultHandler );
+
+ assertEqualsIgnoreWhitespace( xml,
+ (String) resultHandler.getObject() );
+ }
+
+ private static void assertEqualsIgnoreWhitespace(final String expected,
+ final String actual) {
+ final String cleanExpected = expected.replaceAll( "\\s+",
+ "" );
+ final String cleanActual = actual.replaceAll( "\\s+",
+ "" );
+ assertEquals( cleanExpected,
+ cleanActual );
+ }
+
+ public static class ResultHandlerImpl
+ implements
+ ResultHandler {
+ Object object;
+
+ public void handleResult(Object object) {
+ this.object = object;
+ }
+
+ public Object getObject() {
+ return this.object;
+ }
+ }
+
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbGlobalTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbGlobalTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbGlobalTest.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,128 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.transform.stream.StreamSource;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.JaxbConfiguration;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.builder.help.KnowledgeBuilderHelper;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.rule.FactHandle;
+import org.drools.core.util.StringUtils;
+
+import com.sun.tools.xjc.Language;
+import com.sun.tools.xjc.Options;
+
+import junit.framework.TestCase;
+
+public class JaxbGlobalTest extends TestCase {
+ public void testGlobal() throws Exception {
+ Options xjcOpts = new Options();
+ xjcOpts.setSchemaLanguage( Language.XMLSCHEMA );
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ JaxbConfiguration jaxbConf = KnowledgeBuilderFactory.newJaxbConfiguration( xjcOpts, "xsd" );
+
+ kbuilder.add( ResourceFactory.newClassPathResource( "order.xsd",
+ getClass() ), ResourceType.XSD,
+ jaxbConf );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ kbuilder.add( ResourceFactory.newClassPathResource( "test_Jaxb.drl",
+ getClass() ),
+ ResourceType.DRL );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+ KnowledgeRuntimeCommand setGlobalStage = PipelineFactory.newStatefulKnowledgeSessionSetGlobal( "order" );
+
+ JAXBContext jaxbCtx = KnowledgeBuilderHelper.newJAXBContext( jaxbConf.getClasses().toArray( new String[jaxbConf.getClasses().size()] ),
+ kbase );
+
+ Unmarshaller unmarshaller = jaxbCtx.createUnmarshaller();
+ Transformer transformer = PipelineFactory.newJaxbFromXmlTransformer( unmarshaller );
+ transformer.setReceiver(setGlobalStage );
+
+ Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( transformer );
+
+ String xml = StringUtils.readFileAsString( new InputStreamReader( getClass().getResourceAsStream( "order.xml" ) ) );
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ pipeline.insert( xml,
+ resultHandler );
+
+ // now round trip that global
+ Action executeResult = PipelineFactory.newExecuteResultHandler();
+
+ Action assignAsResult = PipelineFactory.newAssignObjectAsResult();
+ assignAsResult.setReceiver( executeResult );
+
+ //transformer = PipelineFactory.newXStreamToXmlTransformer( xstream );
+ Marshaller marshaller = jaxbCtx.createMarshaller();
+ transformer = PipelineFactory.newJaxbToXmlTransformer( marshaller );
+ transformer.setReceiver( assignAsResult );
+
+ KnowledgeRuntimeCommand getGlobalStage = PipelineFactory.newStatefulKnowledgeSessionGetGlobal( );
+ getGlobalStage.setReceiver( transformer );
+
+ pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( getGlobalStage );
+
+ resultHandler = new ResultHandlerImpl();
+ pipeline.insert( "order", resultHandler );
+
+ assertEqualsIgnoreWhitespace( xml, (String) resultHandler.getObject() );
+ }
+
+ private static void assertEqualsIgnoreWhitespace(final String expected,
+ final String actual) {
+ final String cleanExpected = expected.replaceAll( "\\s+",
+ "" );
+ final String cleanActual = actual.replaceAll( "\\s+",
+ "" );
+ assertEquals( cleanExpected,
+ cleanActual );
+ }
+
+ public static class ResultHandlerImpl
+ implements
+ ResultHandler {
+ Object object;
+
+ public void handleResult(Object object) {
+ this.object = object;
+ }
+
+ public Object getObject() {
+ return this.object;
+ }
+}
+
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbSimpleJmsMessengerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbSimpleJmsMessengerTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbSimpleJmsMessengerTest.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,200 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.naming.Context;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+
+import junit.framework.TestCase;
+
+import org.apache.activemq.broker.BrokerService;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.builder.help.KnowledgeBuilderHelper;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.ResultHandlerFactory;
+import org.drools.runtime.pipeline.Service;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.rule.FactHandle;
+import org.drools.core.util.StringUtils;
+
+import com.sun.tools.xjc.Language;
+import com.sun.tools.xjc.Options;
+
+public class JaxbSimpleJmsMessengerTest extends TestCase {
+
+ private SimpleProducer simpleProducer;
+ private BrokerService broker;
+ private String destinationName = "dynamicQueues/FOO.BAR";
+ private String url = "vm://localhost:61616";
+
+ private Properties props;
+
+ protected void setUp() {
+ try {
+ this.broker = new BrokerService();
+ // configure the broker
+ this.broker.setBrokerName( "consumer" );
+ this.broker.addConnector( url );
+ this.broker.start();
+
+ props = new Properties();
+ props.setProperty( Context.INITIAL_CONTEXT_FACTORY,
+ "org.apache.activemq.jndi.ActiveMQInitialContextFactory" );
+ props.setProperty( Context.PROVIDER_URL,
+ this.url );
+
+ this.simpleProducer = new SimpleProducer( props,
+ this.destinationName );
+ this.simpleProducer.start();
+ } catch ( Exception e ) {
+ throw new RuntimeException( e );
+ }
+ }
+
+ protected void tearDown() throws Exception {
+ this.simpleProducer.stop();
+ this.broker.stop();
+ }
+
+ public void testJmsWithJaxb() throws Exception {
+ Options xjcOpts = new Options();
+ xjcOpts.setSchemaLanguage( Language.XMLSCHEMA );
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ String[] classNames = KnowledgeBuilderHelper.addXsdModel( ResourceFactory.newClassPathResource( "order.xsd",
+ getClass() ),
+ kbuilder,
+ xjcOpts,
+ "xsd" );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ kbuilder.add( ResourceFactory.newClassPathResource( "test_Jaxb.drl",
+ getClass() ),
+ ResourceType.DRL );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+ Action resultHandlerStage = PipelineFactory.newExecuteResultHandler();
+
+ KnowledgeRuntimeCommand insertStage = PipelineFactory.newStatefulKnowledgeSessionInsert();
+ insertStage.setReceiver( resultHandlerStage );
+
+ JAXBContext jaxbCtx = KnowledgeBuilderHelper.newJAXBContext( classNames,
+ kbase );
+ Unmarshaller unmarshaller = jaxbCtx.createUnmarshaller();
+ Transformer transformer = PipelineFactory.newJaxbFromXmlTransformer( unmarshaller );
+ transformer.setReceiver( insertStage );
+
+ Action unwrapObjectStage = PipelineFactory.newJmsUnwrapMessageObject();
+ unwrapObjectStage.setReceiver( transformer );
+
+ Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( unwrapObjectStage );
+
+ ResultHandleFactoryImpl factory = new ResultHandleFactoryImpl();
+ Service feeder = PipelineFactory.newJmsMessenger( pipeline,
+ props,
+ this.destinationName,
+ factory );
+ feeder.start();
+
+ String xml = StringUtils.readFileAsString( new InputStreamReader( getClass().getResourceAsStream( "order.xml" ) ) );
+
+ this.simpleProducer.sendObject( xml );
+
+ for ( int i = 0; i < 5; i++ ) {
+ // iterate and sleep 5 times, to give these messages time to complete.
+ if ( factory.list.size() == 1 ) {
+ break;
+ }
+ Thread.sleep( 5000 );
+ }
+
+ FactHandle factHandle = (FactHandle) ((Map) ((ResultHandlerImpl) factory.list.get( 0 )).getObject()).keySet().iterator().next();
+ assertNotNull( factHandle );
+
+ assertEquals( 1,
+ factory.list.size() );
+
+ Action executeResult = PipelineFactory.newExecuteResultHandler();
+
+ Action assignAsResult = PipelineFactory.newAssignObjectAsResult();
+ assignAsResult.setReceiver( executeResult );
+
+ //transformer = PipelineFactory.newXStreamToXmlTransformer( xstream );
+ Marshaller marshaller = jaxbCtx.createMarshaller();
+ transformer = PipelineFactory.newJaxbToXmlTransformer( marshaller );
+ transformer.setReceiver( assignAsResult );
+
+ KnowledgeRuntimeCommand getObject = PipelineFactory.newStatefulKnowledgeSessionGetObject();
+ getObject.setReceiver( transformer );
+
+ pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( getObject );
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ pipeline.insert( factHandle,
+ resultHandler );
+
+ assertEqualsIgnoreWhitespace( xml,
+ (String) resultHandler.getObject() );
+ feeder.stop();
+
+ }
+
+ public static class ResultHandleFactoryImpl
+ implements
+ ResultHandlerFactory {
+ List list = new ArrayList();
+
+ public ResultHandler newResultHandler() {
+ ResultHandler handler = new ResultHandlerImpl();
+ list.add( handler );
+ return handler;
+ }
+
+ }
+
+ public static class ResultHandlerImpl
+ implements
+ ResultHandler {
+ Object object;
+
+ public void handleResult(Object object) {
+ this.object = object;
+ }
+
+ public Object getObject() {
+ return this.object;
+ }
+ }
+
+ private static void assertEqualsIgnoreWhitespace(final String expected,
+ final String actual) {
+ final String cleanExpected = expected.replaceAll( "\\s+",
+ "" );
+ final String cleanActual = actual.replaceAll( "\\s+",
+ "" );
+ assertEquals( cleanExpected,
+ cleanActual );
+ }
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JaxbTest.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,232 @@
+package org.drools.runtime.pipeline.impl;
+
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * 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.
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.transform.stream.StreamSource;
+
+import junit.framework.TestCase;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.JaxbConfiguration;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.builder.help.KnowledgeBuilderHelper;
+import org.drools.common.InternalRuleBase;
+import org.drools.impl.KnowledgeBaseImpl;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.Expression;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.Splitter;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.rule.FactHandle;
+
+import com.sun.tools.xjc.Language;
+import com.sun.tools.xjc.Options;
+
+public class JaxbTest extends TestCase {
+
+ // public void testModelLoad() throws Exception {
+ // Options xjcOpts = new Options();
+ // xjcOpts.setSchemaLanguage( Language.XMLSCHEMA );
+ // PackageBuilder pkgBuilder = new PackageBuilder();
+ //
+ // InputStream stream = getClass().getResourceAsStream( "test.xsd" );
+ // String[] classNames = DroolsJaxbHelper.addModel( new InputStreamReader( stream ),
+ // pkgBuilder,
+ // xjcOpts,
+ // "xsd" );
+ //
+ // assertFalse( pkgBuilder.hasErrors() );
+ //
+ // RuleBase rb = RuleBaseFactory.newRuleBase();
+ // rb.addPackage( pkgBuilder.getPackage() );
+ //
+ // JAXBContext jaxbCtx = DroolsJaxbHelper.newInstance( classNames,
+ // rb );
+ // Unmarshaller unmarshaller = jaxbCtx.createUnmarshaller();
+ // JAXBElement elm = ( JAXBElement ) unmarshaller.unmarshal( getClass().getResourceAsStream( "data.xml" ) );
+ //
+ // assertEquals( "com.oracle.sample3.USAddress",
+ // elm.getValue().getClass().getName() );
+ // }
+
+ public void testDirectRoot() throws Exception {
+ Options xjcOpts = new Options();
+ xjcOpts.setSchemaLanguage( Language.XMLSCHEMA );
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ JaxbConfiguration jaxbConf = KnowledgeBuilderFactory.newJaxbConfiguration( xjcOpts, "xsd" );
+
+ kbuilder.add( ResourceFactory.newClassPathResource( "order.xsd",
+ getClass() ), ResourceType.XSD,
+ jaxbConf );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ kbuilder.add( ResourceFactory.newClassPathResource( "test_Jaxb.drl",
+ getClass() ),
+ ResourceType.DRL );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+ List list1 = new ArrayList();
+ ksession.setGlobal( "list1",
+ list1 );
+
+ Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+ KnowledgeRuntimeCommand insertStage = PipelineFactory.newStatefulKnowledgeSessionInsert();
+ insertStage.setReceiver( executeResultHandler );
+
+ JAXBContext jaxbCtx = KnowledgeBuilderHelper.newJAXBContext( jaxbConf.getClasses().toArray( new String[jaxbConf.getClasses().size()] ),
+ kbase );
+ Unmarshaller unmarshaller = jaxbCtx.createUnmarshaller();
+
+// ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
+//
+// ClassLoader classLoader = ((InternalRuleBase) ((KnowledgeBaseImpl) kbase).getRuleBase()).getRootClassLoader();
+//
+// Thread.currentThread().setContextClassLoader( classLoader );
+// Unmarshaller unmarshaller = JAXBContext.newInstance( "org.drools.model.order" ).createUnmarshaller();
+// Thread.currentThread().setContextClassLoader( originalClassLoader );
+
+ Transformer transformer = PipelineFactory.newJaxbFromXmlTransformer( unmarshaller );
+ transformer.setReceiver( insertStage );
+
+ Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( transformer );
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ pipeline.insert( new StreamSource( getClass().getResourceAsStream( "order.xml" ) ),
+ resultHandler );
+ ksession.fireAllRules();
+
+ Map<FactHandle, Object> handles = (Map<FactHandle, Object>) resultHandler.getObject();
+
+ ksession.fireAllRules();
+
+ assertEquals( 1,
+ handles.size() );
+ assertEquals( 1,
+ list1.size() );
+
+ assertEquals( "org.drools.model.order.Order",
+ list1.get( 0 ).getClass().getName() );
+ }
+
+ public void testNestedIterable() throws Exception {
+ Options xjcOpts = new Options();
+ xjcOpts.setSchemaLanguage( Language.XMLSCHEMA );
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ JaxbConfiguration jaxbConf = KnowledgeBuilderFactory.newJaxbConfiguration( xjcOpts, "xsd" );
+
+ kbuilder.add( ResourceFactory.newClassPathResource( "order.xsd",
+ getClass() ), ResourceType.XSD,
+ jaxbConf );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ kbuilder.add( ResourceFactory.newClassPathResource( "test_Jaxb.drl",
+ getClass() ),
+ ResourceType.DRL );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+ List list1 = new ArrayList();
+ List list2 = new ArrayList();
+ ksession.setGlobal( "list1",
+ list1 );
+ ksession.setGlobal( "list2",
+ list2 );
+
+ Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+ KnowledgeRuntimeCommand insertStage = PipelineFactory.newStatefulKnowledgeSessionInsert();
+ insertStage.setReceiver( executeResultHandler );
+
+ Splitter splitter = PipelineFactory.newIterateSplitter();
+ splitter.setReceiver( insertStage );
+
+ Expression expression = PipelineFactory.newMvelExpression( "this.orderItem" );
+ expression.setReceiver( splitter );
+
+ JAXBContext jaxbCtx = KnowledgeBuilderHelper.newJAXBContext( jaxbConf.getClasses().toArray( new String[jaxbConf.getClasses().size()] ),
+ kbase );
+
+ Unmarshaller unmarshaller = jaxbCtx.createUnmarshaller();
+ Transformer transformer = PipelineFactory.newJaxbFromXmlTransformer( unmarshaller );
+ transformer.setReceiver( expression );
+
+ Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( transformer );
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ pipeline.insert( new StreamSource( getClass().getResourceAsStream( "order.xml" ) ),
+ resultHandler );
+
+ Map<FactHandle, Object> handles = (Map<FactHandle, Object>) resultHandler.getObject();
+ ksession.fireAllRules();
+
+ assertEquals( 2,
+ handles.size() );
+ assertEquals( 1,
+ list1.size() );
+ assertEquals( 1,
+ list2.size() );
+
+ assertEquals( "org.drools.model.order.Order$OrderItem",
+ list1.get( 0 ).getClass().getName() );
+
+ assertEquals( "org.drools.model.order.Order$OrderItem",
+ list2.get( 0 ).getClass().getName() );
+
+ assertNotSame( list1.get( 0 ),
+ list2.get( 0 ) );
+ }
+
+ public static class ResultHandlerImpl
+ implements
+ ResultHandler {
+ Object object;
+
+ public void handleResult(Object object) {
+ this.object = object;
+ }
+
+ public Object getObject() {
+ return this.object;
+ }
+ }
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JxlsTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JxlsTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/JxlsTest.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,73 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.BufferedInputStream;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.builder.impl.KnowledgeBuilderImpl;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.pipeline.Callable;
+import org.drools.runtime.pipeline.ListAdapter;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.pipeline.impl.BasePipelineContext;
+import org.drools.runtime.pipeline.impl.JxlsTransformer;
+import org.drools.runtime.pipeline.impl.ListAdapterImpl;
+import org.mvel2.MVEL;
+import org.mvel2.ParserConfiguration;
+import org.mvel2.ParserContext;
+
+import junit.framework.TestCase;
+import net.sf.jxls.reader.ReaderBuilder;
+import net.sf.jxls.reader.XLSDataReadException;
+import net.sf.jxls.reader.XLSReadStatus;
+import net.sf.jxls.reader.XLSReader;
+
+public class JxlsTest extends TestCase {
+ public void test1() throws Exception {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ // kbuilder.add( ResourceFactory.newClassPathResource( "test_JXLS.drl", getClass() ), ResourceType.DRL );
+
+ ClassLoader cl = ((KnowledgeBuilderImpl)kbuilder).pkgBuilder.getRootClassLoader();
+ Thread.currentThread().setContextClassLoader( cl );
+
+ InputStream inputXLS = new BufferedInputStream(getClass().getResourceAsStream( "departmentData.xls"));
+
+ XLSReader mainReader = ReaderBuilder.buildFromXML( ResourceFactory.newClassPathResource( "departments.xml", getClass() ).getInputStream() );
+ Transformer transformer = PipelineFactory.newJxlsTransformer(mainReader, "[ 'departments' : new java.util.ArrayList(), 'company' : new org.drools.runtime.pipeline.impl.Company() ]");
+
+ Callable callable = new CallableImpl();
+
+ callable.setReceiver( transformer );
+ transformer.setReceiver( callable );
+ BasePipelineContext context = new BasePipelineContext( Thread.currentThread().getContextClassLoader() );
+
+ Map<String, Object> beans = ( Map<String, Object> ) callable.call( inputXLS, context );
+
+ assertEquals( Company.class.getName(), beans.get( "company" ).getClass().getName());
+ assertEquals( ArrayList.class.getName(), beans.get( "departments" ).getClass().getName());
+
+ Company company = ( Company ) beans.get( "company" );
+ assertEquals( "A-Team", company.getName() );
+ assertEquals( 4, company.getEmployee().size() );
+
+ List<Department> departments = ( List<Department> ) beans.get( "departments" );
+ assertEquals( 3, departments.size() );
+
+ Department department = departments.get( 0 );
+ assertEquals( "IT", department.getName() );
+ assertEquals( 5, department.getStaff().size() );
+
+ department = departments.get( 2 );
+ assertEquals( "BA", department.getName() );
+ assertEquals( 4, department.getStaff().size() );
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleConsumer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleConsumer.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleConsumer.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,96 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.Properties;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import org.apache.activemq.broker.BrokerService;
+
+public class SimpleConsumer {
+
+ public SimpleConsumer() {
+ super();
+ }
+
+ public static void main(String[] args) throws Exception {
+ BrokerService broker = new BrokerService();
+ // configure the broker
+ broker.setBrokerName( "consumer" );
+ broker.addConnector( "tcp://localhost:61616" );
+ broker.start();
+
+ Context jndiContext = null;
+ ConnectionFactory connectionFactory = null;
+ Connection connection = null;
+ Session session = null;
+ Destination destination = null;
+ MessageConsumer consumer = null;
+ TextMessage message = null;
+ String destinationName = "dynamicQueues/FOO.BAR";
+ final int NUM_MSGS = 50;
+
+ try {
+ Properties props = new Properties();
+ props.setProperty( Context.INITIAL_CONTEXT_FACTORY,
+ "org.apache.activemq.jndi.ActiveMQInitialContextFactory" );
+ props.setProperty( Context.PROVIDER_URL,
+ "tcp://localhost:61616" );
+ jndiContext = new InitialContext( props );
+ }
+
+ catch ( NamingException e ) {
+ System.out.println( "Could not create JNDI API context: " + e.toString() );
+ System.exit( 1 );
+ }
+
+ try {
+ connectionFactory = (ConnectionFactory) jndiContext.lookup( "ConnectionFactory" );
+ destination = (Destination) jndiContext.lookup( destinationName );
+ }
+
+ catch ( NamingException e ) {
+ e.printStackTrace();
+ System.out.println( "JNDI API lookup failed: " + e );
+ System.exit( 1 );
+ }
+
+ try {
+ connection = connectionFactory.createConnection();
+ session = connection.createSession( false,
+ Session.AUTO_ACKNOWLEDGE );
+
+ //producer = session.createProducer(destination);
+ consumer = session.createConsumer( destination );
+ connection.start();
+ //message = session.createTextMessage();
+
+ for ( int i = 0; i < NUM_MSGS; i++ ) {
+ Message msg = consumer.receive();
+ System.out.println( "received : " + msg );
+ if ( msg instanceof TextMessage ) {
+ message = (TextMessage) msg;
+ System.out.println( message.getText() );
+ }
+ }
+ } catch ( JMSException e ) {
+ System.out.println( "Exception occurred: " + e );
+ } finally {
+ if ( connection != null ) {
+ try {
+ connection.close();
+ } catch ( JMSException e ) {
+ }
+ }
+ }
+ }
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleJmsMessengerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleJmsMessengerTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleJmsMessengerTest.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,136 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.naming.Context;
+
+import junit.framework.TestCase;
+
+import org.apache.activemq.broker.BrokerService;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.ResultHandlerFactory;
+import org.drools.runtime.rule.FactHandle;
+
+public class SimpleJmsMessengerTest extends TestCase {
+
+ private SimpleProducer simpleProducer;
+ private BrokerService broker;
+ private String destinationName = "dynamicQueues/FOO.BAR";
+ private String url = "vm://localhost:61616";
+
+ private Properties props;
+
+ protected void setUp() {
+ try {
+ this.broker = new BrokerService();
+ // configure the broker
+ this.broker.setBrokerName( "consumer" );
+ this.broker.addConnector( url );
+ this.broker.start();
+
+ props = new Properties();
+ props.setProperty( Context.INITIAL_CONTEXT_FACTORY,
+ "org.apache.activemq.jndi.ActiveMQInitialContextFactory" );
+ props.setProperty( Context.PROVIDER_URL,
+ this.url );
+
+ this.simpleProducer = new SimpleProducer( props,
+ this.destinationName );
+ this.simpleProducer.start();
+ } catch ( Exception e ) {
+ throw new RuntimeException( e );
+ }
+ }
+
+ protected void tearDown() throws Exception {
+ this.simpleProducer.stop();
+ this.broker.stop();
+ }
+
+ public void testJms() throws Exception {
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+ StatefulKnowledgeSessionPipelineImpl pipeline = new StatefulKnowledgeSessionPipelineImpl( ksession );
+
+ JmsUnwrapMessageObject unwrapObjectStage = new JmsUnwrapMessageObject();
+ StatefulKnowledgeSessionInsertStage insertStage = new StatefulKnowledgeSessionInsertStage();
+ unwrapObjectStage.setReceiver( insertStage );
+ ExecuteResultHandler resultHandlerStage = new ExecuteResultHandler();
+ insertStage.setReceiver( resultHandlerStage );
+ pipeline.setReceiver( unwrapObjectStage );
+
+ ResultHandleFactoryImpl factory = new ResultHandleFactoryImpl();
+ JmsMessenger feeder = new JmsMessenger( pipeline,
+ props,
+ this.destinationName,
+ factory );
+ feeder.start();
+ this.simpleProducer.sendObject( "hello" );
+ this.simpleProducer.sendObject( "hello1" );
+ this.simpleProducer.sendObject( "hello2" );
+ this.simpleProducer.sendObject( "hello3" );
+
+ for ( int i = 0; i < 5; i++ ) {
+ // iterate and sleep 5 times, to give these messages time to complete.
+ if ( factory.list.size() == 4 ) {
+ break;
+ }
+ Thread.sleep( 500 );
+ }
+
+ assertEquals( 4,
+ factory.list.size() );
+
+ FactHandle factHandle = (FactHandle) ((Map) ((ResultHandlerImpl) factory.list.get( 0 )).getObject()).keySet().iterator().next();
+ assertEquals( "hello",
+ ksession.getObject( factHandle ) );
+
+ factHandle = (FactHandle) ((Map) ((ResultHandlerImpl) factory.list.get( 1 )).getObject()).keySet().iterator().next();
+ assertEquals( "hello1",
+ ksession.getObject( factHandle ) );
+
+ factHandle = (FactHandle) ((Map) ((ResultHandlerImpl) factory.list.get( 2 )).getObject()).keySet().iterator().next();
+ assertEquals( "hello2",
+ ksession.getObject( factHandle ) );
+
+ factHandle = (FactHandle) ((Map) ((ResultHandlerImpl) factory.list.get( 3 )).getObject()).keySet().iterator().next();
+ assertEquals( "hello3",
+ ksession.getObject( factHandle ) );
+ feeder.stop();
+
+ }
+
+ public static class ResultHandleFactoryImpl
+ implements
+ ResultHandlerFactory {
+ List list = new ArrayList();
+
+ public ResultHandler newResultHandler() {
+ ResultHandler handler = new ResultHandlerImpl();
+ list.add( handler );
+ return handler;
+ }
+
+ }
+
+ public static class ResultHandlerImpl
+ implements
+ ResultHandler {
+ Object object;
+
+ public void handleResult(Object object) {
+ this.object = object;
+ }
+
+ public Object getObject() {
+ return this.object;
+ }
+ }
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleProducer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleProducer.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SimpleProducer.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,157 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.Serializable;
+import java.util.Properties;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import org.apache.activemq.command.ActiveMQObjectMessage;
+import org.apache.activemq.command.ActiveMQTextMessage;
+
+public class SimpleProducer {
+
+ private ConnectionFactory connectionFactory;
+ private Destination destination;
+ private MessageProducer producer;
+ private Connection connection;
+ private Session session;
+
+ public SimpleProducer(Properties properties,
+ String destinationName) {
+ try {
+ InitialContext jndiContext = new InitialContext( properties );
+ this.connectionFactory = (ConnectionFactory) jndiContext.lookup( "ConnectionFactory" );
+ this.destination = (Destination) jndiContext.lookup( destinationName );
+ } catch ( Exception e ) {
+ throw new RuntimeException( "Unable to instantiate JmsFeeder",
+ e );
+ }
+ }
+
+ public void start() {
+ try {
+ this.connection = this.connectionFactory.createConnection();
+ this.session = this.connection.createSession( false,
+ Session.AUTO_ACKNOWLEDGE );
+ this.producer = this.session.createProducer( destination );
+ this.connection.start();
+ } catch ( Exception e ) {
+ throw new RuntimeException( e );
+ }
+ }
+
+ public void setText(String text) {
+ ActiveMQTextMessage textMessage = new ActiveMQTextMessage();
+ try {
+ textMessage.setText( text );
+ this.producer.send( textMessage );
+ } catch ( JMSException e ) {
+ throw new RuntimeException( e );
+ }
+ }
+
+ public void sendObject(Serializable object) {
+ ActiveMQObjectMessage objectMessage = new ActiveMQObjectMessage();
+ try {
+ objectMessage.setObject( object );
+ this.producer.send( objectMessage );
+ } catch ( JMSException e ) {
+ throw new RuntimeException( e );
+ }
+ }
+
+ public void stop() {
+ try {
+ // this.run = false;
+ // this will interrupt the receive()
+ this.producer.close();
+ this.connection.stop();
+ } catch ( JMSException e ) {
+ throw new RuntimeException( e );
+ }
+ }
+
+ public void simpleProducer2() {
+ Context jndiContext = null;
+ ConnectionFactory connectionFactory = null;
+ Connection connection = null;
+ Session session = null;
+ Destination destination = null;
+ MessageProducer producer = null;
+ String destinationName = "dynamicQueues/FOO.BAR";
+ final int numMsgs = 50;
+
+ System.out.println( "Destination name is " + destinationName );
+ /*
+ * Create a JNDI API InitialContext object
+ */
+ try {
+ Properties props = new Properties();
+ props.setProperty( Context.INITIAL_CONTEXT_FACTORY,
+ "org.apache.activemq.jndi.ActiveMQInitialContextFactory" );
+ props.setProperty( Context.PROVIDER_URL,
+ "vm://localhost:61616" );
+ jndiContext = new InitialContext( props );
+ } catch ( NamingException e ) {
+ e.printStackTrace();
+ System.out.println( "Could not create JNDI API context: " + e.toString() );
+ System.exit( 1 );
+ }
+
+ /*
+ * Look up connection factory and destination.
+ */
+ try {
+ connectionFactory = (ConnectionFactory) jndiContext.lookup( "ConnectionFactory" );
+ destination = (Destination) jndiContext.lookup( destinationName );
+ } catch ( NamingException e ) {
+ e.printStackTrace();
+ //LOG.info("JNDI API lookup failed: " + e);
+ System.exit( 1 );
+ }
+
+ /*
+ * Create connection. Create session from connection; false means
+ * session is not transacted. Create sender and text message. Send
+ * messages, varying text slightly. Send end-of-messages message.
+ * Finally, close connection.
+ */
+ try {
+ connection = connectionFactory.createConnection();
+ session = connection.createSession( false,
+ Session.AUTO_ACKNOWLEDGE );
+ //session.createTopic( "" )
+ producer = session.createProducer( destination );
+ TextMessage message = session.createTextMessage();
+ for ( int i = 0; i < numMsgs; i++ ) {
+ message.setText( "This is message " + (i + 1) );
+ System.out.println( "Sending message: " + message.getText() );
+ producer.send( message );
+ }
+
+ /*
+ * Send a non-text control message indicating end of messages.
+ */
+ producer.send( session.createMessage() );
+ } catch ( JMSException e ) {
+ e.printStackTrace();
+ System.out.println( "Exception occurred: " + e );
+ } finally {
+ if ( connection != null ) {
+ try {
+ connection.close();
+ } catch ( JMSException e ) {
+ }
+ }
+ }
+ }
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmookStatefulSessionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmookStatefulSessionTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmookStatefulSessionTest.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,163 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.transform.stream.StreamSource;
+
+import junit.framework.TestCase;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.Expression;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.Splitter;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.rule.FactHandle;
+import org.milyn.Smooks;
+import org.milyn.io.StreamUtils;
+
+public class SmookStatefulSessionTest extends TestCase {
+
+ public void testDirectRoot() throws Exception {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ kbuilder.add( ResourceFactory.newClassPathResource( "test_SmooksDirectRoot.drl",
+ SmookStatefulSessionTest.class ),
+ ResourceType.DRL );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+ List list = new ArrayList();
+ ksession.setGlobal( "list",
+ list );
+
+ Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+ KnowledgeRuntimeCommand insertStage = PipelineFactory.newStatefulKnowledgeSessionInsert();
+ insertStage.setReceiver( executeResultHandler );
+
+ // Instantiate Smooks with the config...
+ Smooks smooks = new Smooks( getClass().getResourceAsStream( "smooks-config.xml" ) );
+
+ Transformer transformer = PipelineFactory.newSmooksFromSourceTransformer( smooks,
+ "orderItem" );
+ transformer.setReceiver( insertStage );
+
+ Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( transformer );
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ pipeline.insert( getClass().getResourceAsStream( "SmooksDirectRoot.xml" ),
+ resultHandler );
+ ksession.fireAllRules();
+
+ Map<FactHandle, Object> handles = (Map<FactHandle, Object>) resultHandler.getObject();
+
+ assertEquals( 1,
+ handles.size() );
+ assertEquals( 1,
+ list.size() );
+
+ assertEquals( "example.OrderItem",
+ list.get( 0 ).getClass().getName() );
+ }
+
+ public void testNestedIterable() throws Exception {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ kbuilder.add( ResourceFactory.newClassPathResource( "test_SmooksNestedIterable.drl",
+ SmookStatefulSessionTest.class ),
+ ResourceType.DRL );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+ List list = new ArrayList();
+ ksession.setGlobal( "list",
+ list );
+
+ Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+ KnowledgeRuntimeCommand insertStage = PipelineFactory.newStatefulKnowledgeSessionInsert();
+ insertStage.setReceiver( executeResultHandler );
+
+ Splitter splitter = PipelineFactory.newIterateSplitter();
+ splitter.setReceiver( insertStage );
+
+ Expression expression = PipelineFactory.newMvelExpression( "children" );
+ expression.setReceiver( splitter );
+
+ // Instantiate Smooks with the config...
+ Smooks smooks = new Smooks( getClass().getResourceAsStream( "smooks-config.xml" ) );
+
+ Transformer transformer = PipelineFactory.newSmooksFromSourceTransformer( smooks,
+ "root" );
+ transformer.setReceiver( expression );
+
+ Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( transformer );
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ pipeline.insert( new StreamSource( getClass().getResourceAsStream( "SmooksNestedIterable.xml" ) ),
+ resultHandler );
+
+ Map<FactHandle, Object> handles = (Map<FactHandle, Object>) resultHandler.getObject();
+ ksession.fireAllRules();
+
+ assertEquals( 2,
+ handles.size() );
+ assertEquals( 2,
+ list.size() );
+
+ assertEquals( "example.OrderItem",
+ list.get( 0 ).getClass().getName() );
+ assertEquals( "example.OrderItem",
+ list.get( 1 ).getClass().getName() );
+
+ assertNotSame( list.get( 0 ),
+ list.get( 1 ) );
+ }
+
+ private static byte[] readInputMessage(InputStream stream) {
+ try {
+ return StreamUtils.readStream( stream );
+ } catch ( IOException e ) {
+ e.printStackTrace();
+ return "<no-message/>".getBytes();
+ }
+ }
+
+ public static class ResultHandlerImpl
+ implements
+ ResultHandler {
+ Object object;
+
+ public void handleResult(Object object) {
+ this.object = object;
+ }
+
+ public Object getObject() {
+ return this.object;
+ }
+ }
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmookStatelessSessionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmookStatelessSessionTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmookStatelessSessionTest.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,158 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.transform.stream.StreamSource;
+
+import junit.framework.TestCase;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.common.InternalFactHandle;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatelessKnowledgeSession;
+import org.drools.runtime.help.BatchExecutionHelper;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.Expression;
+import org.drools.runtime.pipeline.Join;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.Receiver;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.Splitter;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.rule.FactHandle;
+import org.milyn.Smooks;
+import org.milyn.io.StreamUtils;
+
+public class SmookStatelessSessionTest extends TestCase {
+
+ public void testSmooksDirectRoot() throws Exception {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ kbuilder.add( ResourceFactory.newClassPathResource( "test_SmooksDirectRoot.drl",
+ SmookStatefulSessionTest.class ),
+ ResourceType.DRL );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
+ List list = new ArrayList();
+ ksession.setGlobal( "list",
+ list );
+
+ Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+ Action assignResult = PipelineFactory.newAssignObjectAsResult();
+ assignResult.setReceiver( executeResultHandler );
+
+ KnowledgeRuntimeCommand batchExecution = PipelineFactory.newCommandExecutor();
+ batchExecution.setReceiver( assignResult );
+
+ KnowledgeRuntimeCommand insertStage = PipelineFactory.newInsertObjectCommand();
+ insertStage.setReceiver( batchExecution );
+
+ // Instantiate Smooks with the config...
+ Smooks smooks = new Smooks( getClass().getResourceAsStream( "smooks-config.xml" ) );
+
+ Transformer transformer = PipelineFactory.newSmooksFromSourceTransformer( smooks,
+ "orderItem" );
+ transformer.setReceiver( insertStage );
+
+ Pipeline pipeline = PipelineFactory.newStatelessKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( transformer );
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ pipeline.insert( new StreamSource( getClass().getResourceAsStream( "SmooksDirectRoot.xml" ) ),
+ resultHandler );
+
+ assertEquals( 1,
+ list.size() );
+
+ assertEquals( "example.OrderItem",
+ list.get( 0 ).getClass().getName() );
+ }
+
+ public void testSmooksNestedIterable() throws Exception {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ kbuilder.add( ResourceFactory.newClassPathResource( "test_SmooksNestedIterable.drl",
+ SmookStatefulSessionTest.class ),
+ ResourceType.DRL );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
+ List list = new ArrayList();
+ ksession.setGlobal( "list",
+ list );
+
+ Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+ Action assignResult = PipelineFactory.newAssignObjectAsResult();
+ assignResult.setReceiver( executeResultHandler );
+
+ KnowledgeRuntimeCommand batchExecution = PipelineFactory.newCommandExecutor();
+ batchExecution.setReceiver( assignResult );
+
+ KnowledgeRuntimeCommand insertElementsStage = PipelineFactory.newInsertElementsCommand();
+ insertElementsStage.setReceiver( batchExecution );
+
+ Expression mvelExpression = PipelineFactory.newMvelExpression( "this.children" );
+ mvelExpression.setReceiver( insertElementsStage );
+
+ // Instantiate Smooks with the config...
+ Smooks smooks = new Smooks( getClass().getResourceAsStream( "smooks-config.xml" ) );
+
+ Transformer transformer = PipelineFactory.newSmooksFromSourceTransformer( smooks,
+ "root" );
+ transformer.setReceiver( mvelExpression );
+
+ Pipeline pipeline = PipelineFactory.newStatelessKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( transformer );
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ pipeline.insert( new StreamSource( getClass().getResourceAsStream( "SmooksNestedIterable.xml" ) ),
+ resultHandler );
+
+ assertEquals( 2,
+ list.size() );
+
+ assertEquals( "example.OrderItem",
+ list.get( 0 ).getClass().getName() );
+ assertEquals( "example.OrderItem",
+ list.get( 1 ).getClass().getName() );
+
+ assertNotSame( list.get( 0 ),
+ list.get( 1 ) );
+ }
+
+ public static class ResultHandlerImpl
+ implements
+ ResultHandler {
+ Object object;
+
+ public void handleResult(Object object) {
+ this.object = object;
+ }
+
+ public Object getObject() {
+ return this.object;
+ }
+ }
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmooksFactTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmooksFactTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmooksFactTest.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,103 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.transform.stream.StreamSource;
+
+import org.custommonkey.xmlunit.Diff;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.rule.FactHandle;
+import org.milyn.Smooks;
+
+import junit.framework.TestCase;
+
+public class SmooksFactTest extends TestCase {
+
+ public void testFact() throws Exception {
+ String xml = "<org.drools.runtime.pipeline.impl.Root><children><example.OrderItem><price>8.9</price><quantity>2</quantity><productId>111</productId></example.OrderItem><example.OrderItem><price>5.2</price><quantity>7</quantity><productId>222</productId></example.OrderItem></children></org.drools.runtime.pipeline.impl.Root>";
+
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ kbuilder.add( ResourceFactory.newClassPathResource( "test_SmooksNestedIterable.drl",
+ SmooksFactTest.class ),
+ ResourceType.DRL );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+ Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+ KnowledgeRuntimeCommand insertStage = PipelineFactory.newStatefulKnowledgeSessionInsert();
+ insertStage.setReceiver( executeResultHandler );
+
+ Smooks smooks = new Smooks( getClass().getResourceAsStream( "smooks-config.xml" ) );
+
+ Transformer transformer = PipelineFactory.newSmooksFromSourceTransformer( smooks,
+ "root" );
+ transformer.setReceiver( insertStage );
+
+ Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( transformer );
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ pipeline.insert( new StreamSource( getClass().getResourceAsStream( "SmooksNestedIterable.xml" ) ),
+ resultHandler );
+
+ FactHandle factHandle = ( FactHandle ) ((Map)resultHandler.getObject()).keySet().iterator().next();
+ assertNotNull( factHandle );
+
+ // now round trip that fact
+ Action executeResult = PipelineFactory.newExecuteResultHandler();
+
+ Action assignAsResult = PipelineFactory.newAssignObjectAsResult();
+ assignAsResult.setReceiver( executeResult );
+
+ transformer = PipelineFactory.newSmooksToSourceTransformer( smooks );
+ transformer.setReceiver( assignAsResult );
+
+ KnowledgeRuntimeCommand getObject = PipelineFactory.newStatefulKnowledgeSessionGetObject();
+ getObject.setReceiver( transformer );
+
+ pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( getObject );
+
+ resultHandler = new ResultHandlerImpl();
+ pipeline.insert( factHandle, resultHandler );
+
+ assertTrue( new Diff( xml, (String) resultHandler.getObject() ).similar() );
+ }
+
+ public static class ResultHandlerImpl
+ implements
+ ResultHandler {
+ Object object;
+
+ public void handleResult(Object object) {
+ this.object = object;
+ }
+
+ public Object getObject() {
+ return this.object;
+ }
+ }
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmooksGlobalTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmooksGlobalTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/SmooksGlobalTest.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,98 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.transform.stream.StreamSource;
+
+import org.custommonkey.xmlunit.Diff;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.rule.FactHandle;
+import org.milyn.Smooks;
+
+import com.thoughtworks.xstream.XStream;
+
+import junit.framework.TestCase;
+
+public class SmooksGlobalTest extends TestCase {
+
+ public void testGlobal() throws Exception {
+ String xml = "<org.drools.runtime.pipeline.impl.Root><children><example.OrderItem><price>8.9</price><quantity>2</quantity><productId>111</productId></example.OrderItem><example.OrderItem><price>5.2</price><quantity>7</quantity><productId>222</productId></example.OrderItem></children></org.drools.runtime.pipeline.impl.Root>";
+
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ kbuilder.add( ResourceFactory.newClassPathResource( "test_SmooksNestedIterable.drl",
+ SmooksGlobalTest.class ),
+ ResourceType.DRL );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+ KnowledgeRuntimeCommand setGlobalStage = PipelineFactory.newStatefulKnowledgeSessionSetGlobal( "root" );
+
+ Smooks smooks = new Smooks( getClass().getResourceAsStream( "smooks-config.xml" ) );
+
+ Transformer transformer = PipelineFactory.newSmooksFromSourceTransformer( smooks,
+ "root" );
+ transformer.setReceiver( setGlobalStage );
+
+ Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( transformer );
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ pipeline.insert( new StreamSource( getClass().getResourceAsStream( "SmooksNestedIterable.xml" ) ),
+ resultHandler );
+
+ // now round trip that global
+
+ Action executeResult = PipelineFactory.newExecuteResultHandler();
+
+ Action assignAsResult = PipelineFactory.newAssignObjectAsResult();
+ assignAsResult.setReceiver( executeResult );
+
+ transformer = PipelineFactory.newSmooksToSourceTransformer( smooks );
+ transformer.setReceiver( assignAsResult );
+
+ pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( transformer );
+
+ resultHandler = new ResultHandlerImpl();
+ pipeline.insert( ksession.getGlobal( "root" ),
+ resultHandler );
+
+ assertTrue( new Diff( xml, (String) resultHandler.getObject() ).similar() );
+ }
+
+ public static class ResultHandlerImpl
+ implements
+ ResultHandler {
+ Object object;
+
+ public void handleResult(Object object) {
+ this.object = object;
+ }
+
+ public Object getObject() {
+ return this.object;
+ }
+ }
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamBatchExecutionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamBatchExecutionTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamBatchExecutionTest.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,2008 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.custommonkey.xmlunit.Diff;
+import org.custommonkey.xmlunit.XMLAssert;
+import org.custommonkey.xmlunit.XMLUnit;
+import org.custommonkey.xmlunit.examples.RecursiveElementNameAndTextQualifier;
+import org.drools.Cheese;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.KnowledgeBaseFactoryService;
+import org.drools.Person;
+import org.drools.TestVariable;
+import org.drools.builder.DirectoryLookupFactoryService;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.KnowledgeBuilderFactoryService;
+import org.drools.builder.ResourceType;
+import org.drools.command.runtime.rule.ModifyCommand;
+import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalRuleBase;
+import org.drools.definition.KnowledgePackage;
+import org.drools.grid.ExecutionNode;
+import org.drools.grid.local.LocalConnection;
+import org.drools.impl.StatefulKnowledgeSessionImpl;
+import org.drools.io.Resource;
+import org.drools.io.ResourceFactory;
+import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.instance.context.variable.VariableScopeInstance;
+import org.drools.runtime.ExecutionResults;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.StatelessKnowledgeSession;
+import org.drools.runtime.help.BatchExecutionHelper;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.process.ProcessInstance;
+import org.drools.runtime.process.WorkItem;
+import org.drools.runtime.process.WorkItemHandler;
+import org.drools.runtime.process.WorkItemManager;
+import org.drools.runtime.process.WorkflowProcessInstance;
+import org.drools.runtime.rule.FactHandle;
+import org.drools.runtime.rule.QueryResultsRow;
+import org.xml.sax.SAXException;
+
+import com.thoughtworks.xstream.XStream;
+
+public class XStreamBatchExecutionTest extends TestCase {
+
+ protected void setUp() throws Exception {
+ XMLUnit.setIgnoreComments( true );
+ XMLUnit.setIgnoreWhitespace( true );
+ XMLUnit.setIgnoreAttributeOrder( true );
+ XMLUnit.setNormalizeWhitespace( true );
+ XMLUnit.setNormalize( true );
+ }
+
+ private void assertXMLEqual(String expectedXml,
+ String resultXml) {
+ try {
+ Diff diff = new Diff( expectedXml,
+ resultXml );
+ diff.overrideElementQualifier( new RecursiveElementNameAndTextQualifier() );
+ XMLAssert.assertXMLEqual( diff,
+ true );
+ } catch ( Exception e ) {
+ throw new RuntimeException( "XML Assertion failure",
+ e );
+ }
+ }
+
+ public void testListenForChanges() throws Exception {
+
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "import org.drools.ChangeCollector \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese(price==25) \n";
+ str += " \n";
+ str += " then \n";
+ str += "end\n";
+
+ str += "rule rule2 \n";
+ str += " when \n";
+ str += " p : Person(name=='mic') \n";
+ str += " c : Cheese(price != 42) \n";
+ str += " \n";
+ str += " then \n";
+ str += " c.setPrice( 42 ); \n";
+ str += " update(c); \n";
+ str += "end\n";
+
+ str += "rule rule3 \n";
+ str += " when \n";
+ str += " p : Person(name=='mark') \n";
+ str += " c : Cheese(price == 42) \n";
+ str += " \n";
+ str += " then \n";
+ str += " retract(c); \n";
+ str += "end\n";
+
+ str += "rule ruleBootStrap \n";
+ str += "salience 10000\n";
+ str += " when \n";
+ str += " $c : ChangeCollector() \n";
+ str += " \n";
+ str += " then \n";
+ str += " kcontext.getKnowledgeRuntime().addEventListener($c); \n";
+ str += "end\n";
+
+ str += "rule ruleCleanup \n";
+ str += "salience -10000\n";
+ str += " when \n";
+ str += " $c : ChangeCollector() \n";
+ str += " \n";
+ str += " then \n";
+ str += " kcontext.getKnowledgeRuntime().removeEventListener($c); \n";
+ str += " retract($c); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <insert out-identifier='outStilton'>";
+ inXml += " <org.drools.Cheese>";
+ inXml += " <type>stilton</type>";
+ inXml += " <price>25</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.drools.Cheese>";
+ inXml += " </insert>";
+ inXml += " <fire-all-rules />";
+ inXml += "</batch-execution>";
+
+ StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+
+ inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <insert out-identifier='person'>";
+ inXml += " <org.drools.Person>";
+ inXml += " <name>mic</name>";
+ inXml += " </org.drools.Person>";
+ inXml += " </insert>";
+ inXml += " <insert out-identifier='changes'>";
+ inXml += " <org.drools.ChangeCollector/>";
+ inXml += " </insert>";
+ inXml += " <fire-all-rules />";
+ inXml += "</batch-execution>";
+
+ resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+
+ assertTrue( outXml.indexOf( "<changes>" ) > -1 );
+
+ inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <insert out-identifier='person'>";
+ inXml += " <org.drools.Person>";
+ inXml += " <name>mark</name>";
+ inXml += " </org.drools.Person>";
+ inXml += " </insert>";
+ inXml += " <insert out-identifier='changes'>";
+ inXml += " <org.drools.ChangeCollector/>";
+ inXml += " </insert>";
+ inXml += " <fire-all-rules />";
+ inXml += "</batch-execution>";
+
+ resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ outXml = (String) resultHandler.getObject();
+
+ assertTrue( outXml.indexOf( "<retracted>" ) > -1 );
+
+ }
+
+ public void testInsertWithDefaults() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <insert out-identifier='outStilton'>";
+ inXml += " <org.drools.Cheese>";
+ inXml += " <type>stilton</type>";
+ inXml += " <price>25</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.drools.Cheese>";
+ inXml += " </insert>";
+ inXml += " <fire-all-rules />";
+ inXml += "</batch-execution>";
+
+ StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+ Cheese stilton = (Cheese) result.getValue( "outStilton" );
+ assertEquals( 30,
+ stilton.getPrice() );
+
+ FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
+ stilton = (Cheese) ksession.getObject( factHandle );
+ assertEquals( 30,
+ stilton.getPrice() );
+
+ String expectedXml = "";
+ expectedXml += "<execution-results>\n";
+ expectedXml += " <result identifier=\"outStilton\">\n";
+ expectedXml += " <org.drools.Cheese>\n";
+ expectedXml += " <type>stilton</type>\n";
+ expectedXml += " <oldPrice>0</oldPrice>\n";
+ expectedXml += " <price>30</price>\n";
+ expectedXml += " </org.drools.Cheese>\n";
+ expectedXml += " </result>\n";
+ expectedXml += " <fact-handle identifier=\"outStilton\" external-form=\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\" /> \n";
+ expectedXml += "</execution-results>\n";
+
+ assertXMLEqual( expectedXml,
+ outXml );
+ }
+
+ public void testInsertWithReturnObjectFalse() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <insert out-identifier='outStilton' return-object='false'>";
+ inXml += " <org.drools.Cheese>";
+ inXml += " <type>stilton</type>";
+ inXml += " <price>25</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.drools.Cheese>";
+ inXml += " </insert>";
+ inXml += " <fire-all-rules />";
+ inXml += "</batch-execution>";
+
+ StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+ assertNull( result.getValue( "outStilton" ) );
+
+ FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
+ Cheese stilton = (Cheese) ksession.getObject( factHandle );
+ assertEquals( 30,
+ stilton.getPrice() );
+
+ String expectedXml = "";
+ expectedXml += "<execution-results>\n";
+ expectedXml += " <fact-handle identifier=\"outStilton\" external-form=\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\" /> \n";
+ expectedXml += "</execution-results>\n";
+
+ assertXMLEqual( expectedXml,
+ outXml );
+ }
+
+ public void testGetObject() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <insert out-identifier='outStilton'>";
+ inXml += " <org.drools.Cheese>";
+ inXml += " <type>stilton</type>";
+ inXml += " <price>25</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.drools.Cheese>";
+ inXml += " </insert>";
+ inXml += " <fire-all-rules />";
+ inXml += "</batch-execution>";
+
+ StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+ Cheese stilton = (Cheese) result.getValue( "outStilton" );
+ assertEquals( 30,
+ stilton.getPrice() );
+
+ FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
+ inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <get-object out-identifier='outStilton' fact-handle='" + factHandle.toExternalForm() + "' />";
+ inXml += "</batch-execution>";
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ outXml = (String) resultHandler.getObject();
+ result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+ stilton = (Cheese) result.getValue( "outStilton" );
+ assertEquals( 30,
+ stilton.getPrice() );
+ }
+
+ public void testRetractObject() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <insert out-identifier='outStilton'>";
+ inXml += " <org.drools.Cheese>";
+ inXml += " <type>stilton</type>";
+ inXml += " <price>25</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.drools.Cheese>";
+ inXml += " </insert>";
+ inXml += " <fire-all-rules />";
+ inXml += "</batch-execution>";
+
+ StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+ Cheese stilton = (Cheese) result.getValue( "outStilton" );
+ assertEquals( 30,
+ stilton.getPrice() );
+
+ FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
+ inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <retract fact-handle='" + factHandle.toExternalForm() + "' />";
+ inXml += "</batch-execution>";
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+
+ inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <get-object out-identifier='outStilton' fact-handle='" + factHandle.toExternalForm() + "' />";
+ inXml += "</batch-execution>";
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ outXml = (String) resultHandler.getObject();
+ result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+ assertNull( result.getValue( "outStilton" ) );
+ }
+
+ public void testModifyObject() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <insert out-identifier='outStilton'>";
+ inXml += " <org.drools.Cheese>";
+ inXml += " <type>stilton</type>";
+ inXml += " <price>25</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.drools.Cheese>";
+ inXml += " </insert>";
+ inXml += " <fire-all-rules />";
+ inXml += "</batch-execution>";
+
+ StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+ Cheese stilton = (Cheese) result.getValue( "outStilton" );
+ assertEquals( 30,
+ stilton.getPrice() );
+
+ FactHandle factHandle = ((FactHandle) result.getFactHandle( "outStilton" ));
+
+ String expectedXml = "";
+ expectedXml += "<execution-results>\n";
+ expectedXml += " <result identifier=\"outStilton\">\n";
+ expectedXml += " <org.drools.Cheese>\n";
+ expectedXml += " <type>stilton</type>\n";
+ expectedXml += " <oldPrice>0</oldPrice>\n";
+ expectedXml += " <price>30</price>\n";
+ expectedXml += " </org.drools.Cheese>\n";
+ expectedXml += " </result>\n";
+ expectedXml += " <fact-handle identifier=\"outStilton\" external-form=\"" + factHandle.toExternalForm() + "\" /> \n";
+ expectedXml += "</execution-results>\n";
+
+ assertXMLEqual( expectedXml,
+ outXml );
+
+ inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <modify fact-handle='" + factHandle.toExternalForm() + "'> <set accessor='oldPrice' value='\"42\"' /><set accessor='price' value='50' /></modify>";
+ inXml += " <fire-all-rules />";
+ inXml += "</batch-execution>";
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+
+ inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <get-object out-identifier='outCheddar' fact-handle='" + factHandle.toExternalForm() + "' />";
+ inXml += "</batch-execution>";
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ outXml = (String) resultHandler.getObject();
+ result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+ Cheese cheddar = (Cheese) result.getValue( "outCheddar" );
+ assertEquals( 42,
+ cheddar.getOldPrice() );
+ assertEquals( 55,
+ cheddar.getPrice() );
+
+ //now test for code injection:
+ ModifyCommand.ALLOW_MODIFY_EXPRESSIONS = false;
+ inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <modify fact-handle='" + factHandle.toExternalForm() + "'> <set accessor='type' value='44\"; System.exit(1);' /><set accessor='price' value='50' /></modify>";
+ inXml += " <fire-all-rules />";
+ inXml += "</batch-execution>";
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ outXml = (String) resultHandler.getObject();
+ result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+ ModifyCommand.ALLOW_MODIFY_EXPRESSIONS = true;
+
+ }
+
+ public void testInsertElements() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "global java.util.List list \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n";
+ str += " list.add( $c );";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <set-global identifier='list' out='true' return-objects='true'>";
+ inXml += " <list/>";
+ inXml += " </set-global>";
+ inXml += " <insert-elements>";
+ inXml += " <org.drools.Cheese>";
+ inXml += " <type>stilton</type>";
+ inXml += " <price>25</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.drools.Cheese>";
+ inXml += " <org.drools.Cheese>";
+ inXml += " <type>stilton</type>";
+ inXml += " <price>30</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.drools.Cheese>";
+ inXml += " </insert-elements>";
+ inXml += "</batch-execution>";
+
+ StatelessKnowledgeSession ksession = getSession2( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipeline( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+
+ String expectedXml = "";
+ expectedXml += "<execution-results>\n";
+ expectedXml += " <result identifier='list'>\n";
+ expectedXml += " <list>\n";
+ expectedXml += " <org.drools.Cheese>\n";
+ expectedXml += " <type>stilton</type>\n";
+ expectedXml += " <price>35</price>\n";
+ expectedXml += " <oldPrice>0</oldPrice>\n";
+ expectedXml += " </org.drools.Cheese>\n";
+ expectedXml += " <org.drools.Cheese>\n";
+ expectedXml += " <type>stilton</type>\n";
+ expectedXml += " <price>30</price>\n";
+ expectedXml += " <oldPrice>0</oldPrice>\n";
+ expectedXml += " </org.drools.Cheese>\n";
+ expectedXml += " </list>\n";
+ expectedXml += " </result>\n";
+ expectedXml += "</execution-results>\n";
+
+ assertXMLEqual( expectedXml,
+ outXml );
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+
+ List list = (List) result.getValue( "list" );
+ Cheese stilton25 = new Cheese( "stilton",
+ 30 );
+ Cheese stilton30 = new Cheese( "stilton",
+ 35 );
+
+ Set expectedList = new HashSet();
+ expectedList.add( stilton25 );
+ expectedList.add( stilton30 );
+
+ assertEquals( expectedList,
+ new HashSet( list ) );
+ }
+
+ public void testFactHandleReturn() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "global java.util.List list \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " System.err.println(42); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <get-global identifier='list' out-identifier='out-list'/>";
+ inXml += "</batch-execution>";
+
+ StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ FactHandle fh = ksession.insert( new Person( "mic",
+ 42 ) );
+ List<FactHandle> list = new ArrayList<FactHandle>();
+ list.add( fh );
+
+ ksession.setGlobal( "list",
+ list );
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+
+ System.err.println( outXml );
+ String expectedXml = "";
+ expectedXml += "<execution-results>\n" + " <result identifier=\"out-list\">\n" + " <list>\n" + " <fact-handle external-form=\"" + fh.toExternalForm() + "\"/>\n" + " </list>\n" + " </result>\n" + "</execution-results>";
+
+ assertXMLEqual( expectedXml,
+ outXml );
+
+ }
+
+ public void testInsertElementsWithReturnObjects() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "global java.util.List list \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n";
+ str += " list.add( $c );";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <set-global identifier='list' out='true' >";
+ inXml += " <list/>";
+ inXml += " </set-global>";
+ inXml += " <insert-elements out-identifier='myfacts' return-objects='true'>";
+ inXml += " <org.drools.Cheese>";
+ inXml += " <type>stilton</type>";
+ inXml += " <price>25</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.drools.Cheese>";
+ inXml += " <org.drools.Cheese>";
+ inXml += " <type>stilton</type>";
+ inXml += " <price>30</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.drools.Cheese>";
+ inXml += " </insert-elements>";
+ inXml += " <fire-all-rules/>";
+ inXml += "</batch-execution>";
+
+ StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+
+ Collection< ? extends FactHandle> factHandles = ksession.getFactHandles();
+
+ String expectedXml = "";
+ expectedXml += "<execution-results>\n";
+ expectedXml += " <result identifier='list'>\n";
+ expectedXml += " <list>\n";
+ expectedXml += " <org.drools.Cheese>\n";
+ expectedXml += " <type>stilton</type>\n";
+ expectedXml += " <price>35</price>\n";
+ expectedXml += " <oldPrice>0</oldPrice>\n";
+ expectedXml += " </org.drools.Cheese>\n";
+ expectedXml += " <org.drools.Cheese>\n";
+ expectedXml += " <type>stilton</type>\n";
+ expectedXml += " <price>30</price>\n";
+ expectedXml += " <oldPrice>0</oldPrice>\n";
+ expectedXml += " </org.drools.Cheese>\n";
+ expectedXml += " </list>\n";
+ expectedXml += " </result>\n";
+
+ expectedXml += " <result identifier=\"myfacts\">\n";
+ expectedXml += " <list>\n";
+ expectedXml += " <org.drools.Cheese reference=\"../../../result/list/org.drools.Cheese[2]\"/>\n";
+ expectedXml += " <org.drools.Cheese reference=\"../../../result/list/org.drools.Cheese\"/>\n";
+ expectedXml += " </list>\n";
+ expectedXml += " </result>\n";
+ expectedXml += " <fact-handles identifier=\"myfacts\">\n";
+ for ( FactHandle factHandle : factHandles ) {
+ if ( ((Cheese) ksession.getObject( factHandle )).getPrice() == 30 ) {
+ expectedXml += " <fact-handle external-form=\"" + factHandle.toExternalForm() + "\"/>\n";
+ }
+ }
+
+ for ( FactHandle factHandle : factHandles ) {
+ if ( ((Cheese) ksession.getObject( factHandle )).getPrice() == 35 ) {
+ expectedXml += " <fact-handle external-form=\"" + factHandle.toExternalForm() + "\"/>\n";
+ }
+ }
+ expectedXml += " </fact-handles>\n";
+
+ expectedXml += "</execution-results>\n";
+
+ assertXMLEqual( expectedXml,
+ outXml );
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+
+ List list = (List) result.getValue( "list" );
+ Cheese stilton25 = new Cheese( "stilton",
+ 30 );
+ Cheese stilton30 = new Cheese( "stilton",
+ 35 );
+
+ Set expectedList = new HashSet();
+ expectedList.add( stilton25 );
+ expectedList.add( stilton30 );
+
+ assertEquals( expectedList,
+ new HashSet( list ) );
+ }
+
+ public void testSetGlobal() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "global java.util.List list1 \n";
+ str += "global java.util.List list2 \n";
+ str += "global java.util.List list3 \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( 30 ); \n";
+ str += " list1.add( $c ); \n";
+ str += " list2.add( $c ); \n";
+ str += " list3.add( $c ); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <set-global identifier='list1'>";
+ inXml += " <list/>";
+ inXml += " </set-global>";
+ inXml += " <set-global identifier='list2' out='true'>";
+ inXml += " <list/>";
+ inXml += " </set-global>";
+ inXml += " <set-global identifier='list3' out-identifier='outList3'>";
+ inXml += " <list/>";
+ inXml += " </set-global>";
+ inXml += " <insert>";
+ inXml += " <org.drools.Cheese>";
+ inXml += " <type>stilton</type>";
+ inXml += " <price>5</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.drools.Cheese>";
+ inXml += " </insert>";
+ inXml += "</batch-execution>";
+
+ StatelessKnowledgeSession ksession = getSession2( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipeline( ksession ).insert( inXml,
+ resultHandler );
+
+ String outXml = (String) resultHandler.getObject();
+
+ String expectedXml = "";
+ expectedXml += "<execution-results>\n";
+ expectedXml += " <result identifier='list2'>\n";
+ expectedXml += " <list>\n";
+ expectedXml += " <org.drools.Cheese>\n";
+ expectedXml += " <type>stilton</type>\n";
+ expectedXml += " <price>30</price>\n";
+ expectedXml += " <oldPrice>0</oldPrice>\n";
+ expectedXml += " </org.drools.Cheese>\n";
+ expectedXml += " </list>\n";
+ expectedXml += " </result>\n";
+ expectedXml += " <result identifier='outList3'>\n";
+ expectedXml += " <list>\n";
+ expectedXml += " <org.drools.Cheese reference='../../../result/list/org.drools.Cheese'/>\n";
+ expectedXml += " </list>\n";
+ expectedXml += " </result>\n";
+ expectedXml += "</execution-results>\n";
+
+ assertXMLEqual( expectedXml,
+ outXml );
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+ Cheese stilton = new Cheese( "stilton",
+ 30 );
+
+ assertNull( result.getValue( "list1" ) );
+
+ List list2 = (List) result.getValue( "list2" );
+ assertEquals( 1,
+ list2.size() );
+ assertEquals( stilton,
+ list2.get( 0 ) );
+
+ List list3 = (List) result.getValue( "outList3" );
+ assertEquals( 1,
+ list3.size() );
+ assertEquals( stilton,
+ list3.get( 0 ) );
+ }
+
+ public void testGetGlobal() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "global java.util.List list \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " list.add( $c ); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <set-global identifier='list'>";
+ inXml += " <list/>";
+ inXml += " </set-global>";
+ inXml += " <insert>";
+ inXml += " <org.drools.Cheese>";
+ inXml += " <type>stilton</type>";
+ inXml += " <price>25</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.drools.Cheese>";
+ inXml += " </insert>";
+ inXml += " <get-global identifier='list' out-identifier='out-list'/>";
+ inXml += "</batch-execution>";
+
+ StatelessKnowledgeSession ksession = getSession2( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipeline( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+
+ String expectedXml = "";
+ expectedXml += "<execution-results>\n";
+ expectedXml += " <result identifier=\"out-list\">\n";
+ expectedXml += " <list>\n";
+ expectedXml += " <org.drools.Cheese>\n";
+ expectedXml += " <type>stilton</type>\n";
+ expectedXml += " <price>25</price>\n";
+ expectedXml += " <oldPrice>0</oldPrice>\n";
+ expectedXml += " </org.drools.Cheese>\n";
+ expectedXml += " </list>\n";
+ expectedXml += " </result>\n";
+ expectedXml += "</execution-results>\n";
+
+ assertXMLEqual( expectedXml,
+ outXml );
+ }
+
+ public void testGetObjects() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <insert-elements>";
+ inXml += " <org.drools.Cheese>";
+ inXml += " <type>stilton</type>";
+ inXml += " <price>25</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.drools.Cheese>";
+ inXml += " <org.drools.Cheese>";
+ inXml += " <type>stilton</type>";
+ inXml += " <price>30</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.drools.Cheese>";
+ inXml += " </insert-elements>";
+ inXml += " <get-objects out-identifier='list' />";
+ inXml += "</batch-execution>";
+
+ StatelessKnowledgeSession ksession = getSession2( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipeline( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+
+ String expectedXml = "";
+ expectedXml += "<execution-results>";
+ expectedXml += " <result identifier='list'>";
+ expectedXml += " <list>";
+ expectedXml += " <org.drools.Cheese>";
+ expectedXml += " <type>stilton</type>";
+ expectedXml += " <price>30</price>";
+ expectedXml += " <oldPrice>0</oldPrice>";
+ expectedXml += " </org.drools.Cheese>";
+ expectedXml += " <org.drools.Cheese>";
+ expectedXml += " <type>stilton</type>";
+ expectedXml += " <price>35</price>";
+ expectedXml += " <oldPrice>0</oldPrice>";
+ expectedXml += " </org.drools.Cheese>";
+ expectedXml += " </list>";
+ expectedXml += " </result>";
+ expectedXml += "</execution-results>";
+
+ assertXMLEqual( expectedXml,
+ outXml );
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+ List list = (List) result.getValue( "list" );
+ Cheese stilton25 = new Cheese( "stilton",
+ 30 );
+ Cheese stilton30 = new Cheese( "stilton",
+ 35 );
+
+ Set expectedList = new HashSet();
+ expectedList.add( stilton25 );
+ expectedList.add( stilton30 );
+
+ assertEquals( expectedList,
+ new HashSet( list ) );
+ }
+
+ public void testQuery() throws Exception {
+ String str = "";
+ str += "package org.drools.test \n";
+ str += "import org.drools.Cheese \n";
+ str += "query cheeses \n";
+ str += " stilton : Cheese(type == 'stilton') \n";
+ str += " cheddar : Cheese(type == 'cheddar', price == stilton.price) \n";
+ str += "end\n";
+ str += "query cheesesWithParams(String a, String b) \n";
+ str += " stilton : Cheese(type == a) \n";
+ str += " cheddar : Cheese(type == b, price == stilton.price) \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <insert>";
+ inXml += " <org.drools.Cheese>";
+ inXml += " <type>stilton</type>";
+ inXml += " <price>1</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.drools.Cheese>";
+ inXml += " </insert>";
+ inXml += " <insert>";
+ inXml += " <org.drools.Cheese>";
+ inXml += " <type>stilton</type>";
+ inXml += " <price>2</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.drools.Cheese>";
+ inXml += " </insert>";
+ inXml += " <insert>";
+ inXml += " <org.drools.Cheese>";
+ inXml += " <type>cheddar</type>";
+ inXml += " <price>1</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.drools.Cheese>";
+ inXml += " </insert>";
+ inXml += " <insert>";
+ inXml += " <org.drools.Cheese>";
+ inXml += " <type>cheddar</type>";
+ inXml += " <price>2</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.drools.Cheese>";
+ inXml += " </insert>";
+ inXml += " <query out-identifier='cheeses' name='cheeses'/>";
+ inXml += " <query out-identifier='cheeses2' name='cheesesWithParams'>";
+ inXml += " <string>stilton</string>";
+ inXml += " <string>cheddar</string>";
+ inXml += " </query>";
+ inXml += "</batch-execution>";
+
+ StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+
+ Iterator<QueryResultsRow> it1 = ksession.getQueryResults( "cheeses" ).iterator();
+ Iterator<QueryResultsRow> it2 = ksession.getQueryResults( "cheesesWithParams",
+ new String[]{"stilton", "cheddar"} ).iterator();
+ QueryResultsRow row = null;
+
+ String expectedXml = "";
+ expectedXml += "<execution-results>\n";
+ expectedXml += " <result identifier='cheeses'>\n";
+ expectedXml += " <query-results>\n";
+ expectedXml += " <identifiers>\n";
+ expectedXml += " <identifier>stilton</identifier>\n";
+ expectedXml += " <identifier>cheddar</identifier>\n";
+ expectedXml += " </identifiers>\n";
+ expectedXml += " <row>\n";
+ row = it1.next();
+ expectedXml += " <org.drools.Cheese>\n";
+ expectedXml += " <type>stilton</type>\n";
+ expectedXml += " <price>1</price>\n";
+ expectedXml += " <oldPrice>0</oldPrice>\n";
+ expectedXml += " </org.drools.Cheese>\n";
+ expectedXml += " <fact-handle external-form='" + row.getFactHandle( "stilton" ).toExternalForm() + "' />";
+ expectedXml += " <org.drools.Cheese>\n";
+ expectedXml += " <type>cheddar</type>\n";
+ expectedXml += " <price>1</price>\n";
+ expectedXml += " <oldPrice>0</oldPrice>\n";
+ expectedXml += " </org.drools.Cheese>\n";
+ expectedXml += " <fact-handle external-form='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+ expectedXml += " </row>\n";
+ expectedXml += " <row>\n";
+ row = it1.next();
+ expectedXml += " <org.drools.Cheese>\n";
+ expectedXml += " <type>stilton</type>\n";
+ expectedXml += " <price>2</price>\n";
+ expectedXml += " <oldPrice>0</oldPrice>\n";
+ expectedXml += " </org.drools.Cheese>\n";
+ expectedXml += " <fact-handle external-form='" + row.getFactHandle( "stilton" ).toExternalForm() + "' />";
+ expectedXml += " <org.drools.Cheese>\n";
+ expectedXml += " <type>cheddar</type>\n";
+ expectedXml += " <price>2</price>\n";
+ expectedXml += " <oldPrice>0</oldPrice>\n";
+ expectedXml += " </org.drools.Cheese>\n";
+ expectedXml += " <fact-handle external-form='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+ expectedXml += " </row>\n";
+ expectedXml += " </query-results>\n";
+ expectedXml += " </result>\n";
+ expectedXml += " <result identifier='cheeses2'>\n";
+ expectedXml += " <query-results>\n";
+ expectedXml += " <identifiers>\n";
+ expectedXml += " <identifier>stilton</identifier>\n";
+ expectedXml += " <identifier>cheddar</identifier>\n";
+ expectedXml += " </identifiers>\n";
+ expectedXml += " <row>\n";
+ row = it2.next();
+ expectedXml += " <org.drools.Cheese reference=\"../../../../result/query-results/row/org.drools.Cheese\"/>\n";
+ expectedXml += " <fact-handle external-form='" + row.getFactHandle( "stilton" ).toExternalForm() + "' />";
+ expectedXml += " <org.drools.Cheese reference=\"../../../../result/query-results/row/org.drools.Cheese[2]\"/>\n";
+ expectedXml += " <fact-handle external-form='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+ expectedXml += " </row>\n";
+ expectedXml += " <row>\n";
+ row = it2.next();
+ expectedXml += " <org.drools.Cheese reference=\"../../../../result/query-results/row[2]/org.drools.Cheese\"/>\n";
+ expectedXml += " <fact-handle external-form='" + row.getFactHandle( "stilton" ).toExternalForm() + "' />";
+ expectedXml += " <org.drools.Cheese reference=\"../../../../result/query-results/row[2]/org.drools.Cheese[2]\"/>\n";
+ expectedXml += " <fact-handle external-form='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+ expectedXml += " </row>\n";
+ expectedXml += " </query-results>\n";
+ expectedXml += " </result>\n";
+ expectedXml += "</execution-results>\n";
+
+ assertXMLEqual( expectedXml,
+ outXml );
+
+ ExecutionResults batchResult = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+
+ Cheese stilton1 = new Cheese( "stilton",
+ 1 );
+ Cheese cheddar1 = new Cheese( "cheddar",
+ 1 );
+ Cheese stilton2 = new Cheese( "stilton",
+ 2 );
+ Cheese cheddar2 = new Cheese( "cheddar",
+ 2 );
+
+ Set set = new HashSet();
+ List list = new ArrayList();
+ list.add( stilton1 );
+ list.add( cheddar1 );
+ set.add( list );
+
+ list = new ArrayList();
+ list.add( stilton2 );
+ list.add( cheddar2 );
+ set.add( list );
+
+ org.drools.runtime.rule.QueryResults results = (org.drools.runtime.rule.QueryResults) batchResult.getValue( "cheeses" );
+ assertEquals( 2,
+ results.size() );
+ assertEquals( 2,
+ results.getIdentifiers().length );
+ Set newSet = new HashSet();
+ for ( org.drools.runtime.rule.QueryResultsRow result : results ) {
+ list = new ArrayList();
+ list.add( result.get( "stilton" ) );
+ list.add( result.get( "cheddar" ) );
+ newSet.add( list );
+ }
+ assertEquals( set,
+ newSet );
+ }
+
+ public void testManualFireAllRules() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "global java.util.List list \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n";
+ str += " list.add( $c );";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <set-global identifier='list' out='true'>";
+ inXml += " <list/>";
+ inXml += " </set-global>";
+ inXml += " <insert-elements>";
+ inXml += " <org.drools.Cheese>";
+ inXml += " <type>stilton</type>";
+ inXml += " <price>25</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.drools.Cheese>";
+ inXml += " <org.drools.Cheese>";
+ inXml += " <type>stilton</type>";
+ inXml += " <price>30</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.drools.Cheese>";
+ inXml += " </insert-elements>";
+ inXml += " <fire-all-rules />";
+ inXml += " <insert out-identifier='outBrie'>";
+ inXml += " <org.drools.Cheese>";
+ inXml += " <type>brie</type>";
+ inXml += " <price>10</price>";
+ inXml += " <oldPrice>5</oldPrice>";
+ inXml += " </org.drools.Cheese>";
+ inXml += " </insert>";
+ inXml += "</batch-execution>";
+
+ StatelessKnowledgeSession ksession = getSession2( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipeline( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+
+ FactHandle factHandle = (FactHandle) ((ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml )).getFactHandle( "outBrie" );
+
+ String expectedXml = "";
+ expectedXml += "<execution-results>\n";
+ expectedXml += " <result identifier='list'>\n";
+ expectedXml += " <list>\n";
+ expectedXml += " <org.drools.Cheese>\n";
+ expectedXml += " <type>stilton</type>\n";
+ expectedXml += " <price>35</price>\n";
+ expectedXml += " <oldPrice>0</oldPrice>\n";
+ expectedXml += " </org.drools.Cheese>\n";
+ expectedXml += " <org.drools.Cheese>\n";
+ expectedXml += " <type>stilton</type>\n";
+ expectedXml += " <price>30</price>\n";
+ expectedXml += " <oldPrice>0</oldPrice>\n";
+ expectedXml += " </org.drools.Cheese>\n";
+ expectedXml += " </list>\n";
+ expectedXml += " </result>\n";
+ expectedXml += " <result identifier='outBrie'>\n";
+ expectedXml += " <org.drools.Cheese>\n";
+ expectedXml += " <type>brie</type>\n";
+ expectedXml += " <price>10</price>\n";
+ expectedXml += " <oldPrice>5</oldPrice>\n";
+ expectedXml += " </org.drools.Cheese>\n";
+ expectedXml += " </result>\n";
+ expectedXml += " <fact-handle identifier=\"outBrie\" external-form=\"" + factHandle.toExternalForm() + "\" /> \n";
+ expectedXml += "</execution-results>\n";
+ assertXMLEqual( expectedXml,
+ outXml );
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+
+ // brie should not have been added to the list
+ List list = (List) result.getValue( "list" );
+ Cheese stilton25 = new Cheese( "stilton",
+ 30 );
+ Cheese stilton30 = new Cheese( "stilton",
+ 35 );
+
+ Set expectedList = new HashSet();
+ expectedList.add( stilton25 );
+ expectedList.add( stilton30 );
+
+ assertEquals( expectedList,
+ new HashSet( list ) );
+
+ // brie should not have changed
+ Cheese brie10 = new Cheese( "brie",
+ 10 );
+ brie10.setOldPrice( 5 );
+ assertEquals( brie10,
+ result.getValue( "outBrie" ) );
+ }
+
+ public void testProcess() throws SAXException,
+ IOException {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ String str = "";
+ str += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+ str += "<process xmlns=\"http://drools.org/drools-5.0/process\"\n";
+ str += " xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+ str += " xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n";
+ str += " type=\"RuleFlow\" name=\"flow\" id=\"org.drools.actions\" package-name=\"org.drools\" version=\"1\" >\n";
+ str += "\n";
+ str += " <header>\n";
+ str += " <imports>\n";
+ str += " <import name=\"org.drools.TestVariable\" />\n";
+ str += " </imports>\n";
+ str += " <globals>\n";
+ str += " <global identifier=\"list\" type=\"java.util.List\" />\n";
+ str += " </globals>\n";
+ str += " <variables>\n";
+ str += " <variable name=\"person\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"TestVariable\" />\n";
+ str += " </variable>\n";
+ str += " </variables>\n";
+ str += " </header>\n";
+ str += "\n";
+ str += " <nodes>\n";
+ str += " <start id=\"1\" name=\"Start\" />\n";
+ str += " <actionNode id=\"2\" name=\"MyActionNode\" >\n";
+ str += " <action type=\"expression\" dialect=\"mvel\" >System.out.println(\"Triggered\");\n";
+ str += "list.add(person.name);\n";
+ str += "</action>\n";
+ str += " </actionNode>\n";
+ str += " <end id=\"3\" name=\"End\" />\n";
+ str += " </nodes>\n";
+ str += "\n";
+ str += " <connections>\n";
+ str += " <connection from=\"1\" to=\"2\" />\n";
+ str += " <connection from=\"2\" to=\"3\" />\n";
+ str += " </connections>\n" + "\n";
+ str += "</process>";
+
+ Reader source = new StringReader( str );
+ kbuilder.add( ResourceFactory.newReaderResource( source ),
+ ResourceType.DRF );
+ if ( kbuilder.hasErrors() ) {
+ fail( kbuilder.getErrors().toString() );
+ }
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
+ List<String> list = new ArrayList<String>();
+ ksession.setGlobal( "list",
+ list );
+ TestVariable person = new TestVariable( "John Doe" );
+
+ String inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <start-process processId='org.drools.actions'>";
+ inXml += " <parameter identifier='person'>";
+ inXml += " <org.drools.TestVariable>";
+ inXml += " <name>John Doe</name>";
+ inXml += " </org.drools.TestVariable>";
+ inXml += " </parameter>";
+ inXml += " </start-process>";
+ inXml += " <get-global identifier='list' out-identifier='out-list'/>";
+ inXml += "</batch-execution>";
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipeline( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+
+ assertEquals( 1,
+ list.size() );
+ assertEquals( "John Doe",
+ list.get( 0 ) );
+
+ String expectedXml = "";
+ expectedXml += "<execution-results>\n";
+ expectedXml += " <result identifier=\"out-list\">\n";
+ expectedXml += " <list>\n";
+ expectedXml += " <string>John Doe</string>\n";
+ expectedXml += " </list>\n";
+ expectedXml += " </result>\n";
+ expectedXml += "</execution-results>\n";
+
+ assertXMLEqual( expectedXml,
+ outXml );
+ }
+
+ public void testProcessInstanceSignalEvent() throws Exception {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ String str = "";
+ str += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+ str += "<process xmlns=\"http://drools.org/drools-5.0/process\"\n";
+ str += " xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+ str += " xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n";
+ str += " type=\"RuleFlow\" name=\"flow\" id=\"org.drools.event\" package-name=\"org.drools\" version=\"1\" >\n";
+ str += "\n";
+ str += " <header>\n";
+ str += " <variables>\n";
+ str += " <variable name=\"MyVar\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " <value>SomeText</value>\n";
+ str += " </variable>\n";
+ str += " </variables>\n";
+ str += " </header>\n";
+ str += "\n";
+ str += " <nodes>\n";
+ str += " <start id=\"1\" name=\"Start\" />\n";
+ str += " <eventNode id=\"2\" name=\"Event\" variableName=\"MyVar\" >\n";
+ str += " <eventFilters>\n";
+ str += " <eventFilter type=\"eventType\" eventType=\"MyEvent\" />\n";
+ str += " </eventFilters>\n";
+ str += " </eventNode>\n";
+ str += " <join id=\"3\" name=\"Join\" type=\"1\" />\n";
+ str += " <end id=\"4\" name=\"End\" />\n";
+ str += " </nodes>\n";
+ str += "\n";
+ str += " <connections>\n";
+ str += " <connection from=\"1\" to=\"3\" />\n";
+ str += " <connection from=\"2\" to=\"3\" />\n";
+ str += " <connection from=\"3\" to=\"4\" />\n";
+ str += " </connections>\n";
+ str += "\n";
+ str += "</process>";
+
+ kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+ ResourceType.DRF );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+ ProcessInstance processInstance = ksession.startProcess( "org.drools.event" );
+ assertEquals( ProcessInstance.STATE_ACTIVE,
+ processInstance.getState() );
+
+ String inXml = "";
+ inXml += "<signal-event process-instance-id= '" + processInstance.getId() + "' event-type='MyEvent'>";
+ inXml += " <string>MyValue</string>";
+ inXml += "</signal-event>";
+
+ getPipelineStateful( ksession ).insert( inXml,
+ new ResultHandlerImpl() );
+
+ assertEquals( ProcessInstance.STATE_COMPLETED,
+ processInstance.getState() );
+ assertEquals( "MyValue",
+ ((VariableScopeInstance) ((org.drools.process.instance.ProcessInstance) processInstance).getContextInstance( VariableScope.VARIABLE_SCOPE )).getVariable( "MyVar" ) );
+ }
+
+ public void testProcessRuntimeSignalEvent() throws Exception {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ String str = "";
+ str += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+ str += "<process xmlns=\"http://drools.org/drools-5.0/process\"\n";
+ str += " xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+ str += " xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n";
+ str += " type=\"RuleFlow\" name=\"flow\" id=\"org.drools.event\" package-name=\"org.drools\" version=\"1\" >\n";
+ str += "\n";
+ str += " <header>\n";
+ str += " <variables>\n";
+ str += " <variable name=\"MyVar\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " <value>SomeText</value>\n";
+ str += " </variable>\n";
+ str += " </variables>\n";
+ str += " </header>\n";
+ str += "\n";
+ str += " <nodes>\n";
+ str += " <start id=\"1\" name=\"Start\" />\n";
+ str += " <eventNode id=\"2\" name=\"Event\" scope=\"external\" variableName=\"MyVar\" >\n";
+ str += " <eventFilters>\n";
+ str += " <eventFilter type=\"eventType\" eventType=\"MyEvent\" />\n";
+ str += " </eventFilters>\n";
+ str += " </eventNode>\n";
+ str += " <join id=\"3\" name=\"Join\" type=\"1\" />\n";
+ str += " <end id=\"4\" name=\"End\" />\n";
+ str += " </nodes>\n";
+ str += "\n";
+ str += " <connections>\n";
+ str += " <connection from=\"1\" to=\"3\" />\n";
+ str += " <connection from=\"2\" to=\"3\" />\n";
+ str += " <connection from=\"3\" to=\"4\" />\n";
+ str += " </connections>\n";
+ str += "\n";
+ str += "</process>";
+
+ kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+ ResourceType.DRF );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+ ProcessInstance processInstance = ksession.startProcess( "org.drools.event" );
+ assertEquals( ProcessInstance.STATE_ACTIVE,
+ processInstance.getState() );
+
+ String inXml = "";
+ inXml += "<signal-event event-type='MyEvent'>";
+ inXml += " <string>MyValue</string>";
+ inXml += "</signal-event>";
+
+ getPipelineStateful( ksession ).insert( inXml,
+ new ResultHandlerImpl() );
+
+ assertEquals( ProcessInstance.STATE_COMPLETED,
+ processInstance.getState() );
+ assertEquals( "MyValue",
+ ((VariableScopeInstance) ((org.drools.process.instance.ProcessInstance) processInstance).getContextInstance( VariableScope.VARIABLE_SCOPE )).getVariable( "MyVar" ) );
+ }
+
+ public void testCompleteWorkItem() {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ String str = "";
+ str += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+ str += "<process xmlns=\"http://drools.org/drools-5.0/process\"\n";
+ str += " xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+ str += " xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n";
+ str += " type=\"RuleFlow\" name=\"flow\" id=\"org.drools.actions\" package-name=\"org.drools\" version=\"1\" >\n";
+ str += "\n";
+ str += " <header>\n";
+ str += " <variables>\n";
+ str += " <variable name=\"UserName\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " <value>John Doe</value>\n";
+ str += " </variable>\n";
+ str += " <variable name=\"Person\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"org.drools.Person\" />\n";
+ str += " </variable>\n";
+ str += " <variable name=\"MyObject\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"java.lang.Object\" />\n";
+ str += " </variable>\n";
+ str += " <variable name=\"Number\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.IntegerDataType\" />\n";
+ str += " </variable>\n";
+ str += " </variables>\n";
+ str += " </header>\n";
+ str += "\n";
+ str += " <nodes>\n";
+ str += " <start id=\"1\" name=\"Start\" />\n";
+ str += " <workItem id=\"2\" name=\"HumanTask\" >\n";
+ str += " <work name=\"Human Task\" >\n";
+ str += " <parameter name=\"ActorId\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " <value>#{UserName}</value>\n";
+ str += " </parameter>\n";
+ str += " <parameter name=\"Content\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " <value>#{Person.name}</value>\n";
+ str += " </parameter>\n";
+ str += " <parameter name=\"TaskName\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " <value>Do something</value>\n";
+ str += " </parameter>\n";
+ str += " <parameter name=\"Priority\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " </parameter>\n";
+ str += " <parameter name=\"Comment\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " </parameter>\n";
+ str += " <parameter name=\"Attachment\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"java.lang.Object\" />\n";
+ str += " </parameter>\n";
+ str += " </work>\n";
+ str += " <mapping type=\"in\" from=\"MyObject\" to=\"Attachment\" />";
+ str += " <mapping type=\"in\" from=\"Person.name\" to=\"Comment\" />";
+ str += " <mapping type=\"out\" from=\"Result\" to=\"MyObject\" />";
+ str += " <mapping type=\"out\" from=\"Result.length()\" to=\"Number\" />";
+ str += " </workItem>\n";
+ str += " <end id=\"3\" name=\"End\" />\n";
+ str += " </nodes>\n";
+ str += "\n";
+ str += " <connections>\n";
+ str += " <connection from=\"1\" to=\"2\" />\n";
+ str += " <connection from=\"2\" to=\"3\" />\n";
+ str += " </connections>\n";
+ str += "\n";
+ str += "</process>";
+
+ Reader source = new StringReader( str );
+ kbuilder.add( ResourceFactory.newReaderResource( source ),
+ ResourceType.DRF );
+
+ Collection<KnowledgePackage> kpkgs = kbuilder.getKnowledgePackages();
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kpkgs );
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+ TestWorkItemHandler handler = new TestWorkItemHandler();
+ ksession.getWorkItemManager().registerWorkItemHandler( "Human Task",
+ handler );
+ Map<String, Object> parameters = new HashMap<String, Object>();
+ parameters.put( "UserName",
+ "John Doe" );
+ Person person = new Person();
+ person.setName( "John Doe" );
+ parameters.put( "Person",
+ person );
+ WorkflowProcessInstance processInstance = (WorkflowProcessInstance) ksession.startProcess( "org.drools.actions",
+ parameters );
+ assertEquals( ProcessInstance.STATE_ACTIVE,
+ processInstance.getState() );
+ WorkItem workItem = handler.getWorkItem();
+ assertNotNull( workItem );
+ assertEquals( "John Doe",
+ workItem.getParameter( "ActorId" ) );
+ assertEquals( "John Doe",
+ workItem.getParameter( "Content" ) );
+ assertEquals( "John Doe",
+ workItem.getParameter( "Comment" ) );
+
+ assertEquals( WorkItem.PENDING,
+ workItem.getState() );
+
+ String inXml = "";
+ inXml = "<complete-work-item id='" + workItem.getId() + "' />";
+ getPipelineStateful( ksession ).insert( inXml,
+ new ResultHandlerImpl() );
+
+ assertEquals( WorkItem.COMPLETED,
+ workItem.getState() );
+
+ assertEquals( ProcessInstance.STATE_COMPLETED,
+ processInstance.getState() );
+
+ parameters = new HashMap<String, Object>();
+ parameters.put( "UserName",
+ "Jane Doe" );
+ parameters.put( "MyObject",
+ "SomeString" );
+ person = new Person();
+ person.setName( "Jane Doe" );
+ parameters.put( "Person",
+ person );
+ processInstance = (WorkflowProcessInstance) ksession.startProcess( "org.drools.actions",
+ parameters );
+ assertEquals( ProcessInstance.STATE_ACTIVE,
+ processInstance.getState() );
+ workItem = handler.getWorkItem();
+ assertNotNull( workItem );
+ assertEquals( "Jane Doe",
+ workItem.getParameter( "ActorId" ) );
+ assertEquals( "SomeString",
+ workItem.getParameter( "Attachment" ) );
+ assertEquals( "Jane Doe",
+ workItem.getParameter( "Content" ) );
+ assertEquals( "Jane Doe",
+ workItem.getParameter( "Comment" ) );
+
+ assertEquals( WorkItem.PENDING,
+ workItem.getState() );
+
+ inXml = "";
+ inXml += "<complete-work-item id='" + workItem.getId() + "' >";
+ inXml += " <result identifier='Result'>";
+ inXml += " <string>SomeOtherString</string>";
+ inXml += " </result>";
+ inXml += "</complete-work-item>";
+ getPipelineStateful( ksession ).insert( inXml,
+ new ResultHandlerImpl() );
+
+ assertEquals( WorkItem.COMPLETED,
+ workItem.getState() );
+
+ assertEquals( ProcessInstance.STATE_COMPLETED,
+ processInstance.getState() );
+ assertEquals( "SomeOtherString",
+ processInstance.getVariable( "MyObject" ) );
+ assertEquals( 15,
+ processInstance.getVariable( "Number" ) );
+ }
+
+ public void testAbortWorkItem() {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ String str = "";
+ str += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+ str += "<process xmlns=\"http://drools.org/drools-5.0/process\"\n";
+ str += " xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+ str += " xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n";
+ str += " type=\"RuleFlow\" name=\"flow\" id=\"org.drools.actions\" package-name=\"org.drools\" version=\"1\" >\n";
+ str += "\n";
+ str += " <header>\n";
+ str += " <variables>\n";
+ str += " <variable name=\"UserName\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " <value>John Doe</value>\n";
+ str += " </variable>\n";
+ str += " <variable name=\"Person\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"org.drools.Person\" />\n";
+ str += " </variable>\n";
+ str += " <variable name=\"MyObject\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"java.lang.Object\" />\n";
+ str += " </variable>\n";
+ str += " <variable name=\"Number\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.IntegerDataType\" />\n";
+ str += " </variable>\n";
+ str += " </variables>\n";
+ str += " </header>\n";
+ str += "\n";
+ str += " <nodes>\n";
+ str += " <start id=\"1\" name=\"Start\" />\n";
+ str += " <workItem id=\"2\" name=\"HumanTask\" >\n";
+ str += " <work name=\"Human Task\" >\n";
+ str += " <parameter name=\"ActorId\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " <value>#{UserName}</value>\n";
+ str += " </parameter>\n";
+ str += " <parameter name=\"Content\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " <value>#{Person.name}</value>\n";
+ str += " </parameter>\n";
+ str += " <parameter name=\"TaskName\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " <value>Do something</value>\n";
+ str += " </parameter>\n";
+ str += " <parameter name=\"Priority\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " </parameter>\n";
+ str += " <parameter name=\"Comment\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n";
+ str += " </parameter>\n";
+ str += " <parameter name=\"Attachment\" >\n";
+ str += " <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"java.lang.Object\" />\n";
+ str += " </parameter>\n";
+ str += " </work>\n";
+ str += " <mapping type=\"in\" from=\"MyObject\" to=\"Attachment\" />";
+ str += " <mapping type=\"in\" from=\"Person.name\" to=\"Comment\" />";
+ str += " <mapping type=\"out\" from=\"Result\" to=\"MyObject\" />";
+ str += " <mapping type=\"out\" from=\"Result.length()\" to=\"Number\" />";
+ str += " </workItem>\n";
+ str += " <end id=\"3\" name=\"End\" />\n";
+ str += " </nodes>\n";
+ str += "\n";
+ str += " <connections>\n";
+ str += " <connection from=\"1\" to=\"2\" />\n";
+ str += " <connection from=\"2\" to=\"3\" />\n";
+ str += " </connections>\n";
+ str += "\n";
+ str += "</process>";
+
+ Reader source = new StringReader( str );
+ kbuilder.add( ResourceFactory.newReaderResource( source ),
+ ResourceType.DRF );
+
+ Collection<KnowledgePackage> kpkgs = kbuilder.getKnowledgePackages();
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kpkgs );
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+ TestWorkItemHandler handler = new TestWorkItemHandler();
+ ksession.getWorkItemManager().registerWorkItemHandler( "Human Task",
+ handler );
+ Map<String, Object> parameters = new HashMap<String, Object>();
+ parameters.put( "UserName",
+ "John Doe" );
+ Person person = new Person();
+ person.setName( "John Doe" );
+ parameters.put( "Person",
+ person );
+ WorkflowProcessInstance processInstance = (WorkflowProcessInstance) ksession.startProcess( "org.drools.actions",
+ parameters );
+ assertEquals( ProcessInstance.STATE_ACTIVE,
+ processInstance.getState() );
+ WorkItem workItem = handler.getWorkItem();
+ assertNotNull( workItem );
+
+ assertEquals( WorkItem.PENDING,
+ workItem.getState() );
+
+ String inXml = "<abort-work-item id='" + workItem.getId() + "' />";
+ getPipelineStateful( ksession ).insert( inXml,
+ new ResultHandlerImpl() );
+
+ assertEquals( WorkItem.ABORTED,
+ workItem.getState() );
+ }
+
+ public static class TestWorkItemHandler
+ implements
+ WorkItemHandler {
+ private WorkItem workItem;
+
+ public void executeWorkItem(WorkItem workItem,
+ WorkItemManager manager) {
+ this.workItem = workItem;
+ }
+
+ public void abortWorkItem(WorkItem workItem,
+ WorkItemManager manager) {
+ }
+
+ public WorkItem getWorkItem() {
+ return workItem;
+ }
+ }
+
+ public void testInsertObjectWithDeclaredFact() throws Exception {
+ String str = "";
+ str += "package org.foo \n";
+ str += "declare Whee \n\ttype: String\n\tprice: Integer\n\toldPrice: Integer\nend\n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Whee() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <insert out-identifier='outStilton'>";
+ inXml += " <org.foo.Whee>";
+ inXml += " <type>stilton</type>";
+ inXml += " <price>25</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.foo.Whee>";
+ inXml += " </insert>";
+ inXml += " <fire-all-rules />";
+ inXml += "</batch-execution>";
+
+ StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+
+ ClassLoader cl = ((InternalRuleBase) ((StatefulKnowledgeSessionImpl) ksession).getRuleBase()).getRootClassLoader();
+ XStream xstream = BatchExecutionHelper.newXStreamMarshaller();
+ xstream.setClassLoader( cl );
+ FactHandle factHandle = (FactHandle) ((ExecutionResults) xstream.fromXML( outXml )).getFactHandle( "outStilton" );
+
+ String expectedXml = "";
+ expectedXml += "<execution-results>\n";
+ expectedXml += " <result identifier=\"outStilton\">\n";
+ expectedXml += " <org.foo.Whee>\n";
+ expectedXml += " <type>stilton</type>\n";
+ expectedXml += " <oldPrice>0</oldPrice>\n";
+ expectedXml += " <price>30</price>\n";
+ expectedXml += " </org.foo.Whee>\n";
+ expectedXml += " </result>\n";
+ expectedXml += " <fact-handle identifier=\"outStilton\" external-form=\"" + factHandle.toExternalForm() + "\" /> \n";
+ expectedXml += "</execution-results>\n";
+
+ assertXMLEqual( expectedXml,
+ outXml );
+
+ }
+
+ public void testInsertObjectStateful() throws Exception {
+ String str = "";
+ str += "package org.foo \n";
+ str += "declare Whee \n\ttype: String\n\tprice: Integer\n\toldPrice: Integer\nend\n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Whee(price < 30) \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n update($c);\n";
+ str += "end\n";
+ str += "query results\n";
+ str += " w: Whee(price == 30)";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <insert>";
+ inXml += " <org.foo.Whee>";
+ inXml += " <type>stilton</type>";
+ inXml += " <price>25</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.foo.Whee>";
+ inXml += " </insert>";
+ inXml += "</batch-execution>";
+
+ StatefulKnowledgeSession ksession = getSessionStateful( ResourceFactory.newByteArrayResource( str.getBytes() ) );
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+
+ getPipelineStateful( ksession ).insert( "<batch-execution><query out-identifier='matchingthings' name='results'/></batch-execution>",
+ resultHandler );
+ String outXml = (String) resultHandler.getObject();
+
+ //we have not fired the rules yet
+ assertFalse( outXml.indexOf( "<price>30</price>" ) > -1 );
+
+ //lets send a command to execute them then
+ inXml = "";
+ inXml += "<batch-execution>";
+ inXml += " <fire-all-rules max='100'/>";
+ inXml += "</batch-execution>";
+ getPipelineStateful( ksession ).insert( inXml,
+ resultHandler );
+ //ksession.fireAllRules();
+
+ //ok lets try that again...
+ getPipelineStateful( ksession ).insert( "<batch-execution><query out-identifier='matchingthings' name='results'/></batch-execution>",
+ resultHandler );
+ outXml = (String) resultHandler.getObject();
+ assertTrue( outXml.indexOf( "<price>30</price>" ) > -1 );
+ }
+
+ public void testVsmPipeline() throws Exception {
+ String str = "";
+ str += "package org.drools \n";
+ str += "import org.drools.Cheese \n";
+ str += "rule rule1 \n";
+ str += " when \n";
+ str += " $c : Cheese() \n";
+ str += " \n";
+ str += " then \n";
+ str += " $c.setPrice( $c.getPrice() + 5 ); \n";
+ str += "end\n";
+
+ String inXml = "";
+ inXml += "<batch-execution lookup=\"ksession1\" >";
+ inXml += " <insert out-identifier='outStilton'>";
+ inXml += " <org.drools.Cheese>";
+ inXml += " <type>stilton</type>";
+ inXml += " <price>25</price>";
+ inXml += " <oldPrice>0</oldPrice>";
+ inXml += " </org.drools.Cheese>";
+ inXml += " </insert>";
+ inXml += " <fire-all-rules />";
+ inXml += "</batch-execution>";
+
+ LocalConnection connection = new LocalConnection();
+ ExecutionNode node = connection.getExecutionNode(null);
+
+ StatefulKnowledgeSession ksession = getExecutionNodeSessionStateful(node, ResourceFactory.newByteArrayResource( str.getBytes() ) );
+
+ node.get(DirectoryLookupFactoryService.class).register("ksession1", ksession);
+
+ XStreamResolverStrategy xstreamStrategy = new XStreamResolverStrategy() {
+ public XStream lookup(String name) {
+ return BatchExecutionHelper.newXStreamMarshaller();
+ }
+ };
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ getPipelineSessionStateful(node, xstreamStrategy).insert(inXml, resultHandler);
+ String outXml = (String) resultHandler.getObject();
+
+ ExecutionResults result = (ExecutionResults) BatchExecutionHelper.newXStreamMarshaller().fromXML( outXml );
+ Cheese stilton = (Cheese) result.getValue( "outStilton" );
+ assertEquals( 30,
+ stilton.getPrice() );
+
+ FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
+ stilton = (Cheese) ksession.getObject( factHandle );
+ assertEquals( 30,
+ stilton.getPrice() );
+
+ String expectedXml = "";
+ expectedXml += "<execution-results>\n";
+ expectedXml += " <result identifier=\"outStilton\">\n";
+ expectedXml += " <org.drools.Cheese>\n";
+ expectedXml += " <type>stilton</type>\n";
+ expectedXml += " <oldPrice>0</oldPrice>\n";
+ expectedXml += " <price>30</price>\n";
+ expectedXml += " </org.drools.Cheese>\n";
+ expectedXml += " </result>\n";
+ expectedXml += " <fact-handle identifier=\"outStilton\" external-form=\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\" /> \n";
+ expectedXml += "</execution-results>\n";
+
+ assertXMLEqual( expectedXml,
+ outXml );
+ }
+
+ private Pipeline getPipeline(StatelessKnowledgeSession ksession) {
+ Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+ Action assignResult = PipelineFactory.newAssignObjectAsResult();
+ assignResult.setReceiver( executeResultHandler );
+
+ Transformer outTransformer = PipelineFactory.newXStreamToXmlTransformer( BatchExecutionHelper.newXStreamMarshaller() );
+ outTransformer.setReceiver( assignResult );
+
+ KnowledgeRuntimeCommand batchExecution = PipelineFactory.newCommandExecutor();
+ batchExecution.setReceiver( outTransformer );
+
+ Transformer inTransformer = PipelineFactory.newXStreamFromXmlTransformer( BatchExecutionHelper.newXStreamMarshaller() );
+ inTransformer.setReceiver( batchExecution );
+
+ Pipeline pipeline = PipelineFactory.newStatelessKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( inTransformer );
+
+ return pipeline;
+ }
+
+ private Pipeline getPipelineSessionStateful(ExecutionNode node, XStreamResolverStrategy xstreamResolverStrategy) {
+ Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+ Action assignResult = PipelineFactory.newAssignObjectAsResult();
+ assignResult.setReceiver( executeResultHandler );
+
+ //Transformer outTransformer = PipelineFactory.newXStreamToXmlTransformer( BatchExecutionHelper.newXStreamMarshaller() );
+ Transformer outTransformer = new XStreamToXmlGridTransformer();
+ outTransformer.setReceiver( assignResult );
+
+ KnowledgeRuntimeCommand batchExecution = PipelineFactory.newCommandExecutor();
+ batchExecution.setReceiver( outTransformer );
+
+ //Transformer inTransformer = PipelineFactory.newXStreamFromXmlTransformer( BatchExecutionHelper.newXStreamMarshaller() );
+ Transformer inTransformer = new XStreamFromXmlGridTransformer( xstreamResolverStrategy );
+ inTransformer.setReceiver( batchExecution );
+
+// Transformer domTransformer = new ToXmlNodeTransformer();
+// domTransformer.setReceiver( inTransformer );
+
+ //Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ Pipeline pipeline = new ExecutionNodePipelineImpl( node );
+
+ pipeline.setReceiver( inTransformer );
+
+ return pipeline;
+ }
+
+ private Pipeline getPipelineStateful(StatefulKnowledgeSession ksession) {
+ Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+ Action assignResult = PipelineFactory.newAssignObjectAsResult();
+ assignResult.setReceiver( executeResultHandler );
+
+ Transformer outTransformer = PipelineFactory.newXStreamToXmlTransformer( BatchExecutionHelper.newXStreamMarshaller() );
+ outTransformer.setReceiver( assignResult );
+
+ KnowledgeRuntimeCommand batchExecution = PipelineFactory.newCommandExecutor();
+ batchExecution.setReceiver( outTransformer );
+
+ Transformer inTransformer = PipelineFactory.newXStreamFromXmlTransformer( BatchExecutionHelper.newXStreamMarshaller() );
+ inTransformer.setReceiver( batchExecution );
+
+ Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( inTransformer );
+
+ return pipeline;
+ }
+
+ public static class ResultHandlerImpl
+ implements
+ ResultHandler {
+ Object object;
+
+ public void handleResult(Object object) {
+ this.object = object;
+ }
+
+ public Object getObject() {
+ return this.object;
+ }
+ }
+
+ private StatelessKnowledgeSession getSession2(Resource resource) throws Exception {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( resource,
+ ResourceType.DRL );
+
+ if ( kbuilder.hasErrors() ) {
+ System.out.println( kbuilder.getErrors() );
+ }
+
+ assertFalse( kbuilder.hasErrors() );
+ Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+
+ kbase.addKnowledgePackages( pkgs );
+ StatelessKnowledgeSession session = kbase.newStatelessKnowledgeSession();
+
+ return session;
+ }
+
+ private StatefulKnowledgeSession getSessionStateful(Resource resource) throws Exception {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( resource,
+ ResourceType.DRL );
+
+ if ( kbuilder.hasErrors() ) {
+ System.out.println( kbuilder.getErrors() );
+ }
+
+ assertFalse( kbuilder.hasErrors() );
+ Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+
+ kbase.addKnowledgePackages( pkgs );
+ StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession();
+
+ return session;
+ }
+
+ private StatefulKnowledgeSession getExecutionNodeSessionStateful(ExecutionNode node, Resource resource) throws Exception {
+ KnowledgeBuilder kbuilder = node.get(KnowledgeBuilderFactoryService.class).newKnowledgeBuilder();
+ kbuilder.add( resource,
+ ResourceType.DRL );
+
+ if ( kbuilder.hasErrors() ) {
+ System.out.println( kbuilder.getErrors() );
+ }
+
+ assertFalse( kbuilder.hasErrors() );
+ Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
+
+ KnowledgeBase kbase = node.get(KnowledgeBaseFactoryService.class).newKnowledgeBase();
+
+ kbase.addKnowledgePackages( pkgs );
+ StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession();
+
+ return session;
+ }
+
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamFactTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamFactTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamFactTest.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,127 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.custommonkey.xmlunit.Diff;
+import org.custommonkey.xmlunit.XMLAssert;
+import org.custommonkey.xmlunit.XMLUnit;
+import org.custommonkey.xmlunit.examples.RecursiveElementNameAndTextQualifier;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.pipeline.impl.XStreamStatefulSessionTest.ResultHandlerImpl;
+import org.drools.runtime.rule.FactHandle;
+
+import com.thoughtworks.xstream.XStream;
+
+public class XStreamFactTest extends TestCase {
+
+ protected void setUp() throws Exception {
+ XMLUnit.setIgnoreComments( true );
+ XMLUnit.setIgnoreWhitespace( true );
+ XMLUnit.setIgnoreAttributeOrder( true );
+ XMLUnit.setNormalizeWhitespace( true );
+ XMLUnit.setNormalize( true );
+ }
+
+ private void assertXMLEqual(String expectedXml,
+ String resultXml) {
+ try {
+ Diff diff = new Diff( expectedXml,
+ resultXml );
+ diff.overrideElementQualifier( new RecursiveElementNameAndTextQualifier() );
+ XMLAssert.assertXMLEqual( diff,
+ true );
+ } catch ( Exception e ) {
+ throw new RuntimeException( "XML Assertion failure",
+ e );
+ }
+ }
+
+
+ public void testFact() throws Exception {
+ String xml = "";
+ xml += "<list>\n";
+ xml += " <example.OrderItem>\n";
+ xml += " <price>8.9</price>\n";
+ xml += " <productId>111</productId>\n";
+ xml += " <quantity>2</quantity>\n";
+ xml += " </example.OrderItem>\n";
+ xml += "</list>\n";
+
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ kbuilder.add( ResourceFactory.newClassPathResource( "test_XStreamDirectRoot.drl",
+ XStreamStatefulSessionTest.class ),
+ ResourceType.DRL );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+ Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+ KnowledgeRuntimeCommand insertStage = PipelineFactory.newStatefulKnowledgeSessionInsert();
+ insertStage.setReceiver( executeResultHandler );
+
+ XStream xstream = new XStream();
+ Transformer transformer = PipelineFactory.newXStreamFromXmlTransformer( xstream );
+ transformer.setReceiver( insertStage );
+
+ Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( transformer );
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ pipeline.insert( xml,
+ resultHandler );
+
+ FactHandle factHandle = ( FactHandle ) ((Map)resultHandler.getObject()).keySet().iterator().next();
+ assertNotNull( factHandle );
+
+ // now round trip that fact
+ Action executeResult = PipelineFactory.newExecuteResultHandler();
+
+ Action assignAsResult = PipelineFactory.newAssignObjectAsResult();
+ assignAsResult.setReceiver( executeResult );
+
+ transformer = PipelineFactory.newXStreamToXmlTransformer( xstream );
+ transformer.setReceiver( assignAsResult );
+
+ KnowledgeRuntimeCommand getObject = PipelineFactory.newStatefulKnowledgeSessionGetObject();
+ getObject.setReceiver( transformer );
+
+ pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( getObject );
+
+ resultHandler = new ResultHandlerImpl();
+ pipeline.insert( factHandle, resultHandler );
+
+ assertXMLEqual( xml, (String) resultHandler.getObject() );
+ }
+
+ private static void assertEqualsIgnoreWhitespace(final String expected,
+ final String actual) {
+ final String cleanExpected = expected.replaceAll( "\\s+",
+ "" );
+ final String cleanActual = actual.replaceAll( "\\s+",
+ "" );
+ assertEquals( cleanExpected,
+ cleanActual );
+ }
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamGlobalTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamGlobalTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamGlobalTest.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,119 @@
+package org.drools.runtime.pipeline.impl;
+
+import junit.framework.TestCase;
+
+import org.custommonkey.xmlunit.Diff;
+import org.custommonkey.xmlunit.XMLAssert;
+import org.custommonkey.xmlunit.XMLUnit;
+import org.custommonkey.xmlunit.examples.RecursiveElementNameAndTextQualifier;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.pipeline.impl.XStreamStatefulSessionTest.ResultHandlerImpl;
+
+import com.thoughtworks.xstream.XStream;
+
+public class XStreamGlobalTest extends TestCase {
+
+ protected void setUp() throws Exception {
+ XMLUnit.setIgnoreComments( true );
+ XMLUnit.setIgnoreWhitespace( true );
+ XMLUnit.setIgnoreAttributeOrder( true );
+ XMLUnit.setNormalizeWhitespace( true );
+ XMLUnit.setNormalize( true );
+ }
+
+ private void assertXMLEqual(String expectedXml,
+ String resultXml) {
+ try {
+ Diff diff = new Diff( expectedXml,
+ resultXml );
+ diff.overrideElementQualifier( new RecursiveElementNameAndTextQualifier() );
+ XMLAssert.assertXMLEqual( diff,
+ true );
+ } catch ( Exception e ) {
+ throw new RuntimeException( "XML Assertion failure",
+ e );
+ }
+ }
+
+
+ public void testGlobal() throws Exception {
+ String xml = "";
+ xml += "<list>\n";
+ xml += " <example.OrderItem>\n";
+ xml += " <price>8.9</price>\n";
+ xml += " <productId>111</productId>\n";
+ xml += " <quantity>2</quantity>\n";
+ xml += " </example.OrderItem>\n";
+ xml += "</list>";
+
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ kbuilder.add( ResourceFactory.newClassPathResource( "test_XStreamDirectRoot.drl",
+ XStreamStatefulSessionTest.class ),
+ ResourceType.DRL );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+ KnowledgeRuntimeCommand setGlobalStage = PipelineFactory.newStatefulKnowledgeSessionSetGlobal( "list" );
+
+ XStream xstream = new XStream();
+ Transformer transformer = PipelineFactory.newXStreamFromXmlTransformer( xstream );
+ transformer.setReceiver( setGlobalStage );
+
+ Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( transformer );
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ pipeline.insert( xml,
+ resultHandler );
+
+
+ // now round trip that global
+ Action executeResult = PipelineFactory.newExecuteResultHandler();
+
+ Action assignAsResult = PipelineFactory.newAssignObjectAsResult();
+ assignAsResult.setReceiver( executeResult );
+
+ transformer = PipelineFactory.newXStreamToXmlTransformer( xstream );
+ transformer.setReceiver( assignAsResult );
+
+ KnowledgeRuntimeCommand getGlobalStage = PipelineFactory.newStatefulKnowledgeSessionGetGlobal( );
+ getGlobalStage.setReceiver( transformer );
+
+ pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( getGlobalStage );
+
+ resultHandler = new ResultHandlerImpl();
+ pipeline.insert( "list", resultHandler );
+
+ assertXMLEqual( xml, (String) resultHandler.getObject() );
+ }
+
+ private static void assertEqualsIgnoreWhitespace(final String expected,
+ final String actual) {
+ final String cleanExpected = expected.replaceAll( "\\s+",
+ "" );
+ final String cleanActual = actual.replaceAll( "\\s+",
+ "" );
+ assertEquals( cleanExpected,
+ cleanActual );
+ }
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamStatefulSessionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamStatefulSessionTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamStatefulSessionTest.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,144 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.transform.stream.StreamSource;
+
+import junit.framework.TestCase;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.Expression;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.Splitter;
+import org.drools.runtime.pipeline.Transformer;
+import org.drools.runtime.rule.FactHandle;
+
+import com.thoughtworks.xstream.XStream;
+
+public class XStreamStatefulSessionTest extends TestCase {
+
+ public void testDirectRoot() throws Exception {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ kbuilder.add( ResourceFactory.newClassPathResource( "test_XStreamDirectRoot.drl",
+ XStreamStatefulSessionTest.class ),
+ ResourceType.DRL );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+ List list = new ArrayList();
+ ksession.setGlobal( "list",
+ list );
+
+ Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+ KnowledgeRuntimeCommand insertStage = PipelineFactory.newStatefulKnowledgeSessionInsert();
+ insertStage.setReceiver( executeResultHandler );
+
+ XStream xstream = new XStream();
+ Transformer transformer = PipelineFactory.newXStreamFromXmlTransformer( xstream );
+ transformer.setReceiver( insertStage );
+
+ Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( transformer );
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ pipeline.insert( getClass().getResourceAsStream( "XStreamDirectRoot.xml" ),
+ resultHandler );
+ ksession.fireAllRules();
+
+ Map<FactHandle, Object> handles = (Map<FactHandle, Object>) resultHandler.getObject();
+
+ assertEquals( 1,
+ handles.size() );
+ assertEquals( 1,
+ list.size() );
+
+ assertEquals( "example.OrderItem",
+ list.get( 0 ).getClass().getName() );
+ }
+
+ public void testNestedIterable() throws Exception {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ kbuilder.add( ResourceFactory.newClassPathResource( "test_XStreamNestedIterable.drl",
+ XStreamStatefulSessionTest.class ),
+ ResourceType.DRL );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+ List list = new ArrayList();
+ ksession.setGlobal( "list",
+ list );
+
+ Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+ KnowledgeRuntimeCommand insertStage = PipelineFactory.newStatefulKnowledgeSessionInsert();
+ insertStage.setReceiver( executeResultHandler );
+
+ Splitter splitter = PipelineFactory.newIterateSplitter();
+ splitter.setReceiver( insertStage );
+
+ XStream xstream = new XStream();
+ Transformer transformer = PipelineFactory.newXStreamFromXmlTransformer( xstream );
+ transformer.setReceiver( splitter );
+
+ Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( transformer );
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ pipeline.insert( getClass().getResourceAsStream( "XStreamNestedIterable.xml" ),
+ resultHandler );
+
+ Map<FactHandle, Object> handles = (Map<FactHandle, Object>) resultHandler.getObject();
+ ksession.fireAllRules();
+
+ assertEquals( 2,
+ handles.size() );
+ assertEquals( 2,
+ list.size() );
+
+ assertEquals( "example.OrderItem",
+ list.get( 0 ).getClass().getName() );
+ assertEquals( "example.OrderItem",
+ list.get( 1 ).getClass().getName() );
+
+ assertNotSame( list.get( 0 ),
+ list.get( 1 ) );
+ }
+
+ public static class ResultHandlerImpl
+ implements
+ ResultHandler {
+ Object object;
+
+ public void handleResult(Object object) {
+ this.object = object;
+ }
+
+ public Object getObject() {
+ return this.object;
+ }
+ }
+
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamStatelessSessionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamStatelessSessionTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/java/org/drools/runtime/pipeline/impl/XStreamStatelessSessionTest.java 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,137 @@
+package org.drools.runtime.pipeline.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatelessKnowledgeSession;
+import org.drools.runtime.pipeline.Action;
+import org.drools.runtime.pipeline.Expression;
+import org.drools.runtime.pipeline.KnowledgeRuntimeCommand;
+import org.drools.runtime.pipeline.Pipeline;
+import org.drools.runtime.pipeline.PipelineFactory;
+import org.drools.runtime.pipeline.ResultHandler;
+import org.drools.runtime.pipeline.Transformer;
+
+import com.thoughtworks.xstream.XStream;
+
+public class XStreamStatelessSessionTest extends TestCase {
+
+ public void testXstreamDirectRoot() throws Exception {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ kbuilder.add( ResourceFactory.newClassPathResource( "test_XStreamDirectRoot.drl",
+ XStreamStatefulSessionTest.class ),
+ ResourceType.DRL );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
+ List list = new ArrayList();
+ ksession.setGlobal( "list",
+ list );
+
+ Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+ Action assignResult = PipelineFactory.newAssignObjectAsResult();
+ assignResult.setReceiver( executeResultHandler );
+
+ KnowledgeRuntimeCommand batchExecution = PipelineFactory.newCommandExecutor();
+ batchExecution.setReceiver( assignResult );
+
+ KnowledgeRuntimeCommand insertStage = PipelineFactory.newInsertObjectCommand();
+ insertStage.setReceiver( batchExecution );
+
+ XStream xstream = new XStream();
+ Transformer transformer = PipelineFactory.newXStreamFromXmlTransformer( xstream );
+ transformer.setReceiver( insertStage );
+
+ Pipeline pipeline = PipelineFactory.newStatelessKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( transformer );
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ pipeline.insert( getClass().getResourceAsStream( "XStreamDirectRoot.xml" ),
+ resultHandler );
+
+ assertEquals( 1,
+ list.size() );
+
+ assertEquals( "example.OrderItem",
+ list.get( 0 ).getClass().getName() );
+ }
+
+ public void testXstreamNestedIterable() throws Exception {
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+ kbuilder.add( ResourceFactory.newClassPathResource( "test_XStreamNestedIterable.drl",
+ XStreamStatefulSessionTest.class ),
+ ResourceType.DRL );
+
+ assertFalse( kbuilder.hasErrors() );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
+ List list = new ArrayList();
+ ksession.setGlobal( "list",
+ list );
+
+ Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+
+ Action assignResult = PipelineFactory.newAssignObjectAsResult();
+ assignResult.setReceiver( executeResultHandler );
+
+ KnowledgeRuntimeCommand batchExecution = PipelineFactory.newCommandExecutor();
+ batchExecution.setReceiver( assignResult );
+
+ KnowledgeRuntimeCommand insertElementsStage = PipelineFactory.newInsertElementsCommand();
+ insertElementsStage.setReceiver( batchExecution );
+
+ Expression mvelExpression = PipelineFactory.newMvelExpression( "this.children" );
+ mvelExpression.setReceiver( insertElementsStage );
+
+ XStream xstream = new XStream();
+ Transformer transformer = PipelineFactory.newXStreamFromXmlTransformer( xstream );
+ transformer.setReceiver( insertElementsStage );
+
+ Pipeline pipeline = PipelineFactory.newStatelessKnowledgeSessionPipeline( ksession );
+ pipeline.setReceiver( transformer );
+
+ ResultHandlerImpl resultHandler = new ResultHandlerImpl();
+ pipeline.insert( getClass().getResourceAsStream( "XStreamNestedIterable.xml" ),
+ resultHandler );
+
+ assertEquals( "example.OrderItem",
+ list.get( 0 ).getClass().getName() );
+ assertEquals( "example.OrderItem",
+ list.get( 1 ).getClass().getName() );
+
+ assertNotSame( list.get( 0 ),
+ list.get( 1 ) );
+ }
+
+ public static class ResultHandlerImpl
+ implements
+ ResultHandler {
+ Object object;
+
+ public void handleResult(Object object) {
+ this.object = object;
+ }
+
+ public Object getObject() {
+ return this.object;
+ }
+ }
+}
Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/SmooksDirectRoot.xml
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/SmooksDirectRoot.xml (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/SmooksDirectRoot.xml 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,5 @@
+<order-item>
+ <product>222</product>
+ <quantity>7</quantity>
+ <price>5.20</price>
+</order-item>
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/SmooksNestedIterable.xml
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/SmooksNestedIterable.xml (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/SmooksNestedIterable.xml 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,12 @@
+<root>
+ <order-item>
+ <product>111</product>
+ <quantity>2</quantity>
+ <price>8.90</price>
+ </order-item>
+ <order-item>
+ <product>222</product>
+ <quantity>7</quantity>
+ <price>5.20</price>
+ </order-item>
+</root>
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/XStreamDirectRoot.xml
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/XStreamDirectRoot.xml (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/XStreamDirectRoot.xml 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,5 @@
+<example.OrderItem>
+ <productId>222</productId>
+ <quantity>7</quantity>
+ <price>5.20</price>
+</example.OrderItem>
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/XStreamNestedIterable.xml
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/XStreamNestedIterable.xml (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/XStreamNestedIterable.xml 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,12 @@
+<java.util.ArrayList>
+ <example.OrderItem>
+ <productId>111</productId>
+ <quantity>2</quantity>
+ <price>8.90</price>
+ </example.OrderItem>
+ <example.OrderItem>
+ <productId>222</productId>
+ <quantity>7</quantity>
+ <price>5.20</price>
+ </example.OrderItem>
+</java.util.ArrayList>
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/data.xml
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/data.xml (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/data.xml 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<myAddress xmlns="http://www.oracle.com/sample3/"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.oracle.com/sample3 sample3.xsd">
+ <name>James Bond</name>
+ <doorNumber>420</doorNumber>
+ <street>Oracle parkway</street>
+ <city>Redwood shores</city>
+ <state>CA</state>
+ <zip>94065</zip>
+ <country>United States</country>
+</myAddress>
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/departmentData.xls
===================================================================
(Binary files differ)
Property changes on: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/departmentData.xls
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/departments.xml
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/departments.xml (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/departments.xml 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<workbook>
+ <worksheet name="Sheet1">
+
+ <section startRow="0" endRow="6">
+ <mapping cell="B1">company.name</mapping>
+ </section>
+ <loop startRow="7" endRow="7" items="company.employee" var="employee" varType="org.drools.runtime.pipeline.impl.Employee">
+ <section startRow="7" endRow="7">
+ <mapping row="7" col="0">employee.name</mapping>
+ <mapping row="7" col="1">employee.age</mapping>
+ <mapping row="7" col="3">employee.payment</mapping>
+ <mapping row="7" col="4">employee.bonus</mapping>
+ </section>
+ <loopbreakcondition>
+ <rowcheck offset="0">
+ <cellcheck offset="0">Employee Payment Totals:</cellcheck>
+ </rowcheck>
+ </loopbreakcondition>
+ </loop>
+
+ </worksheet>
+ <worksheet name="Sheet3">
+ <loop startRow="0" endRow="8" items="departments" var="department" varType="org.drools.runtime.pipeline.impl.Department">
+ <section startRow="0" endRow="6">
+ <mapping row="0" col="1">department.name</mapping>
+ </section>
+ <loop startRow="7" endRow="7" items="department.staff" var="employee" varType="org.drools.runtime.pipeline.impl.Employee">
+ <section startRow="7" endRow="7">
+ <mapping row="7" col="0">employee.name</mapping>
+ <mapping row="7" col="1">employee.age</mapping>
+ <mapping row="7" col="2">employee.payment</mapping>
+ <mapping row="7" col="3">employee.bonus</mapping>
+ </section>
+ <loopbreakcondition>
+ <rowcheck offset="0">
+ <cellcheck offset="0">Employee Payment Totals:</cellcheck>
+ </rowcheck>
+ </loopbreakcondition>
+ </loop>
+ <section startRow="8" endRow="8"/>
+ <loopbreakcondition>
+ <rowcheck offset="0"/>
+ <rowcheck offset="1"/>
+ </loopbreakcondition>
+ </loop>
+ </worksheet>
+</workbook>
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/order.xml
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/order.xml (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/order.xml 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<ns2:order xmlns:ns2="http://drools.org/model/order" >
+ <ns2:order-item>
+ <ns2:product-id>111</ns2:product-id>
+ <ns2:quantity>2</ns2:quantity>
+ <ns2:price>8.90</ns2:price>
+ </ns2:order-item>
+ <ns2:order-item>
+ <ns2:product-id>222</ns2:product-id>
+ <ns2:quantity>7</ns2:quantity>
+ <ns2:price>5.20</ns2:price>
+ </ns2:order-item>
+</ns2:order>
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/order.xsd
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/order.xsd (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/order.xsd 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,43 @@
+<xsd:schema xmlns:order="http://drools.org/model/order"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://drools.org/model/order"
+ elementFormDefault="qualified" >
+
+
+ <xsd:element name="order">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="order-item" minOccurs="0" maxOccurs="unbounded">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="product-id" type="xsd:long" />
+ <xsd:element name="quantity" type="xsd:integer" />
+ <xsd:element name="price" type="xsd:decimal" />
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+<!--
+
+ <xsd:element name="order" type="order:OrderType" />
+
+ <xsd:complexType name="OrderType">
+ <xsd:sequence>
+ <xsd:element name="orderItem" type="order:orderItemType" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+
+ <xsd:complexType name="orderItem">
+ <xsd:sequence>
+ <xsd:element name="product-id" type="xsd:long" />
+ <xsd:element name="quantity" type="xsd:integer" />
+ <xsd:element name="price" type="xsd:decimal" />
+ </xsd:sequence>
+ </xsd:complexType>
+-->
+
+</xsd:schema>
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/smooks-config.xml
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/smooks-config.xml (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/smooks-config.xml 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.0.xsd">
+
+ <!--
+ Create an "example.beans.Order" bean instance when we visit the start of the <order> element.
+ Assign the new bean instance to the beanId of "order".
+ -->
+ <resource-config selector="root">
+ <resource>org.milyn.javabean.BeanPopulator</resource>
+ <param name="beanId">root</param>
+ <param name="beanClass">org.drools.runtime.pipeline.impl.Root</param>
+ <param name="bindings">
+ <binding property="children" selector="${children}" />
+ </param>
+ </resource-config>
+
+ <!--
+ Create an ArrayList bean instance when we visit the start of the <order> element.
+ Call it "orderItems" and seet it on the "order".
+ -->
+ <resource-config selector="root">
+ <resource>org.milyn.javabean.BeanPopulator</resource>
+ <param name="beanId">children</param>
+ <param name="beanClass">java.util.ArrayList</param>
+ <param name="bindings">
+ <binding selector="${orderItem}" />
+ </param>
+ </resource-config>
+
+ <!--
+ Create an "example.beans.OrderItem" bean instance when we visit the start of the <order-item> element.
+ Set the OrderItem instances on the "orderItem".
+ -->
+ <resource-config selector="order-item">
+ <resource>org.milyn.javabean.BeanPopulator</resource>
+ <param name="beanClass">example.OrderItem</param>
+ <param name="bindings">
+ <!-- OrderItem bindings... -->
+ <binding property="productId" type="Long" selector="order-item product" />
+ <binding property="quantity" type="Integer" selector="order-item quantity" />
+ <binding property="price" type="Double" selector="order-item price" />
+ </param>
+ </resource-config>
+
+
+</smooks-resource-list>
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test.xsd
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test.xsd (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test.xsd 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,29 @@
+<schema xmlns = "http://www.w3.org/2001/XMLSchema"
+ xmlns:exp="http://www.oracle.com/sample3/"
+ targetNamespace="http://www.oracle.com/sample3/"
+ elementFormDefault="qualified">
+
+ <complexType name="Address">
+ <sequence>
+ <element name="name" type="string"/>
+ <element name="doorNumber" type="short"/>
+ <element name="street" type="string"/>
+ <element name="city" type="string"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="USAddress">
+ <complexContent>
+ <extension base="exp:Address">
+ <sequence>
+ <element name="state" type="string"/>
+ <element name="zip" type="integer"/>
+ <element name="country" type="string"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <element name="myAddress" type="exp:USAddress"/>
+
+</schema>
Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_JXLS.drl
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_JXLS.drl (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_JXLS.drl 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,17 @@
+package sample
+
+import java.util.List
+// this doesn't work, as we don't support default values
+
+
+declare Department
+ name : String
+ chief : Employee
+ staff : List
+end
+
+declare Company
+ name : String
+ chief : Employee
+ employee : List
+end
Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_Jaxb.drl
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_Jaxb.drl (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_Jaxb.drl 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,31 @@
+package org.drools.xxx
+
+import org.drools.model.order.Order
+import org.drools.model.order.Order.OrderItem
+
+global java.util.List list1;
+global java.util.List list2;
+
+global org.drools.model.order.Order order
+
+
+rule orderRule
+when
+ $i : Order()
+then
+ list1.add( $i );
+end
+
+rule orderItemRule1
+when
+ $i : OrderItem( price > 6)
+then
+ list1.add( $i );
+end
+
+rule orderItemRule2
+when
+ $i : OrderItem( price < 6)
+then
+ list2.add( $i );
+end
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_SmooksDirectRoot.drl
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_SmooksDirectRoot.drl (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_SmooksDirectRoot.drl 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,18 @@
+package example
+
+global java.util.List list;
+
+global org.drools.runtime.pipeline.impl.Root root
+
+declare OrderItem
+ productId : long
+ quantity : Integer
+ price : double
+end
+
+rule someRule
+when
+ $i : OrderItem()
+then
+ list.add( $i );
+end
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_SmooksNestedIterable.drl
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_SmooksNestedIterable.drl (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_SmooksNestedIterable.drl 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,18 @@
+package example
+
+global java.util.List list;
+
+global org.drools.runtime.pipeline.impl.Root root
+
+declare OrderItem
+ productId : long
+ quantity : Integer
+ price : double
+end
+
+rule someRule
+when
+ $i : OrderItem()
+then
+ list.add( $i );
+end
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_XStreamDirectRoot.drl
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_XStreamDirectRoot.drl (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_XStreamDirectRoot.drl 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,16 @@
+package example
+
+global java.util.List list;
+
+declare OrderItem
+ productId : long
+ quantity : Integer
+ price : double
+end
+
+rule someRule
+when
+ $i : OrderItem()
+then
+ list.add( $i );
+end
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_XStreamNestedIterable.drl
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_XStreamNestedIterable.drl (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/src/test/resources/org/drools/runtime/pipeline/impl/test_XStreamNestedIterable.drl 2010-07-17 02:23:49 UTC (rev 33975)
@@ -0,0 +1,16 @@
+package example
+
+global java.util.List list;
+
+declare OrderItem
+ productId : long
+ quantity : Integer
+ price : double
+end
+
+rule someRule
+when
+ $i : OrderItem()
+then
+ list.add( $i );
+end
\ No newline at end of file
More information about the jboss-svn-commits
mailing list