[jboss-svn-commits] JBL Code SVN: r33359 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/base and 6 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sat Jun 5 00:26:31 EDT 2010
Author: mark.proctor at jboss.com
Date: 2010-06-05 00:26:28 -0400 (Sat, 05 Jun 2010)
New Revision: 33359
Added:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/CommandsList.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/CommandsObjectContainer.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/IdentifiersContainer.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/ObjectsObjectContainer.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/ParameterContainer.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/RowItemContainer.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/WorkItemResultsContainer.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamHelper.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamJSon.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamXML.java
labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/JSonBatchExecutionTest.java
Removed:
labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/ToXmlNodeTransformer.java
Modified:
labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/help/BatchExecutionHelper.java
labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/help/BatchExecutionHelperProvider.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorFactory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/GetGlobalCommand.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/SetGlobalCommand.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/rule/InsertObjectCommand.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/core/util/StringUtils.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/BatchExecutionHelperProviderImpl.java
labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlGridTransformer.java
labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/XStreamBatchExecutionTest.java
Log:
JBRULES-2537 JSon Marshaller
-Added JSon marshaller using xstream, with unit tests.
Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/help/BatchExecutionHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/help/BatchExecutionHelper.java 2010-06-05 01:08:43 UTC (rev 33358)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/help/BatchExecutionHelper.java 2010-06-05 04:26:28 UTC (rev 33359)
@@ -239,6 +239,10 @@
public static XStream newXStreamMarshaller() {
return getBatchExecutionHelperProvider().newXStreamMarshaller();
}
+
+ public static XStream newJSonMarshaller() {
+ return getBatchExecutionHelperProvider().newJSonMarshaller();
+ }
private static synchronized void setBatchExecutionHelperProvider(BatchExecutionHelperProvider provider) {
BatchExecutionHelper.provider = provider;
Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/help/BatchExecutionHelperProvider.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/help/BatchExecutionHelperProvider.java 2010-06-05 01:08:43 UTC (rev 33358)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/help/BatchExecutionHelperProvider.java 2010-06-05 04:26:28 UTC (rev 33359)
@@ -9,4 +9,5 @@
*/
public interface BatchExecutionHelperProvider {
XStream newXStreamMarshaller();
+ XStream newJSonMarshaller();
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorFactory.java 2010-06-05 01:08:43 UTC (rev 33358)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorFactory.java 2010-06-05 04:26:28 UTC (rev 33359)
@@ -142,13 +142,12 @@
final Object[] params = {index, fieldType, valueType};
return (BaseClassFieldReader) newClass.getConstructors()[0].newInstance( params );
} else {
- throw new RuntimeDroolsException( "Field/method '" + fieldName + "' not found for class '" + clazz.getName() + "'" );
+ throw new RuntimeDroolsException( "Field/method '" + fieldName + "' not found for class '" + clazz.getName() + "'\n" );
}
}
} catch ( final RuntimeDroolsException e ) {
throw e;
} catch ( final Exception e ) {
-// e.printStackTrace();
throw new RuntimeDroolsException( e );
}
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/GetGlobalCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/GetGlobalCommand.java 2010-06-05 01:08:43 UTC (rev 33358)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/GetGlobalCommand.java 2010-06-05 04:26:28 UTC (rev 33359)
@@ -41,7 +41,13 @@
public String getIdentifier() {
return identifier;
}
+
+
+ public void setIdentifier(String identifier) {
+ this.identifier = identifier;
+ }
+
public Object execute(Context context) {
StatefulKnowledgeSession ksession = ((KnowledgeCommandContext) context).getStatefulKnowledgesession();
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/SetGlobalCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/SetGlobalCommand.java 2010-06-05 01:08:43 UTC (rev 33358)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/SetGlobalCommand.java 2010-06-05 04:26:28 UTC (rev 33359)
@@ -54,6 +54,10 @@
public String getIdentifier() {
return this.identifier;
}
+
+ public void setIdentifier(String identifier) {
+ this.identifier = identifier;
+ }
public Object getObject() {
return this.object;
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/rule/InsertObjectCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/rule/InsertObjectCommand.java 2010-06-05 01:08:43 UTC (rev 33358)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/runtime/rule/InsertObjectCommand.java 2010-06-05 04:26:28 UTC (rev 33359)
@@ -1,5 +1,7 @@
package org.drools.command.runtime.rule;
+import java.io.ObjectStreamException;
+
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
@@ -89,5 +91,10 @@
public String toString() {
return "session.insert(" + object + ");";
}
+
+// private Object readResolve() throws ObjectStreamException {
+// this.returnObject = true;
+// return this;
+// }
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/core/util/StringUtils.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/core/util/StringUtils.java 2010-06-05 01:08:43 UTC (rev 33358)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/core/util/StringUtils.java 2010-06-05 04:26:28 UTC (rev 33359)
@@ -17,7 +17,10 @@
* limitations under the License.
*/
+import java.io.BufferedReader;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
@@ -1184,4 +1187,29 @@
}
return out.toString();
}
+
+ public static String toString(Reader reader) throws IOException {
+ if ( reader instanceof BufferedReader ) {
+ return toString( (BufferedReader) reader );
+ } else {
+ return toString( new BufferedReader( reader ) );
+ }
+ }
+
+ public static String toString(InputStream is) throws IOException {
+ return toString( new BufferedReader(new InputStreamReader(is, "UTF-8") ) );
+ }
+
+ public static String toString(BufferedReader reader) throws IOException {
+ StringBuilder sb = new StringBuilder();
+ try {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ sb.append(line).append("\n");
+ }
+ } finally {
+ reader.close();
+ }
+ return sb.toString();
+ }
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/BatchExecutionHelperProviderImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/BatchExecutionHelperProviderImpl.java 2010-06-05 01:08:43 UTC (rev 33358)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/BatchExecutionHelperProviderImpl.java 2010-06-05 04:26:28 UTC (rev 33359)
@@ -1,1052 +1,23 @@
package org.drools.runtime.help.impl;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.drools.base.ClassObjectType;
-import org.drools.base.DroolsQuery;
-import org.drools.command.Command;
-import org.drools.command.CommandFactory;
-import org.drools.command.Setter;
-import org.drools.command.runtime.BatchExecutionCommand;
-import org.drools.command.runtime.GetGlobalCommand;
-import org.drools.command.runtime.SetGlobalCommand;
-import org.drools.command.runtime.process.AbortWorkItemCommand;
-import org.drools.command.runtime.process.CompleteWorkItemCommand;
-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.GetObjectCommand;
-import org.drools.command.runtime.rule.GetObjectsCommand;
-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.drools.command.runtime.rule.RetractCommand;
-import org.drools.common.DefaultFactHandle;
-import org.drools.common.DisconnectedFactHandle;
-import org.drools.rule.Declaration;
-import org.drools.runtime.ExecutionResults;
import org.drools.runtime.help.BatchExecutionHelperProvider;
-import org.drools.runtime.impl.ExecutionResultImpl;
-import org.drools.runtime.rule.FactHandle;
-import org.drools.runtime.rule.QueryResults;
-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 com.thoughtworks.xstream.XStream;
-import com.thoughtworks.xstream.converters.Converter;
-import com.thoughtworks.xstream.converters.MarshallingContext;
-import com.thoughtworks.xstream.converters.UnmarshallingContext;
-import com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter;
-import com.thoughtworks.xstream.io.HierarchicalStreamReader;
-import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
-import com.thoughtworks.xstream.mapper.Mapper;
public class BatchExecutionHelperProviderImpl
implements
BatchExecutionHelperProvider {
-
+
public XStream newXStreamMarshaller() {
- return newXStreamMarshaller( new XStream());
+ return newXStreamMarshaller( new XStream() );
}
- public XStream newXStreamMarshaller(XStream xstream) {
- ElementNames names = new XmlElementNames();
-
- // xstream.setMode( XStream.NO_REFERENCES );
- xstream.processAnnotations( BatchExecutionCommand.class );
- xstream.addImplicitCollection( BatchExecutionCommand.class,
- "commands" );
-
- xstream.alias( "batch-execution",
- BatchExecutionCommand.class );
- xstream.alias( "insert",
- InsertObjectCommand.class );
- xstream.alias( "modify",
- ModifyCommand.class );
- xstream.alias( "retract",
- RetractCommand.class );
- xstream.alias( "insert-elements",
- InsertElementsCommand.class );
- xstream.alias( "start-process",
- StartProcessCommand.class );
- xstream.alias( "signal-event",
- SignalEventCommand.class );
- xstream.alias( "complete-work-item",
- CompleteWorkItemCommand.class );
- xstream.alias( "abort-work-item",
- AbortWorkItemCommand.class );
- xstream.alias( "set-global",
- SetGlobalCommand.class );
- xstream.alias( "get-global",
- GetGlobalCommand.class );
- xstream.alias( "get-object",
- GetObjectCommand.class );
- xstream.alias( "get-objects",
- GetObjectsCommand.class );
- xstream.alias( "execution-results",
- ExecutionResultImpl.class );
- xstream.alias( "fire-all-rules",
- FireAllRulesCommand.class );
- xstream.alias( "query",
- QueryCommand.class );
- xstream.alias( "query-results",
- FlatQueryResults.class );
- xstream.alias( "query-results",
- NativeQueryResults.class );
- xstream.alias("fact-handle", DefaultFactHandle.class);
-
- xstream.registerConverter( new InsertConverter( xstream.getMapper() ) );
- xstream.registerConverter( new RetractConverter( xstream.getMapper() ) );
- xstream.registerConverter( new ModifyConverter( xstream.getMapper() ) );
- xstream.registerConverter( new GetObjectConverter( xstream.getMapper() ) );
- xstream.registerConverter( new InsertElementsConverter( xstream.getMapper() ) );
- xstream.registerConverter( new FireAllRulesConverter( xstream.getMapper() ) );
- xstream.registerConverter( new StartProcessConvert( xstream.getMapper() ) );
- xstream.registerConverter( new SignalEventConverter( xstream.getMapper() ) );
- xstream.registerConverter( new CompleteWorkItemConverter( xstream.getMapper() ) );
- xstream.registerConverter( new AbortWorkItemConverter( xstream.getMapper() ) );
- xstream.registerConverter( new QueryConverter( xstream.getMapper() ) );
- xstream.registerConverter( new SetGlobalConverter( xstream.getMapper() ) );
- xstream.registerConverter( new GetGlobalConverter( xstream.getMapper() ) );
- xstream.registerConverter( new GetObjectsConverter( xstream.getMapper() ) );
- xstream.registerConverter( new BatchExecutionResultConverter( xstream.getMapper() ) );
- xstream.registerConverter( new QueryResultsConverter( xstream.getMapper() ) );
- xstream.registerConverter( new FactHandleConverter(xstream.getMapper()));
-
- return xstream;
+ public XStream newJSonMarshaller() {
+ return XStreamJSon.newJSonMarshaller();
}
- public static interface ElementNames {
- public String getIn();
-
- public String getInOut();
-
- public String getOut();
+ public XStream newXStreamMarshaller(XStream xstream) {
+ return XStreamXML.newXStreamMarshaller(xstream);
}
-
- public static class JsonElementNames
- implements
- ElementNames {
- private String in = "in";
- private String inOut = "inOut";
- private String out = "out";
-
- public String getIn() {
- return in;
- }
-
- public String getInOut() {
- return inOut;
- }
-
- public String getOut() {
- return out;
- }
- }
-
- public static class XmlElementNames
- implements
- ElementNames {
- private String in = "in";
- private String inOut = "in-out";
- private String out = "out";
-
- public String getIn() {
- return in;
- }
-
- public String getInOut() {
- return inOut;
- }
-
- public String getOut() {
- return out;
- }
- }
-
- public static class InsertConverter extends AbstractCollectionConverter
- implements
- Converter {
-
- public InsertConverter(Mapper mapper) {
- super( mapper );
- }
-
- public void marshal(Object object,
- HierarchicalStreamWriter writer,
- MarshallingContext context) {
- InsertObjectCommand cmd = (InsertObjectCommand) object;
- if ( cmd.getOutIdentifier() != null ) {
- writer.addAttribute( "out-identifier",
- cmd.getOutIdentifier() );
-
- writer.addAttribute( "return-object",
- Boolean.toString( cmd.isReturnObject() ) );
-
- }
- writeItem( cmd.getObject(),
- context,
- writer );
- }
-
- public Object unmarshal(HierarchicalStreamReader reader,
- UnmarshallingContext context) {
- String identifierOut = reader.getAttribute( "out-identifier" );
- String returnObject = reader.getAttribute( "return-object" );
-
- reader.moveDown();
- Object object = readItem( reader,
- context,
- null );
- reader.moveUp();
- InsertObjectCommand cmd = new InsertObjectCommand( object );
- if ( identifierOut != null ) {
- cmd.setOutIdentifier( identifierOut );
- if ( returnObject != null ) {
- cmd.setReturnObject( Boolean.parseBoolean( returnObject ) );
- }
- }
- return cmd;
- }
-
- public boolean canConvert(Class clazz) {
- return clazz.equals( InsertObjectCommand.class );
- }
-
- }
-
- public static class FactHandleConverter extends AbstractCollectionConverter
- implements
- Converter {
- public FactHandleConverter(Mapper mapper) {
- super(mapper);
- }
-
- public boolean canConvert(Class aClass) {
- return FactHandle.class.isAssignableFrom(aClass);
- }
-
- public void marshal(Object object, HierarchicalStreamWriter writer, MarshallingContext marshallingContext) {
- FactHandle fh = (FactHandle) object;
- //writer.startNode("fact-handle");
- writer.addAttribute("externalForm", fh.toExternalForm());
- //writer.endNode();
- }
-
- public Object unmarshal(HierarchicalStreamReader hierarchicalStreamReader, UnmarshallingContext unmarshallingContext) {
- throw new UnsupportedOperationException("Unable to unmarshal fact handles.");
- }
- }
-
- public static class ModifyConverter extends AbstractCollectionConverter
- implements
- Converter {
-
- public ModifyConverter(Mapper mapper) {
- super( mapper );
- }
-
- public void marshal(Object object,
- HierarchicalStreamWriter writer,
- MarshallingContext context) {
- ModifyCommand cmd = (ModifyCommand) object;
-
- writer.addAttribute( "factHandle",
- cmd.getFactHandle().toExternalForm() );
-
- for ( Setter setter : cmd.getSetters() ) {
- writer.startNode( "set" );
- writer.addAttribute( "accessor",
- setter.getAccessor() );
- writer.addAttribute( "value",
- setter.getValue() );
- writer.endNode();
- }
- }
-
- public Object unmarshal(HierarchicalStreamReader reader,
- UnmarshallingContext context) {
- FactHandle factHandle = new DisconnectedFactHandle( reader.getAttribute( "factHandle" ) );
-
- List<Setter> setters = new ArrayList();
- while ( reader.hasMoreChildren() ) {
- reader.moveDown();
- Setter setter = CommandFactory.newSetter( reader.getAttribute( "accessor" ),
- reader.getAttribute( "value" ) );
- setters.add( setter );
- reader.moveUp();
- }
-
- Command cmd = CommandFactory.newModify( factHandle,
- setters );
- return cmd;
- }
-
- public boolean canConvert(Class clazz) {
- return clazz.equals( ModifyCommand.class );
- }
-
- }
-
- public static class RetractConverter extends AbstractCollectionConverter
- implements
- Converter {
-
- public RetractConverter(Mapper mapper) {
- super( mapper );
- }
-
- public void marshal(Object object,
- HierarchicalStreamWriter writer,
- MarshallingContext context) {
- RetractCommand cmd = (RetractCommand) object;
-
- writer.addAttribute( "factHandle",
- cmd.getFactHandle().toExternalForm() );
- }
-
- public Object unmarshal(HierarchicalStreamReader reader,
- UnmarshallingContext context) {
- FactHandle factHandle = new DisconnectedFactHandle( reader.getAttribute( "factHandle" ) );
-
- Command cmd = CommandFactory.newRetract( factHandle );
-
- return cmd;
- }
-
- public boolean canConvert(Class clazz) {
- return clazz.equals( RetractCommand.class );
- }
- }
-
- public static class InsertElementsConverter extends AbstractCollectionConverter
- implements
- Converter {
-
- public InsertElementsConverter(Mapper mapper) {
- super( mapper );
- }
-
- public void marshal(Object object,
- HierarchicalStreamWriter writer,
- MarshallingContext context) {
- InsertElementsCommand cmd = (InsertElementsCommand) object;
-
- if ( cmd.getOutIdentifier() != null ) {
- writer.addAttribute( "out-identifier",
- cmd.getOutIdentifier() );
-
- writer.addAttribute( "return-objects",
- Boolean.toString( cmd.isReturnObject() ) );
-
- }
-
- for ( Object element : cmd.getObjects() ) {
- writeItem( element,
- context,
- writer );
- }
- }
-
- public Object unmarshal(HierarchicalStreamReader reader,
- UnmarshallingContext context) {
- String identifierOut = reader.getAttribute( "out-identifier" );
- String returnObject = reader.getAttribute( "return-objects" );
-
- List objects = new ArrayList();
- while ( reader.hasMoreChildren() ) {
- reader.moveDown();
- Object object = readItem( reader,
- context,
- null );
- reader.moveUp();
- objects.add( object );
- }
-
- InsertElementsCommand cmd = new InsertElementsCommand( objects );
- if ( identifierOut != null ) {
- cmd.setOutIdentifier( identifierOut );
- if ( returnObject != null ) {
- cmd.setReturnObject( Boolean.parseBoolean( returnObject ) );
- }
- }
- return cmd;
- }
-
- public boolean canConvert(Class clazz) {
- return clazz.equals( InsertElementsCommand.class );
- }
-
- }
-
- public static class SetGlobalConverter extends AbstractCollectionConverter
- implements
- Converter {
-
- public SetGlobalConverter(Mapper mapper) {
- super( mapper );
- }
-
- public void marshal(Object object,
- HierarchicalStreamWriter writer,
- MarshallingContext context) {
- SetGlobalCommand cmd = (SetGlobalCommand) object;
-
- writer.addAttribute( "identifier",
- cmd.getIdentifier() );
-
- if ( cmd.getOutIdentifier() != null ) {
- writer.addAttribute( "out-identifier",
- cmd.getOutIdentifier() );
- } else if ( cmd.isOut() ) {
- writer.addAttribute( "out",
- Boolean.toString( cmd.isOut() ) );
- }
-
- writeItem( cmd.getObject(),
- context,
- writer );
- }
-
- public Object unmarshal(HierarchicalStreamReader reader,
- UnmarshallingContext context) {
- String identifier = reader.getAttribute( "identifier" );
- String out = reader.getAttribute( "out" );
- String identifierOut = reader.getAttribute( "out-identifier" );
-
- reader.moveDown();
- Object object = readItem( reader,
- context,
- null );
- reader.moveUp();
- SetGlobalCommand cmd = new SetGlobalCommand( identifier,
- object );
- if ( identifierOut != null ) {
- cmd.setOutIdentifier( identifierOut );
- } else if ( out != null ) {
- cmd.setOut( Boolean.parseBoolean( out ) );
- }
- return cmd;
- }
-
- public boolean canConvert(Class clazz) {
- return clazz.equals( SetGlobalCommand.class );
- }
- }
-
- public static class GetObjectConverter extends AbstractCollectionConverter
- implements
- Converter {
-
- public GetObjectConverter(Mapper mapper) {
- super( mapper );
- }
-
- public void marshal(Object object,
- HierarchicalStreamWriter writer,
- MarshallingContext context) {
- GetObjectCommand cmd = (GetObjectCommand) object;
-
- writer.addAttribute( "factHandle",
- cmd.getFactHandle().toExternalForm() );
-
- if ( cmd.getOutIdentifier() != null ) {
- writer.addAttribute( "out-identifier",
- cmd.getOutIdentifier() );
- }
- }
-
- public Object unmarshal(HierarchicalStreamReader reader,
- UnmarshallingContext context) {
- FactHandle factHandle = new DisconnectedFactHandle( reader.getAttribute( "factHandle" ) );
- String identifierOut = reader.getAttribute( "out-identifier" );
-
- GetObjectCommand cmd = new GetObjectCommand( factHandle );
- if ( identifierOut != null ) {
- cmd.setOutIdentifier( identifierOut );
- }
- return cmd;
- }
-
- public boolean canConvert(Class clazz) {
- return clazz.equals( GetObjectCommand.class );
- }
- }
-
- public static class GetGlobalConverter extends AbstractCollectionConverter
- implements
- Converter {
-
- public GetGlobalConverter(Mapper mapper) {
- super( mapper );
- }
-
- public void marshal(Object object,
- HierarchicalStreamWriter writer,
- MarshallingContext context) {
- GetGlobalCommand cmd = (GetGlobalCommand) object;
-
- writer.addAttribute( "identifier",
- cmd.getIdentifier() );
-
- if ( cmd.getOutIdentifier() != null ) {
- writer.addAttribute( "out-identifier",
- cmd.getOutIdentifier() );
- }
- }
-
- public Object unmarshal(HierarchicalStreamReader reader,
- UnmarshallingContext context) {
- String identifier = reader.getAttribute( "identifier" );
- String identifierOut = reader.getAttribute( "out-identifier" );
-
- GetGlobalCommand cmd = new GetGlobalCommand( identifier );
- if ( identifierOut != null ) {
- cmd.setOutIdentifier( identifierOut );
- }
- return cmd;
- }
-
- public boolean canConvert(Class clazz) {
- return clazz.equals( GetGlobalCommand.class );
- }
- }
-
- public static class GetObjectsConverter extends AbstractCollectionConverter
- implements
- Converter {
-
- public GetObjectsConverter(Mapper mapper) {
- super( mapper );
- }
-
- public void marshal(Object object,
- HierarchicalStreamWriter writer,
- MarshallingContext context) {
- GetObjectsCommand cmd = (GetObjectsCommand) object;
-
- if ( cmd.getOutIdentifier() != null ) {
- writer.addAttribute( "out-identifier",
- cmd.getOutIdentifier() );
- }
- }
-
- public Object unmarshal(HierarchicalStreamReader reader,
- UnmarshallingContext context) {
- String identifierOut = reader.getAttribute( "out-identifier" );
-
- GetObjectsCommand cmd = new GetObjectsCommand();
- if ( identifierOut != null ) {
- cmd.setOutIdentifier( identifierOut );
- }
- return cmd;
- }
-
- public boolean canConvert(Class clazz) {
- return clazz.equals( GetObjectsCommand.class );
- }
- }
-
- public static class FireAllRulesConverter extends AbstractCollectionConverter
- implements
- Converter {
-
- public FireAllRulesConverter(Mapper mapper) {
- super( mapper );
- }
-
- public void marshal(Object object,
- HierarchicalStreamWriter writer,
- MarshallingContext context) {
- FireAllRulesCommand cmd = (FireAllRulesCommand) object;
-
- if ( cmd.getMax() != -1 ) {
- writer.addAttribute( "max",
- Integer.toString( cmd.getMax() ) );
- }
- }
-
- public Object unmarshal(HierarchicalStreamReader reader,
- UnmarshallingContext context) {
- String max = reader.getAttribute( "max" );
-
- FireAllRulesCommand cmd = null;
-
- if ( max != null ) {
- cmd = new FireAllRulesCommand( Integer.parseInt( max ) );
- } else {
- cmd = new FireAllRulesCommand();
- }
- return cmd;
- }
-
- public boolean canConvert(Class clazz) {
- return clazz.equals( FireAllRulesCommand.class );
- }
- }
-
- public static class QueryConverter extends AbstractCollectionConverter
- implements
- Converter {
-
- public QueryConverter(Mapper mapper) {
- super( mapper );
- }
-
- public void marshal(Object object,
- HierarchicalStreamWriter writer,
- MarshallingContext context) {
- QueryCommand cmd = (QueryCommand) object;
- writer.addAttribute( "out-identifier",
- cmd.getOutIdentifier() );
- writer.addAttribute( "name",
- cmd.getName() );
- if ( cmd.getArguments() != null ) {
- for ( Object arg : cmd.getArguments() ) {
- writeItem( arg,
- context,
- writer );
- }
- }
- }
-
- public Object unmarshal(HierarchicalStreamReader reader,
- UnmarshallingContext context) {
- List<String> outs = new ArrayList<String>();
-
- // Query cmd = null;
- String outIdentifier = reader.getAttribute( "out-identifier" );
- String name = reader.getAttribute( "name" );
- List<Object> args = new ArrayList<Object>();
- while ( reader.hasMoreChildren() ) {
- reader.moveDown();
- Object arg = readItem( reader,
- context,
- null );
- args.add( arg );
- reader.moveUp();
- }
- QueryCommand cmd = new QueryCommand( outIdentifier,
- name,
- args.toArray( new Object[args.size()] ) );
-
- return cmd;
- }
-
- public boolean canConvert(Class clazz) {
- return clazz.equals( QueryCommand.class );
- }
- }
-
- public static class StartProcessConvert extends AbstractCollectionConverter
- implements
- Converter {
-
- public StartProcessConvert(Mapper mapper) {
- super( mapper );
- }
-
- public void marshal(Object object,
- HierarchicalStreamWriter writer,
- MarshallingContext context) {
- StartProcessCommand cmd = (StartProcessCommand) object;
- writer.addAttribute( "processId",
- cmd.getProcessId() );
-
- for ( Entry<String, Object> entry : cmd.getParameters().entrySet() ) {
- writer.startNode( "parameter" );
- writer.addAttribute( "identifier",
- entry.getKey() );
- writeItem( entry.getValue(),
- context,
- writer );
- writer.endNode();
- }
- }
-
- public Object unmarshal(HierarchicalStreamReader reader,
- UnmarshallingContext context) {
- String processId = reader.getAttribute( "processId" );
-
- HashMap<String, Object> params = new HashMap<String, Object>();
- while ( reader.hasMoreChildren() ) {
- reader.moveDown();
- String identifier = reader.getAttribute( "identifier" );
- reader.moveDown();
- Object value = readItem( reader,
- context,
- null );
- reader.moveUp();
- params.put( identifier,
- value );
- reader.moveUp();
- }
- StartProcessCommand cmd = new StartProcessCommand();
- cmd.setProcessId( processId );
- cmd.setParameters( params );
-
- return cmd;
- }
-
- public boolean canConvert(Class clazz) {
- return clazz.equals( StartProcessCommand.class );
- }
- }
-
- public static class SignalEventConverter extends AbstractCollectionConverter
- implements
- Converter {
-
- public SignalEventConverter(Mapper mapper) {
- super( mapper );
- }
-
- public void marshal(Object object,
- HierarchicalStreamWriter writer,
- MarshallingContext context) {
- SignalEventCommand cmd = (SignalEventCommand) object;
- long processInstanceId = cmd.getProcessInstanceId();
- String eventType = cmd.getEventType();
- Object event = cmd.getEvent();
-
- if ( processInstanceId != -1 ) {
- writer.addAttribute( "process-instance-id",
- Long.toString( processInstanceId ) );
- }
-
- writer.addAttribute( "event-type",
- eventType );
-
- writeItem( event,
- context,
- writer );
- }
-
- public Object unmarshal(HierarchicalStreamReader reader,
- UnmarshallingContext context) {
- String processInstanceId = reader.getAttribute( "process-instance-id" );
- String eventType = reader.getAttribute( "event-type" );
-
- reader.moveDown();
- Object event = readItem( reader,
- context,
- null );
- reader.moveUp();
-
- Command cmd;
- if ( processInstanceId != null ) {
- cmd = CommandFactory.newSignalEvent( Long.parseLong( processInstanceId ),
- eventType,
- event );
- } else {
- cmd = CommandFactory.newSignalEvent( eventType,
- event );
- }
-
- return cmd;
- }
-
- public boolean canConvert(Class clazz) {
- return clazz.equals( SignalEventCommand.class );
- }
-
- }
-
- public static class CompleteWorkItemConverter extends AbstractCollectionConverter
- implements
- Converter {
-
- public CompleteWorkItemConverter(Mapper mapper) {
- super( mapper );
- }
-
- public void marshal(Object object,
- HierarchicalStreamWriter writer,
- MarshallingContext context) {
- CompleteWorkItemCommand cmd = (CompleteWorkItemCommand) object;
- writer.addAttribute( "id",
- Long.toString( cmd.getWorkItemId() ) );
-
- for ( Entry<String, Object> entry : cmd.getResults().entrySet() ) {
- writer.startNode( "result" );
- writer.addAttribute( "identifier",
- entry.getKey() );
- writeItem( entry.getValue(),
- context,
- writer );
- writer.endNode();
- }
- }
-
- public Object unmarshal(HierarchicalStreamReader reader,
- UnmarshallingContext context) {
- String id = reader.getAttribute( "id" );
-
- Map<String, Object> results = new HashMap<String, Object>();
- while ( reader.hasMoreChildren() ) {
- reader.moveDown();
- String identifier = reader.getAttribute( "identifier" );
- reader.moveDown();
- Object value = readItem( reader,
- context,
- null );
- reader.moveUp();
- results.put( identifier,
- value );
- reader.moveUp();
- }
-
- Command cmd = CommandFactory.newCompleteWorkItem( Long.parseLong( id ),
- results );
-
- return cmd;
- }
-
- public boolean canConvert(Class clazz) {
- return clazz.equals( CompleteWorkItemCommand.class );
- }
- }
-
- public static class AbortWorkItemConverter extends AbstractCollectionConverter
- implements
- Converter {
-
- public AbortWorkItemConverter(Mapper mapper) {
- super( mapper );
- }
-
- public void marshal(Object object,
- HierarchicalStreamWriter writer,
- MarshallingContext context) {
- AbortWorkItemCommand cmd = (AbortWorkItemCommand) object;
- writer.addAttribute( "id",
- Long.toString( cmd.getWorkItemId() ) );
- }
-
- public Object unmarshal(HierarchicalStreamReader reader,
- UnmarshallingContext context) {
- String id = reader.getAttribute( "id" );
- Command cmd = CommandFactory.newAbortWorkItem( Long.parseLong( id ) );
-
- return cmd;
- }
-
- public boolean canConvert(Class clazz) {
- return clazz.equals( AbortWorkItemCommand.class );
- }
- }
-
- public static class BatchExecutionResultConverter extends AbstractCollectionConverter
- implements
- Converter {
-
- public BatchExecutionResultConverter(Mapper mapper) {
- super( mapper );
- }
-
- public void marshal(Object object,
- HierarchicalStreamWriter writer,
- MarshallingContext context) {
- ExecutionResults result = (ExecutionResults) object;
- for ( String identifier : result.getIdentifiers() ) {
- writer.startNode( "result" );
- writer.addAttribute( "identifier",
- identifier );
- Object value = result.getValue( identifier );
- writeItem( value,
- context,
- writer );
- writer.endNode();
- }
-
- for ( String identifier : ((ExecutionResultImpl) result).getFactHandles().keySet() ) {
-
- Object handle = result.getFactHandle( identifier );
- if ( handle instanceof FactHandle ) {
- writer.startNode( "fact-handle" );
- writer.addAttribute( "identifier",
- identifier );
- writer.addAttribute( "externalForm",
- ((FactHandle) handle).toExternalForm() );
-
- writer.endNode();
- } else if ( handle instanceof Collection ) {
- writer.startNode( "fact-handles" );
- writer.addAttribute( "identifier",
- identifier );
- for ( FactHandle factHandle : (Collection<FactHandle>) handle ) {
- writer.startNode( "fact-handle" );
- writer.addAttribute( "externalForm",
- ((FactHandle) factHandle).toExternalForm() );
- writer.endNode();
- }
-
- writer.endNode();
- }
-
- }
- }
-
- public Object unmarshal(HierarchicalStreamReader reader,
- UnmarshallingContext context) {
- ExecutionResultImpl result = new ExecutionResultImpl();
- Map results = result.getResults();
- Map facts = result.getFactHandles();
-
- while ( reader.hasMoreChildren() ) {
- reader.moveDown();
- if ( reader.getNodeName().equals( "result" ) ) {
- String identifier = reader.getAttribute( "identifier" );
- reader.moveDown();
- Object value = readItem( reader,
- context,
- null );
- results.put( identifier,
- value );
- reader.moveUp();
- reader.moveUp();
- } else if ( reader.getNodeName().equals( "fact-handle" ) ) {
- String identifier = reader.getAttribute( "identifier" );
- facts.put( identifier,
- new DisconnectedFactHandle( reader.getAttribute( "externalForm" ) ) );
- } else if ( reader.getNodeName().equals( "fact-handles" ) ) {
- String identifier = reader.getAttribute( "identifier" );
- List<FactHandle> list = new ArrayList();
- while ( reader.hasMoreChildren() ) {
- reader.moveDown();
- list.add( new DisconnectedFactHandle( reader.getAttribute( "externalForm" ) ) );
- reader.moveUp();
- }
- facts.put( identifier,
- list );
- } else {
- throw new IllegalArgumentException( "Element '" + reader.getNodeName() + "' is not supported here" );
- }
- }
-
- return result;
- }
-
- public boolean canConvert(Class clazz) {
- return ExecutionResults.class.isAssignableFrom( clazz );
- }
- }
-
- public static class QueryResultsConverter extends AbstractCollectionConverter
- implements
- Converter {
-
- public QueryResultsConverter(Mapper mapper) {
- super( mapper );
- }
-
- public void marshal(Object object,
- HierarchicalStreamWriter writer,
- MarshallingContext context) {
- QueryResults results = (QueryResults) object;
-
- // write out identifiers
- List<String> originalIds = Arrays.asList( results.getIdentifiers() );
- List<String> actualIds = new ArrayList();
- if ( results instanceof NativeQueryResults ) {
- for ( String identifier : originalIds ) {
- // we don't want to marshall the query parameters
- Declaration declr = ((NativeQueryResults) results).getDeclarations().get( identifier );
- ObjectType objectType = declr.getPattern().getObjectType();
- if ( objectType instanceof ClassObjectType ) {
- if ( ((ClassObjectType) objectType).getClassType() == DroolsQuery.class ) {
- continue;
- }
- }
- actualIds.add( identifier );
- }
- }
-
- String[] identifiers = actualIds.toArray( new String[actualIds.size()] );
-
- writer.startNode( "identifiers" );
- for ( int i = 0; i < identifiers.length; i++ ) {
- writer.startNode( "identifier" );
- writer.setValue( identifiers[i] );
- writer.endNode();
- }
- writer.endNode();
-
- for ( QueryResultsRow result : results ) {
- writer.startNode( "row" );
- for ( int i = 0; i < identifiers.length; i++ ) {
- Object value = result.get( identifiers[i] );
- FactHandle factHandle = result.getFactHandle( identifiers[i] );
- writeItem( value,
- context,
- writer );
- writer.startNode( "fact-handle" );
- writer.addAttribute( "externalForm",
- ((FactHandle) factHandle).toExternalForm() );
- writer.endNode();
- }
- writer.endNode();
- }
- }
-
- public Object unmarshal(HierarchicalStreamReader reader,
- UnmarshallingContext context) {
- reader.moveDown();
- List<String> list = new ArrayList<String>();
- while ( reader.hasMoreChildren() ) {
- reader.moveDown();
- list.add( reader.getValue() );
- reader.moveUp();
- }
- reader.moveUp();
-
- HashMap<String, Integer> identifiers = new HashMap<String, Integer>();
- for ( int i = 0; i < list.size(); i++ ) {
- identifiers.put( list.get( i ),
- i );
- }
-
- ArrayList<ArrayList<Object>> results = new ArrayList();
- ArrayList<ArrayList<FactHandle>> resultHandles = new ArrayList();
- while ( reader.hasMoreChildren() ) {
- reader.moveDown();
- ArrayList objects = new ArrayList();
- ArrayList<FactHandle> handles = new ArrayList();
- while ( reader.hasMoreChildren() ) {
- reader.moveDown();
- Object object = readItem( reader,
- context,
- null );
- reader.moveUp();
-
- reader.moveDown();
- FactHandle handle = new DisconnectedFactHandle( reader.getAttribute( "externalForm" ) );
- reader.moveUp();
-
- objects.add( object );
- handles.add( handle );
- }
- results.add( objects );
- resultHandles.add( handles );
- reader.moveUp();
- }
-
- return new FlatQueryResults( identifiers,
- results,
- resultHandles );
- }
-
- public boolean canConvert(Class clazz) {
- return QueryResults.class.isAssignableFrom( clazz );
- }
- }
+
}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/CommandsList.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/CommandsList.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/CommandsList.java 2010-06-05 04:26:28 UTC (rev 33359)
@@ -0,0 +1,17 @@
+package org.drools.runtime.help.impl;
+
+import java.util.List;
+
+public class CommandsList {
+ private List<CommandsObjectContainer> commands;
+
+ public List<CommandsObjectContainer> getCommands() {
+ return commands;
+ }
+
+ public void setCommands(List<CommandsObjectContainer> commands) {
+ this.commands = commands;
+ }
+
+
+}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/CommandsObjectContainer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/CommandsObjectContainer.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/CommandsObjectContainer.java 2010-06-05 04:26:28 UTC (rev 33359)
@@ -0,0 +1,14 @@
+package org.drools.runtime.help.impl;
+
+public class CommandsObjectContainer {
+
+ private Object containedObject;
+
+ public CommandsObjectContainer(Object object) {
+ this.containedObject = object;
+ }
+
+ public Object getContainedObject() {
+ return containedObject;
+ }
+}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/IdentifiersContainer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/IdentifiersContainer.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/IdentifiersContainer.java 2010-06-05 04:26:28 UTC (rev 33359)
@@ -0,0 +1,28 @@
+package org.drools.runtime.help.impl;
+
+import org.drools.runtime.rule.FactHandle;
+
+public class IdentifiersContainer {
+
+ private String identifier;
+ private int index;
+
+ public IdentifiersContainer() {
+
+ }
+
+ public IdentifiersContainer(String identifier,
+ int index) {
+ this.identifier = identifier;
+ this.index = index;
+ }
+
+ public String getIdentifier() {
+ return identifier;
+ }
+
+ public int getIndex() {
+ return index;
+ }
+
+}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/ObjectsObjectContainer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/ObjectsObjectContainer.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/ObjectsObjectContainer.java 2010-06-05 04:26:28 UTC (rev 33359)
@@ -0,0 +1,14 @@
+package org.drools.runtime.help.impl;
+
+public class ObjectsObjectContainer {
+
+ private Object containedObject;
+
+ public ObjectsObjectContainer(Object object) {
+ this.containedObject = object;
+ }
+
+ public Object getContainedObject() {
+ return containedObject;
+ }
+}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/ParameterContainer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/ParameterContainer.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/ParameterContainer.java 2010-06-05 04:26:28 UTC (rev 33359)
@@ -0,0 +1,34 @@
+package org.drools.runtime.help.impl;
+
+public class ParameterContainer {
+
+ private String identifier;
+ private Object object;
+
+ public ParameterContainer() {
+
+ }
+
+ public ParameterContainer(String identifier,
+ Object object) {
+ this.identifier = identifier;
+ this.object = object;
+ }
+
+ public String getIdentifier() {
+ return identifier;
+ }
+
+ public void setIdentifier(String identifier) {
+ this.identifier = identifier;
+ }
+
+ public Object getObject() {
+ return object;
+ }
+
+ public void setObject(Object object) {
+ this.object = object;
+ }
+
+}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/RowItemContainer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/RowItemContainer.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/RowItemContainer.java 2010-06-05 04:26:28 UTC (rev 33359)
@@ -0,0 +1,37 @@
+package org.drools.runtime.help.impl;
+
+import org.drools.runtime.rule.FactHandle;
+
+
+public class RowItemContainer {
+
+ private FactHandle factHandle;
+ private Object object;
+
+ public RowItemContainer() {
+
+ }
+
+ public RowItemContainer(FactHandle factHandle,
+ Object object) {
+ super();
+ this.factHandle = factHandle;
+ this.object = object;
+ }
+
+ public FactHandle getFactHandle() {
+ return factHandle;
+ }
+
+ public void setFactHandle(FactHandle factHandle) {
+ this.factHandle = factHandle;
+ }
+
+ public Object getObject() {
+ return object;
+ }
+
+ public void setObject(Object object) {
+ this.object = object;
+ }
+}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/WorkItemResultsContainer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/WorkItemResultsContainer.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/WorkItemResultsContainer.java 2010-06-05 04:26:28 UTC (rev 33359)
@@ -0,0 +1,34 @@
+package org.drools.runtime.help.impl;
+
+public class WorkItemResultsContainer {
+
+ private String identifier;
+ private Object object;
+
+ public WorkItemResultsContainer() {
+
+ }
+
+ public WorkItemResultsContainer(String identifier,
+ Object object) {
+ this.identifier = identifier;
+ this.object = object;
+ }
+
+ public String getIdentifier() {
+ return identifier;
+ }
+
+ public void setIdentifier(String identifier) {
+ this.identifier = identifier;
+ }
+
+ public Object getObject() {
+ return object;
+ }
+
+ public void setObject(Object object) {
+ this.object = object;
+ }
+
+}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamHelper.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamHelper.java 2010-06-05 04:26:28 UTC (rev 33359)
@@ -0,0 +1,72 @@
+package org.drools.runtime.help.impl;
+
+import org.drools.command.runtime.BatchExecutionCommand;
+import org.drools.command.runtime.GetGlobalCommand;
+import org.drools.command.runtime.SetGlobalCommand;
+import org.drools.command.runtime.process.AbortWorkItemCommand;
+import org.drools.command.runtime.process.CompleteWorkItemCommand;
+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.GetObjectCommand;
+import org.drools.command.runtime.rule.GetObjectsCommand;
+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.drools.command.runtime.rule.RetractCommand;
+import org.drools.command.runtime.rule.ModifyCommand.SetterImpl;
+import org.drools.common.DefaultFactHandle;
+import org.drools.common.DisconnectedFactHandle;
+import org.drools.runtime.impl.ExecutionResultImpl;
+import org.drools.runtime.rule.impl.FlatQueryResults;
+import org.drools.runtime.rule.impl.NativeQueryResults;
+
+import com.thoughtworks.xstream.XStream;
+
+public class XStreamHelper {
+ public static void setAliases(XStream xstream) {
+ xstream.alias( "batch-execution",
+ BatchExecutionCommand.class );
+ xstream.alias( "insert",
+ InsertObjectCommand.class );
+ xstream.alias( "modify",
+ ModifyCommand.class );
+ xstream.alias( "setters",
+ SetterImpl.class );
+ xstream.alias( "retract",
+ RetractCommand.class );
+ xstream.alias( "insert-elements",
+ InsertElementsCommand.class );
+ xstream.alias( "start-process",
+ StartProcessCommand.class );
+ xstream.alias( "signal-event",
+ SignalEventCommand.class );
+ xstream.alias( "complete-work-item",
+ CompleteWorkItemCommand.class );
+ xstream.alias( "abort-work-item",
+ AbortWorkItemCommand.class );
+ xstream.alias( "set-global",
+ SetGlobalCommand.class );
+ xstream.alias( "get-global",
+ GetGlobalCommand.class );
+ xstream.alias( "get-object",
+ GetObjectCommand.class );
+ xstream.alias( "get-objects",
+ GetObjectsCommand.class );
+ xstream.alias( "execution-results",
+ ExecutionResultImpl.class );
+ xstream.alias( "fire-all-rules",
+ FireAllRulesCommand.class );
+ xstream.alias( "query",
+ QueryCommand.class );
+ xstream.alias( "query-results",
+ FlatQueryResults.class );
+ xstream.alias( "query-results",
+ NativeQueryResults.class );
+ xstream.alias( "fact-handle",
+ DefaultFactHandle.class );
+ xstream.alias( "fact-handle",
+ DisconnectedFactHandle.class );
+ }
+}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamJSon.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamJSon.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamJSon.java 2010-06-05 04:26:28 UTC (rev 33359)
@@ -0,0 +1,1355 @@
+package org.drools.runtime.help.impl;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.drools.command.Command;
+import org.drools.command.CommandFactory;
+import org.drools.command.Setter;
+import org.drools.command.impl.GenericCommand;
+import org.drools.command.runtime.BatchExecutionCommand;
+import org.drools.command.runtime.GetGlobalCommand;
+import org.drools.command.runtime.SetGlobalCommand;
+import org.drools.command.runtime.process.AbortWorkItemCommand;
+import org.drools.command.runtime.process.CompleteWorkItemCommand;
+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.GetObjectCommand;
+import org.drools.command.runtime.rule.GetObjectsCommand;
+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.drools.command.runtime.rule.RetractCommand;
+import org.drools.common.DisconnectedFactHandle;
+import org.drools.runtime.ExecutionResults;
+import org.drools.runtime.impl.ExecutionResultImpl;
+import org.drools.runtime.rule.FactHandle;
+import org.drools.runtime.rule.QueryResults;
+import org.drools.runtime.rule.QueryResultsRow;
+import org.drools.runtime.rule.impl.FlatQueryResults;
+
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.converters.Converter;
+import com.thoughtworks.xstream.converters.MarshallingContext;
+import com.thoughtworks.xstream.converters.UnmarshallingContext;
+import com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter;
+import com.thoughtworks.xstream.converters.reflection.ReflectionProvider;
+import com.thoughtworks.xstream.core.util.HierarchicalStreams;
+import com.thoughtworks.xstream.io.ExtendedHierarchicalStreamWriterHelper;
+import com.thoughtworks.xstream.io.HierarchicalStreamReader;
+import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
+import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
+import com.thoughtworks.xstream.mapper.Mapper;
+
+public class XStreamJSon {
+ public static XStream newJSonMarshaller() {
+ JettisonMappedXmlDriver jet = new JettisonMappedXmlDriver();
+ XStream xstream = new XStream( jet );
+
+ XStreamHelper.setAliases( xstream );
+
+ xstream.alias( "commands",
+ CommandsObjectContainer.class );
+ xstream.alias( "objects",
+ ObjectsObjectContainer.class );
+ xstream.alias( "item",
+ RowItemContainer.class );
+ xstream.alias( "parameters",
+ ParameterContainer.class );
+ xstream.alias( "results",
+ WorkItemResultsContainer.class );
+
+ xstream.setMode( XStream.NO_REFERENCES );
+
+ xstream.registerConverter( new JSonFactHandleConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new JSonBatchExecutionResultConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new JSonInsertConverter( xstream.getMapper(),
+ xstream.getReflectionProvider() ) );
+ xstream.registerConverter( new JSonFireAllRulesConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new JSonBatchExecutionCommandConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new CommandsContainerConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new JSonGetObjectConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new JSonRetractConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new JSonModifyConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new JSonSetGlobalConverter( xstream.getMapper(),
+ xstream.getReflectionProvider() ) );
+ xstream.registerConverter( new JSonInsertElementsConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new JSonGetGlobalConverter( xstream.getMapper(),
+ xstream.getReflectionProvider() ) );
+ xstream.registerConverter( new JSonGetObjectsConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new JSonQueryConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new JSonQueryResultsConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new RowItemConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new JSonStartProcessConvert( xstream.getMapper() ) );
+ xstream.registerConverter( new JSonSignalEventConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new JSonCompleteWorkItemConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new JSonAbortWorkItemConverter( xstream.getMapper() ) );
+
+ return xstream;
+ }
+
+ public static class CommandsContainerConverter extends AbstractCollectionConverter {
+ public CommandsContainerConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public boolean canConvert(Class type) {
+ return CommandsObjectContainer.class.isAssignableFrom( type );
+
+ }
+
+ @Override
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ CommandsObjectContainer container = (CommandsObjectContainer) object;
+
+ writeItem( container.getContainedObject(),
+ context,
+ writer );
+ }
+
+ @Override
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ throw new UnsupportedOperationException();
+ }
+
+ }
+
+ public static class RowItemConverter extends AbstractCollectionConverter {
+ public RowItemConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public boolean canConvert(Class type) {
+ return RowItemContainer.class.isAssignableFrom( type );
+
+ }
+
+ @Override
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ RowItemContainer container = (RowItemContainer) object;
+
+ writer.startNode( "external-form" );
+ writer.setValue( container.getFactHandle().toExternalForm() );
+ writer.endNode();
+
+ writer.startNode( "object" );
+ writeItem( container.getObject(),
+ context,
+ writer );
+ writer.endNode();
+ }
+
+ @Override
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ String externalForm = null;
+ Object object = null;
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ String nodeName = reader.getNodeName();
+ if ( "external-form".equals( nodeName ) ) {
+ externalForm = reader.getValue();
+ } else if ( "object".equals( nodeName ) ) {
+ reader.moveDown();
+ object = readItem( reader,
+ context,
+ null );
+ reader.moveUp();
+ }
+ reader.moveUp();
+ }
+ return new RowItemContainer( new DisconnectedFactHandle( externalForm ),
+ object );
+ }
+
+ }
+
+ // public static class ModifyEntriesContainerConverter extends AbstractCollectionConverter {
+ // public ModifyEntriesContainerConverter(Mapper mapper) {
+ // super( mapper );
+ // }
+ //
+ // public boolean canConvert(Class type) {
+ // return ModifyEntriesContainer.class.isAssignableFrom( type );
+ //
+ // }
+ //
+ // @Override
+ // public void marshal(Object object,
+ // HierarchicalStreamWriter writer,
+ // MarshallingContext context) {
+ // ModifyEntriesContainer container = (ModifyEntriesContainer) object;
+ //
+ // writer.startNode( "accessor" );
+ // writer.setValue( container.getAccessor() );
+ // writer.endNode();
+ //
+ // writer.startNode( "value" );
+ // writer.setValue( container.getValue() );
+ // writer.endNode();
+ // }
+ //
+ // @Override
+ // public Object unmarshal(HierarchicalStreamReader reader,
+ // UnmarshallingContext context) {
+ // throw new UnsupportedOperationException();
+ // }
+ //
+ // }
+
+ public static class JSonBatchExecutionCommandConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public JSonBatchExecutionCommandConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ BatchExecutionCommand cmds = (BatchExecutionCommand) object;
+ if ( cmds.getLookup() != null ) {
+ writer.startNode( "lookup" );
+ writer.setValue( cmds.getLookup() );
+ writer.endNode();
+ }
+ List<GenericCommand< ? >> list = cmds.getCommands();
+
+ for ( GenericCommand cmd : list ) {
+ writeItem( new CommandsObjectContainer( cmd ),
+ context,
+ writer );
+ }
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ List<GenericCommand< ? >> list = new ArrayList<GenericCommand< ? >>();
+ String lookup = null;
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ if ( "commands".equals( reader.getNodeName() ) ) {
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ GenericCommand cmd = (GenericCommand) readItem( reader,
+ context,
+ null );
+ list.add( cmd );
+ reader.moveUp();
+ }
+ } else if ( "lookup".equals( reader.getNodeName() ) ) {
+ lookup = reader.getValue();
+ } else {
+ throw new IllegalArgumentException( "batch-execution does not support the child element name=''" + reader.getNodeName() + "' value=" + reader.getValue() + "'" );
+ }
+ reader.moveUp();
+ }
+ return new BatchExecutionCommand( list,
+ lookup );
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( BatchExecutionCommand.class );
+ }
+ }
+
+ public static class JSonInsertConverter extends BaseConverter
+ implements
+ Converter {
+
+ public JSonInsertConverter(Mapper mapper,
+ ReflectionProvider reflectionProvider) {
+ super( mapper,
+ reflectionProvider );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ InsertObjectCommand cmd = (InsertObjectCommand) object;
+ if ( cmd.getOutIdentifier() != null ) {
+ writer.startNode( "out-identifier" );
+ writer.setValue( cmd.getOutIdentifier() );
+ writer.endNode();
+
+ writer.startNode( "return-object" );
+ writer.setValue( Boolean.toString( cmd.isReturnObject() ) );
+ writer.endNode();
+ }
+ writeValue( writer,
+ context,
+ "object",
+ cmd.getObject() );
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ InsertObjectCommand cmd = new InsertObjectCommand();
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ String nodeName = reader.getNodeName();
+ if ( "out-identifier".equals( nodeName ) ) {
+ cmd.setOutIdentifier( reader.getValue() );
+ } else if ( "return-object".equals( nodeName ) ) {
+ cmd.setReturnObject( Boolean.parseBoolean( reader.getValue() ) );
+ } else if ( "object".equals( nodeName ) ) {
+ cmd.setObject( readValue( reader,
+ context,
+ cmd.getObject(),
+ "object" ) );
+ }
+ reader.moveUp();
+
+ }
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( InsertObjectCommand.class );
+ }
+
+ }
+
+ public static class JSonFactHandleConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+ public JSonFactHandleConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public boolean canConvert(Class aClass) {
+ return FactHandle.class.isAssignableFrom( aClass );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext marshallingContext) {
+ FactHandle fh = (FactHandle) object;
+ writer.startNode( "external-form" );
+ writer.setValue( fh.toExternalForm() );
+ writer.endNode();
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext unmarshallingContext) {
+ reader.moveDown();
+ DisconnectedFactHandle factHandle = new DisconnectedFactHandle( reader.getValue() );
+ reader.moveUp();
+ return factHandle;
+ }
+ }
+
+ public static class JSonFireAllRulesConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public JSonFireAllRulesConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ FireAllRulesCommand cmd = (FireAllRulesCommand) object;
+
+ if ( cmd.getMax() != -1 ) {
+ writer.startNode( "max" );
+ writer.setValue( Integer.toString( cmd.getMax() ) );
+ writer.endNode();
+ }
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ String max = null;
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ if ( "max".equals( reader.getNodeName() ) ) {
+ max = reader.getValue();
+ } else {
+ throw new IllegalArgumentException( "fire-all-rules does not support the child element name=''" + reader.getNodeName() + "' value=" + reader.getValue() + "'" );
+ }
+ reader.moveUp();
+ }
+
+ FireAllRulesCommand cmd = null;
+
+ if ( max != null ) {
+ cmd = new FireAllRulesCommand( Integer.parseInt( max ) );
+ } else {
+ cmd = new FireAllRulesCommand();
+ }
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( FireAllRulesCommand.class );
+ }
+ }
+
+ public static class JSonGetObjectConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public JSonGetObjectConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ GetObjectCommand cmd = (GetObjectCommand) object;
+ writer.startNode( "fact-handle" );
+ writer.setValue( cmd.getFactHandle().toExternalForm() );
+ writer.endNode();
+
+ if ( cmd.getOutIdentifier() != null ) {
+ writer.startNode( "out-identifier" );
+ writer.setValue( cmd.getOutIdentifier() );
+ writer.endNode();
+ }
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ FactHandle factHandle = null;
+ String outIdentifier = null;
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ String name = reader.getNodeName();
+ if ( "fact-handle".equals( name ) ) {
+ factHandle = new DisconnectedFactHandle( reader.getValue() );
+ } else if ( "out-identifier".equals( "out-identifier" ) ) {
+ outIdentifier = reader.getValue();
+ }
+ reader.moveUp();
+ }
+
+ GetObjectCommand cmd = new GetObjectCommand( factHandle );
+ if ( outIdentifier != null ) {
+ cmd.setOutIdentifier( outIdentifier );
+ }
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( GetObjectCommand.class );
+ }
+ }
+
+ public static class JSonRetractConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public JSonRetractConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ RetractCommand cmd = (RetractCommand) object;
+ writer.startNode( "fact-handle" );
+ writer.setValue( cmd.getFactHandle().toExternalForm() );
+ writer.endNode();
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ reader.moveDown();
+ FactHandle factHandle = new DisconnectedFactHandle( reader.getValue() );
+ reader.moveUp();
+
+ Command cmd = CommandFactory.newRetract( factHandle );
+
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( RetractCommand.class );
+ }
+ }
+
+ public static class JSonModifyConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public JSonModifyConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ ModifyCommand cmd = (ModifyCommand) object;
+
+ writer.startNode( "fact-handle" );
+ writer.setValue( cmd.getFactHandle().toExternalForm() );
+ writer.endNode();
+
+ List<Setter> setters = cmd.getSetters();
+ for ( Setter setter : setters ) {
+ writeItem( setter,
+ context,
+ writer );
+
+ }
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ reader.moveDown();
+ FactHandle factHandle = new DisconnectedFactHandle( reader.getValue() );
+ reader.moveUp();
+
+ List<Setter> setters = new ArrayList();
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+
+ reader.moveDown();
+ String accessor = reader.getValue();
+ reader.moveUp();
+
+ reader.moveDown();
+ String value = reader.getValue();
+ reader.moveUp();
+
+ Setter setter = CommandFactory.newSetter( accessor,
+ value );
+ setters.add( setter );
+
+ reader.moveUp();
+ }
+
+ Command cmd = CommandFactory.newModify( factHandle,
+ setters );
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( ModifyCommand.class );
+ }
+
+ }
+
+ public static class JSonInsertElementsConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public JSonInsertElementsConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ InsertElementsCommand cmd = (InsertElementsCommand) object;
+
+ if ( cmd.getOutIdentifier() != null ) {
+ writer.startNode( "out-identifier" );
+ writer.setValue( cmd.getOutIdentifier() );
+ writer.endNode();
+
+ writer.startNode( "return-objects" );
+ writer.setValue( Boolean.toString( cmd.isReturnObject() ) );
+ writer.endNode();
+
+ }
+
+ for ( Object element : cmd.getObjects() ) {
+ writeItem( new ObjectsObjectContainer( element ),
+ context,
+ writer );
+ }
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ List objects = new ArrayList();
+ String outIdentifier = null;
+ String returnObjects = null;
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ String nodeName = reader.getNodeName();
+ if ( "objects".equals( nodeName ) ) {
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ Object o = readItem( reader,
+ context,
+ null );
+ objects.add( o );
+ reader.moveUp();
+ }
+ } else if ( "out-identifier".equals( nodeName ) ) {
+ outIdentifier = reader.getValue();
+ } else if ( "return-objects".equals( nodeName ) ) {
+ returnObjects = reader.getValue();
+ } else {
+ throw new IllegalArgumentException( "insert-elements does not support the child element name=''" + reader.getNodeName() + "' value=" + reader.getValue() + "'" );
+ }
+ reader.moveUp();
+ }
+ InsertElementsCommand cmd = new InsertElementsCommand( objects );
+ if ( outIdentifier != null ) {
+ cmd.setOutIdentifier( outIdentifier );
+ if ( outIdentifier != null ) {
+ cmd.setReturnObject( Boolean.parseBoolean( returnObjects ) );
+ }
+ }
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( InsertElementsCommand.class );
+ }
+ }
+
+ public static class JSonBatchExecutionResultConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public JSonBatchExecutionResultConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ ExecutionResults result = (ExecutionResults) object;
+ writer.startNode( "results" );
+ if ( !result.getIdentifiers().isEmpty() ) {
+ for ( String identifier : result.getIdentifiers() ) {
+ writer.startNode( "result" );
+
+ writer.startNode( "identifier" );
+ writer.setValue( identifier );
+ writer.endNode();
+
+ writer.startNode( "value" );
+ Object value = result.getValue( identifier );
+ writeItem( value,
+ context,
+ writer );
+ writer.endNode();
+
+ writer.endNode();
+ }
+ }
+
+ for ( String identifier : ((ExecutionResultImpl) result).getFactHandles().keySet() ) {
+ Object handle = result.getFactHandle( identifier );
+ if ( handle instanceof FactHandle ) {
+ writer.startNode( "fact-handle" );
+
+ writer.startNode( "identifier" );
+ writer.setValue( identifier );
+ writer.endNode();
+
+ writer.startNode( "external-form" );
+ writer.setValue( ((FactHandle) handle).toExternalForm() );
+ writer.endNode();
+
+ writer.endNode();
+ } else if ( handle instanceof Collection ) {
+ writer.startNode( "fact-handles" );
+
+ writer.startNode( "identifier" );
+ writer.setValue( identifier );
+ writer.endNode();
+
+ //writer.startNode( "xxx" );
+ for ( FactHandle factHandle : (Collection<FactHandle>) handle ) {
+ writeItem( factHandle.toExternalForm(),
+ context,
+ writer );
+ }
+ //writer.endNode();
+
+ writer.endNode();
+ }
+ }
+
+ writer.endNode();
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ ExecutionResultImpl result = new ExecutionResultImpl();
+ Map results = result.getResults();
+ Map facts = result.getFactHandles();
+
+ reader.moveDown();
+ if ( "results".equals( reader.getNodeName() ) ) {
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+
+ if ( reader.getNodeName().equals( "result" ) ) {
+ reader.moveDown();
+ String identifier = reader.getValue();
+ reader.moveUp();
+
+ reader.moveDown();
+ reader.moveDown();
+ Object value = readItem( reader,
+ context,
+ null );
+ results.put( identifier,
+ value );
+ reader.moveUp();
+ reader.moveUp();
+ } else if ( reader.getNodeName().equals( "fact-handle" ) ) {
+ reader.moveDown();
+ String identifier = reader.getValue();
+ reader.moveUp();
+
+ reader.moveDown();
+ String externalForm = reader.getValue();
+ reader.moveUp();
+
+ facts.put( identifier,
+ new DisconnectedFactHandle( externalForm ) );
+ } else if ( reader.getNodeName().equals( "fact-handles" ) ) {
+ List list = new ArrayList();
+ String identifier = null;
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ identifier = reader.getValue();
+ reader.moveUp();
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ FactHandle factHandle = new DisconnectedFactHandle( (String) readItem( reader,
+ context,
+ null ) );
+ list.add( factHandle );
+ reader.moveUp();
+ }
+ }
+ facts.put( identifier,
+ list );
+ } else {
+ throw new IllegalArgumentException( "Element '" + reader.getNodeName() + "' is not supported here" );
+ }
+ reader.moveUp();
+ }
+ } else {
+ throw new IllegalArgumentException( "Element '" + reader.getNodeName() + "' is not supported here" );
+ }
+ reader.moveUp();
+
+ return result;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return ExecutionResults.class.isAssignableFrom( clazz );
+ }
+ }
+
+ public static abstract class BaseConverter {
+ protected Mapper mapper;
+ protected ReflectionProvider reflectionProvider;
+
+ public BaseConverter(Mapper mapper,
+ ReflectionProvider reflectionProvider) {
+ super();
+ this.mapper = mapper;
+ this.reflectionProvider = reflectionProvider;
+ }
+
+ protected void writeValue(HierarchicalStreamWriter writer,
+ MarshallingContext context,
+ String fieldName,
+ Object object) {
+ writer.startNode( fieldName );
+ String name = this.mapper.serializedClass( object.getClass() );
+ ExtendedHierarchicalStreamWriterHelper.startNode( writer,
+ name,
+ Mapper.Null.class );
+ context.convertAnother( object );
+ writer.endNode();
+ writer.endNode();
+ }
+
+ protected Object readValue(HierarchicalStreamReader reader,
+ UnmarshallingContext context,
+ Object object,
+ Object fieldName) {
+ reader.moveDown();
+ Class type = HierarchicalStreams.readClassType( reader,
+ this.mapper );
+ Object o = context.convertAnother( null,
+ type );
+
+ reader.moveUp();
+ return o;
+ }
+ }
+
+ public static class JSonSetGlobalConverter extends BaseConverter
+ implements
+ Converter {
+
+ public JSonSetGlobalConverter(Mapper mapper,
+ ReflectionProvider reflectionProvider) {
+ super( mapper,
+ reflectionProvider );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ SetGlobalCommand cmd = (SetGlobalCommand) object;
+
+ writer.startNode( "identifier" );
+ writer.setValue( cmd.getIdentifier() );
+ writer.endNode();
+
+ if ( cmd.getOutIdentifier() != null ) {
+ writer.startNode( "out-identifier" );
+ writer.setValue( cmd.getOutIdentifier() );
+ writer.endNode();
+ } else if ( cmd.isOut() ) {
+ writer.startNode( "out" );
+ writer.setValue( Boolean.toString( cmd.isOut() ) );
+ writer.endNode();
+ }
+ writeValue( writer,
+ context,
+ "object",
+ cmd.getObject() );
+
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ String identifier = null;
+ String out = null;
+ String outIdentifier = null;
+ Object object = null;
+ SetGlobalCommand cmd = new SetGlobalCommand();
+
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ String nodeName = reader.getNodeName();
+ if ( "identifier".equals( nodeName ) ) {
+ identifier = reader.getValue();
+ } else if ( "out".equals( nodeName ) ) {
+ out = reader.getValue();
+ } else if ( "out-identifier".equals( nodeName ) ) {
+ outIdentifier = reader.getValue();
+ } else if ( "object".equals( nodeName ) ) {
+ cmd.setObject( readValue( reader,
+ context,
+ cmd.getObject(),
+ "object" ) );
+ }
+ reader.moveUp();
+ }
+
+ cmd.setIdentifier( identifier );
+
+ if ( outIdentifier != null ) {
+ cmd.setOutIdentifier( outIdentifier );
+ } else if ( out != null ) {
+ cmd.setOut( Boolean.parseBoolean( out ) );
+ }
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( SetGlobalCommand.class );
+ }
+
+ }
+
+ public static class JSonGetGlobalConverter extends BaseConverter
+ implements
+ Converter {
+
+ public JSonGetGlobalConverter(Mapper mapper,
+ ReflectionProvider reflectionProvider) {
+ super( mapper,
+ reflectionProvider );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ GetGlobalCommand cmd = (GetGlobalCommand) object;
+
+ writer.startNode( "identifier" );
+ writer.setValue( cmd.getIdentifier() );
+ writer.endNode();
+
+ if ( cmd.getOutIdentifier() != null ) {
+ writer.startNode( "out-identifier" );
+ writer.setValue( cmd.getOutIdentifier() );
+ writer.endNode();
+ }
+
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ String identifier = null;
+ String outIdentifier = null;
+ GetGlobalCommand cmd = new GetGlobalCommand();
+
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ String nodeName = reader.getNodeName();
+ if ( "identifier".equals( nodeName ) ) {
+ identifier = reader.getValue();
+ } else if ( "out-identifier".equals( nodeName ) ) {
+ outIdentifier = reader.getValue();
+ }
+ reader.moveUp();
+ }
+
+ cmd.setIdentifier( identifier );
+
+ if ( outIdentifier != null ) {
+ cmd.setOutIdentifier( outIdentifier );
+ }
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( GetGlobalCommand.class );
+ }
+ }
+
+ public static class JSonGetObjectsConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public JSonGetObjectsConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ GetObjectsCommand cmd = (GetObjectsCommand) object;
+
+ if ( cmd.getOutIdentifier() != null ) {
+ writer.startNode( "out-identifier" );
+ writer.setValue( cmd.getOutIdentifier() );
+ writer.endNode();
+ }
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ String outIdentifier = null;
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ if ( "out-identifier".equals( reader.getNodeName() ) ) {
+ outIdentifier = reader.getValue();
+ }
+ reader.moveUp();
+ }
+
+ GetObjectsCommand cmd = new GetObjectsCommand();
+ if ( outIdentifier != null ) {
+ cmd.setOutIdentifier( outIdentifier );
+ }
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( GetObjectsCommand.class );
+ }
+ }
+
+ public static class JSonQueryConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public JSonQueryConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ QueryCommand cmd = (QueryCommand) object;
+
+ writer.startNode( "out-identifier" );
+ writer.setValue( cmd.getOutIdentifier() );
+ writer.endNode();
+
+ writer.startNode( "name" );
+ writer.setValue( cmd.getName() );
+ writer.endNode();
+
+ if ( cmd.getArguments() != null && cmd.getArguments().size() > 0 ) {
+ writer.startNode( "args" );
+ for ( Object arg : cmd.getArguments() ) {
+ writeItem( arg,
+ context,
+ writer );
+ }
+ writer.endNode();
+ }
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ List<String> outs = new ArrayList<String>();
+
+ String outIdentifier = null;
+ String name = null;
+ List<Object> args = null;
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ String nodeName = reader.getNodeName();
+ if ( "out-identifier".equals( nodeName ) ) {
+ outIdentifier = reader.getValue();
+ } else if ( "name".equals( nodeName ) ) {
+ name = reader.getValue();
+ } else if ( "args".equals( nodeName ) ) {
+ reader.moveDown();
+ args = new ArrayList<Object>();
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ Object arg = readItem( reader,
+ context,
+ null );
+ args.add( arg );
+ reader.moveUp();
+ }
+ reader.moveUp();
+ }
+ reader.moveUp();
+ }
+
+ QueryCommand cmd = new QueryCommand( outIdentifier,
+ name,
+ (args != null) ? args.toArray( new Object[args.size()] ) : null );
+
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( QueryCommand.class );
+ }
+ }
+
+ public static class JSonQueryResultsConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public JSonQueryResultsConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ QueryResults results = (QueryResults) object;
+
+ // write out identifiers
+ String[] identifiers = results.getIdentifiers();
+
+ writer.startNode( "identifiers" );
+ for ( int i = 0; i < identifiers.length; i++ ) {
+ writeItem( identifiers[i],
+ context,
+ writer );
+ }
+ writer.endNode();
+
+ for ( QueryResultsRow result : results ) {
+ writer.startNode( "row" );
+ for ( int i = 0; i < identifiers.length; i++ ) {
+ Object value = result.get( identifiers[i] );
+ FactHandle factHandle = result.getFactHandle( identifiers[i] );
+ writeItem( new RowItemContainer( factHandle,
+ value ),
+ context,
+ writer );
+ }
+ writer.endNode();
+ }
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ reader.moveDown();
+ List<String> list = new ArrayList<String>();
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ list.add( (String) readItem( reader,
+ context,
+ null ) );
+ reader.moveUp();
+ }
+ reader.moveUp();
+
+ HashMap<String, Integer> identifiers = new HashMap<String, Integer>();
+ for ( int i = 0; i < list.size(); i++ ) {
+ identifiers.put( list.get( i ),
+ i );
+ }
+
+ ArrayList<ArrayList<Object>> results = new ArrayList();
+ ArrayList<ArrayList<FactHandle>> resultHandles = new ArrayList();
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ ArrayList objects = new ArrayList();
+ ArrayList<FactHandle> handles = new ArrayList();
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ RowItemContainer container = (RowItemContainer) readItem( reader,
+ context,
+ null );
+
+ objects.add( container.getObject() );
+ handles.add( container.getFactHandle() );
+ reader.moveUp();
+ }
+ results.add( objects );
+ resultHandles.add( handles );
+ reader.moveUp();
+ }
+
+ return new FlatQueryResults( identifiers,
+ results,
+ resultHandles );
+ }
+
+ public boolean canConvert(Class clazz) {
+ return QueryResults.class.isAssignableFrom( clazz );
+ }
+ }
+
+ public static class JSonStartProcessConvert extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public JSonStartProcessConvert(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ StartProcessCommand cmd = (StartProcessCommand) object;
+ writer.startNode( "process-id" );
+ writer.setValue( cmd.getProcessId() );
+ writer.endNode();
+
+ for ( Entry<String, Object> entry : cmd.getParameters().entrySet() ) {
+ writeItem( new ParameterContainer( entry.getKey(),
+ entry.getValue() ),
+ context,
+ writer );
+ }
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ reader.moveDown();
+ String processId = reader.getValue();
+ reader.moveUp();
+
+ HashMap<String, Object> params = new HashMap<String, Object>();
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ ParameterContainer parameterContainer = (ParameterContainer) readItem( reader,
+ context,
+ null );
+ params.put( parameterContainer.getIdentifier(),
+ parameterContainer.getObject() );
+ reader.moveUp();
+ }
+
+ StartProcessCommand cmd = new StartProcessCommand();
+ cmd.setProcessId( processId );
+ cmd.setParameters( params );
+
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( StartProcessCommand.class );
+ }
+ }
+
+ public static class JSonSignalEventConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public JSonSignalEventConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ SignalEventCommand cmd = (SignalEventCommand) object;
+ long processInstanceId = cmd.getProcessInstanceId();
+ String eventType = cmd.getEventType();
+ Object event = cmd.getEvent();
+
+ if ( processInstanceId != -1 ) {
+ writer.startNode( "process-instance-id" );
+ writer.setValue( Long.toString( processInstanceId ) );
+ writer.endNode();
+ }
+
+ writer.addAttribute( "event-type",
+ eventType );
+
+ writer.startNode( "event-type" );
+ writer.setValue( eventType );
+ writer.endNode();
+
+ writer.startNode( "object" );
+ writeItem( event,
+ context,
+ writer );
+ writer.endNode();
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ String processInstanceId = null;
+ String eventType = null;
+ Object event = null;
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ String nodeName = reader.getNodeName();
+ if ( "process-instance-id".equals( nodeName ) ) {
+ processInstanceId = reader.getValue();
+ } else if ( "event-type".equals( nodeName ) ) {
+ eventType = reader.getValue();
+ } else if ( "object".equals( nodeName ) ) {
+ reader.moveDown();
+ event = readItem( reader,
+ context,
+ null );
+ reader.moveUp();
+ }
+ reader.moveUp();
+ }
+
+ Command cmd;
+ if ( processInstanceId != null ) {
+ cmd = CommandFactory.newSignalEvent( Long.parseLong( processInstanceId ),
+ eventType,
+ event );
+ } else {
+ cmd = CommandFactory.newSignalEvent( eventType,
+ event );
+ }
+
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( SignalEventCommand.class );
+ }
+
+ }
+
+ public static class JSonCompleteWorkItemConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public JSonCompleteWorkItemConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ CompleteWorkItemCommand cmd = (CompleteWorkItemCommand) object;
+
+ writer.startNode( "id" );
+ writer.setValue( Long.toString( cmd.getWorkItemId() ) );
+ writer.endNode();
+
+ for ( Entry<String, Object> entry : cmd.getResults().entrySet() ) {
+ writeItem( new WorkItemResultsContainer( entry.getKey(),
+ entry.getValue() ),
+ context,
+ writer );
+ }
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ String id = null;
+ Map<String, Object> results = new HashMap<String, Object>();
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ String nodeName = reader.getNodeName();
+ if ( "id".equals( nodeName ) ) {
+ id = reader.getValue();
+ } else if ( "results".equals( nodeName ) ) {
+ while ( reader.hasMoreChildren() ) {
+ WorkItemResultsContainer res = (WorkItemResultsContainer) readItem( reader,
+ context,
+ null );
+ results.put( res.getIdentifier(),
+ res.getObject() );
+ }
+ }
+ reader.moveUp();
+ }
+
+ return new CompleteWorkItemCommand( Long.parseLong( id ),
+ results );
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( CompleteWorkItemCommand.class );
+ }
+ }
+
+ public static class JSonAbortWorkItemConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public JSonAbortWorkItemConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ AbortWorkItemCommand cmd = (AbortWorkItemCommand) object;
+ writer.startNode( "id" );
+ writer.setValue( Long.toString( cmd.getWorkItemId() ) );
+ writer.endNode();
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ reader.moveDown();
+ String id = reader.getValue();
+ reader.moveUp();
+
+ Command cmd = CommandFactory.newAbortWorkItem( Long.parseLong( id ) );
+
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( AbortWorkItemCommand.class );
+ }
+ }
+}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamXML.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamXML.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/XStreamXML.java 2010-06-05 04:26:28 UTC (rev 33359)
@@ -0,0 +1,964 @@
+package org.drools.runtime.help.impl;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.drools.base.ClassObjectType;
+import org.drools.base.DroolsQuery;
+import org.drools.command.Command;
+import org.drools.command.CommandFactory;
+import org.drools.command.Setter;
+import org.drools.command.runtime.BatchExecutionCommand;
+import org.drools.command.runtime.GetGlobalCommand;
+import org.drools.command.runtime.SetGlobalCommand;
+import org.drools.command.runtime.process.AbortWorkItemCommand;
+import org.drools.command.runtime.process.CompleteWorkItemCommand;
+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.GetObjectCommand;
+import org.drools.command.runtime.rule.GetObjectsCommand;
+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.drools.command.runtime.rule.RetractCommand;
+import org.drools.common.DisconnectedFactHandle;
+import org.drools.rule.Declaration;
+import org.drools.runtime.ExecutionResults;
+import org.drools.runtime.impl.ExecutionResultImpl;
+import org.drools.runtime.rule.FactHandle;
+import org.drools.runtime.rule.QueryResults;
+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 com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.converters.Converter;
+import com.thoughtworks.xstream.converters.MarshallingContext;
+import com.thoughtworks.xstream.converters.UnmarshallingContext;
+import com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter;
+import com.thoughtworks.xstream.io.HierarchicalStreamReader;
+import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
+import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
+import com.thoughtworks.xstream.mapper.Mapper;
+
+public class XStreamXML {
+
+ public static XStream newXStreamMarshaller(XStream xstream) {
+ XStreamHelper.setAliases( xstream );
+
+ xstream.processAnnotations( BatchExecutionCommand.class );
+ xstream.addImplicitCollection( BatchExecutionCommand.class,
+ "commands" );
+
+ xstream.registerConverter( new InsertConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new RetractConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new ModifyConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new GetObjectConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new InsertElementsConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new FireAllRulesConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new StartProcessConvert( xstream.getMapper() ) );
+ xstream.registerConverter( new SignalEventConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new CompleteWorkItemConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new AbortWorkItemConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new QueryConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new SetGlobalConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new GetGlobalConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new GetObjectsConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new BatchExecutionResultConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new QueryResultsConverter( xstream.getMapper() ) );
+ xstream.registerConverter( new FactHandleConverter( xstream.getMapper() ) );
+
+ return xstream;
+ }
+
+
+ public static class InsertConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public InsertConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ InsertObjectCommand cmd = (InsertObjectCommand) object;
+ if ( cmd.getOutIdentifier() != null ) {
+ writer.addAttribute( "out-identifier",
+ cmd.getOutIdentifier() );
+
+ writer.addAttribute( "return-object",
+ Boolean.toString( cmd.isReturnObject() ) );
+
+ }
+ writeItem( cmd.getObject(),
+ context,
+ writer );
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ String identifierOut = reader.getAttribute( "out-identifier" );
+ String returnObject = reader.getAttribute( "return-object" );
+
+ reader.moveDown();
+ Object object = readItem( reader,
+ context,
+ null );
+ reader.moveUp();
+ InsertObjectCommand cmd = new InsertObjectCommand( object );
+ if ( identifierOut != null ) {
+ cmd.setOutIdentifier( identifierOut );
+ if ( returnObject != null ) {
+ cmd.setReturnObject( Boolean.parseBoolean( returnObject ) );
+ }
+ }
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( InsertObjectCommand.class );
+ }
+
+ }
+
+ public static class FactHandleConverter
+ implements
+ Converter {
+ private Mapper mapper;
+
+ public FactHandleConverter(Mapper mapper) {
+ this.mapper = mapper;
+ }
+
+ public boolean canConvert(Class aClass) {
+ return FactHandle.class.isAssignableFrom( aClass );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext marshallingContext) {
+ FactHandle fh = (FactHandle) object;
+ //writer.startNode("fact-handle");
+ writer.addAttribute( "external-form",
+ fh.toExternalForm() );
+ //writer.endNode();
+ }
+
+ public Object unmarshal(HierarchicalStreamReader hierarchicalStreamReader,
+ UnmarshallingContext unmarshallingContext) {
+ throw new UnsupportedOperationException( "Unable to unmarshal fact handles." );
+ }
+ }
+
+ public static class ModifyConverter
+ implements
+ Converter {
+
+ public ModifyConverter(Mapper mapper) {
+
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ ModifyCommand cmd = (ModifyCommand) object;
+
+ writer.addAttribute( "fact-handle",
+ cmd.getFactHandle().toExternalForm() );
+
+ for ( Setter setter : cmd.getSetters() ) {
+ writer.startNode( "set" );
+ writer.addAttribute( "accessor",
+ setter.getAccessor() );
+ writer.addAttribute( "value",
+ setter.getValue() );
+ writer.endNode();
+ }
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ FactHandle factHandle = new DisconnectedFactHandle( reader.getAttribute( "fact-handle" ) );
+
+ List<Setter> setters = new ArrayList();
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ Setter setter = CommandFactory.newSetter( reader.getAttribute( "accessor" ),
+ reader.getAttribute( "value" ) );
+ setters.add( setter );
+ reader.moveUp();
+ }
+
+ Command cmd = CommandFactory.newModify( factHandle,
+ setters );
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( ModifyCommand.class );
+ }
+
+ }
+
+ public static class RetractConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public RetractConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ RetractCommand cmd = (RetractCommand) object;
+
+ writer.addAttribute( "fact-handle",
+ cmd.getFactHandle().toExternalForm() );
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ FactHandle factHandle = new DisconnectedFactHandle( reader.getAttribute( "fact-handle" ) );
+
+ Command cmd = CommandFactory.newRetract( factHandle );
+
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( RetractCommand.class );
+ }
+ }
+
+ public static class InsertElementsConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public InsertElementsConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ InsertElementsCommand cmd = (InsertElementsCommand) object;
+
+ if ( cmd.getOutIdentifier() != null ) {
+ writer.addAttribute( "out-identifier",
+ cmd.getOutIdentifier() );
+
+ writer.addAttribute( "return-objects",
+ Boolean.toString( cmd.isReturnObject() ) );
+
+ }
+
+ for ( Object element : cmd.getObjects() ) {
+ writeItem( element,
+ context,
+ writer );
+ }
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ String identifierOut = reader.getAttribute( "out-identifier" );
+ String returnObject = reader.getAttribute( "return-objects" );
+
+ List objects = new ArrayList();
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ Object object = readItem( reader,
+ context,
+ null );
+ reader.moveUp();
+ objects.add( object );
+ }
+
+ InsertElementsCommand cmd = new InsertElementsCommand( objects );
+ if ( identifierOut != null ) {
+ cmd.setOutIdentifier( identifierOut );
+ if ( returnObject != null ) {
+ cmd.setReturnObject( Boolean.parseBoolean( returnObject ) );
+ }
+ }
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( InsertElementsCommand.class );
+ }
+
+ }
+
+ public static class SetGlobalConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public SetGlobalConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ SetGlobalCommand cmd = (SetGlobalCommand) object;
+
+ writer.addAttribute( "identifier",
+ cmd.getIdentifier() );
+
+ if ( cmd.getOutIdentifier() != null ) {
+ writer.addAttribute( "out-identifier",
+ cmd.getOutIdentifier() );
+ } else if ( cmd.isOut() ) {
+ writer.addAttribute( "out",
+ Boolean.toString( cmd.isOut() ) );
+ }
+
+ writeItem( cmd.getObject(),
+ context,
+ writer );
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ String identifier = reader.getAttribute( "identifier" );
+ String out = reader.getAttribute( "out" );
+ String identifierOut = reader.getAttribute( "out-identifier" );
+
+ reader.moveDown();
+ Object object = readItem( reader,
+ context,
+ null );
+ reader.moveUp();
+ SetGlobalCommand cmd = new SetGlobalCommand( identifier,
+ object );
+ if ( identifierOut != null ) {
+ cmd.setOutIdentifier( identifierOut );
+ } else if ( out != null ) {
+ cmd.setOut( Boolean.parseBoolean( out ) );
+ }
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( SetGlobalCommand.class );
+ }
+ }
+
+ public static class GetObjectConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public GetObjectConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ GetObjectCommand cmd = (GetObjectCommand) object;
+
+ writer.addAttribute( "fact-handle",
+ cmd.getFactHandle().toExternalForm() );
+
+ if ( cmd.getOutIdentifier() != null ) {
+ writer.addAttribute( "out-identifier",
+ cmd.getOutIdentifier() );
+ }
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ FactHandle factHandle = new DisconnectedFactHandle( reader.getAttribute( "fact-handle" ) );
+ String identifierOut = reader.getAttribute( "out-identifier" );
+
+ GetObjectCommand cmd = new GetObjectCommand( factHandle );
+ if ( identifierOut != null ) {
+ cmd.setOutIdentifier( identifierOut );
+ }
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( GetObjectCommand.class );
+ }
+ }
+
+ public static class GetGlobalConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public GetGlobalConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ GetGlobalCommand cmd = (GetGlobalCommand) object;
+
+ writer.addAttribute( "identifier",
+ cmd.getIdentifier() );
+
+ if ( cmd.getOutIdentifier() != null ) {
+ writer.addAttribute( "out-identifier",
+ cmd.getOutIdentifier() );
+ }
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ String identifier = reader.getAttribute( "identifier" );
+ String identifierOut = reader.getAttribute( "out-identifier" );
+
+ GetGlobalCommand cmd = new GetGlobalCommand( identifier );
+ if ( identifierOut != null ) {
+ cmd.setOutIdentifier( identifierOut );
+ }
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( GetGlobalCommand.class );
+ }
+ }
+
+ public static class GetObjectsConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public GetObjectsConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ GetObjectsCommand cmd = (GetObjectsCommand) object;
+
+ if ( cmd.getOutIdentifier() != null ) {
+ writer.addAttribute( "out-identifier",
+ cmd.getOutIdentifier() );
+ }
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ String identifierOut = reader.getAttribute( "out-identifier" );
+
+ GetObjectsCommand cmd = new GetObjectsCommand();
+ if ( identifierOut != null ) {
+ cmd.setOutIdentifier( identifierOut );
+ }
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( GetObjectsCommand.class );
+ }
+ }
+
+ public static class FireAllRulesConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public FireAllRulesConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ FireAllRulesCommand cmd = (FireAllRulesCommand) object;
+
+ if ( cmd.getMax() != -1 ) {
+ writer.addAttribute( "max",
+ Integer.toString( cmd.getMax() ) );
+ }
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ String max = reader.getAttribute( "max" );
+
+ FireAllRulesCommand cmd = null;
+
+ if ( max != null ) {
+ cmd = new FireAllRulesCommand( Integer.parseInt( max ) );
+ } else {
+ cmd = new FireAllRulesCommand();
+ }
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( FireAllRulesCommand.class );
+ }
+ }
+
+ public static class QueryConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public QueryConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ QueryCommand cmd = (QueryCommand) object;
+ writer.addAttribute( "out-identifier",
+ cmd.getOutIdentifier() );
+ writer.addAttribute( "name",
+ cmd.getName() );
+ if ( cmd.getArguments() != null ) {
+ for ( Object arg : cmd.getArguments() ) {
+ writeItem( arg,
+ context,
+ writer );
+ }
+ }
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ List<String> outs = new ArrayList<String>();
+
+ // Query cmd = null;
+ String outIdentifier = reader.getAttribute( "out-identifier" );
+ String name = reader.getAttribute( "name" );
+ List<Object> args = new ArrayList<Object>();
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ Object arg = readItem( reader,
+ context,
+ null );
+ args.add( arg );
+ reader.moveUp();
+ }
+ QueryCommand cmd = new QueryCommand( outIdentifier,
+ name,
+ args.toArray( new Object[args.size()] ) );
+
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( QueryCommand.class );
+ }
+ }
+
+ public static class StartProcessConvert extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public StartProcessConvert(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ StartProcessCommand cmd = (StartProcessCommand) object;
+ writer.addAttribute( "processId",
+ cmd.getProcessId() );
+
+ for ( Entry<String, Object> entry : cmd.getParameters().entrySet() ) {
+ writer.startNode( "parameter" );
+ writer.addAttribute( "identifier",
+ entry.getKey() );
+ writeItem( entry.getValue(),
+ context,
+ writer );
+ writer.endNode();
+ }
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ String processId = reader.getAttribute( "processId" );
+
+ HashMap<String, Object> params = new HashMap<String, Object>();
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ String identifier = reader.getAttribute( "identifier" );
+ reader.moveDown();
+ Object value = readItem( reader,
+ context,
+ null );
+ reader.moveUp();
+ params.put( identifier,
+ value );
+ reader.moveUp();
+ }
+ StartProcessCommand cmd = new StartProcessCommand();
+ cmd.setProcessId( processId );
+ cmd.setParameters( params );
+
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( StartProcessCommand.class );
+ }
+ }
+
+ public static class SignalEventConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public SignalEventConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ SignalEventCommand cmd = (SignalEventCommand) object;
+ long processInstanceId = cmd.getProcessInstanceId();
+ String eventType = cmd.getEventType();
+ Object event = cmd.getEvent();
+
+ if ( processInstanceId != -1 ) {
+ writer.addAttribute( "process-instance-id",
+ Long.toString( processInstanceId ) );
+ }
+
+ writer.addAttribute( "event-type",
+ eventType );
+
+ writeItem( event,
+ context,
+ writer );
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ String processInstanceId = reader.getAttribute( "process-instance-id" );
+ String eventType = reader.getAttribute( "event-type" );
+
+ reader.moveDown();
+ Object event = readItem( reader,
+ context,
+ null );
+ reader.moveUp();
+
+ Command cmd;
+ if ( processInstanceId != null ) {
+ cmd = CommandFactory.newSignalEvent( Long.parseLong( processInstanceId ),
+ eventType,
+ event );
+ } else {
+ cmd = CommandFactory.newSignalEvent( eventType,
+ event );
+ }
+
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( SignalEventCommand.class );
+ }
+
+ }
+
+ public static class CompleteWorkItemConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public CompleteWorkItemConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ CompleteWorkItemCommand cmd = (CompleteWorkItemCommand) object;
+ writer.addAttribute( "id",
+ Long.toString( cmd.getWorkItemId() ) );
+
+ for ( Entry<String, Object> entry : cmd.getResults().entrySet() ) {
+ writer.startNode( "result" );
+ writer.addAttribute( "identifier",
+ entry.getKey() );
+ writeItem( entry.getValue(),
+ context,
+ writer );
+ writer.endNode();
+ }
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ String id = reader.getAttribute( "id" );
+
+ Map<String, Object> results = new HashMap<String, Object>();
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ String identifier = reader.getAttribute( "identifier" );
+ reader.moveDown();
+ Object value = readItem( reader,
+ context,
+ null );
+ reader.moveUp();
+ results.put( identifier,
+ value );
+ reader.moveUp();
+ }
+
+ Command cmd = CommandFactory.newCompleteWorkItem( Long.parseLong( id ),
+ results );
+
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( CompleteWorkItemCommand.class );
+ }
+ }
+
+ public static class AbortWorkItemConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public AbortWorkItemConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ AbortWorkItemCommand cmd = (AbortWorkItemCommand) object;
+ writer.addAttribute( "id",
+ Long.toString( cmd.getWorkItemId() ) );
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ String id = reader.getAttribute( "id" );
+ Command cmd = CommandFactory.newAbortWorkItem( Long.parseLong( id ) );
+
+ return cmd;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return clazz.equals( AbortWorkItemCommand.class );
+ }
+ }
+
+ public static class BatchExecutionResultConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public BatchExecutionResultConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ ExecutionResults result = (ExecutionResults) object;
+ for ( String identifier : result.getIdentifiers() ) {
+ writer.startNode( "result" );
+ writer.addAttribute( "identifier",
+ identifier );
+ Object value = result.getValue( identifier );
+ writeItem( value,
+ context,
+ writer );
+ writer.endNode();
+ }
+
+ for ( String identifier : ((ExecutionResultImpl) result).getFactHandles().keySet() ) {
+ Object handle = result.getFactHandle( identifier );
+ if ( handle instanceof FactHandle ) {
+ writer.startNode( "fact-handle" );
+ writer.addAttribute( "identifier",
+ identifier );
+ writer.addAttribute( "external-form",
+ ((FactHandle) handle).toExternalForm() );
+
+ writer.endNode();
+ } else if ( handle instanceof Collection ) {
+ writer.startNode( "fact-handles" );
+ writer.addAttribute( "identifier",
+ identifier );
+ for ( FactHandle factHandle : (Collection<FactHandle>) handle ) {
+ writer.startNode( "fact-handle" );
+ writer.addAttribute( "external-form",
+ ((FactHandle) factHandle).toExternalForm() );
+ writer.endNode();
+ }
+
+ writer.endNode();
+ }
+
+ }
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ ExecutionResultImpl result = new ExecutionResultImpl();
+ Map results = result.getResults();
+ Map facts = result.getFactHandles();
+
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ if ( reader.getNodeName().equals( "result" ) ) {
+ String identifier = reader.getAttribute( "identifier" );
+ reader.moveDown();
+ Object value = readItem( reader,
+ context,
+ null );
+ results.put( identifier,
+ value );
+ reader.moveUp();
+ reader.moveUp();
+ } else if ( reader.getNodeName().equals( "fact-handle" ) ) {
+ String identifier = reader.getAttribute( "identifier" );
+ facts.put( identifier,
+ new DisconnectedFactHandle( reader.getAttribute( "external-form" ) ) );
+ } else if ( reader.getNodeName().equals( "fact-handles" ) ) {
+ String identifier = reader.getAttribute( "identifier" );
+ List<FactHandle> list = new ArrayList();
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ list.add( new DisconnectedFactHandle( reader.getAttribute( "external-form" ) ) );
+ reader.moveUp();
+ }
+ facts.put( identifier,
+ list );
+ } else {
+ throw new IllegalArgumentException( "Element '" + reader.getNodeName() + "' is not supported here" );
+ }
+ }
+
+ return result;
+ }
+
+ public boolean canConvert(Class clazz) {
+ return ExecutionResults.class.isAssignableFrom( clazz );
+ }
+ }
+
+ public static class QueryResultsConverter extends AbstractCollectionConverter
+ implements
+ Converter {
+
+ public QueryResultsConverter(Mapper mapper) {
+ super( mapper );
+ }
+
+ public void marshal(Object object,
+ HierarchicalStreamWriter writer,
+ MarshallingContext context) {
+ QueryResults results = (QueryResults) object;
+
+ // write out identifiers
+ List<String> originalIds = Arrays.asList( results.getIdentifiers() );
+ List<String> actualIds = new ArrayList();
+ if ( results instanceof NativeQueryResults ) {
+ for ( String identifier : originalIds ) {
+ // we don't want to marshall the query parameters
+ Declaration declr = ((NativeQueryResults) results).getDeclarations().get( identifier );
+ ObjectType objectType = declr.getPattern().getObjectType();
+ if ( objectType instanceof ClassObjectType ) {
+ if ( ((ClassObjectType) objectType).getClassType() == DroolsQuery.class ) {
+ continue;
+ }
+ }
+ actualIds.add( identifier );
+ }
+ }
+
+ String[] identifiers = actualIds.toArray( new String[actualIds.size()] );
+
+ writer.startNode( "identifiers" );
+ for ( int i = 0; i < identifiers.length; i++ ) {
+ writer.startNode( "identifier" );
+ writer.setValue( identifiers[i] );
+ writer.endNode();
+ }
+ writer.endNode();
+
+ for ( QueryResultsRow result : results ) {
+ writer.startNode( "row" );
+ for ( int i = 0; i < identifiers.length; i++ ) {
+ Object value = result.get( identifiers[i] );
+ FactHandle factHandle = result.getFactHandle( identifiers[i] );
+ writeItem( value,
+ context,
+ writer );
+ writer.startNode( "fact-handle" );
+ writer.addAttribute( "external-form",
+ ((FactHandle) factHandle).toExternalForm() );
+ writer.endNode();
+ }
+ writer.endNode();
+ }
+ }
+
+ public Object unmarshal(HierarchicalStreamReader reader,
+ UnmarshallingContext context) {
+ reader.moveDown();
+ List<String> list = new ArrayList<String>();
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ list.add( reader.getValue() );
+ reader.moveUp();
+ }
+ reader.moveUp();
+
+ HashMap<String, Integer> identifiers = new HashMap<String, Integer>();
+ for ( int i = 0; i < list.size(); i++ ) {
+ identifiers.put( list.get( i ),
+ i );
+ }
+
+ ArrayList<ArrayList<Object>> results = new ArrayList();
+ ArrayList<ArrayList<FactHandle>> resultHandles = new ArrayList();
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ ArrayList objects = new ArrayList();
+ ArrayList<FactHandle> handles = new ArrayList();
+ while ( reader.hasMoreChildren() ) {
+ reader.moveDown();
+ Object object = readItem( reader,
+ context,
+ null );
+ reader.moveUp();
+
+ reader.moveDown();
+ FactHandle handle = new DisconnectedFactHandle( reader.getAttribute( "external-form" ) );
+ reader.moveUp();
+
+ objects.add( object );
+ handles.add( handle );
+ }
+ results.add( objects );
+ resultHandles.add( handles );
+ reader.moveUp();
+ }
+
+ return new FlatQueryResults( identifiers,
+ results,
+ resultHandles );
+ }
+
+ public boolean canConvert(Class clazz) {
+ return QueryResults.class.isAssignableFrom( clazz );
+ }
+ }
+}
Modified: labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlGridTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlGridTransformer.java 2010-06-05 01:08:43 UTC (rev 33358)
+++ labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/main/java/org/drools/runtime/pipeline/impl/XStreamFromXmlGridTransformer.java 2010-06-05 04:26:28 UTC (rev 33359)
@@ -3,15 +3,24 @@
*/
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;
@@ -24,6 +33,8 @@
private Object payload;
private PipelineContext context;
+ private static Pattern p = Pattern.compile("[\"']?lookup[\"']?\\s*[:=]\\s*[\"']([^\"']+)[\"']");
+
public XStreamFromXmlGridTransformer(XStreamResolverStrategy strategy) {
this.strategy = strategy;
}
@@ -38,8 +49,25 @@
public Object processPayload(Object object, PipelineContext context) {
try {
- Document d = (Document) object;
- String name = d.getDocumentElement().getAttribute("lookup");
+ 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 + "'");
@@ -62,7 +90,7 @@
}
xstream.setClassLoader(cl);
executionNodeContext.setClassLoader(cl);
- payload = xstream.unmarshal(new DomReader(d));
+ payload = xstream.fromXML( ((String) object) );
context.getProperties().put("xstream-instance", xstream);
this.context = context;
} catch (Exception e) {
Added: labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/JSonBatchExecutionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/JSonBatchExecutionTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/JSonBatchExecutionTest.java 2010-06-05 04:26:28 UTC (rev 33359)
@@ -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 );
+
+ }
+
+}
Deleted: labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/ToXmlNodeTransformer.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/ToXmlNodeTransformer.java 2010-06-05 01:08:43 UTC (rev 33358)
+++ labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/ToXmlNodeTransformer.java 2010-06-05 04:26:28 UTC (rev 33359)
@@ -1,52 +0,0 @@
-package org.drools.runtime.pipeline.impl;
-
-import java.io.InputStream;
-import java.io.Reader;
-import java.io.StringReader;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import org.drools.io.Resource;
-import org.drools.runtime.pipeline.PipelineContext;
-import org.drools.runtime.pipeline.Transformer;
-import org.w3c.dom.Document;
-import org.xml.sax.InputSource;
-
-public class ToXmlNodeTransformer extends BaseEmitter
- implements
- Transformer {
-
- public void receive(Object object,
- PipelineContext context) {
- // Create a DOM builder and parse the fragment
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- Document d = null;
- try {
- d = factory.newDocumentBuilder().parse( (InputSource) null );
- } catch ( Exception e ) {
- }
-
- try {
- if ( object instanceof String ) {
- d = factory.newDocumentBuilder().parse( new InputSource( new StringReader( (String) object ) ) );
- } else if ( object instanceof Reader ) {
- d = factory.newDocumentBuilder().parse( new InputSource( (Reader) object ) );
- } else if ( object instanceof InputStream ) {
- d = factory.newDocumentBuilder().parse( (InputStream) object );
- } else if ( object instanceof Resource ) {
- d = factory.newDocumentBuilder().parse( new InputSource( ((Resource) object).getReader() ) );
- } else {
- throw new IllegalArgumentException( "signal object must be instance of InputStream or Resource" );
- }
- } catch ( Exception e ) {
- handleException( this,
- object,
- e );
- }
-
- emit( d,
- context );
-
- }
-
-}
Modified: labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/XStreamBatchExecutionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/XStreamBatchExecutionTest.java 2010-06-05 01:08:43 UTC (rev 33358)
+++ labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/XStreamBatchExecutionTest.java 2010-06-05 04:26:28 UTC (rev 33359)
@@ -244,7 +244,7 @@
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 += " <fact-handle identifier=\"outStilton\" external-form=\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\" /> \n";
expectedXml += "</execution-results>\n";
assertXMLEqual( expectedXml,
@@ -291,7 +291,7 @@
String expectedXml = "";
expectedXml += "<execution-results>\n";
- expectedXml += " <fact-handle identifier=\"outStilton\" externalForm=\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\" /> \n";
+ expectedXml += " <fact-handle identifier=\"outStilton\" external-form=\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\" /> \n";
expectedXml += "</execution-results>\n";
assertXMLEqual( expectedXml,
@@ -336,7 +336,7 @@
FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
inXml = "";
inXml += "<batch-execution>";
- inXml += " <get-object out-identifier='outStilton' factHandle='" + factHandle.toExternalForm() + "' />";
+ inXml += " <get-object out-identifier='outStilton' fact-handle='" + factHandle.toExternalForm() + "' />";
inXml += "</batch-execution>";
getPipelineStateful( ksession ).insert( inXml,
resultHandler );
@@ -385,14 +385,14 @@
FactHandle factHandle = (FactHandle) result.getFactHandle( "outStilton" );
inXml = "";
inXml += "<batch-execution>";
- inXml += " <retract factHandle='" + factHandle.toExternalForm() + "' />";
+ inXml += " <retract fact-handle='" + factHandle.toExternalForm() + "' />";
inXml += "</batch-execution>";
getPipelineStateful( ksession ).insert( inXml,
resultHandler );
inXml = "";
inXml += "<batch-execution>";
- inXml += " <get-object out-identifier='outStilton' factHandle='" + factHandle.toExternalForm() + "' />";
+ inXml += " <get-object out-identifier='outStilton' fact-handle='" + factHandle.toExternalForm() + "' />";
inXml += "</batch-execution>";
getPipelineStateful( ksession ).insert( inXml,
resultHandler );
@@ -447,7 +447,7 @@
expectedXml += " <price>30</price>\n";
expectedXml += " </org.drools.Cheese>\n";
expectedXml += " </result>\n";
- expectedXml += " <fact-handle identifier=\"outStilton\" externalForm=\"" + factHandle.toExternalForm() + "\" /> \n";
+ expectedXml += " <fact-handle identifier=\"outStilton\" external-form=\"" + factHandle.toExternalForm() + "\" /> \n";
expectedXml += "</execution-results>\n";
assertXMLEqual( expectedXml,
@@ -455,7 +455,7 @@
inXml = "";
inXml += "<batch-execution>";
- inXml += " <modify factHandle='" + factHandle.toExternalForm() + "'> <set accessor='oldPrice' value='\"42\"' /><set accessor='price' value='50' /></modify>";
+ 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,
@@ -463,7 +463,7 @@
inXml = "";
inXml += "<batch-execution>";
- inXml += " <get-object out-identifier='outCheddar' factHandle='" + factHandle.toExternalForm() + "' />";
+ inXml += " <get-object out-identifier='outCheddar' fact-handle='" + factHandle.toExternalForm() + "' />";
inXml += "</batch-execution>";
getPipelineStateful( ksession ).insert( inXml,
resultHandler );
@@ -479,7 +479,7 @@
ModifyCommand.ALLOW_MODIFY_EXPRESSIONS = false;
inXml = "";
inXml += "<batch-execution>";
- inXml += " <modify factHandle='" + factHandle.toExternalForm() + "'> <set accessor='type' value='44\"; System.exit(1);' /><set accessor='price' value='50' /></modify>";
+ 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,
@@ -602,7 +602,7 @@
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>";
+ 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 );
@@ -677,13 +677,13 @@
expectedXml += " <fact-handles identifier=\"myfacts\">\n";
for ( FactHandle factHandle : factHandles ) {
if ( ((Cheese) ksession.getObject( factHandle )).getPrice() == 30 ) {
- expectedXml += " <fact-handle externalForm=\"" + factHandle.toExternalForm() + "\"/>\n";
+ expectedXml += " <fact-handle external-form=\"" + factHandle.toExternalForm() + "\"/>\n";
}
}
for ( FactHandle factHandle : factHandles ) {
if ( ((Cheese) ksession.getObject( factHandle )).getPrice() == 35 ) {
- expectedXml += " <fact-handle externalForm=\"" + factHandle.toExternalForm() + "\"/>\n";
+ expectedXml += " <fact-handle external-form=\"" + factHandle.toExternalForm() + "\"/>\n";
}
}
expectedXml += " </fact-handles>\n";
@@ -992,13 +992,13 @@
expectedXml += " <price>1</price>\n";
expectedXml += " <oldPrice>0</oldPrice>\n";
expectedXml += " </org.drools.Cheese>\n";
- expectedXml += " <fact-handle externalForm='" + row.getFactHandle( "stilton" ).toExternalForm() + "' />";
+ 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 externalForm='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+ expectedXml += " <fact-handle external-form='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
expectedXml += " </row>\n";
expectedXml += " <row>\n";
row = it1.next();
@@ -1007,13 +1007,13 @@
expectedXml += " <price>2</price>\n";
expectedXml += " <oldPrice>0</oldPrice>\n";
expectedXml += " </org.drools.Cheese>\n";
- expectedXml += " <fact-handle externalForm='" + row.getFactHandle( "stilton" ).toExternalForm() + "' />";
+ 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 externalForm='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+ expectedXml += " <fact-handle external-form='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
expectedXml += " </row>\n";
expectedXml += " </query-results>\n";
expectedXml += " </result>\n";
@@ -1026,16 +1026,16 @@
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 += " <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 externalForm='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+ 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 externalForm='" + row.getFactHandle( "stilton" ).toExternalForm() + "' />";
+ 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 externalForm='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
+ expectedXml += " <fact-handle external-form='" + row.getFactHandle( "cheddar" ).toExternalForm() + "' />";
expectedXml += " </row>\n";
expectedXml += " </query-results>\n";
expectedXml += " </result>\n";
@@ -1154,7 +1154,7 @@
expectedXml += " <oldPrice>5</oldPrice>\n";
expectedXml += " </org.drools.Cheese>\n";
expectedXml += " </result>\n";
- expectedXml += " <fact-handle identifier=\"outBrie\" externalForm=\"" + factHandle.toExternalForm() + "\" /> \n";
+ expectedXml += " <fact-handle identifier=\"outBrie\" external-form=\"" + factHandle.toExternalForm() + "\" /> \n";
expectedXml += "</execution-results>\n";
assertXMLEqual( expectedXml,
outXml );
@@ -1732,7 +1732,7 @@
expectedXml += " <price>30</price>\n";
expectedXml += " </org.foo.Whee>\n";
expectedXml += " </result>\n";
- expectedXml += " <fact-handle identifier=\"outStilton\" externalForm=\"" + factHandle.toExternalForm() + "\" /> \n";
+ expectedXml += " <fact-handle identifier=\"outStilton\" external-form=\"" + factHandle.toExternalForm() + "\" /> \n";
expectedXml += "</execution-results>\n";
assertXMLEqual( expectedXml,
@@ -1854,7 +1854,7 @@
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 += " <fact-handle identifier=\"outStilton\" external-form=\"" + ((InternalFactHandle) result.getFactHandle( "outStilton" )).toExternalForm() + "\" /> \n";
expectedXml += "</execution-results>\n";
assertXMLEqual( expectedXml,
@@ -1899,13 +1899,13 @@
Transformer inTransformer = new XStreamFromXmlGridTransformer( xstreamResolverStrategy );
inTransformer.setReceiver( batchExecution );
- Transformer domTransformer = new ToXmlNodeTransformer();
- domTransformer.setReceiver( inTransformer );
+// Transformer domTransformer = new ToXmlNodeTransformer();
+// domTransformer.setReceiver( inTransformer );
//Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline( ksession );
Pipeline pipeline = new ExecutionNodePipelineImpl( node );
- pipeline.setReceiver( domTransformer );
+ pipeline.setReceiver( inTransformer );
return pipeline;
}
More information about the jboss-svn-commits
mailing list