[jboss-svn-commits] JBL Code SVN: r26296 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/command/impl and 3 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Apr 28 22:37:52 EDT 2009


Author: mark.proctor at jboss.com
Date: 2009-04-28 22:37:51 -0400 (Tue, 28 Apr 2009)
New Revision: 26296

Modified:
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/command/CommandFactory.java
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/command/CommandFactoryProvider.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/impl/CommandFactoryProviderImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/CompleteWorkItemCommand.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/test/java/org/drools/runtime/pipeline/impl/XStreamBatchExecutionTest.java
Log:
-added complete work items to CommandFactory and xml marshalling

Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/command/CommandFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/command/CommandFactory.java	2009-04-29 01:28:47 UTC (rev 26295)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/command/CommandFactory.java	2009-04-29 02:37:51 UTC (rev 26296)
@@ -57,30 +57,34 @@
     public static Command newInsertElements(Iterable objects) {
         return getCommandFactoryProvider().newInsertElements( objects );
     }
-    
+
     public static Command newRetract(FactHandle factHandle) {
         return getCommandFactoryProvider().newRetract( factHandle );
     }
-    
-    public static Setter newSetter(String accessor, String value) {
-        return getCommandFactoryProvider().newSetter(accessor, value);
+
+    public static Setter newSetter(String accessor,
+                                   String value) {
+        return getCommandFactoryProvider().newSetter( accessor,
+                                                      value );
     }
-    
-    public static Command newModify(FactHandle factHandle, List<Setter> setters) {
-        return getCommandFactoryProvider().newModify(factHandle, setters);
+
+    public static Command newModify(FactHandle factHandle,
+                                    List<Setter> setters) {
+        return getCommandFactoryProvider().newModify( factHandle,
+                                                      setters );
     }
-    
+
     public static Command newGetObject(FactHandle factHandle) {
         return getCommandFactoryProvider().newGetObject( factHandle );
     }
-    
+
     public static Command newGetObjects() {
-    	return getCommandFactoryProvider().newGetObjects( );
-    }    
-    
+        return getCommandFactoryProvider().newGetObjects();
+    }
+
     public static Command newGetObjects(ObjectFilter filter) {
-    	return getCommandFactoryProvider().newGetObjects( filter );
-    }    
+        return getCommandFactoryProvider().newGetObjects( filter );
+    }
 
     /**
      * Sets the global.
@@ -159,14 +163,14 @@
         return getCommandFactoryProvider().newGetGlobal( identifier,
                                                          outIdentifier );
     }
-    
+
     public static Command newFireAllRules() {
         return getCommandFactoryProvider().newFireAllRules();
     }
-    
+
     public static Command newFireAllRules(int max) {
-        return getCommandFactoryProvider().newFireAllRules(max);
-    }    
+        return getCommandFactoryProvider().newFireAllRules( max );
+    }
 
     /**
      * Start a process
@@ -189,21 +193,27 @@
                                           Map<String, Object> parameters) {
         return getCommandFactoryProvider().newStartProcess( processId );
     }
-    
-    public static Command signalEvent(String type,
-                                      Object event) {
-        return getCommandFactoryProvider().signalEvent( type,
-                                                        event );
+
+    public static Command newSignalEvent(String type,
+                                         Object event) {
+        return getCommandFactoryProvider().newSignalEvent( type,
+                                                           event );
     }
-    
-    public static Command signalEvent(long processInstanceId,
-                                      String type,
-                                      Object event) {
-        return getCommandFactoryProvider().signalEvent( processInstanceId,
-                                                        type,
-                                                        event );
-    }    
-    
+
+    public static Command newSignalEvent(long processInstanceId,
+                                         String type,
+                                         Object event) {
+        return getCommandFactoryProvider().newSignalEvent( processInstanceId,
+                                                           type,
+                                                           event );
+    }
+
+    public static Command newCompleteWorkItem(long workItemId,
+                                              Map<String, Object> results) {
+        return getCommandFactoryProvider().newCompleteWorkItem( workItemId,
+                                                                results );
+    }
+
     /**
      * Executes a query. The query results will be added to the ExecutionResults using the 
      * given identifier.
@@ -215,11 +225,12 @@
      * @return
      */
     public static Command newQuery(String identifier,
-                                    String name) {
-        return getCommandFactoryProvider().newQuery( identifier, name );
-        
+                                   String name) {
+        return getCommandFactoryProvider().newQuery( identifier,
+                                                     name );
+
     }
-    
+
     /**
      * Executes a query using the given parameters. The query results will be added to the 
      * ExecutionResults using the given identifier.
@@ -233,17 +244,19 @@
      * @return
      */
     public static Command newQuery(String identifier,
-                                    String name,
-                                    Object[] arguments) {
-        return getCommandFactoryProvider().newQuery( identifier, name, arguments );  
-    }    
-    
+                                   String name,
+                                   Object[] arguments) {
+        return getCommandFactoryProvider().newQuery( identifier,
+                                                     name,
+                                                     arguments );
+    }
+
     /**
      * This is a special composite command and will execute all the supplied commands in turn.
      * @param commands
      * @return
      */
-    public static Command newBatchExecution(List<? extends Command> commands) {
+    public static Command newBatchExecution(List< ? extends Command> commands) {
         return getCommandFactoryProvider().newBatchExecution( commands );
     }
 

Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/command/CommandFactoryProvider.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/command/CommandFactoryProvider.java	2009-04-29 01:28:47 UTC (rev 26295)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/command/CommandFactoryProvider.java	2009-04-29 02:37:51 UTC (rev 26296)
@@ -53,13 +53,16 @@
     Command newStartProcess(String processId,
                             Map<String, Object> parameters);
 
-    Command signalEvent(String type,
-                        Object event);
+    Command newSignalEvent(String type,
+                           Object event);
 
-    Command signalEvent(long processInstanceId,
-                        String type,
-                        Object event);
+    Command newSignalEvent(long processInstanceId,
+                           String type,
+                           Object event);
     
+    Command newCompleteWorkItem(long workItemId,
+                                Map<String, Object> results);    
+
     Command newQuery(String identifier,
                      String name);
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/impl/CommandFactoryProviderImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/impl/CommandFactoryProviderImpl.java	2009-04-29 01:28:47 UTC (rev 26295)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/impl/CommandFactoryProviderImpl.java	2009-04-29 02:37:51 UTC (rev 26296)
@@ -6,6 +6,7 @@
 import org.drools.command.Command;
 import org.drools.command.CommandFactoryProvider;
 import org.drools.command.Setter;
+import org.drools.process.command.CompleteWorkItemCommand;
 import org.drools.process.command.FireAllRulesCommand;
 import org.drools.process.command.GetGlobalCommand;
 import org.drools.process.command.GetObjectCommand;
@@ -114,20 +115,24 @@
 		return startProcess;
 	}
 
-    public Command signalEvent(String type,
+    public Command newSignalEvent(String type,
                                Object event) {
         return new SignalEventCommand( type, event );
     }
     
-    public Command signalEvent(long processInstanceId,
+    public Command newSignalEvent(long processInstanceId,
                                String type,
                                Object event) {
         return new SignalEventCommand( processInstanceId, type, event );
     }    
+    
+    public Command newCompleteWorkItem(long workItemId,
+                                       Map<String, Object> results) {
+        return new CompleteWorkItemCommand(workItemId, results);
+    }    
 	
 	public Command newQuery(String identifier, String name) {
 		return new QueryCommand(identifier, name, null);
-
 	}
 
 	public Command newQuery(String identifier, String name, Object[] arguments) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/CompleteWorkItemCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/CompleteWorkItemCommand.java	2009-04-29 01:28:47 UTC (rev 26295)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/CompleteWorkItemCommand.java	2009-04-29 02:37:51 UTC (rev 26296)
@@ -10,7 +10,18 @@
 	private long workItemId;
 	private Map<String, Object> results = new HashMap<String, Object>();
 	
-	public long getWorkItemId() {
+	
+	public CompleteWorkItemCommand() {
+	    
+	}
+	
+	public CompleteWorkItemCommand(long workItemId,
+                                   Map<String, Object> results) {
+        this.workItemId = workItemId;
+        this.results = results;
+    }
+
+    public long getWorkItemId() {
 		return workItemId;
 	}
 

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	2009-04-29 01:28:47 UTC (rev 26295)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/runtime/help/impl/BatchExecutionHelperProviderImpl.java	2009-04-29 02:37:51 UTC (rev 26296)
@@ -14,6 +14,7 @@
 import org.drools.command.Setter;
 import org.drools.common.DisconnectedFactHandle;
 import org.drools.common.InternalFactHandle;
+import org.drools.process.command.CompleteWorkItemCommand;
 import org.drools.process.command.FireAllRulesCommand;
 import org.drools.process.command.GetGlobalCommand;
 import org.drools.process.command.GetObjectCommand;
@@ -76,7 +77,9 @@
         xstream.alias( "start-process",
                        StartProcessCommand.class );
         xstream.alias( "signal-event",
-                       SignalEventCommand.class );        
+                       SignalEventCommand.class );
+        xstream.alias( "complete-work-item",
+                       CompleteWorkItemCommand.class );
         xstream.alias( "set-global",
                        SetGlobalCommand.class );
         xstream.alias( "get-global",
@@ -104,6 +107,7 @@
         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 QueryConverter( xstream.getMapper() ) );
         xstream.registerConverter( new SetGlobalConverter( xstream.getMapper() ) );
         xstream.registerConverter( new GetGlobalConverter( xstream.getMapper() ) );
@@ -177,9 +181,10 @@
             if ( cmd.getOutIdentifier() != null ) {
                 writer.addAttribute( "out-identifier",
                                      cmd.getOutIdentifier() );
-                
-                writer.addAttribute( "return-object", Boolean.toString( cmd.isReturnObject() ) );
-                
+
+                writer.addAttribute( "return-object",
+                                     Boolean.toString( cmd.isReturnObject() ) );
+
             }
             writeItem( cmd.getObject(),
                        context,
@@ -198,7 +203,7 @@
             reader.moveUp();
             InsertObjectCommand cmd = new InsertObjectCommand( object );
             if ( identifierOut != null ) {
-                cmd.setOutIdentifier( identifierOut );                
+                cmd.setOutIdentifier( identifierOut );
                 if ( returnObject != null ) {
                     cmd.setReturnObject( Boolean.parseBoolean( returnObject ) );
                 }
@@ -305,15 +310,16 @@
                             HierarchicalStreamWriter writer,
                             MarshallingContext context) {
             InsertElementsCommand cmd = (InsertElementsCommand) object;
-            
+
             if ( cmd.getOutIdentifier() != null ) {
                 writer.addAttribute( "out-identifier",
                                      cmd.getOutIdentifier() );
-                
-                writer.addAttribute( "return-object", Boolean.toString( cmd.isReturnObject() ) );
-                
+
+                writer.addAttribute( "return-object",
+                                     Boolean.toString( cmd.isReturnObject() ) );
+
             }
-            
+
             for ( Object element : cmd.getObjects() ) {
                 writeItem( element,
                            context,
@@ -325,7 +331,7 @@
                                 UnmarshallingContext context) {
             String identifierOut = reader.getAttribute( "out-identifier" );
             String returnObject = reader.getAttribute( "return-object" );
-            
+
             List objects = new ArrayList();
             while ( reader.hasMoreChildren() ) {
                 reader.moveDown();
@@ -335,10 +341,10 @@
                 reader.moveUp();
                 objects.add( object );
             }
-            
+
             InsertElementsCommand cmd = new InsertElementsCommand( objects );
             if ( identifierOut != null ) {
-                cmd.setOutIdentifier( identifierOut );                
+                cmd.setOutIdentifier( identifierOut );
                 if ( returnObject != null ) {
                     cmd.setReturnObject( Boolean.parseBoolean( returnObject ) );
                 }
@@ -665,60 +671,120 @@
             return clazz.equals( StartProcessCommand.class );
         }
     }
-    
+
     public static class SignalEventConverter extends AbstractCollectionConverter
-    implements
-    Converter {
+        implements
+        Converter {
 
-    public SignalEventConverter(Mapper mapper) {
-        super( mapper );
-    }
+        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 ) );
+        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 );
         }
-        
-        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" );
+        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 = new SignalEventCommand(Long.parseLong( processInstanceId ), eventType, event );
-        } else {
-            cmd = new SignalEventCommand( eventType, event );
+            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;
         }
 
-        return cmd;
+        public boolean canConvert(Class clazz) {
+            return clazz.equals( SignalEventCommand.class );
+        }
+
     }
 
-    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 BatchExecutionResultConverter extends AbstractCollectionConverter
         implements
         Converter {

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	2009-04-29 01:28:47 UTC (rev 26295)
+++ labs/jbossrules/trunk/drools-pipeline/drools-transformer-xstream/src/test/java/org/drools/runtime/pipeline/impl/XStreamBatchExecutionTest.java	2009-04-29 02:37:51 UTC (rev 26296)
@@ -5,8 +5,10 @@
 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;
@@ -19,6 +21,7 @@
 import org.drools.Cheese;
 import org.drools.KnowledgeBase;
 import org.drools.KnowledgeBaseFactory;
+import org.drools.Person;
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
 import org.drools.StatefulSession;
@@ -49,6 +52,10 @@
 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;
 
@@ -1022,24 +1029,26 @@
         str += "\n";
         str += "</process>";
 
-        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRF );       
-        
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRF );
+
         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
         kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-        
-        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();        
-        
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
         ProcessInstance processInstance = ksession.startProcess( "org.drools.event" );
         assertEquals( ProcessInstance.STATE_ACTIVE,
                       processInstance.getState() );
-                       
+
         String inXml = "";
         inXml += "<signal-event process-instance-id= '" + processInstance.getId() + "' event-type='MyEvent'>";
         inXml += "    <string>MyValue</string>";
         inXml += "</signal-event>";
-        
-        getPipelineStateful( ksession ).insert( inXml, new ResultHandlerImpl() );
 
+        getPipelineStateful( ksession ).insert( inXml,
+                                                new ResultHandlerImpl() );
+
         assertEquals( ProcessInstance.STATE_COMPLETED,
                       processInstance.getState() );
         assertEquals( "MyValue",
@@ -1084,30 +1093,201 @@
         str += "\n";
         str += "</process>";
 
-        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRF );       
-        
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRF );
+
         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
         kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-        
-        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();        
-        
+
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
         ProcessInstance processInstance = ksession.startProcess( "org.drools.event" );
         assertEquals( ProcessInstance.STATE_ACTIVE,
                       processInstance.getState() );
-                       
+
         String inXml = "";
         inXml += "<signal-event event-type='MyEvent'>";
         inXml += "    <string>MyValue</string>";
         inXml += "</signal-event>";
-        
-        getPipelineStateful( ksession ).insert( inXml, new ResultHandlerImpl() );
 
+        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" ) );
+
+        String inXml = "";
+        inXml = "<complete-work-item id='" + workItem.getId() + "' />";
+        getPipelineStateful( ksession ).insert( inXml,
+                                                new ResultHandlerImpl() );
+
+        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" ) );
+
+        inXml = "";
+        inXml += "<complete-work-item id='" + workItem.getId() + "' >";
+        inXml += "    <result identifier='Result'>";
+        inXml += "        <string>SomeOtherString</string>";
+        inXml += "    </result>";
+        inXml += "</complete-work-item>";
+        getPipelineStateful( ksession ).insert( inXml,
+                                                new ResultHandlerImpl() );
+
+        assertEquals( ProcessInstance.STATE_COMPLETED,
+                      processInstance.getState() );
+        assertEquals( "SomeOtherString",
+                      processInstance.getVariable( "MyObject" ) );
+        assertEquals( 15,
+                      processInstance.getVariable( "Number" ) );
+    }
+
+    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";




More information about the jboss-svn-commits mailing list