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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Oct 25 09:12:58 EDT 2010


Author: diegoll
Date: 2010-10-25 09:12:57 -0400 (Mon, 25 Oct 2010)
New Revision: 35708

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkItemHandlerNotFoundException.java
   labs/jbossrules/trunk/drools-flow-core/src/test/java/org/drools/process/WorkItemTest.java
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/DefaultWorkItemManager.java
   labs/jbossrules/trunk/drools-flow-core/src/main/java/org/drools/workflow/instance/node/WorkItemNodeInstance.java
   labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java
Log:
[JBRULES-2752] Throw exception for non-existing work item handler

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkItemHandlerNotFoundException.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkItemHandlerNotFoundException.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkItemHandlerNotFoundException.java	2010-10-25 13:12:57 UTC (rev 35708)
@@ -0,0 +1,22 @@
+package org.drools;
+
+
+public class WorkItemHandlerNotFoundException extends RuntimeDroolsException {
+
+    private String workItemName;
+
+    public WorkItemHandlerNotFoundException(String message,
+                                            String workItemName) {
+        super( message );
+        this.workItemName = workItemName;
+    }
+
+    public String getWorkItemName() {
+        return workItemName;
+    }
+
+    public void setWorkName(String workName) {
+        this.workItemName = workName;
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkItemHandlerNotFoundException.java
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/DefaultWorkItemManager.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/DefaultWorkItemManager.java	2010-10-25 12:55:48 UTC (rev 35707)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/DefaultWorkItemManager.java	2010-10-25 13:12:57 UTC (rev 35708)
@@ -26,6 +26,7 @@
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.drools.WorkItemHandlerNotFoundException;
 import org.drools.common.InternalKnowledgeRuntime;
 import org.drools.process.instance.WorkItem;
 import org.drools.process.instance.WorkItemManager;
@@ -67,14 +68,13 @@
 	public void internalExecuteWorkItem(WorkItem workItem) {
 	    ((WorkItemImpl) workItem).setId(++workItemCounter);
 	    internalAddWorkItem(workItem);
-	    WorkItemHandler handler = (WorkItemHandler) this.workItemHandlers.get(workItem.getName());
+	    WorkItemHandler handler = this.workItemHandlers.get(workItem.getName());
 	    if (handler != null) {
 	        handler.executeWorkItem(workItem, this);
-	    } else {
-	        System.err.println("Could not find work item handler for " + workItem.getName());
-	    }
+	    } else throw new WorkItemHandlerNotFoundException( "Could not find work item handler for " + workItem.getName(),
+                                                    workItem.getName() );
 	}
-	
+
 	public void internalAddWorkItem(WorkItem workItem) {
 	    workItems.put(new Long(workItem.getId()), workItem);
 	    // fix to reset workItemCounter after deserialization
@@ -87,31 +87,33 @@
         WorkItemImpl workItem = (WorkItemImpl) workItems.get(new Long(id));
         // work item may have been aborted
         if (workItem != null) {
-            WorkItemHandler handler = (WorkItemHandler) this.workItemHandlers.get(workItem.getName());
+            WorkItemHandler handler = this.workItemHandlers.get(workItem.getName());
             if (handler != null) {
                 handler.abortWorkItem(workItem, this);
             } else {
-                System.err.println("Could not find work item handler for " + workItem.getName());
+                workItems.remove( workItem.getId() );
+                throw new WorkItemHandlerNotFoundException( "Could not find work item handler for " + workItem.getName(),
+                                                                 workItem.getName() );
             }
             workItems.remove(workItem.getId());
         }
     }
-    
+
 	public Set<WorkItem> getWorkItems() {
 	    return new HashSet<WorkItem>(workItems.values());
 	}
-	
+
 	public WorkItem getWorkItem(long id) {
 		return workItems.get(id);
 	}
 
     public void completeWorkItem(long id, Map<String, Object> results) {
-        WorkItem workItem = (WorkItem) workItems.get(new Long(id));
+        WorkItem workItem = workItems.get(new Long(id));
         // work item may have been aborted
         if (workItem != null) {
-            ((org.drools.process.instance.WorkItem) workItem).setResults(results);
+            (workItem).setResults(results);
             ProcessInstance processInstance = kruntime.getProcessInstance(workItem.getProcessInstanceId());
-            ((org.drools.process.instance.WorkItem) workItem).setState(WorkItem.COMPLETED);
+            (workItem).setState(WorkItem.COMPLETED);
             // process instance may have finished already
             if (processInstance != null) {
                 processInstance.signalEvent("workItemCompleted", workItem);

Modified: labs/jbossrules/trunk/drools-flow-core/src/main/java/org/drools/workflow/instance/node/WorkItemNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-flow-core/src/main/java/org/drools/workflow/instance/node/WorkItemNodeInstance.java	2010-10-25 12:55:48 UTC (rev 35707)
+++ labs/jbossrules/trunk/drools-flow-core/src/main/java/org/drools/workflow/instance/node/WorkItemNodeInstance.java	2010-10-25 13:12:57 UTC (rev 35708)
@@ -22,6 +22,7 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.drools.WorkItemHandlerNotFoundException;
 import org.drools.definition.process.Node;
 import org.drools.process.core.Work;
 import org.drools.process.core.context.variable.VariableScope;
@@ -96,8 +97,13 @@
 			((ProcessInstance) getProcessInstance()).getKnowledgeRuntime()
 				.update(((ProcessInstance) getProcessInstance()).getKnowledgeRuntime().getFactHandle(this), this);
 		} else {
+		    try{
 		    ((WorkItemManager) ((ProcessInstance) getProcessInstance())
 	    		.getKnowledgeRuntime().getWorkItemManager()).internalExecuteWorkItem(workItem);
+		    } catch (WorkItemHandlerNotFoundException wihnfe){
+		        getProcessInstance().setState( ProcessInstance.STATE_ABORTED );
+		        throw wihnfe;
+		    }
 		}
         if (!workItemNode.isWaitForCompletion()) {
             triggerCompleted();
@@ -205,8 +211,13 @@
     	if (workItem != null &&
     			workItem.getState() != WorkItem.COMPLETED && 
     			workItem.getState() != WorkItem.ABORTED) {
-    		((WorkItemManager) ((ProcessInstance) getProcessInstance())
-				.getKnowledgeRuntime().getWorkItemManager()).internalAbortWorkItem(workItemId);
+    	    try{
+        		((WorkItemManager) ((ProcessInstance) getProcessInstance())
+    				.getKnowledgeRuntime().getWorkItemManager()).internalAbortWorkItem(workItemId);
+    	    } catch (WorkItemHandlerNotFoundException wihnfe){
+                getProcessInstance().setState( ProcessInstance.STATE_ABORTED );
+                throw wihnfe;
+    	    }
     	}
         super.cancel();
     }

Added: labs/jbossrules/trunk/drools-flow-core/src/test/java/org/drools/process/WorkItemTest.java
===================================================================
--- labs/jbossrules/trunk/drools-flow-core/src/test/java/org/drools/process/WorkItemTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-flow-core/src/test/java/org/drools/process/WorkItemTest.java	2010-10-25 13:12:57 UTC (rev 35708)
@@ -0,0 +1,185 @@
+package org.drools.process;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.Person;
+import org.drools.WorkItemHandlerNotFoundException;
+import org.drools.common.AbstractRuleBase;
+import org.drools.impl.InternalKnowledgeBase;
+import org.drools.process.core.ParameterDefinition;
+import org.drools.process.core.Work;
+import org.drools.process.core.context.variable.Variable;
+import org.drools.process.core.datatype.impl.type.IntegerDataType;
+import org.drools.process.core.datatype.impl.type.ObjectDataType;
+import org.drools.process.core.datatype.impl.type.StringDataType;
+import org.drools.process.core.impl.ParameterDefinitionImpl;
+import org.drools.process.core.impl.WorkImpl;
+import org.drools.process.instance.impl.demo.DoNothingWorkItemHandler;
+import org.drools.ruleflow.core.RuleFlowProcess;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.process.ProcessInstance;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.ConnectionImpl;
+import org.drools.workflow.core.node.EndNode;
+import org.drools.workflow.core.node.StartNode;
+import org.drools.workflow.core.node.WorkItemNode;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class WorkItemTest {
+
+    @Test
+    public void reachNonRegisteredWorkItemHandler() {
+        String processId = "org.drools.actions";
+        String workName = "Unnexistent Task";
+        RuleFlowProcess process = getWorkItemProcess( processId,
+                                                      workName );
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        ((AbstractRuleBase) ((InternalKnowledgeBase) kbase).getRuleBase()).addProcess( process );
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        Map<String, Object> parameters = new HashMap<String, Object>();
+        parameters.put( "UserName",
+                        "John Doe" );
+        parameters.put( "Person",
+                        new Person( "John Doe" ) );
+
+        ProcessInstance processInstance = null;
+        try {
+            processInstance = ksession.startProcess( "org.drools.actions",
+                                                                 parameters );
+            Assert.fail( "should fail if WorkItemHandler for" + workName + "is not registered" );
+        } catch ( Throwable e ) {
+
+        }
+        Assert.assertNull( processInstance );
+    }
+
+    @Test
+    public void cancelNonRegisteredWorkItemHandler() {
+        String processId = "org.drools.actions";
+        String workName = "Unnexistent Task";
+        RuleFlowProcess process = getWorkItemProcess( processId,
+                                                      workName );
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        ((AbstractRuleBase) ((InternalKnowledgeBase) kbase).getRuleBase()).addProcess( process );
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+        ksession.getWorkItemManager().registerWorkItemHandler( workName,
+                                                               new DoNothingWorkItemHandler() );
+
+        Map<String, Object> parameters = new HashMap<String, Object>();
+        parameters.put( "UserName",
+                        "John Doe" );
+        parameters.put( "Person",
+                        new Person( "John Doe" ) );
+
+        ProcessInstance processInstance = ksession.startProcess( "org.drools.actions",
+                                                                  parameters );
+        long processInstanceId = processInstance.getId();
+        Assert.assertEquals( ProcessInstance.STATE_ACTIVE,
+                           processInstance.getState() );
+        ksession.getWorkItemManager().registerWorkItemHandler( workName,
+                                                               null );
+
+        try {
+            ksession.abortProcessInstance( processInstanceId );
+            Assert.fail( "should fail if WorkItemHandler for" + workName + "is not registered" );
+        } catch ( WorkItemHandlerNotFoundException wihnfe ) {
+
+        }
+
+        Assert.assertEquals( ProcessInstance.STATE_ABORTED,
+                             processInstance.getState() );
+    }
+
+    private RuleFlowProcess getWorkItemProcess(String processId,
+                                               String workName) {
+        RuleFlowProcess process = new RuleFlowProcess();
+        process.setId( processId );
+
+        List<Variable> variables = new ArrayList<Variable>();
+        Variable variable = new Variable();
+        variable.setName( "UserName" );
+        variable.setType( new StringDataType() );
+        variables.add( variable );
+        variable = new Variable();
+        variable.setName( "Person" );
+        variable.setType( new ObjectDataType( Person.class.getName() ) );
+        variables.add( variable );
+        variable = new Variable();
+        variable.setName( "MyObject" );
+        variable.setType( new ObjectDataType() );
+        variables.add( variable );
+        variable = new Variable();
+        variable.setName( "Number" );
+        variable.setType( new IntegerDataType() );
+        variables.add( variable );
+        process.getVariableScope().setVariables( variables );
+
+        StartNode startNode = new StartNode();
+        startNode.setName( "Start" );
+        startNode.setId( 1 );
+
+        WorkItemNode workItemNode = new WorkItemNode();
+        workItemNode.setName( "workItemNode" );
+        workItemNode.setId( 2 );
+        workItemNode.addInMapping( "Comment",
+                                   "Person.name" );
+        workItemNode.addInMapping( "Attachment",
+                                   "MyObject" );
+        workItemNode.addOutMapping( "Result",
+                                    "MyObject" );
+        workItemNode.addOutMapping( "Result.length()",
+                                    "Number" );
+        Work work = new WorkImpl();
+        work.setName( workName );
+        Set<ParameterDefinition> parameterDefinitions = new HashSet<ParameterDefinition>();
+        ParameterDefinition parameterDefinition = new ParameterDefinitionImpl( "ActorId",
+                                                                               new StringDataType() );
+        parameterDefinitions.add( parameterDefinition );
+        parameterDefinition = new ParameterDefinitionImpl( "Content",
+                                                           new StringDataType() );
+        parameterDefinitions.add( parameterDefinition );
+        parameterDefinition = new ParameterDefinitionImpl( "Comment",
+                                                           new StringDataType() );
+        parameterDefinitions.add( parameterDefinition );
+        work.setParameterDefinitions( parameterDefinitions );
+        work.setParameter( "ActorId",
+                           "#{UserName}" );
+        work.setParameter( "Content",
+                           "#{Person.name}" );
+        workItemNode.setWork( work );
+
+        EndNode endNode = new EndNode();
+        endNode.setName( "End" );
+        endNode.setId( 3 );
+
+        connect( startNode,
+                 workItemNode );
+        connect( workItemNode,
+                 endNode );
+
+        process.addNode( startNode );
+        process.addNode( workItemNode );
+        process.addNode( endNode );
+
+        return process;
+    }
+
+    private void connect(Node sourceNode,
+                         Node targetNode) {
+        new ConnectionImpl( sourceNode,
+                             Node.CONNECTION_DEFAULT_TYPE,
+                             targetNode,
+                             Node.CONNECTION_DEFAULT_TYPE );
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-flow-core/src/test/java/org/drools/process/WorkItemTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java
===================================================================
--- labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java	2010-10-25 12:55:48 UTC (rev 35707)
+++ labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java	2010-10-25 13:12:57 UTC (rev 35708)
@@ -7,6 +7,7 @@
 
 import javax.persistence.EntityManager;
 
+import org.drools.WorkItemHandlerNotFoundException;
 import org.drools.common.InternalKnowledgeRuntime;
 import org.drools.process.instance.WorkItem;
 import org.drools.process.instance.WorkItemManager;
@@ -44,10 +45,15 @@
 	    if (handler != null) {
 	        handler.executeWorkItem(workItem, this);
 	    } else {
-	        System.err.println("Could not find work item handler for " + workItem.getName());
+	        throwWorkItemNotFoundException( workItem );
 	    }
 	}
 
+    private void throwWorkItemNotFoundException(WorkItem workItem) {
+        throw new WorkItemHandlerNotFoundException( "Could not find work item handler for " + workItem.getName(),
+                                                    workItem.getName() );
+	}
+
 	public void internalAbortWorkItem(long id) {
         Environment env = this.kruntime.getEnvironment();
         EntityManager em = (EntityManager) env.get(EnvironmentName.CMD_SCOPED_ENTITY_MANAGER);
@@ -60,7 +66,10 @@
             if (handler != null) {
                 handler.abortWorkItem(workItem, this);
             } else {
-                System.err.println("Could not find work item handler for " + workItem.getName());
+                if ( workItems != null ) {
+                    workItems.remove( id );
+                }
+                throwWorkItemNotFoundException( workItem );
             }
             if (workItems != null) {
             	workItems.remove(id);



More information about the jboss-svn-commits mailing list