[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