[jboss-svn-commits] JBL Code SVN: r22778 - in labs/jbossrules/trunk: drools-compiler/src/main/java/org/drools/rule/builder and 32 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Sep 15 09:20:35 EDT 2008
Author: KrisVerlaenen
Date: 2008-09-15 09:20:33 -0400 (Mon, 15 Sep 2008)
New Revision: 22778
Added:
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/ExceptionHandlerHandler.java
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/FaultNodeHandler.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessExceptionHandlerTest.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/context/exception/ActionExceptionHandler.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/context/exception/DefaultExceptionScopeInstance.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/icons/fault.gif
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/EditMapDialog.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/MapItemDialog.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/FaultNodeWrapper.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/FaultNodeEditPart.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/exceptionHandler/
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/exceptionHandler/ExceptionHandlerDialog.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/exceptionHandler/ExceptionHandlersCellEditor.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/exceptionHandler/ExceptionHandlersDialog.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/exceptionHandler/ExceptionHandlersPropertyDescriptor.java
Modified:
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/ProcessBuildContext.java
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/ProcessSemanticModule.java
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlWorkflowProcessDumper.java
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/AbstractNodeHandler.java
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/CompositeNodeHandler.java
labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-4.0.xsd
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/processes/XMLPersistenceTest.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/context/exception/ExceptionHandler.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/context/exception/ExceptionScope.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/ContextInstance.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/context/AbstractContextInstance.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/ContextInstanceFactory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/ContextInstanceFactoryRegistry.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/ProcessInstanceImpl.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/factory/ReuseContextInstanceFactory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/RuleFlowProcess.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/validation/RuleFlowProcessValidator.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ProcessContext.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/DroolsConsequenceAction.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/FaultNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/context/WorkflowReuseContextInstanceFactory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeContextNodeInstance.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeNodeInstance.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstance.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstanceInterface.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/core/ProcessWrapper.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/BeanDialogCellEditor.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/EditBeanDialog.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/EditListDialog.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/ListPropertyDescriptor.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/CompositeContextNodeWrapper.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/RuleFlowWrapperBuilder.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/RuleFlowPaletteFactory.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/RuleFlowEditPartFactory.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowGlobalsDialog.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowImportsDialog.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/swimlane/SwimlaneDialog.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/swimlane/SwimlanesCellEditor.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/swimlane/SwimlanesDialog.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/task/TaskCellEditor.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/task/TaskDialog.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/variable/VariableDialog.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/variable/VariableListCellEditor.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/variable/VariableListDialog.java
labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELReceiveInstance.java
Log:
JBRULES-1764: Add exception handler support to RuleFlow language
- Added fault node and exception handlers to process and composite context node, in core, XML and IDE
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -25,13 +25,18 @@
import java.util.List;
import java.util.Map;
+import org.drools.lang.descr.ActionDescr;
import org.drools.lang.descr.ProcessDescr;
import org.drools.process.builder.ProcessNodeBuilder;
import org.drools.process.builder.ProcessNodeBuilderRegistry;
+import org.drools.process.core.Context;
+import org.drools.process.core.ContextContainer;
import org.drools.process.core.Process;
+import org.drools.process.core.context.exception.ActionExceptionHandler;
+import org.drools.process.core.context.exception.ExceptionHandler;
+import org.drools.process.core.context.exception.ExceptionScope;
import org.drools.process.core.validation.ProcessValidationError;
import org.drools.process.core.validation.ProcessValidator;
-import org.drools.rule.Package;
import org.drools.rule.builder.ProcessBuildContext;
import org.drools.ruleflow.core.RuleFlowProcess;
import org.drools.ruleflow.core.validation.RuleFlowProcessValidator;
@@ -40,6 +45,7 @@
import org.drools.workflow.core.Node;
import org.drools.workflow.core.NodeContainer;
import org.drools.workflow.core.WorkflowProcess;
+import org.drools.workflow.core.impl.DroolsConsequenceAction;
import org.drools.workflow.core.impl.WorkflowProcessImpl;
import org.drools.workflow.core.node.MilestoneNode;
import org.drools.workflow.core.node.Split;
@@ -95,52 +101,59 @@
// should never occur
e.printStackTrace( System.err );
}
- buildNodes( process );
+
+ ProcessDescr processDescr = new ProcessDescr();
+ processDescr.setName(process.getPackageName());
+ PackageRegistry pkgRegistry = this.packageBuilder.getPackageRegistry( this.packageBuilder.getPackage().getName() );
+ DialectCompiletimeRegistry dialectRegistry = pkgRegistry.getDialectCompiletimeRegistry();
+ Dialect dialect = dialectRegistry.getDialect( "java" );
+ dialect.init(processDescr);
+
+ ProcessBuildContext buildContext = new ProcessBuildContext(
+ this.packageBuilder,
+ this.packageBuilder.getPackage(),
+ process,
+ processDescr,
+ dialectRegistry,
+ dialect);
+
+ buildContexts( process, buildContext );
+ if (process instanceof WorkflowProcess) {
+ buildNodes( (WorkflowProcess) process, buildContext );
+ }
this.packageBuilder.getPackage().addProcess( process );
- Package pkg = this.packageBuilder.getPackage();
- if ( pkg != null ) {
- // FIXME, we should never have a null package
- // we can only do this is this.pkg != null, as otherwise the dialects won't be properly initialised
- // as the dialects are initialised when the pkg is first created
- PackageRegistry pkgRegistry = this.packageBuilder.getPackageRegistry( pkg.getName() );
- pkgRegistry.compileAll();
- pkgRegistry.getDialectRuntimeRegistry().onBeforeExecute();
- }
+ pkgRegistry.compileAll();
+ pkgRegistry.getDialectRuntimeRegistry().onBeforeExecute();
}
}
+ public void buildContexts(ContextContainer contextContainer, ProcessBuildContext buildContext) {
+ List<Context> exceptionScopes = contextContainer.getContexts(ExceptionScope.EXCEPTION_SCOPE);
+ if (exceptionScopes != null) {
+ for (Context context: exceptionScopes) {
+ ExceptionScope exceptionScope = (ExceptionScope) context;
+ for (ExceptionHandler exceptionHandler: exceptionScope.getExceptionHandlers().values()) {
+ if (exceptionHandler instanceof ActionExceptionHandler) {
+ DroolsConsequenceAction action = (DroolsConsequenceAction)
+ ((ActionExceptionHandler) exceptionHandler).getAction();
+ ActionDescr actionDescr = new ActionDescr();
+ actionDescr.setText( action.getConsequence() );
+ Dialect dialect = buildContext.getDialectRegistry().getDialect( action.getDialect() );
+ dialect.getActionBuilder().build( buildContext, action, actionDescr );
+ }
+ }
+ }
+ }
+ }
-
- public void buildNodes(Process process) {
- ProcessNodeBuilderRegistry nodeBuilderRegistry = packageBuilder.getPackageBuilderConfiguration().getProcessNodeBuilderRegistry();
-
- WorkflowProcess rfp = (WorkflowProcess) process;
-
- ProcessDescr processDescr = new ProcessDescr();
- processDescr.setName( rfp.getPackageName() );
-
- PackageRegistry pkgRegistry = this.packageBuilder.getPackageRegistry( this.packageBuilder.getPackage().getName() );
- DialectCompiletimeRegistry dialectRegistry = pkgRegistry.getDialectCompiletimeRegistry();
-
- Dialect dialect = dialectRegistry.getDialect( "java" );
- dialect.init( processDescr );
-
- ProcessBuildContext context = new ProcessBuildContext( this.packageBuilder,
- this.packageBuilder.getPackage(),
- process,
- processDescr,
- dialectRegistry,
- dialect );
-
- processNodes(rfp.getNodes(), process, processDescr, context, nodeBuilderRegistry);
-
+ public void buildNodes(WorkflowProcess process, ProcessBuildContext context) {
+ ProcessNodeBuilderRegistry nodeBuilderRegistry = packageBuilder.getPackageBuilderConfiguration().getProcessNodeBuilderRegistry();
+ processNodes(process.getNodes(), process, context.getProcessDescr(), context, nodeBuilderRegistry);
if ( !context.getErrors().isEmpty() ) {
this.errors.addAll( context.getErrors() );
}
-
- pkgRegistry.addProcess( context );
-
+ context.getDialectRegistry().addProcess( context );
}
private void processNodes(
@@ -158,6 +171,9 @@
if (node instanceof NodeContainer) {
processNodes(((NodeContainer) node).getNodes(), process, processDescr, context, nodeBuilderRegistry);
}
+ if (node instanceof ContextContainer) {
+ buildContexts((ContextContainer) node, context);
+ }
}
}
@@ -183,16 +199,15 @@
if ( process instanceof WorkflowProcessImpl ) {
WorkflowProcessImpl ruleFlow = (WorkflowProcessImpl) process;
builder.append( "package " + ruleFlow.getPackageName() + "\n" );
- List imports = ruleFlow.getImports();
+ List<String> imports = ruleFlow.getImports();
if ( imports != null ) {
- for ( Iterator iterator = imports.iterator(); iterator.hasNext(); ) {
- builder.append( "import " + iterator.next() + ";\n" );
+ for ( String importString: imports ) {
+ builder.append( "import " + importString + ";\n" );
}
}
- Map globals = ruleFlow.getGlobals();
+ Map<String, String> globals = ruleFlow.getGlobals();
if ( globals != null ) {
- for ( Iterator iterator = globals.entrySet().iterator(); iterator.hasNext(); ) {
- Map.Entry entry = (Map.Entry) iterator.next();
+ for ( Map.Entry<String, String> entry: globals.entrySet()) {
builder.append( "global " + entry.getValue() + " " + entry.getKey() + ";\n" );
}
}
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/ProcessBuildContext.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/ProcessBuildContext.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/ProcessBuildContext.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -3,16 +3,16 @@
import org.drools.compiler.Dialect;
import org.drools.compiler.DialectCompiletimeRegistry;
import org.drools.compiler.PackageBuilder;
-import org.drools.compiler.PackageBuilderConfiguration;
import org.drools.lang.descr.BaseDescr;
import org.drools.lang.descr.ProcessDescr;
-
import org.drools.process.core.Process;
import org.drools.rule.Package;
public class ProcessBuildContext extends PackageBuildContext {
+
private Process process;
private ProcessDescr processDescr;
+ private DialectCompiletimeRegistry dialectRegistry;
public ProcessBuildContext(final PackageBuilder pkgBuilder,
final Package pkg,
@@ -22,6 +22,7 @@
final Dialect defaultDialect) {
this.process = process;
this.processDescr = (ProcessDescr) processDescr;
+ this.dialectRegistry = dialectRegistry;
init( pkgBuilder,
pkg,
processDescr,
@@ -46,5 +47,9 @@
public void setProcess(Process process) {
this.process = process;
}
+
+ public DialectCompiletimeRegistry getDialectRegistry() {
+ return dialectRegistry;
+ }
}
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/ProcessSemanticModule.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/ProcessSemanticModule.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/ProcessSemanticModule.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -7,6 +7,8 @@
import org.drools.xml.processes.EndNodeHandler;
import org.drools.xml.processes.EventFilterHandler;
import org.drools.xml.processes.EventNodeHandler;
+import org.drools.xml.processes.ExceptionHandlerHandler;
+import org.drools.xml.processes.FaultNodeHandler;
import org.drools.xml.processes.ForEachNodeHandler;
import org.drools.xml.processes.GlobalHandler;
import org.drools.xml.processes.HumanTaskNodeHandler;
@@ -92,5 +94,9 @@
new EventNodeHandler() );
addHandler( "eventFilter",
new EventFilterHandler() );
+ addHandler( "fault",
+ new FaultNodeHandler() );
+ addHandler( "exceptionHandler",
+ new ExceptionHandlerHandler() );
}
}
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlWorkflowProcessDumper.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlWorkflowProcessDumper.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlWorkflowProcessDumper.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -5,6 +5,9 @@
import java.util.List;
import java.util.Map;
+import org.drools.process.core.context.exception.ActionExceptionHandler;
+import org.drools.process.core.context.exception.ExceptionHandler;
+import org.drools.process.core.context.exception.ExceptionScope;
import org.drools.process.core.context.swimlane.Swimlane;
import org.drools.process.core.context.swimlane.SwimlaneContext;
import org.drools.process.core.context.variable.Variable;
@@ -12,6 +15,7 @@
import org.drools.process.core.datatype.DataType;
import org.drools.process.core.datatype.impl.type.ObjectDataType;
import org.drools.workflow.core.Connection;
+import org.drools.workflow.core.DroolsAction;
import org.drools.workflow.core.Node;
import org.drools.workflow.core.WorkflowProcess;
import org.drools.workflow.core.impl.NodeImpl;
@@ -86,6 +90,10 @@
if (swimlaneContext != null) {
visitSwimlanes(swimlaneContext.getSwimlanes(), xmlDump);
}
+ ExceptionScope exceptionScope = (ExceptionScope) process.getDefaultContext(ExceptionScope.EXCEPTION_SCOPE);
+ if (exceptionScope != null) {
+ visitExceptionHandlers(exceptionScope.getExceptionHandlers(), xmlDump);
+ }
xmlDump.append(" </header>" + EOL + EOL);
}
@@ -135,6 +143,33 @@
}
}
+ public static void visitExceptionHandlers(Map<String, ExceptionHandler> exceptionHandlers, StringBuffer xmlDump) {
+ if (exceptionHandlers != null && exceptionHandlers.size() > 0) {
+ xmlDump.append(" <exceptionHandlers>" + EOL);
+ for (Map.Entry<String, ExceptionHandler> entry: exceptionHandlers.entrySet()) {
+ ExceptionHandler exceptionHandler = entry.getValue();
+ if (exceptionHandler instanceof ActionExceptionHandler) {
+ ActionExceptionHandler actionExceptionHandler = (ActionExceptionHandler) exceptionHandler;
+ xmlDump.append(" <exceptionHandler faultName=\"" + entry.getKey() + "\" type=\"action\" ");
+ String faultVariable = exceptionHandler.getFaultVariable();
+ if (faultVariable != null && faultVariable.length() > 0) {
+ xmlDump.append("faultVariable=\"" + faultVariable + "\" ");
+ }
+ xmlDump.append(">" + EOL);
+ DroolsAction action = actionExceptionHandler.getAction();
+ if (action != null) {
+ AbstractNodeHandler.writeAction(action, xmlDump);
+ }
+ xmlDump.append(" </exceptionHandler>" + EOL);
+ } else {
+ throw new IllegalArgumentException(
+ "Unknown exception handler type: " + exceptionHandler);
+ }
+ }
+ xmlDump.append(" </exceptionHandlers>" + EOL);
+ }
+ }
+
public static void visitDataType(DataType dataType, StringBuffer xmlDump) {
xmlDump.append(" <type name=\"" + dataType.getClass().getName() + "\" ");
// TODO make this pluggable so datatypes can write out other properties as well
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/AbstractNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/AbstractNodeHandler.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/AbstractNodeHandler.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -126,7 +126,7 @@
}
}
- protected DroolsAction extractAction(Element xmlNode) {
+ public static DroolsAction extractAction(Element xmlNode) {
String actionType = xmlNode.getAttribute("type");
if ("expression".equals(actionType)) {
String consequence = xmlNode.getTextContent();
@@ -175,7 +175,7 @@
}
}
- protected void writeAction(final DroolsAction action, final StringBuffer xmlDump) {
+ public static void writeAction(final DroolsAction action, final StringBuffer xmlDump) {
if (action instanceof DroolsConsequenceAction) {
DroolsConsequenceAction consequenceAction = (DroolsConsequenceAction) action;
xmlDump.append(" <action type=\"expression\" ");
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/CompositeNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/CompositeNodeHandler.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/CompositeNodeHandler.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -4,6 +4,7 @@
import java.util.List;
import java.util.Map;
+import org.drools.process.core.context.exception.ExceptionScope;
import org.drools.process.core.context.variable.Variable;
import org.drools.process.core.context.variable.VariableScope;
import org.drools.workflow.core.Connection;
@@ -23,7 +24,7 @@
return result;
}
- public Class generateNodeFor() {
+ public Class<?> generateNodeFor() {
return CompositeNode.class;
}
@@ -37,10 +38,18 @@
writeAttributes(compositeNode, xmlDump, includeMeta);
xmlDump.append(">" + EOL);
if (compositeNode instanceof CompositeContextNode) {
- List<Variable> variables = ((VariableScope)
- ((CompositeContextNode) compositeNode)
- .getDefaultContext(VariableScope.VARIABLE_SCOPE)).getVariables();
- XmlWorkflowProcessDumper.visitVariables(variables, xmlDump);
+ VariableScope variableScope = (VariableScope)
+ ((CompositeContextNode) compositeNode).getDefaultContext(VariableScope.VARIABLE_SCOPE);
+ if (variableScope != null) {
+ List<Variable> variables = variableScope.getVariables();
+ XmlWorkflowProcessDumper.visitVariables(variables, xmlDump);
+ }
+ ExceptionScope exceptionScope = (ExceptionScope)
+ ((CompositeContextNode) compositeNode).getDefaultContext(ExceptionScope.EXCEPTION_SCOPE);
+ if (exceptionScope != null) {
+ XmlWorkflowProcessDumper.visitExceptionHandlers(
+ exceptionScope.getExceptionHandlers(), xmlDump);
+ }
}
List<Node> subNodes = getSubNodes(compositeNode);
xmlDump.append(" <nodes>" + EOL);
Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/ExceptionHandlerHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/ExceptionHandlerHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/ExceptionHandlerHandler.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -0,0 +1,87 @@
+package org.drools.xml.processes;
+
+import java.util.HashSet;
+
+import org.drools.process.core.ContextContainer;
+import org.drools.process.core.Process;
+import org.drools.process.core.context.exception.ActionExceptionHandler;
+import org.drools.process.core.context.exception.ExceptionHandler;
+import org.drools.process.core.context.exception.ExceptionScope;
+import org.drools.workflow.core.DroolsAction;
+import org.drools.xml.BaseAbstractHandler;
+import org.drools.xml.ExtensibleXmlParser;
+import org.drools.xml.Handler;
+import org.w3c.dom.Element;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+public class ExceptionHandlerHandler extends BaseAbstractHandler implements Handler {
+
+ public ExceptionHandlerHandler() {
+ if ((this.validParents == null) && (this.validPeers == null)) {
+ this.validParents = new HashSet<Class<?>>();
+ this.validParents.add(Process.class);
+
+ this.validPeers = new HashSet<Class<?>>();
+ this.validPeers.add(null);
+
+ this.allowNesting = false;
+ }
+ }
+
+ public Object start(final String uri, final String localName,
+ final Attributes attrs, final ExtensibleXmlParser parser)
+ throws SAXException {
+ parser.startElementBuilder(localName, attrs);
+ return null;
+ }
+
+ public Object end(final String uri, final String localName,
+ final ExtensibleXmlParser parser) throws SAXException {
+ final Element element = parser.endElementBuilder();
+ ContextContainer contextContainer = (ContextContainer) parser.getParent();
+
+ final String type = element.getAttribute("type");
+ emptyAttributeCheck(localName, "type", type, parser);
+
+ final String faultName = element.getAttribute("faultName");
+ emptyAttributeCheck(localName, "faultName", type, parser);
+
+ final String faultVariable = element.getAttribute("faultVariable");
+
+ ExceptionHandler exceptionHandler = null;
+ if ("action".equals(type)) {
+ exceptionHandler = new ActionExceptionHandler();
+ org.w3c.dom.Node xmlNode = element.getFirstChild();
+ if (xmlNode instanceof Element) {
+ Element actionXml = (Element) xmlNode;
+ DroolsAction action = ActionNodeHandler.extractAction(actionXml);
+ ((ActionExceptionHandler) exceptionHandler).setAction(action);
+ }
+ } else {
+ throw new SAXParseException("Unknown exception handler type " + type, parser.getLocator());
+ }
+
+ if (faultVariable != null && faultVariable.length() > 0) {
+ exceptionHandler.setFaultVariable(faultVariable);
+ }
+
+ ExceptionScope exceptionScope = (ExceptionScope)
+ contextContainer.getDefaultContext(ExceptionScope.EXCEPTION_SCOPE);
+ if (exceptionScope == null) {
+ exceptionScope = new ExceptionScope();
+ contextContainer.addContext(exceptionScope);
+ contextContainer.setDefaultContext(exceptionScope);
+ }
+
+ exceptionScope.setExceptionHandler(faultName, exceptionHandler);
+
+ return null;
+ }
+
+ public Class<?> generateNodeFor() {
+ return null;
+ }
+
+}
Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/FaultNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/FaultNodeHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/FaultNodeHandler.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -0,0 +1,48 @@
+package org.drools.xml.processes;
+
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.node.FaultNode;
+import org.drools.xml.ExtensibleXmlParser;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
+
+public class FaultNodeHandler extends AbstractNodeHandler {
+
+ protected Node createNode() {
+ return new FaultNode();
+ }
+
+ public void handleNode(final Node node, final Element element, final String uri,
+ final String localName, final ExtensibleXmlParser parser)
+ throws SAXException {
+ super.handleNode(node, element, uri, localName, parser);
+ FaultNode faultNode = (FaultNode) node;
+ String faultName = element.getAttribute("faultName");
+ if (faultName != null && faultName.length() != 0 ) {
+ faultNode.setFaultName(faultName);
+ }
+ String faultVariable = element.getAttribute("faultVariable");
+ if (faultVariable != null && !"".equals(faultVariable) ) {
+ faultNode.setFaultVariable(faultVariable);
+ }
+ }
+
+ public Class generateNodeFor() {
+ return FaultNode.class;
+ }
+
+ public void writeNode(Node node, StringBuffer xmlDump, boolean includeMeta) {
+ FaultNode faultNode = (FaultNode) node;
+ writeNode("fault", faultNode, xmlDump, includeMeta);
+ String faultName = faultNode.getFaultName();
+ if (faultName != null && faultName.length() != 0) {
+ xmlDump.append("faultName=\"" + faultName + "\" ");
+ }
+ String faultVariable = faultNode.getFaultVariable();
+ if (faultVariable != null && faultVariable.length() != 0) {
+ xmlDump.append("faultVariable=\"" + faultVariable + "\" ");
+ }
+ endNode(xmlDump);
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-4.0.xsd
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-4.0.xsd 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-4.0.xsd 2008-09-15 13:20:33 UTC (rev 22778)
@@ -22,6 +22,7 @@
<xs:element ref="drools:globals"/>
<xs:element ref="drools:variables"/>
<xs:element ref="drools:swimlanes"/>
+ <xs:element ref="drools:exceptionHandlers"/>
</xs:choice>
</xs:complexType>
</xs:element>
@@ -91,6 +92,23 @@
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
+ <xs:element name="exceptionHandlers">
+ <xs:complexType>
+ <xs:sequence minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="drools:exceptionHandler"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="exceptionHandler">
+ <xs:complexType>
+ <xs:sequence minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="drools:action"/>
+ </xs:sequence>
+ <xs:attribute name="faultName" type="xs:string" use="required"/>
+ <xs:attribute name="type" type="xs:string" use="required"/>
+ <xs:attribute name="faultVariable" type="xs:string"/>
+ </xs:complexType>
+ </xs:element>
<xs:element name="nodes">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
@@ -108,6 +126,7 @@
<xs:element ref="drools:composite"/>
<xs:element ref="drools:forEach"/>
<xs:element ref="drools:eventNode"/>
+ <xs:element ref="drools:fault"/>
</xs:choice>
</xs:complexType>
</xs:element>
@@ -330,6 +349,7 @@
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="drools:variables"/>
+ <xs:element ref="drools:exceptionHandlers"/>
<xs:element ref="drools:nodes"/>
<xs:element ref="drools:connections"/>
<xs:element ref="drools:in-ports"/>
@@ -417,6 +437,18 @@
<xs:attribute name="eventType" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
+ <xs:element name="fault">
+ <xs:complexType>
+ <xs:attribute name="id" type="xs:string" use="required"/>
+ <xs:attribute name="name" type="xs:string"/>
+ <xs:attribute name="x" type="xs:string"/>
+ <xs:attribute name="y" type="xs:string"/>
+ <xs:attribute name="width" type="xs:string"/>
+ <xs:attribute name="height" type="xs:string"/>
+ <xs:attribute name="faultName" type="xs:string"/>
+ <xs:attribute name="faultVariable" type="xs:string"/>
+ </xs:complexType>
+ </xs:element>
<xs:element name="connections">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessExceptionHandlerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessExceptionHandlerTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessExceptionHandlerTest.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -0,0 +1,306 @@
+package org.drools.integrationtests;
+
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.WorkingMemory;
+import org.drools.compiler.DroolsError;
+import org.drools.compiler.PackageBuilder;
+import org.drools.compiler.PackageBuilderErrors;
+import org.drools.process.instance.ProcessInstance;
+import org.drools.rule.Package;
+
+public class ProcessExceptionHandlerTest extends TestCase {
+
+ public void testFaultWithoutHandler() {
+ PackageBuilder builder = new PackageBuilder();
+ Reader source = new StringReader(
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+ "<process xmlns=\"http://drools.org/drools-4.0/process\"\n" +
+ " xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
+ " xs:schemaLocation=\"http://drools.org/drools-4.0/process drools-processes-4.0.xsd\"\n" +
+ " type=\"RuleFlow\" name=\"flow\" id=\"org.drools.exception\" package-name=\"org.drools\" version=\"1\" >\n" +
+ "\n" +
+ " <header>\n" +
+ " </header>\n" +
+ "\n" +
+ " <nodes>\n" +
+ " <start id=\"1\" name=\"Start\" />\n" +
+ " <fault id=\"2\" name=\"Fault\" faultName=\"myFault\" />\n" +
+ " </nodes>\n" +
+ "\n" +
+ " <connections>\n" +
+ " <connection from=\"1\" to=\"2\" />\n" +
+ " </connections>\n" +
+ "\n" +
+ "</process>");
+ builder.addRuleFlow(source);
+ Package pkg = builder.getPackage();
+ PackageBuilderErrors errors = builder.getErrors();
+ if (errors != null && !errors.isEmpty()) {
+ for (DroolsError error: errors.getErrors()) {
+ System.err.println(error);
+ }
+ fail("Package could not be compiled");
+ }
+ RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ ruleBase.addPackage( pkg );
+ WorkingMemory workingMemory = ruleBase.newStatefulSession();
+ ProcessInstance processInstance =
+ workingMemory.startProcess("org.drools.exception");
+ assertEquals(ProcessInstance.STATE_ABORTED, processInstance.getState());
+ }
+
+ public void testProcessExceptionHandlerAction() {
+ PackageBuilder builder = new PackageBuilder();
+ Reader source = new StringReader(
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+ "<process xmlns=\"http://drools.org/drools-4.0/process\"\n" +
+ " xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
+ " xs:schemaLocation=\"http://drools.org/drools-4.0/process drools-processes-4.0.xsd\"\n" +
+ " type=\"RuleFlow\" name=\"flow\" id=\"org.drools.exception\" package-name=\"org.drools\" version=\"1\" >\n" +
+ "\n" +
+ " <header>\n" +
+ " <globals>\n" +
+ " <global identifier=\"list\" type=\"java.util.List\" />\n" +
+ " </globals>\n" +
+ " <variables>\n" +
+ " <variable name=\"SomeVar\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " <value>SomeValue</value>\n" +
+ " </variable>\n" +
+ " <variable name=\"faultVar\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " </variable>\n" +
+ " </variables>\n" +
+ " <exceptionHandlers>\n" +
+ " <exceptionHandler faultName=\"myFault\" type=\"action\" faultVariable=\"faultVar\" >\n" +
+ " <action type=\"expression\" name=\"Print\" dialect=\"java\" >list.add(context.getVariable(\"faultVar\"));</action>\n" +
+ " </exceptionHandler>\n" +
+ " </exceptionHandlers>\n" +
+ " </header>\n" +
+ "\n" +
+ " <nodes>\n" +
+ " <start id=\"1\" name=\"Start\" />\n" +
+ " <fault id=\"2\" name=\"Fault\" faultName=\"myFault\" faultVariable=\"SomeVar\" />\n" +
+ " </nodes>\n" +
+ "\n" +
+ " <connections>\n" +
+ " <connection from=\"1\" to=\"2\" />\n" +
+ " </connections>\n" +
+ "\n" +
+ "</process>");
+ builder.addRuleFlow(source);
+ Package pkg = builder.getPackage();
+ RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ ruleBase.addPackage( pkg );
+ WorkingMemory workingMemory = ruleBase.newStatefulSession();
+ List<String> list = new ArrayList<String>();
+ workingMemory.setGlobal("list", list);
+ ProcessInstance processInstance =
+ workingMemory.startProcess("org.drools.exception");
+ assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
+ assertEquals(1, list.size());
+ assertEquals("SomeValue", list.get(0));
+ }
+
+ public void testProcessExceptionHandlerTriggerNode() {
+ PackageBuilder builder = new PackageBuilder();
+ Reader source = new StringReader(
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+ "<process xmlns=\"http://drools.org/drools-4.0/process\"\n" +
+ " xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
+ " xs:schemaLocation=\"http://drools.org/drools-4.0/process drools-processes-4.0.xsd\"\n" +
+ " type=\"RuleFlow\" name=\"flow\" id=\"org.drools.exception\" package-name=\"org.drools\" version=\"1\" >\n" +
+ "\n" +
+ " <header>\n" +
+ " <globals>\n" +
+ " <global identifier=\"list\" type=\"java.util.List\" />\n" +
+ " </globals>\n" +
+ " <exceptionHandlers>\n" +
+ " <exceptionHandler faultName=\"myFault\" type=\"action\" >\n" +
+ " <action type=\"expression\" name=\"Complete\" dialect=\"java\" >context.getProcessInstance().setState(org.drools.process.instance.ProcessInstance.STATE_COMPLETED);</action>\n" +
+ " </exceptionHandler>\n" +
+ " </exceptionHandlers>\n" +
+ " </header>\n" +
+ "\n" +
+ " <nodes>\n" +
+ " <start id=\"1\" name=\"Start\" />\n" +
+ " <fault id=\"2\" name=\"Fault\" faultName=\"myFault\" />\n" +
+ " </nodes>\n" +
+ "\n" +
+ " <connections>\n" +
+ " <connection from=\"1\" to=\"2\" />\n" +
+ " </connections>\n" +
+ "\n" +
+ "</process>");
+ builder.addRuleFlow(source);
+ Package pkg = builder.getPackage();
+ RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ ruleBase.addPackage( pkg );
+ WorkingMemory workingMemory = ruleBase.newStatefulSession();
+ ProcessInstance processInstance =
+ workingMemory.startProcess("org.drools.exception");
+ assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+ }
+
+ public void testCompositeNodeExceptionHandlerTriggerNode() {
+ PackageBuilder builder = new PackageBuilder();
+ Reader source = new StringReader(
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+ "<process xmlns=\"http://drools.org/drools-4.0/process\"\n" +
+ " xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
+ " xs:schemaLocation=\"http://drools.org/drools-4.0/process drools-processes-4.0.xsd\"\n" +
+ " type=\"RuleFlow\" name=\"flow\" id=\"org.drools.exception\" package-name=\"org.drools\" version=\"1\" >\n" +
+ "\n" +
+ " <header>\n" +
+ " <globals>\n" +
+ " <global identifier=\"list\" type=\"java.util.List\" />\n" +
+ " </globals>\n" +
+ " </header>\n" +
+ "\n" +
+ " <nodes>\n" +
+ " <start id=\"1\" name=\"Start\" />\n" +
+ " <composite id=\"2\" name=\"Composite\" >\n" +
+ " <variables>\n" +
+ " <variable name=\"SomeVar\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " <value>SomeValue</value>\n" +
+ " </variable>\n" +
+ " <variable name=\"FaultVariable\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " </variable>\n" +
+ " </variables>\n" +
+ " <exceptionHandlers>\n" +
+ " <exceptionHandler faultName=\"MyFault\" type=\"action\" faultVariable=\"FaultVariable\" >\n" +
+ " <action type=\"expression\" name=\"Trigger\" dialect=\"java\" >context.getProcessInstance().signalEvent(\"MyEvent\", null);</action>\n" +
+ " </exceptionHandler>\n" +
+ " </exceptionHandlers>\n" +
+ " <nodes>\n" +
+ " <fault id=\"1\" name=\"Fault\" faultName=\"MyFault\" faultVariable=\"SomeVar\" />\n" +
+ " <eventNode id=\"2\" name=\"Event\" >\n" +
+ " <eventFilters>\n" +
+ " <eventFilter type=\"eventType\" eventType=\"MyEvent\" />\n" +
+ " </eventFilters>\n" +
+ " </eventNode>\n" +
+ " <actionNode id=\"3\" name=\"Action\" >\n" +
+ " <action type=\"expression\" dialect=\"java\" >list.add(context.getVariable(\"FaultVariable\"));</action>\n" +
+ " </actionNode>\n" +
+ " </nodes>\n" +
+ " <connections>\n" +
+ " <connection from=\"2\" to=\"3\" />\n" +
+ " </connections>\n" +
+ " <in-ports>\n" +
+ " <in-port type=\"DROOLS_DEFAULT\" nodeId=\"1\" nodeInType=\"DROOLS_DEFAULT\" />\n" +
+ " </in-ports>\n" +
+ " <out-ports>\n" +
+ " <out-port type=\"DROOLS_DEFAULT\" nodeId=\"3\" nodeOutType=\"DROOLS_DEFAULT\" />\n" +
+ " </out-ports>\n" +
+ " </composite>\n" +
+ " <end id=\"3\" name=\"End\" />" +
+ " </nodes>\n" +
+ "\n" +
+ " <connections>\n" +
+ " <connection from=\"1\" to=\"2\" />\n" +
+ " <connection from=\"2\" to=\"3\" />\n" +
+ " </connections>\n" +
+ "\n" +
+ "</process>");
+
+ builder.addRuleFlow(source);
+ Package pkg = builder.getPackage();
+ RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ ruleBase.addPackage( pkg );
+ WorkingMemory workingMemory = ruleBase.newStatefulSession();
+ List<String> list = new ArrayList<String>();
+ workingMemory.setGlobal("list", list);
+ ProcessInstance processInstance =
+ workingMemory.startProcess("org.drools.exception");
+ assertEquals(1, list.size());
+ assertEquals("SomeValue", list.get(0));
+ assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+ }
+
+ public void testNestedExceptionHandler() {
+ PackageBuilder builder = new PackageBuilder();
+ Reader source = new StringReader(
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+ "<process xmlns=\"http://drools.org/drools-4.0/process\"\n" +
+ " xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
+ " xs:schemaLocation=\"http://drools.org/drools-4.0/process drools-processes-4.0.xsd\"\n" +
+ " type=\"RuleFlow\" name=\"flow\" id=\"org.drools.exception\" package-name=\"org.drools\" version=\"1\" >\n" +
+ "\n" +
+ " <header>\n" +
+ " <globals>\n" +
+ " <global identifier=\"list\" type=\"java.util.List\" />\n" +
+ " </globals>\n" +
+ " <exceptionHandlers>\n" +
+ " <exceptionHandler faultName=\"otherFault\" type=\"action\" >\n" +
+ " <action type=\"expression\" name=\"Print\" dialect=\"java\" >list.add(\"Triggered global exception scope\");</action>\n" +
+ " </exceptionHandler>\n" +
+ " </exceptionHandlers>\n" +
+ " </header>\n" +
+ "\n" +
+ " <nodes>\n" +
+ " <start id=\"1\" name=\"Start\" />\n" +
+ " <composite id=\"2\" name=\"Composite\" >\n" +
+ " <variables>\n" +
+ " <variable name=\"SomeVar\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " <value>SomeValue</value>\n" +
+ " </variable>\n" +
+ " <variable name=\"FaultVariable\" >\n" +
+ " <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
+ " </variable>\n" +
+ " </variables>\n" +
+ " <exceptionHandlers>\n" +
+ " <exceptionHandler faultName=\"MyFault\" type=\"action\" faultVariable=\"FaultVariable\" >\n" +
+ " <action type=\"expression\" name=\"Trigger\" dialect=\"java\" >((org.drools.workflow.instance.node.CompositeNodeInstance) context.getNodeInstance()).signalEvent(\"MyEvent\", null);</action>\n" +
+ " </exceptionHandler>\n" +
+ " </exceptionHandlers>\n" +
+ " <nodes>\n" +
+ " <fault id=\"1\" name=\"Fault\" faultName=\"MyFault\" faultVariable=\"SomeVar\" />\n" +
+ " <eventNode id=\"2\" name=\"Event\" >\n" +
+ " <eventFilters>\n" +
+ " <eventFilter type=\"eventType\" eventType=\"MyEvent\" />\n" +
+ " </eventFilters>\n" +
+ " </eventNode>\n" +
+ " <fault id=\"3\" name=\"Fault\" faultName=\"otherFault\" />\n" +
+ " </nodes>\n" +
+ " <connections>\n" +
+ " <connection from=\"2\" to=\"3\" />\n" +
+ " </connections>\n" +
+ " <in-ports>\n" +
+ " <in-port type=\"DROOLS_DEFAULT\" nodeId=\"1\" nodeInType=\"DROOLS_DEFAULT\" />\n" +
+ " </in-ports>\n" +
+ " </composite>\n" +
+ " <end id=\"3\" name=\"End\" />" +
+ " </nodes>\n" +
+ "\n" +
+ " <connections>\n" +
+ " <connection from=\"1\" to=\"2\" />\n" +
+ " <connection from=\"2\" to=\"3\" />\n" +
+ " </connections>\n" +
+ "\n" +
+ "</process>");
+
+ builder.addRuleFlow(source);
+ Package pkg = builder.getPackage();
+ RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ ruleBase.addPackage( pkg );
+ WorkingMemory workingMemory = ruleBase.newStatefulSession();
+ List<String> list = new ArrayList<String>();
+ workingMemory.setGlobal("list", list);
+ ProcessInstance processInstance =
+ workingMemory.startProcess("org.drools.exception");
+ assertEquals(1, list.size());
+ assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/processes/XMLPersistenceTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/processes/XMLPersistenceTest.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/processes/XMLPersistenceTest.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -14,8 +14,11 @@
import org.drools.compiler.PackageBuilderConfiguration;
import org.drools.process.core.ParameterDefinition;
import org.drools.process.core.Work;
+import org.drools.process.core.context.exception.ActionExceptionHandler;
+import org.drools.process.core.context.exception.ExceptionScope;
import org.drools.process.core.context.swimlane.Swimlane;
import org.drools.process.core.context.variable.Variable;
+import org.drools.process.core.context.variable.VariableScope;
import org.drools.process.core.datatype.impl.type.IntegerDataType;
import org.drools.process.core.datatype.impl.type.ListDataType;
import org.drools.process.core.datatype.impl.type.ObjectDataType;
@@ -32,8 +35,10 @@
import org.drools.workflow.core.impl.ConstraintImpl;
import org.drools.workflow.core.impl.DroolsConsequenceAction;
import org.drools.workflow.core.node.ActionNode;
+import org.drools.workflow.core.node.CompositeContextNode;
import org.drools.workflow.core.node.EndNode;
import org.drools.workflow.core.node.EventNode;
+import org.drools.workflow.core.node.FaultNode;
import org.drools.workflow.core.node.ForEachNode;
import org.drools.workflow.core.node.HumanTaskNode;
import org.drools.workflow.core.node.Join;
@@ -70,7 +75,9 @@
process.addNode(new TimerNode());
process.addNode(new HumanTaskNode());
process.addNode(new ForEachNode());
+ process.addNode(new CompositeContextNode());
process.addNode(new EventNode());
+ process.addNode(new FaultNode());
String xml = XmlRuleFlowProcessDumper.INSTANCE.dump(process, false);
if (xml == null) {
@@ -87,7 +94,7 @@
throw new IllegalArgumentException("Failed to reload process!");
}
- assertEquals(13, process.getNodes().length);
+ assertEquals(15, process.getNodes().length);
// System.out.println("************************************");
@@ -141,7 +148,7 @@
variable.setValue(person);
variables.add(variable);
variable = new Variable();
- variable.setName("variable3");
+ variable.setName("variable4");
ListDataType listDataType = new ListDataType();
listDataType.setType(new ObjectDataType("java.lang.Integer"));
variable.setType(listDataType);
@@ -159,6 +166,17 @@
swimlane.setName("actor2");
process.getSwimlaneContext().addSwimlane(swimlane);
+ ActionExceptionHandler exceptionHandler = new ActionExceptionHandler();
+ exceptionHandler.setFaultVariable("faultVariable");
+ DroolsConsequenceAction action = new DroolsConsequenceAction("dialect", "consequence");
+ exceptionHandler.setAction(action);
+ process.getExceptionScope().setExceptionHandler("myFault", exceptionHandler);
+ exceptionHandler = new ActionExceptionHandler();
+ exceptionHandler.setFaultVariable("faultVariable2");
+ action = new DroolsConsequenceAction("dialect2", "consequence2");
+ exceptionHandler.setAction(action);
+ process.getExceptionScope().setExceptionHandler("myFault2", exceptionHandler);
+
StartNode startNode = new StartNode();
startNode.setName("start");
startNode.setMetaData("x", 1);
@@ -173,7 +191,7 @@
actionNode.setMetaData("y", 2);
actionNode.setMetaData("width", 3);
actionNode.setMetaData("height", 4);
- DroolsConsequenceAction action = new DroolsConsequenceAction("dialect", "consequence");
+ action = new DroolsConsequenceAction("dialect", "consequence");
actionNode.setAction(action);
process.addNode(actionNode);
@@ -186,6 +204,16 @@
ruleSetNode.setRuleFlowGroup("ruleFlowGroup");
process.addNode(ruleSetNode);
+ FaultNode faultNode = new FaultNode();
+ faultNode.setName("action");
+ faultNode.setMetaData("x", 1);
+ faultNode.setMetaData("y", 2);
+ faultNode.setMetaData("width", 3);
+ faultNode.setMetaData("height", 4);
+ faultNode.setFaultName("faultName");
+ faultNode.setFaultVariable("faultVariable");
+ process.addNode(faultNode);
+
Split split = new Split();
split.setName("split");
split.setMetaData("x", 1);
@@ -263,6 +291,7 @@
connection.setMetaData("bendpoints", "[10,10]");
WorkItemNode workItemNode = new WorkItemNode();
+ workItemNode.setName("WorkItem");
Work work = new WorkImpl();
work.setName("workname");
Set<ParameterDefinition> parameterDefinitions = new HashSet<ParameterDefinition>();
@@ -282,6 +311,7 @@
connection.setMetaData("bendpoints", "[]");
HumanTaskNode humanTaskNode = new HumanTaskNode();
+ humanTaskNode.setName("Human Task");
work = humanTaskNode.getWork();
parameterDefinitions = new HashSet<ParameterDefinition>();
parameterDefinition = new ParameterDefinitionImpl("TaskName", new StringDataType());
@@ -313,6 +343,7 @@
new ConnectionImpl(humanTaskNode, Node.CONNECTION_DEFAULT_TYPE, timerNode, Node.CONNECTION_DEFAULT_TYPE);
ForEachNode forEachNode = new ForEachNode();
+ forEachNode.setName("ForEach");
forEachNode.setCollectionExpression("collection");
forEachNode.setVariable("variableName", new ObjectDataType());
forEachNode.setWaitForCompletion(false);
@@ -326,6 +357,35 @@
process.addNode(forEachNode);
new ConnectionImpl(timerNode, Node.CONNECTION_DEFAULT_TYPE, forEachNode, Node.CONNECTION_DEFAULT_TYPE);
+ CompositeContextNode compositeNode = new CompositeContextNode();
+ compositeNode.setName("Composite");
+ VariableScope variableScope = new VariableScope();
+ compositeNode.addContext(variableScope);
+ compositeNode.setDefaultContext(variableScope);
+ variableScope.setVariables(variables);
+ ExceptionScope exceptionScope = new ExceptionScope();
+ compositeNode.addContext(exceptionScope);
+ compositeNode.setDefaultContext(exceptionScope);
+ exceptionHandler = new ActionExceptionHandler();
+ exceptionHandler.setFaultVariable("faultVariable");
+ action = new DroolsConsequenceAction("dialect", "consequence");
+ exceptionHandler.setAction(action);
+ exceptionScope.setExceptionHandler("MyFault", exceptionHandler);
+ exceptionHandler = new ActionExceptionHandler();
+ exceptionHandler.setFaultVariable("faultVariable2");
+ action = new DroolsConsequenceAction("dialect2", "consequence2");
+ exceptionHandler.setAction(action);
+ exceptionScope.setExceptionHandler("MyFault2", exceptionHandler);
+ subActionNode1 = new ActionNode();
+ compositeNode.addNode(subActionNode1);
+ subActionNode2 = new ActionNode();
+ compositeNode.addNode(subActionNode2);
+ new ConnectionImpl(subActionNode1, Node.CONNECTION_DEFAULT_TYPE, subActionNode2, Node.CONNECTION_DEFAULT_TYPE);
+ compositeNode.linkIncomingConnections(Node.CONNECTION_DEFAULT_TYPE, subActionNode1.getId(), Node.CONNECTION_DEFAULT_TYPE);
+ compositeNode.linkOutgoingConnections(subActionNode2.getId(), Node.CONNECTION_DEFAULT_TYPE, Node.CONNECTION_DEFAULT_TYPE);
+ process.addNode(compositeNode);
+ new ConnectionImpl(forEachNode, Node.CONNECTION_DEFAULT_TYPE, compositeNode, Node.CONNECTION_DEFAULT_TYPE);
+
EndNode endNode = new EndNode();
endNode.setName("end");
endNode.setTerminate(false);
@@ -334,7 +394,7 @@
endNode.setMetaData("width", 3);
endNode.setMetaData("height", 4);
process.addNode(endNode);
- new ConnectionImpl(forEachNode, Node.CONNECTION_DEFAULT_TYPE, endNode, Node.CONNECTION_DEFAULT_TYPE);
+ new ConnectionImpl(compositeNode, Node.CONNECTION_DEFAULT_TYPE, endNode, Node.CONNECTION_DEFAULT_TYPE);
String xml = XmlRuleFlowProcessDumper.INSTANCE.dump(process, true);
if (xml == null) {
@@ -350,8 +410,14 @@
throw new IllegalArgumentException("Failed to reload process!");
}
- assertEquals(13, process.getNodes().length);
+ assertEquals(15, process.getNodes().length);
+ assertEquals(2, process.getImports().size());
+ assertEquals(2, process.getGlobals().size());
+ assertEquals(4, process.getVariableScope().getVariables().size());
+ assertEquals(2, process.getSwimlaneContext().getSwimlanes().size());
+ assertEquals(2, process.getExceptionScope().getExceptionHandlers().size());
+
// System.out.println("************************************");
String xml2 = XmlRuleFlowProcessDumper.INSTANCE.dump(process, true);
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/context/exception/ActionExceptionHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/context/exception/ActionExceptionHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/context/exception/ActionExceptionHandler.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -0,0 +1,32 @@
+package org.drools.process.core.context.exception;
+
+import org.drools.workflow.core.DroolsAction;
+
+public class ActionExceptionHandler implements ExceptionHandler {
+
+ private static final long serialVersionUID = 400L;
+
+ private String faultVariable;
+ private DroolsAction action;
+
+ public String getFaultVariable() {
+ return faultVariable;
+ }
+
+ public void setFaultVariable(String faultVariable) {
+ this.faultVariable = faultVariable;
+ }
+
+ public DroolsAction getAction() {
+ return action;
+ }
+
+ public void setAction(DroolsAction action) {
+ this.action = action;
+ }
+
+ public String toString() {
+ return action == null ? "" : action.toString();
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/context/exception/ExceptionHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/context/exception/ExceptionHandler.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/context/exception/ExceptionHandler.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -1,5 +1,9 @@
package org.drools.process.core.context.exception;
public interface ExceptionHandler {
+
+ String getFaultVariable();
+
+ void setFaultVariable(String faultVariable);
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/context/exception/ExceptionScope.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/context/exception/ExceptionScope.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/context/exception/ExceptionScope.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -37,6 +37,13 @@
public Map<String, ExceptionHandler> getExceptionHandlers() {
return exceptionHandlers;
}
+
+ public void setExceptionHandlers(Map<String, ExceptionHandler> exceptionHandlers) {
+ if (exceptionHandlers == null) {
+ throw new IllegalArgumentException( "Exception handlers are null" );
+ }
+ this.exceptionHandlers = exceptionHandlers;
+ }
public Context resolveContext(Object param) {
if (param instanceof String) {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/ContextInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/ContextInstance.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/ContextInstance.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -16,4 +16,6 @@
Context getContext();
+ ProcessInstance getProcessInstance();
+
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/context/AbstractContextInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/context/AbstractContextInstance.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/context/AbstractContextInstance.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -5,11 +5,13 @@
import org.drools.process.core.Context;
import org.drools.process.instance.ContextInstance;
import org.drools.process.instance.ContextInstanceContainer;
+import org.drools.process.instance.ProcessInstance;
public abstract class AbstractContextInstance implements ContextInstance, Serializable {
private long contextId;
private ContextInstanceContainer contextInstanceContainer;
+ private ProcessInstance processInstance;
public long getContextId() {
return contextId;
@@ -30,5 +32,13 @@
public Context getContext() {
return getContextInstanceContainer().getContextContainer().getContext(getContextType(), getContextId());
}
+
+ public ProcessInstance getProcessInstance() {
+ return processInstance;
+ }
+
+ public void setProcessInstance(ProcessInstance processInstance) {
+ this.processInstance = processInstance;
+ }
}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/context/exception/DefaultExceptionScopeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/context/exception/DefaultExceptionScopeInstance.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/context/exception/DefaultExceptionScopeInstance.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -0,0 +1,56 @@
+package org.drools.process.instance.context.exception;
+
+import org.drools.WorkingMemory;
+import org.drools.base.DefaultKnowledgeHelper;
+import org.drools.base.SequentialKnowledgeHelper;
+import org.drools.common.InternalRuleBase;
+import org.drools.process.core.context.exception.ActionExceptionHandler;
+import org.drools.process.core.context.exception.ExceptionHandler;
+import org.drools.process.instance.ContextInstanceContainer;
+import org.drools.process.instance.ProcessInstance;
+import org.drools.spi.Action;
+import org.drools.spi.KnowledgeHelper;
+import org.drools.spi.ProcessContext;
+import org.drools.workflow.instance.NodeInstance;
+
+public class DefaultExceptionScopeInstance extends ExceptionScopeInstance {
+
+ private static final long serialVersionUID = 4L;
+
+ public void handleException(ExceptionHandler handler, String exception, Object params) {
+
+ if (handler instanceof ActionExceptionHandler) {
+ Action action = (Action) ((ActionExceptionHandler) handler).getAction().getMetaData("Action");
+ try {
+ KnowledgeHelper knowledgeHelper = createKnowledgeHelper();
+ ProcessContext context = new ProcessContext();
+ ProcessInstance processInstance = getProcessInstance();
+ ContextInstanceContainer contextInstanceContainer = getContextInstanceContainer();
+ if (contextInstanceContainer instanceof NodeInstance) {
+ context.setNodeInstance((NodeInstance) contextInstanceContainer);
+ } else {
+ context.setProcessInstance(processInstance);
+ }
+ String faultVariable = handler.getFaultVariable();
+ if (faultVariable != null) {
+ context.setVariable(faultVariable, params);
+ }
+ action.execute(knowledgeHelper, processInstance.getWorkingMemory(), context);
+ } catch (Exception e) {
+ throw new RuntimeException("unable to execute Action", e);
+ }
+ } else {
+ throw new IllegalArgumentException("Unknown exception handler " + handler);
+ }
+ }
+
+ private KnowledgeHelper createKnowledgeHelper() {
+ WorkingMemory workingMemory = getProcessInstance().getWorkingMemory();
+ if ( ((InternalRuleBase) workingMemory.getRuleBase()).getConfiguration().isSequential() ) {
+ return new SequentialKnowledgeHelper( workingMemory );
+ } else {
+ return new DefaultKnowledgeHelper( workingMemory );
+ }
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/ContextInstanceFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/ContextInstanceFactory.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/ContextInstanceFactory.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -3,9 +3,10 @@
import org.drools.process.core.Context;
import org.drools.process.instance.ContextInstance;
import org.drools.process.instance.ContextInstanceContainer;
+import org.drools.process.instance.ProcessInstance;
public interface ContextInstanceFactory {
- ContextInstance getContextInstance(Context context, ContextInstanceContainer contextInstanceContainer);
+ ContextInstance getContextInstance(Context context, ContextInstanceContainer contextInstanceContainer, ProcessInstance processInstance);
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/ContextInstanceFactoryRegistry.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/ContextInstanceFactoryRegistry.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/ContextInstanceFactoryRegistry.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -7,7 +7,7 @@
import org.drools.process.core.context.exception.ExceptionScope;
import org.drools.process.core.context.swimlane.SwimlaneContext;
import org.drools.process.core.context.variable.VariableScope;
-import org.drools.process.instance.context.exception.ExceptionScopeInstance;
+import org.drools.process.instance.context.exception.DefaultExceptionScopeInstance;
import org.drools.process.instance.context.swimlane.SwimlaneContextInstance;
import org.drools.process.instance.context.variable.VariableScopeInstance;
import org.drools.process.instance.impl.factory.ReuseContextInstanceFactory;
@@ -26,7 +26,7 @@
register(VariableScope.class, new ReuseContextInstanceFactory(
VariableScopeInstance.class));
register(ExceptionScope.class, new ReuseContextInstanceFactory(
- ExceptionScopeInstance.class));
+ DefaultExceptionScopeInstance.class));
register(SwimlaneContext.class, new ReuseContextInstanceFactory(
SwimlaneContextInstance.class));
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/ProcessInstanceImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/ProcessInstanceImpl.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/ProcessInstanceImpl.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -148,7 +148,7 @@
if (conf == null) {
throw new IllegalArgumentException("Illegal context type (registry not found): " + context.getClass());
}
- ContextInstance contextInstance = (ContextInstance) conf.getContextInstance(context, this);
+ ContextInstance contextInstance = (ContextInstance) conf.getContextInstance(context, this, this);
if (contextInstance == null) {
throw new IllegalArgumentException("Illegal context type (instance not found): " + context.getClass());
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/factory/ReuseContextInstanceFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/factory/ReuseContextInstanceFactory.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/factory/ReuseContextInstanceFactory.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -3,6 +3,7 @@
import org.drools.process.core.Context;
import org.drools.process.instance.ContextInstance;
import org.drools.process.instance.ContextInstanceContainer;
+import org.drools.process.instance.ProcessInstance;
import org.drools.process.instance.context.AbstractContextInstance;
import org.drools.process.instance.impl.ContextInstanceFactory;
@@ -14,7 +15,7 @@
this.cls = cls;
}
- public ContextInstance getContextInstance(Context context, ContextInstanceContainer contextInstanceContainer) {
+ public ContextInstance getContextInstance(Context context, ContextInstanceContainer contextInstanceContainer, ProcessInstance processInstance) {
ContextInstance result = contextInstanceContainer.getContextInstance( context.getType(), context.getId() );
if (result != null) {
return result;
@@ -23,6 +24,7 @@
AbstractContextInstance contextInstance = (AbstractContextInstance) cls.newInstance();
contextInstance.setContextId(context.getId());
contextInstance.setContextInstanceContainer(contextInstanceContainer);
+ contextInstance.setProcessInstance(processInstance);
contextInstanceContainer.addContextInstance(context.getType(), contextInstance);
return contextInstance;
} catch (Exception e) {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/RuleFlowProcess.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/RuleFlowProcess.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/RuleFlowProcess.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -1,5 +1,6 @@
package org.drools.ruleflow.core;
+import org.drools.process.core.context.exception.ExceptionScope;
import org.drools.process.core.context.swimlane.SwimlaneContext;
import org.drools.process.core.context.variable.VariableScope;
import org.drools.workflow.core.Node;
@@ -16,12 +17,16 @@
public RuleFlowProcess() {
setType(RULEFLOW_TYPE);
+ // TODO create contexts on request ?
VariableScope variableScope = new VariableScope();
addContext(variableScope);
setDefaultContext(variableScope);
SwimlaneContext swimLaneContext = new SwimlaneContext();
addContext(swimLaneContext);
setDefaultContext(swimLaneContext);
+ ExceptionScope exceptionScope = new ExceptionScope();
+ addContext(exceptionScope);
+ setDefaultContext(exceptionScope);
}
public VariableScope getVariableScope() {
@@ -32,6 +37,10 @@
return (SwimlaneContext) getDefaultContext(SwimlaneContext.SWIMLANE_SCOPE);
}
+ public ExceptionScope getExceptionScope() {
+ return (ExceptionScope) getDefaultContext(ExceptionScope.EXCEPTION_SCOPE);
+ }
+
protected NodeContainer createNodeContainer() {
return new WorkflowProcessNodeContainer();
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/validation/RuleFlowProcessValidator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/validation/RuleFlowProcessValidator.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/validation/RuleFlowProcessValidator.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -36,6 +36,7 @@
import org.drools.workflow.core.node.CompositeNode;
import org.drools.workflow.core.node.EndNode;
import org.drools.workflow.core.node.EventNode;
+import org.drools.workflow.core.node.FaultNode;
import org.drools.workflow.core.node.ForEachNode;
import org.drools.workflow.core.node.Join;
import org.drools.workflow.core.node.MilestoneNode;
@@ -345,6 +346,17 @@
errors.add(new ProcessValidationErrorImpl(process,
"Event node '" + node.getName() + "' [" + node.getId() + "] has no outgoing connection"));
}
+ } else if (node instanceof FaultNode) {
+ endNodeFound = true;
+ final FaultNode faultNode = (FaultNode) node;
+ if (faultNode.getFrom() == null) {
+ errors.add(new ProcessValidationErrorImpl(process,
+ "Fault node '" + node.getName() + "' [" + node.getId() + "] has no incoming connection."));
+ }
+ if (faultNode.getFaultName() == null) {
+ errors.add(new ProcessValidationErrorImpl(process,
+ "Fault node '" + node.getName() + "' [" + node.getId() + "] has no fault name."));
+ }
}
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ProcessContext.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ProcessContext.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ProcessContext.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -1,13 +1,29 @@
package org.drools.spi;
import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.instance.ProcessInstance;
import org.drools.process.instance.context.variable.VariableScopeInstance;
import org.drools.workflow.instance.NodeInstance;
public class ProcessContext {
+ private ProcessInstance processInstance;
private NodeInstance nodeInstance;
+ public ProcessInstance getProcessInstance() {
+ if (processInstance != null) {
+ return processInstance;
+ }
+ if (nodeInstance != null) {
+ return nodeInstance.getProcessInstance();
+ }
+ return null;
+ }
+
+ public void setProcessInstance(ProcessInstance processInstance) {
+ this.processInstance = processInstance;
+ }
+
public NodeInstance getNodeInstance() {
return nodeInstance;
}
@@ -17,17 +33,31 @@
}
public Object getVariable(String variableName) {
- VariableScopeInstance variableScope = (VariableScopeInstance) nodeInstance.resolveContextInstance(VariableScope.VARIABLE_SCOPE, variableName);
+ VariableScopeInstance variableScope = null;
+ if (nodeInstance != null) {
+ variableScope = (VariableScopeInstance) nodeInstance.resolveContextInstance(VariableScope.VARIABLE_SCOPE, variableName);
+ }
if (variableScope == null) {
- return ((VariableScopeInstance) nodeInstance.getProcessInstance()
- .getContextInstance(VariableScope.VARIABLE_SCOPE)).getVariable(variableName);
+ variableScope = (VariableScopeInstance)
+ getProcessInstance().getContextInstance(VariableScope.VARIABLE_SCOPE);
}
return variableScope.getVariable(variableName);
}
public void setVariable(String variableName, Object value) {
- VariableScopeInstance variableScope = (VariableScopeInstance) nodeInstance.resolveContextInstance(VariableScope.VARIABLE_SCOPE, variableName);
+ VariableScopeInstance variableScope = null;
+ if (nodeInstance != null) {
+ variableScope = (VariableScopeInstance)
+ nodeInstance.resolveContextInstance(VariableScope.VARIABLE_SCOPE, variableName);
+ }
if (variableScope == null) {
+ variableScope = (VariableScopeInstance)
+ getProcessInstance().getContextInstance(VariableScope.VARIABLE_SCOPE);
+ if (variableScope.getVariableScope().findVariable(variableName) == null) {
+ variableScope = null;
+ }
+ }
+ if (variableScope == null) {
System.err.println("Could not find variable " + variableName);
System.err.println("Continuing without setting value");
return;
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/DroolsConsequenceAction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/DroolsConsequenceAction.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/DroolsConsequenceAction.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -4,7 +4,6 @@
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.io.Serializable;
-import java.util.Map;
import org.drools.workflow.core.DroolsAction;
@@ -16,13 +15,17 @@
private String consequence;
public DroolsConsequenceAction() {
-
}
-
+
+ public DroolsConsequenceAction(String dialect, String consequence) {
+ this.dialect = dialect;
+ this.consequence = consequence;
+ }
+
public void writeExternal(ObjectOutput out) throws IOException {
super.writeExternal( out );
out.writeObject( dialect );
- out.writeObject( consequence );
+ out.writeObject( consequence );
}
public void readExternal(ObjectInput in) throws IOException,
@@ -31,12 +34,7 @@
dialect = (String) in.readObject();
consequence = (String) in.readObject();
}
-
- public DroolsConsequenceAction(String dialect, String consequence) {
- this.dialect = dialect;
- this.consequence = consequence;
- }
-
+
public void setConsequence(String consequence) {
this.consequence = consequence;
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/FaultNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/FaultNode.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/FaultNode.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -1,6 +1,8 @@
package org.drools.workflow.core.node;
+import org.drools.workflow.core.Connection;
+
/*
* Copyright 2005 JBoss Inc
*
@@ -45,5 +47,10 @@
public void setFaultName(String faultName) {
this.faultName = faultName;
}
+
+ public void validateAddOutgoingConnection(final String type, final Connection connection) {
+ throw new UnsupportedOperationException(
+ "A fault node does not have an outgoing connection!");
+ }
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/context/WorkflowReuseContextInstanceFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/context/WorkflowReuseContextInstanceFactory.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/context/WorkflowReuseContextInstanceFactory.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -3,6 +3,7 @@
import org.drools.process.core.Context;
import org.drools.process.instance.ContextInstance;
import org.drools.process.instance.ContextInstanceContainer;
+import org.drools.process.instance.ProcessInstance;
import org.drools.process.instance.context.AbstractContextInstance;
import org.drools.process.instance.impl.ContextInstanceFactory;
import org.drools.workflow.instance.NodeInstanceContainer;
@@ -15,7 +16,7 @@
this.cls = cls;
}
- public ContextInstance getContextInstance(Context context, ContextInstanceContainer contextInstanceContainer) {
+ public ContextInstance getContextInstance(Context context, ContextInstanceContainer contextInstanceContainer, ProcessInstance processInstance) {
ContextInstance result = contextInstanceContainer.getContextInstance( context.getType(), context.getId() );
if (result != null) {
return result;
@@ -24,6 +25,7 @@
AbstractContextInstance contextInstance = (AbstractContextInstance) cls.newInstance();
contextInstance.setContextId(context.getId());
contextInstance.setContextInstanceContainer(contextInstanceContainer);
+ contextInstance.setProcessInstance(processInstance);
contextInstanceContainer.addContextInstance(context.getType(), contextInstance);
NodeInstanceContainer nodeInstanceContainer = null;
if (contextInstanceContainer instanceof NodeInstanceContainer) {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -106,6 +106,17 @@
return null;
}
+ public List<NodeInstance> getNodeInstances(final long nodeId) {
+ List<NodeInstance> result = new ArrayList<NodeInstance>();
+ for ( final Iterator<NodeInstance> iterator = this.nodeInstances.iterator(); iterator.hasNext(); ) {
+ final NodeInstance nodeInstance = iterator.next();
+ if ( nodeInstance.getNodeId() == nodeId ) {
+ result.add(nodeInstance);
+ }
+ }
+ return result;
+ }
+
public NodeInstance getNodeInstance(final Node node) {
NodeInstanceFactoryRegistry nodeRegistry =
((InternalRuleBase) getWorkingMemory().getRuleBase())
@@ -209,8 +220,15 @@
for (Node node: getWorkflowProcess().getNodes()) {
if (node instanceof EventNodeInterface) {
if (((EventNodeInterface) node).acceptsEvent(type, event)) {
- EventNodeInstanceInterface eventNodeInstance = (EventNodeInstanceInterface) getNodeInstance(node);
- eventNodeInstance.triggerEvent(type, event);
+ List<NodeInstance> nodeInstances = getNodeInstances(node.getId());
+ if (nodeInstances != null && !nodeInstances.isEmpty()) {
+ for (NodeInstance nodeInstance: nodeInstances) {
+ ((EventNodeInstanceInterface) nodeInstance).signalEvent(type, event);
+ }
+ } else {
+ EventNodeInstanceInterface eventNodeInstance = (EventNodeInstanceInterface) getNodeInstance(node);
+ eventNodeInstance.signalEvent(type, event);
+ }
}
}
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeContextNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeContextNodeInstance.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeContextNodeInstance.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -79,7 +79,7 @@
if (conf == null) {
throw new IllegalArgumentException("Illegal context type (registry not found): " + context.getClass());
}
- ContextInstance contextInstance = (ContextInstance) conf.getContextInstance(context, this);
+ ContextInstance contextInstance = (ContextInstance) conf.getContextInstance(context, this, getProcessInstance());
if (contextInstance == null) {
throw new IllegalArgumentException("Illegal context type (instance not found): " + context.getClass());
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeNodeInstance.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/CompositeNodeInstance.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -154,12 +154,12 @@
return nodeInstance;
}
- public void triggerEvent(String type, Object event) {
+ public void signalEvent(String type, Object event) {
for (Node node: getCompositeNode().getNodes()) {
if (node instanceof EventNodeInterface) {
if (((EventNodeInterface) node).acceptsEvent(type, event)) {
EventNodeInstanceInterface eventNodeInstance = (EventNodeInstanceInterface) getNodeInstance(node);
- eventNodeInstance.triggerEvent(type, event);
+ eventNodeInstance.signalEvent(type, event);
}
}
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstance.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstance.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -33,7 +33,7 @@
private static final long serialVersionUID = 400L;
- public void triggerEvent(String type, Object event) {
+ public void signalEvent(String type, Object event) {
String variableName = getEventNode().getVariableName();
if (variableName != null) {
VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstanceInterface.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstanceInterface.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/EventNodeInstanceInterface.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -2,5 +2,6 @@
public interface EventNodeInstanceInterface {
- void triggerEvent(String type, Object event);
+ void signalEvent(String type, Object event);
+
}
Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/icons/fault.gif
===================================================================
(Binary files differ)
Property changes on: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/icons/fault.gif
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/core/ProcessWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/core/ProcessWrapper.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/core/ProcessWrapper.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -25,9 +25,12 @@
import java.util.Map;
import org.drools.eclipse.flow.common.view.property.ListPropertyDescriptor;
+import org.drools.eclipse.flow.ruleflow.view.property.exceptionHandler.ExceptionHandlersPropertyDescriptor;
import org.drools.eclipse.flow.ruleflow.view.property.swimlane.SwimlanesCellEditor;
import org.drools.eclipse.flow.ruleflow.view.property.variable.VariableListCellEditor;
import org.drools.process.core.Process;
+import org.drools.process.core.context.exception.ExceptionHandler;
+import org.drools.process.core.context.exception.ExceptionScope;
import org.drools.process.core.context.swimlane.Swimlane;
import org.drools.process.core.context.swimlane.SwimlaneContext;
import org.drools.process.core.context.variable.Variable;
@@ -44,6 +47,8 @@
*/
public abstract class ProcessWrapper implements ElementContainer, IPropertySource, Serializable {
+ private static final long serialVersionUID = 4L;
+
public static final int CHANGE_ELEMENTS = 1;
public static final int CHANGE_ROUTER_LAYOUT = 2;
@@ -51,8 +56,6 @@
public static final Integer ROUTER_LAYOUT_MANHATTAN = new Integer(1);
public static final Integer ROUTER_LAYOUT_SHORTEST_PATH = new Integer(2);
- protected static IPropertyDescriptor[] descriptors;
-
public static final String NAME = "name";
public static final String VERSION = "version";
public static final String ID = "id";
@@ -60,25 +63,12 @@
public static final String ROUTER_LAYOUT = "routerLayout";
public static final String VARIABLES = "variables";
public static final String SWIMLANES = "swimlanes";
+ public static final String EXCEPTION_HANDLERS = "exceptionHandlers";
- static {
- descriptors = new IPropertyDescriptor[] {
- new TextPropertyDescriptor(NAME, "Name"),
- new TextPropertyDescriptor(VERSION, "Version"),
- new TextPropertyDescriptor(ID, "Id"),
- new TextPropertyDescriptor(PACKAGE_NAME, "Package"),
- new ComboBoxPropertyDescriptor(ROUTER_LAYOUT, "Connection Layout",
- new String[] { "Manual", "Manhatten", "Shortest Path" }),
- new ListPropertyDescriptor(VARIABLES, "Variables",
- VariableListCellEditor.class),
- new ListPropertyDescriptor(SWIMLANES, "Swimlanes",
- SwimlanesCellEditor.class),
- };
- }
-
private Process process;
private Map<String, ElementWrapper> elements = new HashMap<String, ElementWrapper>();
private transient List<ModelListener> listeners = new ArrayList<ModelListener>();
+ protected IPropertyDescriptor[] descriptors;
public ProcessWrapper() {
process = createProcess();
@@ -198,9 +188,28 @@
}
public IPropertyDescriptor[] getPropertyDescriptors() {
+ if (descriptors == null) {
+ initPropertyDescriptors();
+ }
return descriptors;
}
+ public void initPropertyDescriptors() {
+ descriptors = new IPropertyDescriptor[] {
+ new TextPropertyDescriptor(NAME, "Name"),
+ new TextPropertyDescriptor(VERSION, "Version"),
+ new TextPropertyDescriptor(ID, "Id"),
+ new TextPropertyDescriptor(PACKAGE_NAME, "Package"),
+ new ComboBoxPropertyDescriptor(ROUTER_LAYOUT, "Connection Layout",
+ new String[] { "Manual", "Manhatten", "Shortest Path" }),
+ new ListPropertyDescriptor(VARIABLES, "Variables", VariableListCellEditor.class),
+ new ListPropertyDescriptor(SWIMLANES, "Swimlanes",
+ SwimlanesCellEditor.class),
+ new ExceptionHandlersPropertyDescriptor(EXCEPTION_HANDLERS,
+ "Exception Handlers", process),
+ };
+ }
+
public Object getPropertyValue(Object id) {
if (NAME.equals(id)) {
return getName();
@@ -223,6 +232,9 @@
if (SWIMLANES.equals(id)) {
return ((SwimlaneContext) getProcess().getDefaultContext(SwimlaneContext.SWIMLANE_SCOPE)).getSwimlanes();
}
+ if (EXCEPTION_HANDLERS.equals(id)) {
+ return ((ExceptionScope) getProcess().getDefaultContext(ExceptionScope.EXCEPTION_SCOPE)).getExceptionHandlers();
+ }
return null;
}
@@ -254,9 +266,14 @@
((SwimlaneContext) getProcess().getDefaultContext(
SwimlaneContext.SWIMLANE_SCOPE)).setSwimlanes(new ArrayList<Swimlane>());
}
+ if (EXCEPTION_HANDLERS.equals(id)) {
+ ((ExceptionScope) getProcess().getDefaultContext(
+ ExceptionScope.EXCEPTION_SCOPE)).setExceptionHandlers(new HashMap<String, ExceptionHandler>());
+ }
}
- public void setPropertyValue(Object id, Object value) {
+ @SuppressWarnings("unchecked")
+ public void setPropertyValue(Object id, Object value) {
if (NAME.equals(id)) {
setName((String) value);
} else if (VERSION.equals(id)) {
@@ -273,6 +290,9 @@
} else if (SWIMLANES.equals(id)) {
((SwimlaneContext) getProcess().getDefaultContext(
SwimlaneContext.SWIMLANE_SCOPE)).setSwimlanes((List<Swimlane>) value);
- }
+ } else if (EXCEPTION_HANDLERS.equals(id)) {
+ ((ExceptionScope) getProcess().getDefaultContext(
+ ExceptionScope.EXCEPTION_SCOPE)).setExceptionHandlers((Map<String, ExceptionHandler>) value);
+ }
}
}
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/BeanDialogCellEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/BeanDialogCellEditor.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/BeanDialogCellEditor.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -26,15 +26,16 @@
*
* @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
*/
-public abstract class BeanDialogCellEditor extends DialogCellEditor {
+public abstract class BeanDialogCellEditor<T> extends DialogCellEditor {
public BeanDialogCellEditor(Composite parent) {
super(parent);
}
- protected Object openDialogBox(Control cellEditorWindow) {
- EditBeanDialog dialog = createDialog(cellEditorWindow.getShell());
- Object value = getValue();
+ @SuppressWarnings("unchecked")
+ protected Object openDialogBox(Control cellEditorWindow) {
+ EditBeanDialog<T> dialog = createDialog(cellEditorWindow.getShell());
+ T value = (T) getValue();
if (value != null) {
dialog.setValue(value);
}
@@ -45,7 +46,7 @@
return dialog.getValue();
}
- protected abstract EditBeanDialog createDialog(Shell shell);
+ protected abstract EditBeanDialog<T> createDialog(Shell shell);
protected void updateContents(Object value) {
getDefaultLabel().setText(getLabelText(value));
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/EditBeanDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/EditBeanDialog.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/EditBeanDialog.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -25,10 +25,10 @@
*
* @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
*/
-public abstract class EditBeanDialog extends Dialog {
+public abstract class EditBeanDialog<T> extends Dialog {
private String title;
- private Object value;
+ private T value;
protected EditBeanDialog(Shell parentShell, String title) {
super(parentShell);
@@ -45,7 +45,7 @@
return new Point(400, 200);
}
- public Object getValue() {
+ public T getValue() {
return value;
}
@@ -58,9 +58,9 @@
}
}
- protected abstract Object updateValue(Object value);
+ protected abstract T updateValue(T value);
- public void setValue(Object value) {
+ public void setValue(T value) {
this.value = value;
}
}
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/EditListDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/EditListDialog.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/EditListDialog.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -39,15 +39,15 @@
*
* @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
*/
-public abstract class EditListDialog extends EditBeanDialog {
+public abstract class EditListDialog<T> extends EditBeanDialog<List<T>> {
- private Class editItemDialogClass;
- private List newList;
+ private Class<? extends EditBeanDialog<T>> editItemDialogClass;
+ private List<T> newList;
private ListViewer listViewer;
private Button removeButton;
private Button editButton;
- protected EditListDialog(Shell parentShell, String title, Class editItemDialogClass) {
+ protected EditListDialog(Shell parentShell, String title, Class<? extends EditBeanDialog<T>> editItemDialogClass) {
super(parentShell, title);
this.editItemDialogClass = editItemDialogClass;
}
@@ -114,35 +114,36 @@
return composite;
}
- public void setValue(Object value) {
+ public void setValue(List<T> value) {
super.setValue(value);
if (value == null) {
- this.newList = new ArrayList();
+ this.newList = new ArrayList<T>();
} else {
- this.newList = new ArrayList((List) value);
+ this.newList = new ArrayList<T>((List<T>) value);
}
}
- protected Object updateValue(Object value) {
+ protected List<T> updateValue(List<T> value) {
return newList;
}
private void addItem() {
- EditBeanDialog dialog = createEditItemDialog();
+ EditBeanDialog<T> dialog = createEditItemDialog();
dialog.setValue(createItem());
int code = dialog.open();
- Object result = dialog.getValue();
+ T result = dialog.getValue();
if (code != CANCEL) {
newList.add(result);
listViewer.add(result);
}
}
- protected abstract Object createItem();
+ protected abstract T createItem();
- private void editItem() {
- EditBeanDialog dialog = createEditItemDialog();
- Iterator iterator = ((StructuredSelection) listViewer.getSelection()).iterator();
+ @SuppressWarnings("unchecked")
+ private void editItem() {
+ EditBeanDialog<T> dialog = createEditItemDialog();
+ Iterator<T> iterator = ((StructuredSelection) listViewer.getSelection()).iterator();
if (iterator.hasNext()) {
dialog.setValue(iterator.next());
int code = dialog.open();
@@ -153,8 +154,9 @@
}
}
- private void removeItem() {
- Iterator iterator = ((StructuredSelection) listViewer.getSelection()).iterator();
+ @SuppressWarnings("unchecked")
+ private void removeItem() {
+ Iterator<T> iterator = ((StructuredSelection) listViewer.getSelection()).iterator();
// single selection only allowed
if (iterator.hasNext()) {
Object item = iterator.next();
@@ -163,9 +165,9 @@
}
}
- protected EditBeanDialog createEditItemDialog() {
+ protected EditBeanDialog<T> createEditItemDialog() {
try {
- return (EditBeanDialog) editItemDialogClass.getConstructor(
+ return (EditBeanDialog<T>) editItemDialogClass.getConstructor(
new Class[] { Shell.class }).newInstance(
new Object[] { getShell() });
} catch (InstantiationException e) {
Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/EditMapDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/EditMapDialog.java (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/EditMapDialog.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -0,0 +1,188 @@
+package org.drools.eclipse.flow.common.view.property;
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ListViewer;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Dialog for editing a list.
+ *
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public abstract class EditMapDialog<T> extends EditBeanDialog<Map<String, T>> {
+
+ private Class<? extends EditBeanDialog<T>> editItemDialogClass;
+ private Map<String, T> newMap;
+ private ListViewer listViewer;
+ private Button removeButton;
+ private Button editButton;
+
+ protected EditMapDialog(Shell parentShell, String title, Class<? extends EditBeanDialog<T>> editItemDialogClass) {
+ super(parentShell, title);
+ this.editItemDialogClass = editItemDialogClass;
+ }
+
+ protected Control createDialogArea(Composite parent) {
+ Composite composite = (Composite) super.createDialogArea(parent);
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 2;
+ composite.setLayout(gridLayout);
+
+ listViewer = new ListViewer(composite, SWT.SINGLE);
+ listViewer.add(newMap.keySet().toArray());
+ listViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ removeButton.setEnabled(!event.getSelection().isEmpty());
+ editButton.setEnabled(!event.getSelection().isEmpty());
+ }
+ });
+ GridData gridData = new GridData();
+ gridData.grabExcessHorizontalSpace = true;
+ gridData.grabExcessVerticalSpace = true;
+ gridData.horizontalAlignment = GridData.FILL;
+ gridData.verticalAlignment = GridData.FILL;
+ gridData.verticalSpan = 3;
+ listViewer.getList().setLayoutData(gridData);
+
+ Button addButton = new Button(composite, SWT.NONE);
+ addButton.setText("Add");
+ gridData = new GridData();
+ gridData.horizontalAlignment = GridData.FILL;
+ gridData.verticalAlignment = GridData.BEGINNING;
+ addButton.setLayoutData(gridData);
+ addButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ addItem();
+ }
+ });
+
+ removeButton = new Button(composite, SWT.NONE);
+ removeButton.setText("Remove");
+ removeButton.setEnabled(false);
+ gridData = new GridData();
+ gridData.verticalAlignment = GridData.BEGINNING;
+ removeButton.setLayoutData(gridData);
+ removeButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ removeItem();
+ }
+ });
+
+ editButton = new Button(composite, SWT.NONE);
+ editButton.setText("Edit");
+ editButton.setEnabled(false);
+ gridData = new GridData();
+ gridData.horizontalAlignment = GridData.FILL;
+ gridData.verticalAlignment = GridData.BEGINNING;
+ editButton.setLayoutData(gridData);
+ editButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ editItem();
+ }
+ });
+
+ return composite;
+ }
+
+ public void setValue(Map<String, T> value) {
+ super.setValue(value);
+ if (value == null) {
+ this.newMap = new HashMap<String, T>();
+ } else {
+ this.newMap = new HashMap<String, T>((Map<String, T>) value);
+ }
+ }
+
+ protected Map<String, T> updateValue(Map<String, T> value) {
+ return newMap;
+ }
+
+ private void addItem() {
+ EditBeanDialog<T> dialog = createEditItemDialog();
+ dialog.setValue(createItem());
+ int code = dialog.open();
+ String key = ((MapItemDialog) dialog).getKey();
+ T result = dialog.getValue();
+ if (code != CANCEL) {
+ T object = newMap.put(key, result);
+ if (object == null) {
+ listViewer.add(key);
+ }
+ }
+ }
+
+ protected abstract T createItem();
+
+ @SuppressWarnings("unchecked")
+ private void editItem() {
+ EditBeanDialog<T> dialog = createEditItemDialog();
+ Iterator<String> iterator = ((StructuredSelection) listViewer.getSelection()).iterator();
+ if (iterator.hasNext()) {
+ String key = iterator.next();
+ ((MapItemDialog) dialog).setKey(key);
+ dialog.setValue(newMap.get(key));
+ int code = dialog.open();
+ T result = dialog.getValue();
+ if (code != CANCEL) {
+ newMap.put(key, result);
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private void removeItem() {
+ Iterator<String> iterator = ((StructuredSelection) listViewer.getSelection()).iterator();
+ // single selection only allowed
+ if (iterator.hasNext()) {
+ String key = iterator.next();
+ newMap.remove(key);
+ listViewer.remove(key);
+ }
+ }
+
+ protected EditBeanDialog<T> createEditItemDialog() {
+ try {
+ return (EditBeanDialog<T>) editItemDialogClass.getConstructor(
+ new Class[] { Shell.class }).newInstance(
+ new Object[] { getShell() });
+ } catch (InstantiationException e) {
+ throw new RuntimeException(e);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ } catch (InvocationTargetException e) {
+ throw new RuntimeException(e);
+ } catch (NoSuchMethodException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/ListPropertyDescriptor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/ListPropertyDescriptor.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/ListPropertyDescriptor.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -28,9 +28,9 @@
*/
public class ListPropertyDescriptor extends PropertyDescriptor {
- private Class cellEditorClass;
+ private Class<? extends CellEditor> cellEditorClass;
- public ListPropertyDescriptor(Object id, String displayName, Class cellEditorClass) {
+ public ListPropertyDescriptor(Object id, String displayName, Class<? extends CellEditor> cellEditorClass) {
super(id, displayName);
this.cellEditorClass = cellEditorClass;
}
Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/MapItemDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/MapItemDialog.java (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/view/property/MapItemDialog.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -0,0 +1,9 @@
+package org.drools.eclipse.flow.common.view.property;
+
+public interface MapItemDialog {
+
+ String getKey();
+
+ void setKey(String key);
+
+}
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/CompositeContextNodeWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/CompositeContextNodeWrapper.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/CompositeContextNodeWrapper.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -1,13 +1,18 @@
package org.drools.eclipse.flow.ruleflow.core;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import org.drools.eclipse.flow.common.editor.core.DefaultElementWrapper;
import org.drools.eclipse.flow.common.editor.core.ElementConnection;
import org.drools.eclipse.flow.common.editor.core.ElementWrapper;
import org.drools.eclipse.flow.common.view.property.ListPropertyDescriptor;
+import org.drools.eclipse.flow.ruleflow.view.property.exceptionHandler.ExceptionHandlersPropertyDescriptor;
import org.drools.eclipse.flow.ruleflow.view.property.variable.VariableListCellEditor;
+import org.drools.process.core.context.exception.ExceptionHandler;
+import org.drools.process.core.context.exception.ExceptionScope;
import org.drools.process.core.context.variable.Variable;
import org.drools.process.core.context.variable.VariableScope;
import org.drools.workflow.core.Node;
@@ -21,21 +26,12 @@
public static final String VARIABLES = "variables";
public static final String START_NODE = "startNodeId";
public static final String END_NODE = "endNodeId";
+ public static final String EXCEPTION_HANDLERS = "exceptionHandlers";
private static final long serialVersionUID = 400L;
- private static IPropertyDescriptor[] descriptors;
- static {
- descriptors = new IPropertyDescriptor[DefaultElementWrapper.descriptors.length + 3];
- System.arraycopy(DefaultElementWrapper.descriptors, 0, descriptors, 0, DefaultElementWrapper.descriptors.length);
- descriptors[descriptors.length - 3] =
- new TextPropertyDescriptor(START_NODE, "StartNodeId");
- descriptors[descriptors.length - 2] =
- new TextPropertyDescriptor(END_NODE, "EndNodeId");
- descriptors[descriptors.length - 1] =
- new ListPropertyDescriptor(VARIABLES, "Variables", VariableListCellEditor.class);
- }
-
+ private IPropertyDescriptor[] descriptors;
+
public CompositeContextNodeWrapper() {
setNode(new CompositeContextNode());
getCompositeNode().setName("CompositeNode");
@@ -45,9 +41,26 @@
}
public IPropertyDescriptor[] getPropertyDescriptors() {
+ if (descriptors == null) {
+ initPropertyDescriptors();
+ }
return descriptors;
}
+ private void initPropertyDescriptors() {
+ descriptors = new IPropertyDescriptor[DefaultElementWrapper.descriptors.length + 4];
+ System.arraycopy(DefaultElementWrapper.descriptors, 0, descriptors, 0, DefaultElementWrapper.descriptors.length);
+ descriptors[descriptors.length - 4] =
+ new TextPropertyDescriptor(START_NODE, "StartNodeId");
+ descriptors[descriptors.length - 3] =
+ new TextPropertyDescriptor(END_NODE, "EndNodeId");
+ descriptors[descriptors.length - 2] =
+ new ListPropertyDescriptor(VARIABLES, "Variables", VariableListCellEditor.class);
+ descriptors[descriptors.length - 1] =
+ new ExceptionHandlersPropertyDescriptor(EXCEPTION_HANDLERS,
+ "Exception Handlers", getProcessWrapper().getProcess());
+ }
+
public CompositeContextNode getCompositeContextNode() {
return (CompositeContextNode) getNode();
}
@@ -86,6 +99,14 @@
CompositeNode.NodeAndType link = getCompositeNode().getLinkedOutgoingNode(Node.CONNECTION_DEFAULT_TYPE);
return link == null ? "" : link.getNodeId() + "";
}
+ if (EXCEPTION_HANDLERS.equals(id)) {
+ ExceptionScope exceptionScope = (ExceptionScope)
+ getCompositeContextNode().getDefaultContext(ExceptionScope.EXCEPTION_SCOPE);
+ if (exceptionScope == null) {
+ return new HashMap<String, ExceptionHandler>();
+ }
+ return exceptionScope.getExceptionHandlers();
+ }
return super.getPropertyValue(id);
}
@@ -97,6 +118,12 @@
getCompositeNode().linkIncomingConnections(Node.CONNECTION_DEFAULT_TYPE, null);
} else if (END_NODE.equals(id)) {
getCompositeNode().linkOutgoingConnections(null, Node.CONNECTION_DEFAULT_TYPE);
+ } else if (EXCEPTION_HANDLERS.equals(id)) {
+ ExceptionScope exceptionScope = (ExceptionScope)
+ getCompositeContextNode().getDefaultContext(ExceptionScope.EXCEPTION_SCOPE);
+ if (exceptionScope != null) {
+ exceptionScope.setExceptionHandlers(new HashMap<String, ExceptionHandler>());
+ }
} else {
super.resetPropertyValue(id);
}
@@ -111,6 +138,15 @@
getCompositeNode().linkIncomingConnections(Node.CONNECTION_DEFAULT_TYPE, new Long((String) value), Node.CONNECTION_DEFAULT_TYPE);
} else if (END_NODE.equals(id)) {
getCompositeNode().linkOutgoingConnections(new Long((String) value), Node.CONNECTION_DEFAULT_TYPE, Node.CONNECTION_DEFAULT_TYPE);
+ } else if (EXCEPTION_HANDLERS.equals(id)) {
+ ExceptionScope exceptionScope = (ExceptionScope)
+ getCompositeContextNode().getDefaultContext(ExceptionScope.EXCEPTION_SCOPE);
+ if (exceptionScope == null) {
+ exceptionScope = new ExceptionScope();
+ getCompositeContextNode().addContext(exceptionScope);
+ getCompositeContextNode().setDefaultContext(exceptionScope);
+ }
+ exceptionScope.setExceptionHandlers((Map<String, ExceptionHandler>) value);
} else {
super.setPropertyValue(id, value);
}
Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/FaultNodeWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/FaultNodeWrapper.java (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/FaultNodeWrapper.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -0,0 +1,100 @@
+package org.drools.eclipse.flow.ruleflow.core;
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.drools.eclipse.flow.common.editor.core.DefaultElementWrapper;
+import org.drools.eclipse.flow.common.editor.core.ElementConnection;
+import org.drools.eclipse.flow.common.editor.core.ElementWrapper;
+import org.drools.workflow.core.node.FaultNode;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+
+/**
+ * Wrapper for a fault node.
+ *
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class FaultNodeWrapper extends AbstractNodeWrapper {
+
+ public static final String FAULT_NAME = "FaultName";
+ public static final String FAULT_VARIABLE = "FaultVariable";
+
+ private static final long serialVersionUID = 4L;
+ private static IPropertyDescriptor[] descriptors;
+ static {
+ descriptors = new IPropertyDescriptor[DefaultElementWrapper.descriptors.length + 2];
+ System.arraycopy(DefaultElementWrapper.descriptors, 0, descriptors, 0, DefaultElementWrapper.descriptors.length);
+ descriptors[descriptors.length - 2] =
+ new TextPropertyDescriptor(FAULT_NAME, "FaultName");
+ descriptors[descriptors.length - 1] =
+ new TextPropertyDescriptor(FAULT_VARIABLE, "FaultVariable");
+ }
+
+ public FaultNodeWrapper() {
+ setNode(new FaultNode());
+ getFaultNode().setName("Fault");
+ }
+
+ public FaultNode getFaultNode() {
+ return (FaultNode) getNode();
+ }
+
+ public IPropertyDescriptor[] getPropertyDescriptors() {
+ return descriptors;
+ }
+
+ public boolean acceptsIncomingConnection(ElementConnection connection, ElementWrapper source) {
+ return super.acceptsIncomingConnection(connection, source)
+ && getIncomingConnections().isEmpty();
+ }
+
+ public boolean acceptsOutgoingConnection(ElementConnection connection, ElementWrapper target) {
+ return false;
+ }
+
+ public Object getPropertyValue(Object id) {
+ if (FAULT_NAME.equals(id)) {
+ String faultName = getFaultNode().getFaultName();
+ return faultName == null ? "" : faultName;
+ }
+ if (FAULT_VARIABLE.equals(id)) {
+ String faultVariable = getFaultNode().getFaultVariable();
+ return faultVariable == null ? "" : faultVariable;
+ }
+ return super.getPropertyValue(id);
+ }
+
+ public void resetPropertyValue(Object id) {
+ if (FAULT_NAME.equals(id)) {
+ getFaultNode().setFaultName(null);
+ } else if (FAULT_VARIABLE.equals(id)) {
+ getFaultNode().setFaultVariable(null);
+ } else {
+ super.resetPropertyValue(id);
+ }
+ }
+
+ public void setPropertyValue(Object id, Object value) {
+ if (FAULT_NAME.equals(id)) {
+ getFaultNode().setFaultName((String) value);
+ } else if (FAULT_VARIABLE.equals(id)) {
+ getFaultNode().setFaultVariable((String) value);
+ } else {
+ super.setPropertyValue(id, value);
+ }
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/RuleFlowWrapperBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/RuleFlowWrapperBuilder.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/RuleFlowWrapperBuilder.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -23,6 +23,7 @@
import org.drools.workflow.core.node.CompositeNode;
import org.drools.workflow.core.node.EndNode;
import org.drools.workflow.core.node.EventNode;
+import org.drools.workflow.core.node.FaultNode;
import org.drools.workflow.core.node.ForEachNode;
import org.drools.workflow.core.node.HumanTaskNode;
import org.drools.workflow.core.node.Join;
@@ -113,6 +114,8 @@
return new SplitWrapper();
} else if (node instanceof MilestoneNode) {
return new MilestoneWrapper();
+ } else if (node instanceof FaultNode) {
+ return new FaultNodeWrapper();
} else if (node instanceof TimerNode) {
return new TimerWrapper();
} else if (node instanceof HumanTaskNode) {
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/RuleFlowPaletteFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/RuleFlowPaletteFactory.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/RuleFlowPaletteFactory.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -26,6 +26,7 @@
import org.drools.eclipse.flow.ruleflow.core.ConnectionWrapperFactory;
import org.drools.eclipse.flow.ruleflow.core.EndNodeWrapper;
import org.drools.eclipse.flow.ruleflow.core.EventNodeWrapper;
+import org.drools.eclipse.flow.ruleflow.core.FaultNodeWrapper;
import org.drools.eclipse.flow.ruleflow.core.ForEachNodeWrapper;
import org.drools.eclipse.flow.ruleflow.core.HumanTaskNodeWrapper;
import org.drools.eclipse.flow.ruleflow.core.JoinWrapper;
@@ -40,6 +41,7 @@
import org.eclipse.gef.palette.MarqueeToolEntry;
import org.eclipse.gef.palette.PaletteContainer;
import org.eclipse.gef.palette.PaletteDrawer;
+import org.eclipse.gef.palette.PaletteEntry;
import org.eclipse.gef.palette.PaletteGroup;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.palette.SelectionToolEntry;
@@ -61,8 +63,8 @@
return flowPalette;
}
- private static List createCategories(PaletteRoot root) {
- List categories = new ArrayList();
+ private static List<PaletteEntry> createCategories(PaletteRoot root) {
+ List<PaletteEntry> categories = new ArrayList<PaletteEntry>();
categories.add(createControlGroup(root));
categories.add(createComponentsDrawer());
categories.add(createWorkNodesDrawer());
@@ -73,7 +75,7 @@
PaletteDrawer drawer = new PaletteDrawer("Components", null);
- List entries = new ArrayList();
+ List<PaletteEntry> entries = new ArrayList<PaletteEntry>();
CombinedTemplateCreationEntry combined = new CombinedTemplateCreationEntry(
"Start",
@@ -166,6 +168,16 @@
entries.add(combined);
combined = new CombinedTemplateCreationEntry(
+ "Fault",
+ "Create a new Fault",
+ FaultNodeWrapper.class,
+ new SimpleFactory(FaultNodeWrapper.class),
+ ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/fault.gif")),
+ ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/fault.gif"))
+ );
+ entries.add(combined);
+
+ combined = new CombinedTemplateCreationEntry(
"Event",
"Create a new Event Node",
EventNodeWrapper.class,
@@ -256,7 +268,7 @@
private static PaletteContainer createControlGroup(PaletteRoot root) {
PaletteGroup controlGroup = new PaletteGroup("Control Group");
- List entries = new ArrayList();
+ List<PaletteEntry> entries = new ArrayList<PaletteEntry>();
ToolEntry tool = new SelectionToolEntry();
entries.add(tool);
Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/FaultNodeEditPart.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/FaultNodeEditPart.java (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/FaultNodeEditPart.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -0,0 +1,71 @@
+package org.drools.eclipse.flow.ruleflow.editor.editpart;
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.drools.eclipse.DroolsEclipsePlugin;
+import org.drools.eclipse.flow.common.editor.editpart.ElementEditPart;
+import org.drools.eclipse.flow.common.editor.editpart.figure.AbstractElementFigure;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.RoundedRectangle;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * EditPart for a fault node.
+ *
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class FaultNodeEditPart extends ElementEditPart {
+
+ private static final Color color = new Color(Display.getCurrent(), 255, 250, 205);
+
+ protected IFigure createFigure() {
+ return new FaultNodeFigure();
+ }
+
+ public static class FaultNodeFigure extends AbstractElementFigure {
+
+ private static final Image ICON = ImageDescriptor.createFromURL(
+ DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/fault.gif")).createImage();
+
+ private RoundedRectangle rectangle;
+
+ protected void customizeFigure() {
+ rectangle = new RoundedRectangle();
+ rectangle.setCornerDimensions(new Dimension(25, 25));
+ add(rectangle, 0);
+ rectangle.setBackgroundColor(color);
+ rectangle.setBounds(getBounds());
+ setSelected(false);
+ setIcon(ICON);
+ }
+
+ public void setBounds(Rectangle rectangle) {
+ super.setBounds(rectangle);
+ this.rectangle.setBounds(rectangle);
+ }
+
+ public void setSelected(boolean b) {
+ super.setSelected(b);
+ rectangle.setLineWidth(b ? 3 : 1);
+ repaint();
+ }
+ }
+}
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/RuleFlowEditPartFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/RuleFlowEditPartFactory.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/RuleFlowEditPartFactory.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -23,6 +23,7 @@
import org.drools.eclipse.flow.ruleflow.core.ConnectionWrapper;
import org.drools.eclipse.flow.ruleflow.core.EndNodeWrapper;
import org.drools.eclipse.flow.ruleflow.core.EventNodeWrapper;
+import org.drools.eclipse.flow.ruleflow.core.FaultNodeWrapper;
import org.drools.eclipse.flow.ruleflow.core.ForEachNodeWrapper;
import org.drools.eclipse.flow.ruleflow.core.JoinWrapper;
import org.drools.eclipse.flow.ruleflow.core.MilestoneWrapper;
@@ -74,6 +75,8 @@
} else if (model instanceof WorkItemWrapper) {
result = new WorkItemEditPart();
((WorkItemEditPart) result).setProject(project);
+ } else if (model instanceof FaultNodeWrapper) {
+ result = new FaultNodeEditPart();
} else if (model instanceof TimerWrapper) {
result = new TimerEditPart();
} else if (model instanceof ForEachNodeWrapper) {
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowGlobalsDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowGlobalsDialog.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowGlobalsDialog.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -16,7 +16,6 @@
*/
import java.util.HashMap;
-import java.util.Iterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -61,7 +60,7 @@
private boolean success;
private TabFolder tabFolder;
private SourceViewer globalsViewer;
- private Map globals;
+ private Map<String, String> globals;
public RuleFlowGlobalsDialog(Shell parentShell, WorkflowProcess process) {
super(parentShell);
@@ -115,10 +114,9 @@
private String getProcessImports() {
String result = "# define your globals here: e.g. global java.util.List myList\n";
- Map globals = process.getGlobals();
+ Map<String, String> globals = process.getGlobals();
if (globals != null) {
- for (Iterator iterator = globals.entrySet().iterator(); iterator.hasNext(); ) {
- Map.Entry entry = (Map.Entry) iterator.next();
+ for (Map.Entry<String, String> entry: globals.entrySet()) {
result += "global " + entry.getValue() + " " + entry.getKey() + "\n";
}
}
@@ -152,12 +150,12 @@
return success;
}
- public Map getGlobals() {
+ public Map<String, String> getGlobals() {
return globals;
}
private void updateGlobals() {
- this.globals = new HashMap();
+ this.globals = new HashMap<String, String>();
Matcher matcher = GLOBAL_PATTERN.matcher(globalsViewer.getDocument().get());
while (matcher.find()) {
this.globals.put(matcher.group(2), matcher.group(1));
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowImportsDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowImportsDialog.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowImportsDialog.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -16,7 +16,6 @@
*/
import java.util.ArrayList;
-import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -61,7 +60,7 @@
private boolean success;
private TabFolder tabFolder;
private SourceViewer importsViewer;
- private List imports;
+ private List<String> imports;
public RuleFlowImportsDialog(Shell parentShell, WorkflowProcess process) {
super(parentShell);
@@ -115,10 +114,10 @@
private String getProcessImports() {
String result = "# define your imports here: e.g. import com.sample.MyClass\n";
- List imports = process.getImports();
+ List<String> imports = process.getImports();
if (imports != null) {
- for (Iterator iterator = imports.iterator(); iterator.hasNext(); ) {
- result += "import " + (String) iterator.next() + "\n";
+ for (String importString: imports) {
+ result += "import " + importString + "\n";
}
}
return result;
@@ -151,12 +150,12 @@
return success;
}
- public List getImports() {
+ public List<String> getImports() {
return imports;
}
private void updateImports() {
- this.imports = new ArrayList();
+ this.imports = new ArrayList<String>();
Matcher matcher = IMPORT_PATTERN.matcher(importsViewer.getDocument().get());
while (matcher.find()) {
this.imports.add(matcher.group(1));
Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/exceptionHandler/ExceptionHandlerDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/exceptionHandler/ExceptionHandlerDialog.java (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/exceptionHandler/ExceptionHandlerDialog.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -0,0 +1,295 @@
+package org.drools.eclipse.flow.ruleflow.view.property.exceptionHandler;
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.List;
+import java.util.Map;
+
+import org.drools.eclipse.editors.DRLSourceViewerConfig;
+import org.drools.eclipse.editors.scanners.DRLPartionScanner;
+import org.drools.eclipse.flow.common.view.property.EditBeanDialog;
+import org.drools.eclipse.flow.common.view.property.MapItemDialog;
+import org.drools.eclipse.flow.ruleflow.view.property.action.ActionCompletionProcessor;
+import org.drools.eclipse.flow.ruleflow.view.property.constraint.RuleFlowGlobalsDialog;
+import org.drools.eclipse.flow.ruleflow.view.property.constraint.RuleFlowImportsDialog;
+import org.drools.process.core.context.exception.ActionExceptionHandler;
+import org.drools.util.ArrayUtils;
+import org.drools.workflow.core.DroolsAction;
+import org.drools.workflow.core.WorkflowProcess;
+import org.drools.workflow.core.impl.DroolsConsequenceAction;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentPartitioner;
+import org.eclipse.jface.text.contentassist.ContentAssistant;
+import org.eclipse.jface.text.contentassist.IContentAssistant;
+import org.eclipse.jface.text.reconciler.IReconciler;
+import org.eclipse.jface.text.rules.FastPartitioner;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.swt.widgets.TabItem;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Dialog for editing exception handlers.
+ *
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class ExceptionHandlerDialog extends EditBeanDialog<ActionExceptionHandler> implements MapItemDialog {
+
+ private static final String[] DIALECTS = new String[] { "mvel", "java" };
+
+ private String key;
+ private Text nameText;
+ private Text faultVariableText;
+ private WorkflowProcess process;
+ private TabFolder tabFolder;
+ private SourceViewer actionViewer;
+ private Combo dialectCombo;
+ private ActionCompletionProcessor completionProcessor;
+
+ public ExceptionHandlerDialog(Shell parentShell, WorkflowProcess process) {
+ super(parentShell, "Edit Exception Handler");
+ this.process = process;
+ }
+
+ protected Point getInitialSize() {
+ return new Point(400, 500);
+ }
+
+ protected Control createDialogArea(Composite parent) {
+ final Composite composite = (Composite) super.createDialogArea(parent);
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 2;
+ composite.setLayout(gridLayout);
+
+ Label nameLabel = new Label(composite, SWT.NONE);
+ nameLabel.setText("Name: ");
+ nameText = new Text(composite, SWT.NONE);
+ GridData gridData = new GridData();
+ gridData.grabExcessHorizontalSpace = true;
+ gridData.horizontalAlignment = GridData.FILL;
+ nameText.setLayoutData(gridData);
+ if (key != null) {
+ nameText.setText(key);
+ nameText.setEditable(false);
+ }
+
+ nameLabel = new Label(composite, SWT.NONE);
+ nameLabel.setText("FaultVariable: ");
+ faultVariableText = new Text(composite, SWT.NONE);
+ gridData = new GridData();
+ gridData.grabExcessHorizontalSpace = true;
+ gridData.horizontalAlignment = GridData.FILL;
+ faultVariableText.setLayoutData(gridData);
+ String faultVariable = getValue().getFaultVariable();
+ faultVariableText.setText(faultVariable == null ? "" : faultVariable);
+
+ Composite top = new Composite(composite, SWT.NONE);
+ GridData gd = new GridData();
+ gd.horizontalSpan = 2;
+ gd.grabExcessHorizontalSpace = true;
+ top.setLayoutData(gd);
+
+ gridLayout = new GridLayout();
+ gridLayout.numColumns = 4;
+ top.setLayout(gridLayout);
+
+ Label label = new Label(top, SWT.NONE);
+ label.setText("Dialect:");
+ createDialectCombo(top);
+
+ Button importButton = new Button(top, SWT.PUSH);
+ importButton.setText("Imports ...");
+ importButton.setFont(JFaceResources.getDialogFont());
+ importButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent event) {
+ importButtonPressed();
+ }
+ });
+
+ Button globalButton = new Button(top, SWT.PUSH);
+ globalButton.setText("Globals ...");
+ globalButton.setFont(JFaceResources.getDialogFont());
+ globalButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent event) {
+ globalButtonPressed();
+ }
+ });
+
+ tabFolder = new TabFolder(composite, SWT.NONE);
+ gd = new GridData();
+ gd.horizontalSpan = 3;
+ gd.grabExcessHorizontalSpace = true;
+ gd.grabExcessVerticalSpace = true;
+ gd.verticalAlignment = GridData.FILL;
+ gd.horizontalAlignment = GridData.FILL;
+ tabFolder.setLayoutData(gd);
+ TabItem textEditorTab = new TabItem(tabFolder, SWT.NONE);
+ textEditorTab.setText("Textual Editor");
+
+ textEditorTab.setControl(createTextualEditor(tabFolder));
+ return composite;
+ }
+
+ private Control createTextualEditor(Composite parent) {
+ actionViewer = new SourceViewer(parent, null, SWT.BORDER);
+ actionViewer.configure(new DRLSourceViewerConfig(null) {
+ public IReconciler getReconciler(ISourceViewer sourceViewer) {
+ return null;
+ }
+ public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
+ ContentAssistant assistant = new ContentAssistant();
+ completionProcessor = new ActionCompletionProcessor(process);
+ assistant.setContentAssistProcessor(
+ completionProcessor, IDocument.DEFAULT_CONTENT_TYPE);
+ assistant.setProposalPopupOrientation(IContentAssistant.PROPOSAL_OVERLAY);
+ return assistant;
+ }
+ });
+ completionProcessor.setDialect(
+ dialectCombo.getItem(dialectCombo.getSelectionIndex()));
+ DroolsAction action = getValue().getAction();
+ String value = null;
+ if (action instanceof DroolsConsequenceAction) {
+ value = ((DroolsConsequenceAction) action).getConsequence();
+ }
+ if (value == null) {
+ value = "";
+ }
+ IDocument document = new Document(value);
+ actionViewer.setDocument(document);
+ IDocumentPartitioner partitioner =
+ new FastPartitioner(
+ new DRLPartionScanner(),
+ DRLPartionScanner.LEGAL_CONTENT_TYPES);
+ partitioner.connect(document);
+ document.setDocumentPartitioner(partitioner);
+ actionViewer.getControl().addKeyListener(new KeyListener() {
+ public void keyPressed(KeyEvent e) {
+ if (e.character == ' ' && e.stateMask == SWT.CTRL) {
+ actionViewer.doOperation(ISourceViewer.CONTENTASSIST_PROPOSALS);
+ }
+ }
+ public void keyReleased(KeyEvent e) {
+ }
+ });
+ return actionViewer.getControl();
+ }
+
+ private Control createDialectCombo(Composite parent) {
+ dialectCombo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
+ dialectCombo.setItems(DIALECTS);
+ DroolsAction action = getValue().getAction();
+ int index = 0;
+ if (action instanceof DroolsConsequenceAction) {
+ String dialect = ((DroolsConsequenceAction) action).getDialect();
+ int found = ArrayUtils.indexOf(DIALECTS, dialect);
+ if (found >= 0) {
+ index = found;
+ }
+ }
+ dialectCombo.select(index);
+ dialectCombo.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ completionProcessor.setDialect(
+ dialectCombo.getItem(dialectCombo.getSelectionIndex()));
+ }
+ public void widgetSelected(SelectionEvent e) {
+ completionProcessor.setDialect(
+ dialectCombo.getItem(dialectCombo.getSelectionIndex()));
+ }
+ });
+ return dialectCombo;
+ }
+
+ private DroolsConsequenceAction getAction() {
+ return new DroolsConsequenceAction(
+ dialectCombo.getItem(dialectCombo.getSelectionIndex()),
+ actionViewer.getDocument().get());
+ }
+
+ private void importButtonPressed() {
+ final Runnable r = new Runnable() {
+ public void run() {
+ RuleFlowImportsDialog dialog =
+ new RuleFlowImportsDialog(getShell(), process);
+ dialog.create();
+ int code = dialog.open();
+ if (code != CANCEL) {
+ List<String> imports = dialog.getImports();
+ process.setImports(imports);
+ completionProcessor.reset();
+ }
+ }
+ };
+ r.run();
+ }
+
+ private void globalButtonPressed() {
+ final Runnable r = new Runnable() {
+ public void run() {
+ RuleFlowGlobalsDialog dialog =
+ new RuleFlowGlobalsDialog(getShell(), process);
+ dialog.create();
+ int code = dialog.open();
+ if (code != CANCEL) {
+ Map<String, String> globals = dialog.getGlobals();
+ process.setGlobals(globals);
+ completionProcessor.reset();
+ }
+ }
+ };
+ r.run();
+ }
+
+ protected ActionExceptionHandler updateValue(ActionExceptionHandler value) {
+ key = nameText.getText();
+ if (key.length() == 0) {
+ throw new IllegalArgumentException("Name should not be empty.");
+ }
+ value.setFaultVariable(faultVariableText.getText());
+ if (tabFolder.getSelectionIndex() == 0) {
+ value.setAction(getAction());
+ }
+ return value;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/exceptionHandler/ExceptionHandlersCellEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/exceptionHandler/ExceptionHandlersCellEditor.java (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/exceptionHandler/ExceptionHandlersCellEditor.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -0,0 +1,56 @@
+package org.drools.eclipse.flow.ruleflow.view.property.exceptionHandler;
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.Map;
+
+import org.drools.eclipse.flow.common.view.property.BeanDialogCellEditor;
+import org.drools.eclipse.flow.common.view.property.EditBeanDialog;
+import org.drools.process.core.Process;
+import org.drools.process.core.context.exception.ActionExceptionHandler;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Cell edtior for exception handlers.
+ *
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class ExceptionHandlersCellEditor extends BeanDialogCellEditor<Map<String, ActionExceptionHandler>> {
+
+ private Process process;
+
+ public ExceptionHandlersCellEditor(Composite parent, Process process) {
+ super(parent);
+ this.process = process;
+ }
+
+ protected EditBeanDialog<Map<String, ActionExceptionHandler>> createDialog(Shell shell) {
+ return new ExceptionHandlersDialog(shell, process);
+ }
+
+ @SuppressWarnings("unchecked")
+ protected String getLabelText(Object value) {
+ if (value == null) {
+ return "";
+ }
+ if (value instanceof Map) {
+ return ((Map<String, ActionExceptionHandler>) value).keySet().toString();
+ }
+ return value.toString();
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/exceptionHandler/ExceptionHandlersDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/exceptionHandler/ExceptionHandlersDialog.java (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/exceptionHandler/ExceptionHandlersDialog.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -0,0 +1,48 @@
+package org.drools.eclipse.flow.ruleflow.view.property.exceptionHandler;
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.drools.eclipse.flow.common.view.property.EditBeanDialog;
+import org.drools.eclipse.flow.common.view.property.EditMapDialog;
+import org.drools.process.core.Process;
+import org.drools.process.core.context.exception.ActionExceptionHandler;
+import org.drools.workflow.core.WorkflowProcess;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Dialog for editing exception handlers.
+ *
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class ExceptionHandlersDialog extends EditMapDialog<ActionExceptionHandler> {
+
+ private Process process;
+
+ protected ExceptionHandlersDialog(Shell parentShell, Process process) {
+ super(parentShell, "ExceptionHandlers", ExceptionHandlerDialog.class);
+ this.process = process;
+ }
+
+ protected ActionExceptionHandler createItem() {
+ return new ActionExceptionHandler();
+ }
+
+ protected EditBeanDialog<ActionExceptionHandler> createEditItemDialog() {
+ return new ExceptionHandlerDialog(getShell(), (WorkflowProcess) process);
+ }
+
+}
+
Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/exceptionHandler/ExceptionHandlersPropertyDescriptor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/exceptionHandler/ExceptionHandlersPropertyDescriptor.java (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/exceptionHandler/ExceptionHandlersPropertyDescriptor.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -0,0 +1,21 @@
+package org.drools.eclipse.flow.ruleflow.view.property.exceptionHandler;
+
+import org.drools.eclipse.flow.common.view.property.ListPropertyDescriptor;
+import org.drools.process.core.Process;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.swt.widgets.Composite;
+
+public class ExceptionHandlersPropertyDescriptor extends ListPropertyDescriptor {
+
+ private Process process;
+
+ public ExceptionHandlersPropertyDescriptor(Object id, String displayName, Process process) {
+ super(id, displayName, ExceptionHandlersCellEditor.class);
+ this.process = process;
+ }
+
+ public CellEditor createPropertyEditor(Composite parent) {
+ return new ExceptionHandlersCellEditor(parent, process);
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/swimlane/SwimlaneDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/swimlane/SwimlaneDialog.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/swimlane/SwimlaneDialog.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -17,7 +17,6 @@
import org.drools.eclipse.flow.common.view.property.EditBeanDialog;
import org.drools.process.core.context.swimlane.Swimlane;
-import org.drools.process.core.context.variable.Variable;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
@@ -32,7 +31,7 @@
*
* @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
*/
-public class SwimlaneDialog extends EditBeanDialog {
+public class SwimlaneDialog extends EditBeanDialog<Swimlane> {
private Text nameText;
@@ -59,10 +58,9 @@
return composite;
}
- protected Object updateValue(Object value) {
- Swimlane swimlane = (Swimlane) getValue();
- swimlane.setName(nameText.getText());
- return swimlane;
+ protected Swimlane updateValue(Swimlane value) {
+ value.setName(nameText.getText());
+ return value;
}
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/swimlane/SwimlanesCellEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/swimlane/SwimlanesCellEditor.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/swimlane/SwimlanesCellEditor.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -15,8 +15,11 @@
* limitations under the License.
*/
+import java.util.List;
+
import org.drools.eclipse.flow.common.view.property.BeanDialogCellEditor;
import org.drools.eclipse.flow.common.view.property.EditBeanDialog;
+import org.drools.process.core.context.swimlane.Swimlane;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
@@ -25,13 +28,13 @@
*
* @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
*/
-public class SwimlanesCellEditor extends BeanDialogCellEditor {
+public class SwimlanesCellEditor extends BeanDialogCellEditor<List<Swimlane>> {
public SwimlanesCellEditor(Composite parent) {
super(parent);
}
- protected EditBeanDialog createDialog(Shell shell) {
+ protected EditBeanDialog<List<Swimlane>> createDialog(Shell shell) {
return new SwimlanesDialog(shell);
}
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/swimlane/SwimlanesDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/swimlane/SwimlanesDialog.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/swimlane/SwimlanesDialog.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -24,13 +24,13 @@
*
* @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
*/
-public class SwimlanesDialog extends EditListDialog {
+public class SwimlanesDialog extends EditListDialog<Swimlane> {
protected SwimlanesDialog(Shell parentShell) {
super(parentShell, "Swimlanes", SwimlaneDialog.class);
}
- protected Object createItem() {
+ protected Swimlane createItem() {
return new Swimlane();
}
}
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/task/TaskCellEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/task/TaskCellEditor.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/task/TaskCellEditor.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -17,6 +17,7 @@
import org.drools.eclipse.flow.common.view.property.BeanDialogCellEditor;
import org.drools.eclipse.flow.common.view.property.EditBeanDialog;
+import org.drools.process.core.Work;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
@@ -25,13 +26,13 @@
*
* @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
*/
-public class TaskCellEditor extends BeanDialogCellEditor {
+public class TaskCellEditor extends BeanDialogCellEditor<Work> {
public TaskCellEditor(Composite parent) {
super(parent);
}
- protected EditBeanDialog createDialog(Shell shell) {
+ protected EditBeanDialog<Work> createDialog(Shell shell) {
return new TaskDialog(shell);
}
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/task/TaskDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/task/TaskDialog.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/task/TaskDialog.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -31,7 +31,7 @@
*
* @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
*/
-public class TaskDialog extends EditBeanDialog {
+public class TaskDialog extends EditBeanDialog<Work> {
private Text nameText;
// private DataTypeCombo dataTypeCombo;
@@ -54,7 +54,7 @@
gridData.grabExcessHorizontalSpace = true;
gridData.horizontalAlignment = GridData.FILL;
nameText.setLayoutData(gridData);
- String name = ((Work) getValue()).getName();
+ String name = getValue().getName();
nameText.setText(name == null ? "" : name);
// Label typeLabel = new Label(composite, SWT.NONE);
@@ -90,10 +90,9 @@
return composite;
}
- protected Object updateValue(Object value) {
- Work task = (Work) getValue();
- task.setName(nameText.getText());
- return task;
+ protected Work updateValue(Work value) {
+ value.setName(nameText.getText());
+ return value;
}
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/variable/VariableDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/variable/VariableDialog.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/variable/VariableDialog.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -43,7 +43,7 @@
*
* @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
*/
-public class VariableDialog extends EditBeanDialog {
+public class VariableDialog extends EditBeanDialog<Variable> {
private Text nameText;
private DataTypeCombo dataTypeCombo;
@@ -75,7 +75,7 @@
dataTypeCombo = new DataTypeCombo(composite,
SWT.NONE, DefaultDataTypeRegistry.getInstance());
- DataType dataType = ((Variable) getValue()).getType();
+ DataType dataType = getValue().getType();
dataTypeCombo.setDataType(dataType);
dataTypeCombo.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
@@ -125,7 +125,7 @@
return composite;
}
- protected Object updateValue(Object value) {
+ protected Variable updateValue(Variable value) {
Variable variable = (Variable) getValue();
String name = nameText.getText();
if ("".equals(name)) {
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/variable/VariableListCellEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/variable/VariableListCellEditor.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/variable/VariableListCellEditor.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -15,8 +15,11 @@
* limitations under the License.
*/
+import java.util.List;
+
import org.drools.eclipse.flow.common.view.property.BeanDialogCellEditor;
import org.drools.eclipse.flow.common.view.property.EditBeanDialog;
+import org.drools.process.core.context.variable.Variable;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
@@ -25,13 +28,13 @@
*
* @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
*/
-public class VariableListCellEditor extends BeanDialogCellEditor {
+public class VariableListCellEditor extends BeanDialogCellEditor<List<Variable>> {
public VariableListCellEditor(Composite parent) {
super(parent);
}
- protected EditBeanDialog createDialog(Shell shell) {
+ protected EditBeanDialog<List<Variable>> createDialog(Shell shell) {
return new VariableListDialog(shell);
}
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/variable/VariableListDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/variable/VariableListDialog.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/variable/VariableListDialog.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -24,13 +24,13 @@
*
* @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
*/
-public class VariableListDialog extends EditListDialog {
+public class VariableListDialog extends EditListDialog<Variable> {
protected VariableListDialog(Shell parentShell) {
super(parentShell, "Variable List Editor", VariableDialog.class);
}
- protected Object createItem() {
+ protected Variable createItem() {
return new Variable();
}
}
Modified: labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELReceiveInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELReceiveInstance.java 2008-09-15 10:55:06 UTC (rev 22777)
+++ labs/jbossrules/trunk/drools-process/drools-bpel/src/main/java/org/drools/bpel/instance/BPELReceiveInstance.java 2008-09-15 13:20:33 UTC (rev 22778)
@@ -47,7 +47,7 @@
BPELLinkManager.activateTargetLinks(this);
}
- public void triggerEvent(String type, Object event) {
+ public void signalEvent(String type, Object event) {
this.event = true;
message = ((String[]) event)[3];
if (this.event && triggered) {
More information about the jboss-svn-commits
mailing list