[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