[jboss-svn-commits] JBL Code SVN: r16767 - in labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin: src/main/java/org/drools/eclipse and 13 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Nov 23 20:26:01 EST 2007


Author: KrisVerlaenen
Date: 2007-11-23 20:26:01 -0500 (Fri, 23 Nov 2007)
New Revision: 16767

Added:
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/icons/node-triggered.gif
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/WorkItemDefinitions.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/core/Process.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/WorkItemWrapper.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/WorkItemEditPart.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/task/
   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/task/TaskPropertyDescriptor.java
Modified:
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/DRLInfo.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/DroolsEclipsePlugin.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/DroolsPluginImages.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/builder/DroolsBuilder.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/core/DroolsElement.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/core/DroolsModelBuilder.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/core/Package.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/core/ui/DroolsLabelProvider.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/AuditView.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/core/DroolsLineBreakpoint.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/JoinWrapper.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/SubFlowWrapper.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/action/ActionDialog.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/preferences/IDroolsConstants.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/view/rules/RulesView.java
Log:
JBRULES-1342: Extend audit framework to support integrated rules and process logging
JBRULES-1343: WorkItems for communication between processes and outside world
JBRULES-1344: Discriminator join
JBRULES-1345: Subflow can specify whether this process should wait for its completion
JBRULES-1346: Extend Rules view with support for processes

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/icons/node-triggered.gif
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/icons/node-triggered.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/DRLInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/DRLInfo.java	2007-11-24 00:40:18 UTC (rev 16766)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/DRLInfo.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -6,7 +6,10 @@
 import java.util.List;
 
 import org.drools.compiler.Dialect;
+import org.drools.compiler.DialectRegistry;
 import org.drools.compiler.DroolsError;
+import org.drools.compiler.PackageBuilder;
+import org.drools.lang.descr.AttributeDescr;
 import org.drools.lang.descr.FunctionDescr;
 import org.drools.lang.descr.PackageDescr;
 import org.drools.lang.descr.RuleDescr;
@@ -27,8 +30,9 @@
 	// cached entry
 	private transient RuleInfo[] ruleInfos;
 	private transient FunctionInfo[] functionInfos;
+	private DialectRegistry dialectRegistry;
 
-	public DRLInfo(String sourcePathName, PackageDescr packageDescr, List parserErrors) {
+	public DRLInfo(String sourcePathName, PackageDescr packageDescr, List parserErrors, DialectRegistry dialectRegistry) {
 		if (sourcePathName == null || "".equals(sourcePathName)) {
 			throw new IllegalArgumentException("Invalid sourcePathName " + sourcePathName);
 		}
@@ -40,10 +44,11 @@
 		this.parserErrors =
 			parserErrors == null ? EMPTY_LIST : Collections.unmodifiableList(parserErrors);
 		this.builderErrors = EMPTY_DROOLS_ERROR_ARRAY;
+		this.dialectRegistry = dialectRegistry;
 	}
 
-	public DRLInfo(String pathName, PackageDescr packageDescr, List parserErrors, Package compiledPackage, DroolsError[] builderErrors) {
-		this(pathName, packageDescr, parserErrors);
+	public DRLInfo(String pathName, PackageDescr packageDescr, List parserErrors, Package compiledPackage, DroolsError[] builderErrors, DialectRegistry dialectRegistry) {
+		this(pathName, packageDescr, parserErrors, dialectRegistry);
 		if (compiledPackage == null) {
 			throw new IllegalArgumentException("Null package");
 		}
@@ -123,8 +128,33 @@
 			this.ruleDescr = ruleDescr;
 		}
 
+        public String getDialectName() {
+            String dialectName = null;
+            for (Iterator iterator = ruleDescr.getAttributes().iterator(); iterator.hasNext(); ) {
+                AttributeDescr attribute = (AttributeDescr) iterator.next();
+                if ("dialect".equals(attribute.getName())) {
+                    dialectName = (String) attribute.getValue();
+                    break;
+                }
+            }
+            if (dialectName == null) {
+                for (Iterator iterator = DRLInfo.this.packageDescr.getAttributes().iterator(); iterator.hasNext(); ) {
+                    AttributeDescr attribute = (AttributeDescr) iterator.next();
+                    if ("dialect".equals(attribute.getName())) {
+                        dialectName = (String) attribute.getValue();
+                        break;
+                    }
+                }
+            }
+            return dialectName;
+        }
+        
         public Dialect getDialect() {
-            return ruleDescr.getDialect();
+            String dialectName = getDialectName();
+            if (dialectName == null) {
+                return null;
+            }
+            return DRLInfo.this.dialectRegistry.getDialect(dialectName);
         }
 
 		public String getSourcePathName() {

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/DroolsEclipsePlugin.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/DroolsEclipsePlugin.java	2007-11-24 00:40:18 UTC (rev 16766)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/DroolsEclipsePlugin.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -221,6 +221,7 @@
 		store.setDefault(IDroolsConstants.BUILD_ALL, false);
 		store.setDefault(IDroolsConstants.EDITOR_FOLDING, true);
 		store.setDefault(IDroolsConstants.CACHE_PARSED_RULES, true);
+		store.setDefault(IDroolsConstants.DSL_RULE_EDITOR_COMPLETION_FULL_SENTENCES, true);
 	}
 	
 	public DRLInfo parseResource(IResource resource, boolean compile) throws DroolsParserException {
@@ -334,12 +335,10 @@
                 	}
                 	parserErrors = parser.getErrors();
                 }
-                PackageBuilder builder = null;
+                PackageBuilder builder = new PackageBuilder(builder_configuration);
         		DRLInfo result = null;
             	// compile parsed rules if necessary
             	if (compile && !parser.hasErrors()) {
-                    builder = new PackageBuilder(builder_configuration);
-
                     // check whether a .package file exists and add it
                     if (resource.getParent() != null) {
                     	MyResourceVisitor visitor = new MyResourceVisitor();
@@ -354,11 +353,11 @@
         			result = new DRLInfo(
 	    				resource.getProjectRelativePath().toString(),
 	    				packageDescr, parserErrors,
-	    				builder.getPackage(), builder.getErrors().getErrors());
+	    				builder.getPackage(), builder.getErrors().getErrors(), builder.getDialectRegistry());
         		} else {
         			result = new DRLInfo(
 	    				resource.getProjectRelativePath().toString(),
-	    				packageDescr, parserErrors);
+	    				packageDescr, parserErrors, builder.getDialectRegistry());
         		}
         		            		
             	// cache result

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/DroolsPluginImages.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/DroolsPluginImages.java	2007-11-24 00:40:18 UTC (rev 16766)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/DroolsPluginImages.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -54,6 +54,8 @@
     public static final String DSL = "DSL";
     public static final String GLOBAL = "Global";
     public static final String RULEFLOW = "RuleFlow";
+    public static final String RULEFLOW_GROUP = "RuleFlowGroup";
+    public static final String RULEFLOW_NODE_TRIGGERED = "RuleFlowNodeTriggered";
     
     private static ImageRegistry imageRegistry;
     private static final String PATH_SUFFIX = "/icons/";
@@ -86,6 +88,8 @@
         declareRegistryImage(DSL, "dsl.GIF");
         declareRegistryImage(GLOBAL, "field_public_obj.gif");
         declareRegistryImage(RULEFLOW, "process.gif");
+        declareRegistryImage(RULEFLOW_GROUP, "activity.gif");
+        declareRegistryImage(RULEFLOW_NODE_TRIGGERED, "node-triggered.gif");
     }
 
     /**

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/WorkItemDefinitions.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/WorkItemDefinitions.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/WorkItemDefinitions.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -0,0 +1,59 @@
+package org.drools.eclipse;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.ruleflow.common.core.WorkDefinition;
+import org.drools.ruleflow.common.core.impl.ParameterDefinitionImpl;
+import org.drools.ruleflow.common.core.impl.WorkDefinitionExtensionImpl;
+import org.drools.ruleflow.common.datatype.impl.type.StringDataType;
+
+public final class WorkItemDefinitions {
+    
+    private static Map workDefinitions = new HashMap();
+    
+    static {
+        // Email
+        WorkDefinitionExtensionImpl emailDefinition = new WorkDefinitionExtensionImpl();
+        emailDefinition.setName("Email");
+        emailDefinition.addParameter(new ParameterDefinitionImpl("From", new StringDataType()));
+        emailDefinition.addParameter(new ParameterDefinitionImpl("To", new StringDataType()));
+        emailDefinition.addParameter(new ParameterDefinitionImpl("Subject", new StringDataType()));
+        emailDefinition.addParameter(new ParameterDefinitionImpl("Text", new StringDataType()));
+        emailDefinition.setDisplayName("Email");
+        emailDefinition.setIcon("icons/import_statement.gif");
+        addWorkDefinition(emailDefinition);
+        // Log
+        WorkDefinitionExtensionImpl logDefinition = new WorkDefinitionExtensionImpl();
+        logDefinition.setName("Log");
+        logDefinition.addParameter(new ParameterDefinitionImpl("Message", new StringDataType()));
+        logDefinition.setDisplayName("Log");
+        logDefinition.setIcon("icons/open.gif");
+        addWorkDefinition(logDefinition);
+        // Order
+        WorkDefinitionExtensionImpl orderDefinition = new WorkDefinitionExtensionImpl();
+        orderDefinition.setName("Order");
+        orderDefinition.addParameter(new ParameterDefinitionImpl("OrderId", new StringDataType()));
+        orderDefinition.setDisplayName("Order");
+        orderDefinition.setIcon("icons/open.gif");
+        addWorkDefinition(orderDefinition);
+
+    }
+    
+    private WorkItemDefinitions() {
+    }
+    
+    private static void addWorkDefinition(WorkDefinition workDefinition) {
+        workDefinitions.put(workDefinition.getName(), workDefinition);
+    }
+    
+    public static Collection getWorkDefinitions() {
+        return workDefinitions.values();
+    }
+
+    public static WorkDefinition getWorkDefinition(String name) {
+        return (WorkDefinition) workDefinitions.get(name);
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/builder/DroolsBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/builder/DroolsBuilder.java	2007-11-24 00:40:18 UTC (rev 16766)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/builder/DroolsBuilder.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -24,7 +24,7 @@
 import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.ParserError;
 import org.drools.compiler.ProcessBuilder;
-import org.drools.compiler.RuleError;
+import org.drools.compiler.RuleBuildError;
 import org.drools.decisiontable.InputType;
 import org.drools.decisiontable.SpreadsheetCompiler;
 import org.drools.eclipse.DRLInfo;
@@ -349,9 +349,9 @@
         	DroolsError error = buildErrors[i];
         	if (error instanceof GlobalError) {
         		GlobalError globalError = (GlobalError) error;
-        		markers.add(new DroolsBuildMarker(globalError.getGlobal(), -1));
-        	} else if (error instanceof RuleError) {
-        		RuleError ruleError = (RuleError) error;
+        		markers.add(new DroolsBuildMarker("Global error: " + globalError.getGlobal(), -1));
+        	} else if (error instanceof RuleBuildError) {
+        	    RuleBuildError ruleError = (RuleBuildError) error;
         		// TODO try to retrieve line number (or even character start-end)
         		// disabled for now because line number are those of the rule class,
         		// not the rule file itself

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/core/DroolsElement.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/core/DroolsElement.java	2007-11-24 00:40:18 UTC (rev 16766)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/core/DroolsElement.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -22,6 +22,7 @@
 	public static final int GLOBAL = 7;
 	public static final int IMPORT = 8;
 	public static final int RULE_ATTRIBUTE = 9;
+    public static final int PROCESS = 10;
 	
 	protected static final DroolsElement[] NO_ELEMENTS = new DroolsElement[0];
 	

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/core/DroolsModelBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/core/DroolsModelBuilder.java	2007-11-24 00:40:18 UTC (rev 16766)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/core/DroolsModelBuilder.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -142,6 +142,20 @@
 		}
 	}
 	
+    public static Process addProcess(Package pkg, String processId, IFile file) {
+        Process process = new Process(pkg, processId);
+        process.setFile(file, -1, -1);
+        pkg.addProcess(process);
+        return process;
+    }
+
+    public static void removeProcess(Process process) {
+        Package pkg = process.getParentPackage();
+        if (pkg != null) {
+            pkg.removeProcess(process);
+        }
+    }
+
 	public static void removeElement(DroolsElement element) {
 		switch (element.getType()) {
 			case DroolsElement.RULESET:
@@ -152,23 +166,39 @@
 				break;
 			case DroolsElement.RULE:
 				removeRule((Rule) element);
+				removePackageIfEmpty(((Rule) element).getParentPackage());
 				break;
 			case DroolsElement.QUERY:
 				removeQuery((Query) element);
+                removePackageIfEmpty(((Query) element).getParentPackage());
 				break;
 			case DroolsElement.FUNCTION:
 				removeFunction((Function) element);
+                removePackageIfEmpty(((Function) element).getParentPackage());
 				break;
 			case DroolsElement.TEMPLATE:
 				removeTemplate((Template) element);
+                removePackageIfEmpty(((Template) element).getParentPackage());
 				break;
 			case DroolsElement.EXPANDER:
 				removeExpander((Expander) element);
+                removePackageIfEmpty(((Expander) element).getParentPackage());
 				break;
 			case DroolsElement.GLOBAL:
 				removeGlobal((Global) element);
+                removePackageIfEmpty(((Global) element).getParentPackage());
 				break;
+            case DroolsElement.PROCESS:
+                removeProcess((Process) element);
+                removePackageIfEmpty(((Process) element).getParentPackage());
+                break;
 		}
 	}
+	
+	private static void removePackageIfEmpty(Package pkg) {
+	    if (pkg.getChildren().length == 0) {
+	        removePackage(pkg);
+	    }
+	}
 
 }

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/core/Package.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/core/Package.java	2007-11-24 00:40:18 UTC (rev 16766)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/core/Package.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -18,6 +18,7 @@
 	private List globals = new ArrayList();
 	private List queries = new ArrayList();
 	private List templates = new ArrayList();
+	private List processes = new ArrayList();
 
 	Package(RuleSet parent, String packageName) {
 		super(parent);
@@ -46,6 +47,7 @@
 		children.addAll(expanders);
 		children.addAll(imports);
 		children.addAll(templates);
+		children.addAll(processes);
 		return (DroolsElement[]) children.toArray(new DroolsElement[0]);
 	}
 
@@ -112,4 +114,12 @@
 		templates.remove(template);
 	}
 	
+    void addProcess(Process process) {
+        processes.add(process);
+    }
+    
+    void removeProcess(Process process) {
+        processes.remove(process);
+    }
+    
 }

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/core/Process.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/core/Process.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/core/Process.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -0,0 +1,37 @@
+package org.drools.eclipse.core;
+
+/**
+ * This represents a function. 
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">kris verlaenen </a>
+ */
+public class Process extends DroolsElement {
+
+    private final String processId;
+
+    Process(Package parent, String processId) {
+        super(parent);
+        this.processId = processId;
+    }
+    
+	public Package getParentPackage() {
+		return (Package) getParent();
+	}
+	
+    public String getProcessId() {
+    	return processId;
+    }
+
+	public int getType() {
+		return PROCESS;
+	}
+	
+	public DroolsElement[] getChildren() {
+		return NO_ELEMENTS;
+	}
+
+	public String toString() {
+		return processId;
+	}
+
+}

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/core/ui/DroolsLabelProvider.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/core/ui/DroolsLabelProvider.java	2007-11-24 00:40:18 UTC (rev 16766)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/core/ui/DroolsLabelProvider.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -8,16 +8,17 @@
 public class DroolsLabelProvider extends LabelProvider {
 
 	private static final String[] ICONS = new String[] {
-		DroolsPluginImages.PACKAGE,	// ruleset
-		DroolsPluginImages.PACKAGE,	// package
-		DroolsPluginImages.DROOLS, 	// rule
-		DroolsPluginImages.DROOLS, 	// query
-		DroolsPluginImages.METHOD, 	// function
-		DroolsPluginImages.CLASS, 	// template
-		DroolsPluginImages.DSL, 	// expander
-		DroolsPluginImages.GLOBAL, 	// global
-		DroolsPluginImages.IMPORT, 	// import
-		DroolsPluginImages.DROOLS, 	// rule attribute
+		DroolsPluginImages.PACKAGE,	 // ruleset
+		DroolsPluginImages.PACKAGE,  // package
+		DroolsPluginImages.DROOLS, 	 // rule
+		DroolsPluginImages.DROOLS, 	 // query
+		DroolsPluginImages.METHOD, 	 // function
+		DroolsPluginImages.CLASS, 	 // template
+		DroolsPluginImages.DSL, 	 // expander
+		DroolsPluginImages.GLOBAL, 	 // global
+		DroolsPluginImages.IMPORT, 	 // import
+		DroolsPluginImages.DROOLS, 	 // rule attribute
+        DroolsPluginImages.RULEFLOW, // process
 	};
 	
     public Image getImage(Object element) {

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/AuditView.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/AuditView.java	2007-11-24 00:40:18 UTC (rev 16766)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/AuditView.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -10,6 +10,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Stack;
 
 import org.drools.audit.event.ActivationLogEvent;
 import org.drools.audit.event.LogEvent;
@@ -17,6 +18,7 @@
 import org.drools.audit.event.RuleBaseLogEvent;
 import org.drools.audit.event.RuleFlowGroupLogEvent;
 import org.drools.audit.event.RuleFlowLogEvent;
+import org.drools.audit.event.RuleFlowNodeLogEvent;
 import org.drools.eclipse.DroolsEclipsePlugin;
 import org.drools.eclipse.DroolsPluginImages;
 import org.drools.eclipse.debug.actions.DeleteLogAction;
@@ -100,8 +102,7 @@
     protected List createEventList(List logEvents) {
 		Iterator iterator = logEvents.iterator();
 		List events = new ArrayList();
-		Event currentBeforeActivationEvent = null;
-		Event currentBeforePackageEvent = null;
+		Stack beforeEvents = new Stack();
 		List newActivations = new ArrayList();
 		Map activationMap = new HashMap();
 		Map objectMap = new HashMap();
@@ -112,8 +113,8 @@
 				case LogEvent.INSERTED:
 					ObjectLogEvent inObjectEvent = (ObjectLogEvent) inEvent;
 					event.setString("Object inserted (" + inObjectEvent.getFactId() + "): " + inObjectEvent.getObjectToString());
-					if (currentBeforeActivationEvent != null) {
-						currentBeforeActivationEvent.addSubEvent(event);
+					if (!beforeEvents.isEmpty()) {
+						((Event) beforeEvents.peek()).addSubEvent(event);
 					} else {
 						events.add(event);
 					}
@@ -124,8 +125,8 @@
 				case LogEvent.UPDATED:
 					inObjectEvent = (ObjectLogEvent) inEvent;
 					event.setString("Object updated (" + inObjectEvent.getFactId() + "): " + inObjectEvent.getObjectToString());
-					if (currentBeforeActivationEvent != null) {
-						currentBeforeActivationEvent.addSubEvent(event);
+					if (!beforeEvents.isEmpty()) {
+                        ((Event) beforeEvents.peek()).addSubEvent(event);
 					} else {
 						events.add(event);
 					}
@@ -139,8 +140,8 @@
 				case LogEvent.RETRACTED:
 					inObjectEvent = (ObjectLogEvent) inEvent;
 					event.setString("Object removed (" + inObjectEvent.getFactId() + "): " + inObjectEvent.getObjectToString());
-					if (currentBeforeActivationEvent != null) {
-						currentBeforeActivationEvent.addSubEvent(event);
+					if (!beforeEvents.isEmpty()) {
+                        ((Event) beforeEvents.peek()).addSubEvent(event);
 					} else {
 						events.add(event);
 					}
@@ -167,99 +168,134 @@
 					inActivationEvent = (ActivationLogEvent) inEvent;
 					event.setString("Activation executed: Rule " + inActivationEvent.getRule() + " " + inActivationEvent.getDeclarations());
 					events.add(event);
-					currentBeforeActivationEvent = event;
+					beforeEvents.push(event);
 					event.setCauseEvent((Event) activationMap.get(((ActivationLogEvent) inEvent).getActivationId()));
 					break;
 				case LogEvent.AFTER_ACTIVATION_FIRE:
-					currentBeforeActivationEvent = null;
+				    beforeEvents.pop();
 					break;
-				case LogEvent.RULEFLOW_CREATED:
+				case LogEvent.BEFORE_RULEFLOW_CREATED:
 					RuleFlowLogEvent inRuleFlowEvent = (RuleFlowLogEvent) inEvent;
 					event.setString("RuleFlow started: " + inRuleFlowEvent.getProcessName() + "[" + inRuleFlowEvent.getProcessId() + "]");
-					if (currentBeforeActivationEvent != null) {
-						currentBeforeActivationEvent.addSubEvent(event);
+					if (!beforeEvents.isEmpty()) {
+                        ((Event) beforeEvents.peek()).addSubEvent(event);
 					} else {
 						events.add(event);
 					}
+                    beforeEvents.push(event);
 					break;
-				case LogEvent.RULEFLOW_COMPLETED:
+                case LogEvent.AFTER_RULEFLOW_CREATED:
+                    beforeEvents.pop();
+                    break;
+				case LogEvent.BEFORE_RULEFLOW_COMPLETED:
 					inRuleFlowEvent = (RuleFlowLogEvent) inEvent;
 					event.setString("RuleFlow completed: " + inRuleFlowEvent.getProcessName() + "[" + inRuleFlowEvent.getProcessId() + "]");
-					if (currentBeforeActivationEvent != null) {
-						currentBeforeActivationEvent.addSubEvent(event);
+					if (!beforeEvents.isEmpty()) {
+                        ((Event) beforeEvents.peek()).addSubEvent(event);
 					} else {
 						events.add(event);
 					}
+                    beforeEvents.push(event);
 					break;
-				case LogEvent.RULEFLOW_GROUP_ACTIVATED:
+                case LogEvent.AFTER_RULEFLOW_COMPLETED:
+                    beforeEvents.pop();
+                    break;
+                case LogEvent.BEFORE_RULEFLOW_NODE_TRIGGERED:
+                    RuleFlowNodeLogEvent inRuleFlowNodeEvent = (RuleFlowNodeLogEvent) inEvent;
+                    event.setString("RuleFlow node triggered: " + inRuleFlowNodeEvent.getNodeName() + " in process " + inRuleFlowNodeEvent.getProcessName() + "[" + inRuleFlowNodeEvent.getProcessId() + "]");
+                    if (!beforeEvents.isEmpty()) {
+                        ((Event) beforeEvents.peek()).addSubEvent(event);
+                    } else {
+                        events.add(event);
+                    }
+                    beforeEvents.push(event);
+                    break;
+                case LogEvent.AFTER_RULEFLOW_NODE_TRIGGERED:
+                    beforeEvents.pop();
+                    break;
+				case LogEvent.BEFORE_RULEFLOW_GROUP_ACTIVATED:
 					RuleFlowGroupLogEvent inRuleFlowGroupEvent = (RuleFlowGroupLogEvent) inEvent;
 					event.setString("RuleFlowGroup activated: " + inRuleFlowGroupEvent.getGroupName() + "[size=" + inRuleFlowGroupEvent.getSize() + "]");
-					if (currentBeforeActivationEvent != null) {
-						currentBeforeActivationEvent.addSubEvent(event);
+					if (!beforeEvents.isEmpty()) {
+                        ((Event) beforeEvents.peek()).addSubEvent(event);
 					} else {
 						events.add(event);
 					}
-					break;
-				case LogEvent.RULEFLOW_GROUP_DEACTIVATED:
+					beforeEvents.push(event);
+                    break;
+                case LogEvent.AFTER_RULEFLOW_GROUP_ACTIVATED:
+                    beforeEvents.pop();
+                    break;
+				case LogEvent.BEFORE_RULEFLOW_GROUP_DEACTIVATED:
 					inRuleFlowGroupEvent = (RuleFlowGroupLogEvent) inEvent;
 					event.setString("RuleFlowGroup deactivated: " + inRuleFlowGroupEvent.getGroupName() + "[size=" + inRuleFlowGroupEvent.getSize() + "]");
-					if (currentBeforeActivationEvent != null) {
-						currentBeforeActivationEvent.addSubEvent(event);
+					if (!beforeEvents.isEmpty()) {
+                        ((Event) beforeEvents.peek()).addSubEvent(event);
 					} else {
 						events.add(event);
 					}
-					break;
+                    beforeEvents.push(event);
+                    break;
+                case LogEvent.AFTER_RULEFLOW_GROUP_DEACTIVATED:
+                    beforeEvents.pop();
+                    break;
 				case LogEvent.BEFORE_PACKAGE_ADDED:
 					RuleBaseLogEvent ruleBaseEvent = (RuleBaseLogEvent) inEvent;
 					event.setString("Package added: " + ruleBaseEvent.getPackageName());
-					if (currentBeforeActivationEvent != null) {
-						currentBeforeActivationEvent.addSubEvent(event);
+					if (!beforeEvents.isEmpty()) {
+                        ((Event) beforeEvents.peek()).addSubEvent(event);
 					} else {
 						events.add(event);
 					}
-					currentBeforePackageEvent = event;
+                    beforeEvents.push(event);
 					break;
 				case LogEvent.AFTER_PACKAGE_ADDED:
-					currentBeforePackageEvent = null;
+                    beforeEvents.pop();
 					break;
 				case LogEvent.BEFORE_PACKAGE_REMOVED:
 					ruleBaseEvent = (RuleBaseLogEvent) inEvent;
 					event.setString("Package removed: " + ruleBaseEvent.getPackageName());
-					if (currentBeforeActivationEvent != null) {
-						currentBeforeActivationEvent.addSubEvent(event);
+					if (!beforeEvents.isEmpty()) {
+                        ((Event) beforeEvents.peek()).addSubEvent(event);
 					} else {
 						events.add(event);
 					}
-					currentBeforePackageEvent = event;
+                    beforeEvents.push(event);
 					break;
 				case LogEvent.AFTER_PACKAGE_REMOVED:
-					currentBeforePackageEvent = null;
+                    beforeEvents.pop();
 					break;
-				case LogEvent.AFTER_RULE_ADDED:
+                case LogEvent.BEFORE_RULE_ADDED:
 					ruleBaseEvent = (RuleBaseLogEvent) inEvent;
 					event.setString("Rule added: " + ruleBaseEvent.getRuleName());
-					if (currentBeforePackageEvent != null) {
-						currentBeforePackageEvent.addSubEvent(event);
-					} else if (currentBeforeActivationEvent != null) {
-						currentBeforeActivationEvent.addSubEvent(event);
+					if (!beforeEvents.isEmpty()) {
+                        ((Event) beforeEvents.peek()).addSubEvent(event);
 					} else {
 						events.add(event);
 					}
-					event.addSubEvents(newActivations);
-					newActivations.clear();
 					break;
-				case LogEvent.AFTER_RULE_REMOVED:
+                case LogEvent.AFTER_RULE_ADDED:
+                    if (!beforeEvents.isEmpty()) {
+                        Event beforeEvent = (Event) beforeEvents.pop();
+                        beforeEvent.addSubEvents(newActivations);
+                        newActivations.clear();
+                    }
+                    break;
+				case LogEvent.BEFORE_RULE_REMOVED:
 					ruleBaseEvent = (RuleBaseLogEvent) inEvent;
 					event.setString("Rule removed: " + ruleBaseEvent.getRuleName());
-					if (currentBeforePackageEvent != null) {
-						currentBeforePackageEvent.addSubEvent(event);
-					} else if (currentBeforeActivationEvent != null) {
-						currentBeforeActivationEvent.addSubEvent(event);
+					if (!beforeEvents.isEmpty()) {
+                        ((Event) beforeEvents.peek()).addSubEvent(event);
 					} else {
 						events.add(event);
 					}
-					event.addSubEvents(newActivations);
-					newActivations.clear();
+                    break;
+                case LogEvent.AFTER_RULE_REMOVED:
+                    if (!beforeEvents.isEmpty()) {
+                        Event beforeEvent = (Event) beforeEvents.pop();
+                        beforeEvent.addSubEvents(newActivations);
+    					newActivations.clear();
+                    }
 					break;
 			}
 		}
@@ -424,14 +460,15 @@
 	    			case LogEvent.ACTIVATION_CREATED: return DroolsPluginImages.getImage(DroolsPluginImages.CREATE_ACTIVATION);
 	    			case LogEvent.ACTIVATION_CANCELLED: return DroolsPluginImages.getImage(DroolsPluginImages.CANCEL_ACTIVATION);
 	    			case LogEvent.BEFORE_ACTIVATION_FIRE: return DroolsPluginImages.getImage(DroolsPluginImages.EXECUTE_ACTIVATION);
-	    			case LogEvent.RULEFLOW_CREATED: return DroolsPluginImages.getImage(DroolsPluginImages.RULEFLOW);
-	    			case LogEvent.RULEFLOW_COMPLETED: return DroolsPluginImages.getImage(DroolsPluginImages.RULEFLOW);
-	    			case LogEvent.RULEFLOW_GROUP_ACTIVATED: return DroolsPluginImages.getImage(DroolsPluginImages.RULEFLOW);
-	    			case LogEvent.RULEFLOW_GROUP_DEACTIVATED: return DroolsPluginImages.getImage(DroolsPluginImages.RULEFLOW);
+	    			case LogEvent.BEFORE_RULEFLOW_CREATED: return DroolsPluginImages.getImage(DroolsPluginImages.RULEFLOW);
+	    			case LogEvent.BEFORE_RULEFLOW_COMPLETED: return DroolsPluginImages.getImage(DroolsPluginImages.RULEFLOW);
+                    case LogEvent.BEFORE_RULEFLOW_NODE_TRIGGERED: return DroolsPluginImages.getImage(DroolsPluginImages.RULEFLOW_NODE_TRIGGERED);
+	    			case LogEvent.BEFORE_RULEFLOW_GROUP_ACTIVATED: return DroolsPluginImages.getImage(DroolsPluginImages.RULEFLOW_GROUP);
+	    			case LogEvent.BEFORE_RULEFLOW_GROUP_DEACTIVATED: return DroolsPluginImages.getImage(DroolsPluginImages.RULEFLOW_GROUP);
 	    			case LogEvent.BEFORE_PACKAGE_ADDED: return DroolsPluginImages.getImage(DroolsPluginImages.DROOLS);
 	    			case LogEvent.BEFORE_PACKAGE_REMOVED: return DroolsPluginImages.getImage(DroolsPluginImages.DROOLS);
-	    			case LogEvent.AFTER_RULE_ADDED: return DroolsPluginImages.getImage(DroolsPluginImages.DROOLS);
-	    			case LogEvent.AFTER_RULE_REMOVED: return DroolsPluginImages.getImage(DroolsPluginImages.DROOLS);
+	    			case LogEvent.BEFORE_RULE_ADDED: return DroolsPluginImages.getImage(DroolsPluginImages.DROOLS);
+	    			case LogEvent.BEFORE_RULE_REMOVED: return DroolsPluginImages.getImage(DroolsPluginImages.DROOLS);
 	    		}
 	    		return null;
 	    	}

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/core/DroolsLineBreakpoint.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/core/DroolsLineBreakpoint.java	2007-11-24 00:40:18 UTC (rev 16766)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/core/DroolsLineBreakpoint.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -102,7 +102,7 @@
 
     private String getDialect(DRLInfo info, int drlLineNumber) {
         if ( info != null ) {
-            return info.getRuleInfo( drlLineNumber ).getDialect().getId();
+            return info.getRuleInfo( drlLineNumber ).getDialectName();
         }
         return null;
     }
@@ -130,7 +130,7 @@
 
                     int line = ruleInfo.getConsequenceJavaLineNumber()
                                         	+ (lineNumber - ruleInfo.getConsequenceDrlLineNumber());
-                    if (ruleInfo.getDialect().getId().equals( MVELDialect.ID )) {
+                    if (ruleInfo.getDialectName().equals( MVELDialect.ID )) {
                         return line;
                     }
                     return line+1;

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/JoinWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/JoinWrapper.java	2007-11-24 00:40:18 UTC (rev 16766)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/JoinWrapper.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -38,7 +38,7 @@
         descriptors = new IPropertyDescriptor[DefaultElementWrapper.descriptors.length + 1];
         System.arraycopy(DefaultElementWrapper.descriptors, 0, descriptors, 0, DefaultElementWrapper.descriptors.length);
         descriptors[descriptors.length - 1] = 
-            new ComboBoxPropertyDescriptor(TYPE, "Type", new String[] { "", "AND", "XOR" });
+            new ComboBoxPropertyDescriptor(TYPE, "Type", new String[] { "", "AND", "XOR", "Discriminator" });
     }
     
     public JoinWrapper() {

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/SubFlowWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/SubFlowWrapper.java	2007-11-24 00:40:18 UTC (rev 16766)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/SubFlowWrapper.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -19,6 +19,7 @@
 import org.drools.eclipse.flow.common.editor.core.ElementConnection;
 import org.drools.ruleflow.core.SubFlowNode;
 import org.drools.ruleflow.core.impl.SubFlowNodeImpl;
+import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
 import org.eclipse.ui.views.properties.IPropertyDescriptor;
 import org.eclipse.ui.views.properties.TextPropertyDescriptor;
 
@@ -33,12 +34,15 @@
     private static IPropertyDescriptor[] descriptors;
     
     public static final String PROCESS_ID = "ProcessId";
+    public static final String WAIT_FOR_COMPLETION = "WaitForCompletion";
 
     static {
-        descriptors = new IPropertyDescriptor[DefaultElementWrapper.descriptors.length + 1];
+        descriptors = new IPropertyDescriptor[DefaultElementWrapper.descriptors.length + 2];
         System.arraycopy(DefaultElementWrapper.descriptors, 0, descriptors, 0, DefaultElementWrapper.descriptors.length);
+        descriptors[descriptors.length - 2] = 
+        	new TextPropertyDescriptor(PROCESS_ID, "ProcessId");
         descriptors[descriptors.length - 1] = 
-        	new TextPropertyDescriptor(PROCESS_ID, "ProcessId");
+            new ComboBoxPropertyDescriptor(WAIT_FOR_COMPLETION, "Wait for completion", new String[] {"true", "false"});
     }
     
     public SubFlowWrapper() {
@@ -67,12 +71,17 @@
         	String processId = getSubFlowNode().getProcessId();
             return processId == null ? "" : processId;
         }
+        if (WAIT_FOR_COMPLETION.equals(id)) {
+            return getSubFlowNode().isWaitForCompletion() ? new Integer(0) : new Integer(1);
+        }
         return super.getPropertyValue(id);
     }
 
     public void resetPropertyValue(Object id) {
         if (PROCESS_ID.equals(id)) {
         	getSubFlowNode().setProcessId("");
+        } else if (WAIT_FOR_COMPLETION.equals(id)) {
+            getSubFlowNode().setWaitForCompletion(true);
         } else {
             super.resetPropertyValue(id);
         }
@@ -81,6 +90,8 @@
     public void setPropertyValue(Object id, Object value) {
         if (PROCESS_ID.equals(id)) {
         	getSubFlowNode().setProcessId((String) value);
+        } else if (WAIT_FOR_COMPLETION.equals(id)) {
+            getSubFlowNode().setWaitForCompletion(((Integer) value).intValue() == 0);
         } else {
             super.setPropertyValue(id, value);
         }

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/WorkItemWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/WorkItemWrapper.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/WorkItemWrapper.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -0,0 +1,131 @@
+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 java.util.Iterator;
+import java.util.Set;
+
+import org.drools.eclipse.WorkItemDefinitions;
+import org.drools.eclipse.flow.common.editor.core.DefaultElementWrapper;
+import org.drools.eclipse.flow.common.editor.core.ElementConnection;
+import org.drools.ruleflow.common.core.ParameterDefinition;
+import org.drools.ruleflow.common.core.Work;
+import org.drools.ruleflow.common.core.WorkDefinition;
+import org.drools.ruleflow.core.WorkItemNode;
+import org.drools.ruleflow.core.impl.WorkItemNodeImpl;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+
+/**
+ * Wrapper for a task node.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class WorkItemWrapper extends NodeWrapper {
+
+    public static final String TASK = "Task";
+    
+	private static final long serialVersionUID = -3618183280436588589L;
+
+	private IPropertyDescriptor[] descriptors;
+
+    public WorkItemWrapper() {
+        setNode(new WorkItemNodeImpl());
+    }
+    
+    public WorkItemNode getWorkItemNode() {
+        return (WorkItemNode) getNode();
+    }
+    
+    private WorkDefinition getWorkDefinition() {
+        Work work = getWorkItemNode().getWork();
+        if (work != null && work.getName() != null) {
+            return WorkItemDefinitions.getWorkDefinition(work.getName());
+        }
+        return null;
+    }
+    
+    private boolean workParameterExists(String parameterName) {
+        WorkDefinition workDefinition = getWorkDefinition();
+        if (workDefinition != null) {
+            return workDefinition.getParameter(parameterName) != null;
+        }
+        return false;
+    }
+    
+    private void setDescriptors() {
+        WorkDefinition workDefinition = getWorkDefinition();
+        if (workDefinition != null) {
+            Set parameters = workDefinition.getParameters();
+            descriptors = new IPropertyDescriptor[DefaultElementWrapper.descriptors.length + parameters.size()];
+            System.arraycopy(DefaultElementWrapper.descriptors, 0, descriptors, 0, DefaultElementWrapper.descriptors.length);
+            int i = 0;
+            for (Iterator iterator = parameters.iterator(); iterator.hasNext(); ) {
+                ParameterDefinition def = (ParameterDefinition) iterator.next();
+                descriptors[descriptors.length - parameters.size() + (i++)] = 
+                    new TextPropertyDescriptor(def.getName(), def.getName());
+            }
+        }
+        if (descriptors == null) {
+            descriptors = DefaultElementWrapper.descriptors;
+        }
+    }
+    
+    public IPropertyDescriptor[] getPropertyDescriptors() {
+        if (descriptors == null) {
+            setDescriptors();
+        }
+    	return descriptors;
+    }
+
+    public boolean acceptsIncomingConnection(ElementConnection connection) {
+        return getIncomingConnections().isEmpty();
+    }
+
+    public boolean acceptsOutgoingConnection(ElementConnection connection) {
+        return getOutgoingConnections().isEmpty();
+    }
+    
+    public Object getPropertyValue(Object id) {
+        if (id instanceof String) {
+            String name = (String) id;
+            if (workParameterExists(name)) {
+            	Object value = getWorkItemNode().getWork().getParameter(name);
+            	if (value instanceof String) {
+            	    return value;
+            	}
+            	return "";
+            }
+        }
+        return super.getPropertyValue(id);
+    }
+
+    public void resetPropertyValue(Object id) {
+        if (id instanceof String && workParameterExists((String) id)) {
+            getWorkItemNode().getWork().setParameter((String) id, null);
+        } else {
+            super.resetPropertyValue(id);
+        }
+    }
+
+    public void setPropertyValue(Object id, Object value) {
+        if (id instanceof String && workParameterExists((String) id)) {
+            getWorkItemNode().getWork().setParameter((String) id, value);
+        } else {
+            super.setPropertyValue(id, value);
+        }
+    }
+}

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	2007-11-24 00:40:18 UTC (rev 16766)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/RuleFlowPaletteFactory.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -16,9 +16,11 @@
  */
 
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 
 import org.drools.eclipse.DroolsEclipsePlugin;
+import org.drools.eclipse.WorkItemDefinitions;
 import org.drools.eclipse.flow.common.editor.core.ElementConnectionFactory;
 import org.drools.eclipse.flow.ruleflow.core.ActionWrapper;
 import org.drools.eclipse.flow.ruleflow.core.ConnectionWrapper;
@@ -30,6 +32,10 @@
 import org.drools.eclipse.flow.ruleflow.core.SplitWrapper;
 import org.drools.eclipse.flow.ruleflow.core.StartNodeWrapper;
 import org.drools.eclipse.flow.ruleflow.core.SubFlowWrapper;
+import org.drools.eclipse.flow.ruleflow.core.WorkItemWrapper;
+import org.drools.ruleflow.common.core.WorkDefinition;
+import org.drools.ruleflow.common.core.WorkDefinitionExtension;
+import org.drools.ruleflow.common.core.impl.WorkImpl;
 import org.drools.ruleflow.core.Connection;
 import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
 import org.eclipse.gef.palette.ConnectionCreationToolEntry;
@@ -61,6 +67,7 @@
         List categories = new ArrayList();
         categories.add(createControlGroup(root));
         categories.add(createComponentsDrawer());
+        categories.add(createTaskNodesDrawer());
         return categories;
     }
 
@@ -141,19 +148,63 @@
         entries.add(combined);
                                 
         combined = new CombinedTemplateCreationEntry(
-                "Action",
-                "Create a new Action",
-                ActionWrapper.class,
-                new SimpleFactory(ActionWrapper.class),
-                ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/action.gif")), 
-                ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/action.gif"))
+            "Action",
+            "Create a new Action",
+            ActionWrapper.class,
+            new SimpleFactory(ActionWrapper.class),
+            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/action.gif")), 
+            ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry("icons/action.gif"))
+        );
+        entries.add(combined);
+                      
+        drawer.addAll(entries);
+        return drawer;
+    }
+    
+    private static PaletteContainer createTaskNodesDrawer() {
+
+        PaletteDrawer drawer = new PaletteDrawer("Work Items", null);
+
+        List entries = new ArrayList();
+
+        for (Iterator iterator = WorkItemDefinitions.getWorkDefinitions().iterator(); iterator.hasNext(); ) {
+            final WorkDefinition workDefinition = (WorkDefinition) iterator.next();
+            final String label;
+            String description = workDefinition.getName();
+            String icon = null;
+            if (workDefinition instanceof WorkDefinitionExtension) {
+                WorkDefinitionExtension extension = (WorkDefinitionExtension) workDefinition;
+                label = extension.getDisplayName();
+                description = extension.getExplanationText();
+                icon = extension.getIcon();
+            } else {
+                label = workDefinition.getName();
+            }
+            
+            CombinedTemplateCreationEntry combined = new CombinedTemplateCreationEntry(
+                label,
+                description,
+                WorkItemWrapper.class,
+                new SimpleFactory(WorkItemWrapper.class) {
+                    public Object getNewObject() {
+                        WorkItemWrapper taskWrapper = (WorkItemWrapper) super.getNewObject();
+                        taskWrapper.setName(label);
+                        taskWrapper.getWorkItemNode().setName(label);
+                        taskWrapper.getWorkItemNode().setWork(new WorkImpl());
+                        taskWrapper.getWorkItemNode().getWork().setName(workDefinition.getName());
+                        return taskWrapper;
+                    }
+                },
+                ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry(icon == null? "icons/action.gif" : icon)), 
+                ImageDescriptor.createFromURL(DroolsEclipsePlugin.getDefault().getBundle().getEntry(icon == null? "icons/action.gif" : icon))
             );
             entries.add(combined);
-                                    
+        }
+                                        
         drawer.addAll(entries);
         return drawer;
     }
-
+    
     private static PaletteContainer createControlGroup(PaletteRoot root) {
         PaletteGroup controlGroup = new PaletteGroup("Control Group");
 

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	2007-11-24 00:40:18 UTC (rev 16766)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/RuleFlowEditPartFactory.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -26,6 +26,7 @@
 import org.drools.eclipse.flow.ruleflow.core.SplitWrapper;
 import org.drools.eclipse.flow.ruleflow.core.StartNodeWrapper;
 import org.drools.eclipse.flow.ruleflow.core.SubFlowWrapper;
+import org.drools.eclipse.flow.ruleflow.core.WorkItemWrapper;
 import org.eclipse.gef.EditPart;
 import org.eclipse.gef.EditPartFactory;
 
@@ -58,6 +59,8 @@
             result = new SubFlowEditPart();
         } else if (model instanceof ActionWrapper) {
             result = new ActionEditPart();
+        } else if (model instanceof WorkItemWrapper) {
+            result = new WorkItemEditPart();
         } else {
             throw new IllegalArgumentException(
                 "Unknown model object " + model);

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/WorkItemEditPart.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/WorkItemEditPart.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/WorkItemEditPart.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -0,0 +1,84 @@
+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.WorkItemDefinitions;
+import org.drools.eclipse.flow.common.editor.editpart.ElementEditPart;
+import org.drools.eclipse.flow.common.editor.editpart.figure.ElementFigure;
+import org.drools.eclipse.flow.ruleflow.core.WorkItemWrapper;
+import org.drools.ruleflow.common.core.WorkDefinition;
+import org.drools.ruleflow.common.core.WorkDefinitionExtension;
+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.widgets.Display;
+
+/**
+ * EditPart for a Task node.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class WorkItemEditPart extends ElementEditPart {
+
+    private static final Color color = new Color(Display.getCurrent(), 255, 250, 205);
+    
+    protected IFigure createFigure() {
+        String icon = null;
+        String taskName = ((WorkItemWrapper) getElementWrapper()).getWorkItemNode().getWork().getName();
+        WorkDefinition workDefinition = WorkItemDefinitions.getWorkDefinition(taskName);
+        if (workDefinition instanceof WorkDefinitionExtension) {
+            icon = ((WorkDefinitionExtension) workDefinition).getIcon();
+        }
+        if (icon == null) {
+            icon = "icons/action.gif";
+        }
+        return new TaskNodeFigure(icon);
+    }
+    
+    public static class TaskNodeFigure extends ElementFigure {
+        
+        public TaskNodeFigure(String icon) {
+            setIcon(ImageDescriptor.createFromURL(
+                DroolsEclipsePlugin.getDefault().getBundle().getEntry(icon)).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);
+        }
+        
+        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/view/property/action/ActionDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/action/ActionDialog.java	2007-11-24 00:40:18 UTC (rev 16766)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/action/ActionDialog.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -25,6 +25,7 @@
 import org.drools.ruleflow.core.ActionNode;
 import org.drools.ruleflow.core.RuleFlowProcess;
 import org.drools.ruleflow.core.impl.DroolsConsequenceAction;
+import org.drools.util.ArrayUtils;
 import org.eclipse.jface.resource.JFaceResources;
 import org.eclipse.jface.text.Document;
 import org.eclipse.jface.text.IDocument;
@@ -41,8 +42,10 @@
 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;
@@ -54,9 +57,12 @@
  */
 public class ActionDialog extends EditBeanDialog {
 
+    private static final String[] DIALECTS = new String[] { "mvel", "java" };
+    
 	private RuleFlowProcess process;
 	private TabFolder tabFolder;
 	private SourceViewer actionViewer;
+	private Combo dialectCombo;
 	//private ActionCompletionProcessor completionProcessor;
 
 	public ActionDialog(Shell parentShell, RuleFlowProcess process, ActionNode actionNode) {
@@ -124,8 +130,26 @@
 		return actionViewer.getControl();
 	}
 	
+	private Control createDialectCombo(Composite parent) {
+	    dialectCombo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
+	    dialectCombo.setItems(DIALECTS);
+	    Object action = getValue();
+	    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);
+	    return dialectCombo;
+	}
+	
 	private Object getAction() {
-		return new DroolsConsequenceAction(actionViewer.getDocument().get());
+		return new DroolsConsequenceAction(
+	        dialectCombo.getItem(dialectCombo.getSelectionIndex()),
+	        actionViewer.getDocument().get());
 	}
 	
 	public Control createDialogArea(Composite parent) {
@@ -140,9 +164,13 @@
 		top.setLayoutData(gd);
 
 		layout = new GridLayout();
-		layout.numColumns = 3;
+		layout.numColumns = 4;
 		top.setLayout(layout);
-
+		
+		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());
@@ -151,9 +179,7 @@
 				importButtonPressed();
 			}
 		});
-		gd = new GridData();
-		importButton.setLayoutData(gd);
-
+		
 		Button globalButton = new Button(top, SWT.PUSH);
 		globalButton.setText("Globals ...");
 		globalButton.setFont(JFaceResources.getDialogFont());
@@ -162,9 +188,7 @@
 				globalButtonPressed();
 			}
 		});
-		gd = new GridData();
-		globalButton.setLayoutData(gd);
-
+		
 		tabFolder = new TabFolder(parent, SWT.NONE);
 		gd = new GridData();
 		gd.horizontalSpan = 3;

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/task/TaskCellEditor.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -0,0 +1,38 @@
+package org.drools.eclipse.flow.ruleflow.view.property.task;
+/*
+ * 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.BeanDialogCellEditor;
+import org.drools.eclipse.flow.common.view.property.EditBeanDialog;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Cell editor for an action.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class TaskCellEditor extends BeanDialogCellEditor {
+
+    public TaskCellEditor(Composite parent) {
+        super(parent);
+    }
+
+    protected EditBeanDialog createDialog(Shell shell) {
+        return new TaskDialog(shell);
+    }
+    
+}
\ 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/task/TaskDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/task/TaskDialog.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/task/TaskDialog.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -0,0 +1,99 @@
+package org.drools.eclipse.flow.ruleflow.view.property.task;
+/*
+ * 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.ruleflow.common.core.Work;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+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.Text;
+
+/**
+ * Dialog for editing tasks.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class TaskDialog extends EditBeanDialog {
+    
+    private Text nameText;
+//    private DataTypeCombo dataTypeCombo;
+//    private EditorComposite editorComposite;
+
+    public TaskDialog(Shell parentShell) {
+        super(parentShell, "Task editor");
+    }
+    
+    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);
+        String name = ((Work) getValue()).getName();
+        nameText.setText(name == null ? "" : name);
+
+//        Label typeLabel = new Label(composite, SWT.NONE);
+//        typeLabel.setText("Type: ");
+//        
+//        dataTypeCombo = new DataTypeCombo(composite,
+//          SWT.NONE, DefaultDataTypeRegistry.getInstance());
+//        DataType dataType = ((Variable) getValue()).getType();
+//        dataTypeCombo.setDataType(dataType);
+//        
+//      new Label(composite, SWT.NONE);
+//        
+//        Label valueLabel = new Label(composite, SWT.NONE);
+//        valueLabel.setText("Value: ");
+//        gridData = new GridData();
+//        gridData.verticalAlignment = SWT.TOP;
+//        valueLabel.setLayoutData(gridData);
+//        editorComposite = new EditorComposite(composite,
+//            SWT.NONE, DefaultDataTypeRegistry.getInstance());
+//        gridData = new GridData();
+//        gridData.horizontalAlignment = GridData.FILL;
+//        gridData.grabExcessHorizontalSpace = true;
+//        editorComposite.setLayoutData(gridData);
+//        editorComposite.setDataType(dataType);
+//        editorComposite.setValue(((Variable) getValue()).getValue());
+//        
+//        Composite bottom = new Composite(composite, SWT.NONE);
+//        gridData = new GridData();
+//        gridData.grabExcessVerticalSpace = true;
+//        gridData.horizontalSpan = 2;
+//        bottom.setLayoutData(gridData);
+        
+        return composite;
+    }
+    
+    protected Object updateValue(Object value) {
+        Work task = (Work) getValue();
+        task.setName(nameText.getText());
+        return task;
+    }
+
+}
\ 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/task/TaskPropertyDescriptor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/task/TaskPropertyDescriptor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/task/TaskPropertyDescriptor.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -0,0 +1,40 @@
+package org.drools.eclipse.flow.ruleflow.view.property.task;
+/*
+ * 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.eclipse.jface.viewers.CellEditor;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+/**
+ * Property descriptor for a task.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class TaskPropertyDescriptor extends PropertyDescriptor {
+    
+    public TaskPropertyDescriptor(Object id, String displayName) {
+        super(id, displayName);
+    }
+    
+    public CellEditor createPropertyEditor(Composite parent) {
+    	TaskCellEditor editor = new TaskCellEditor(parent);
+        if (getValidator() != null) {
+            editor.setValidator(getValidator());
+        }
+        return editor;
+    }
+}

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/preferences/IDroolsConstants.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/preferences/IDroolsConstants.java	2007-11-24 00:40:18 UTC (rev 16766)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/preferences/IDroolsConstants.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -7,5 +7,6 @@
 	String CACHE_PARSED_RULES = "Drools.CacheParsedRules";
 	String DRL_EDITOR_MATCHING_BRACKETS = "Drools.DRLMatchingBrackets";
 	String DRL_EDITOR_MATCHING_BRACKETS_COLOR = "Drools.DRLMatchingBracketsColor";
+	String DSL_RULE_EDITOR_COMPLETION_FULL_SENTENCES = "Drools.DSLRuleEditorCompletionFullSentences";
 	
 }

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/view/rules/RulesView.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/view/rules/RulesView.java	2007-11-24 00:40:18 UTC (rev 16766)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/view/rules/RulesView.java	2007-11-24 01:26:01 UTC (rev 16767)
@@ -1,11 +1,17 @@
 package org.drools.eclipse.view.rules;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
+import org.drools.compiler.PackageBuilder;
+import org.drools.compiler.ProcessBuilder;
 import org.drools.eclipse.DRLInfo;
 import org.drools.eclipse.DroolsEclipsePlugin;
 import org.drools.eclipse.core.DroolsElement;
@@ -14,6 +20,7 @@
 import org.drools.eclipse.core.Global;
 import org.drools.eclipse.core.Package;
 import org.drools.eclipse.core.Query;
+import org.drools.eclipse.core.Process;
 import org.drools.eclipse.core.Rule;
 import org.drools.eclipse.core.RuleSet;
 import org.drools.eclipse.core.Template;
@@ -21,6 +28,8 @@
 import org.drools.eclipse.core.ui.DroolsLabelProvider;
 import org.drools.eclipse.core.ui.DroolsTreeSorter;
 import org.drools.eclipse.core.ui.FilterActionGroup;
+import org.drools.eclipse.flow.common.editor.core.ProcessWrapper;
+import org.drools.eclipse.flow.ruleflow.core.RuleFlowProcessWrapper;
 import org.drools.lang.descr.FactTemplateDescr;
 import org.drools.lang.descr.FunctionDescr;
 import org.drools.lang.descr.GlobalDescr;
@@ -55,6 +64,8 @@
 import org.eclipse.ui.part.ViewPart;
 import org.eclipse.ui.texteditor.ITextEditor;
 
+import com.thoughtworks.xstream.XStream;
+
 public class RulesView extends ViewPart implements IDoubleClickListener, IResourceVisitor, IResourceChangeListener {
 
 	private final RuleSet ruleSet = DroolsModelBuilder.createRuleSet();
@@ -105,96 +116,130 @@
             	return false;
             }
     		if (resource instanceof IFile 
-    				&& "drl".equals(resource.getFileExtension())
-    				&& javaProject.isOnClasspath(resource)) {
-    			try {
-    				IFile file = (IFile) resource;
-    				DRLInfo drlInfo = DroolsEclipsePlugin.getDefault().parseResource(resource, false);
-    				String packageName = drlInfo.getPackageName();
-    				Package pkg = ruleSet.getPackage(packageName);
-    				if (pkg == null) {
-    					pkg = DroolsModelBuilder.addPackage(ruleSet, packageName, 0, 0);
-    				}
-    				// add rules
-    				List rules = drlInfo.getPackageDescr().getRules();
-    				for (Iterator iterator = rules.iterator(); iterator.hasNext();) {
-    					RuleDescr ruleDescr = (RuleDescr) iterator.next();
-    					boolean isQuery = ruleDescr instanceof QueryDescr;
-    					String ruleName = ruleDescr.getName();
-    					if (!isQuery) {
-    						Rule rule = DroolsModelBuilder.addRule(
-								pkg, ruleName, file, ruleDescr.getStartCharacter(),
-								ruleDescr.getEndCharacter() - ruleDescr.getStartCharacter() + 1, null);
-	    					// create link between resource and created rule nodes
-	    					List droolsElements = (List) resourcesMap.get(file);
-	    					if (droolsElements == null) {
-	    						droolsElements = new ArrayList();
-	    						resourcesMap.put(file, droolsElements);
-	    					}
-	    					droolsElements.add(rule);
-    					} else {
-    						Query query = DroolsModelBuilder.addQuery(
-								pkg, ruleName, file, ruleDescr.getStartCharacter(), 
-								ruleDescr.getEndCharacter() - ruleDescr.getStartCharacter() + 1);
-	    					// create link between resource and created rule nodes
-	    					List droolsElements = (List) resourcesMap.get(file);
-	    					if (droolsElements == null) {
-	    						droolsElements = new ArrayList();
-	    						resourcesMap.put(file, droolsElements);
-	    					}
-	    					droolsElements.add(query);
-    					}
-    				}
-    				// add templates
-    				List templates = drlInfo.getPackageDescr().getFactTemplates();
-    				for (Iterator iterator = templates.iterator(); iterator.hasNext();) {
-    					FactTemplateDescr templateDescr = (FactTemplateDescr) iterator.next();
-						Template template = DroolsModelBuilder.addTemplate(
-							pkg, templateDescr.getName(), file, templateDescr.getStartCharacter(),
-							templateDescr.getEndCharacter() - templateDescr.getStartCharacter() + 1);
-    					// create link between resource and created rule nodes
-    					List droolsElements = (List) resourcesMap.get(file);
-    					if (droolsElements == null) {
-    						droolsElements = new ArrayList();
-    						resourcesMap.put(file, droolsElements);
-    					}
-    					droolsElements.add(template);
-    				}
-    				// add globals
-    				List globals = drlInfo.getPackageDescr().getGlobals();
-    				for (Iterator iterator = globals.iterator(); iterator.hasNext();) {
-    					GlobalDescr globalDescr = (GlobalDescr) iterator.next();
-    					Global global = DroolsModelBuilder.addGlobal(
-							pkg, globalDescr.getIdentifier(), file, globalDescr.getStartCharacter(),
-							globalDescr.getEndCharacter() - globalDescr.getStartCharacter() + 1);
-    					// create link between resource and created rule nodes
-    					List droolsElements = (List) resourcesMap.get(file);
-    					if (droolsElements == null) {
-    						droolsElements = new ArrayList();
-    						resourcesMap.put(file, droolsElements);
-    					}
-    					droolsElements.add(global);
-    				}
-    				// add functions
-    				List functions = drlInfo.getPackageDescr().getFunctions();
-    				for (Iterator iterator = functions.iterator(); iterator.hasNext();) {
-    					FunctionDescr functionDescr = (FunctionDescr) iterator.next();
-    					String functionName = functionDescr.getName();
-    					Function function = DroolsModelBuilder.addFunction(
-							pkg, functionName, file, functionDescr.getStartCharacter(),
-							functionDescr.getEndCharacter() - functionDescr.getStartCharacter() + 1);
-    					// create link between resource and created rule nodes
-    					List droolsElements = (List) resourcesMap.get(file);
-    					if (droolsElements == null) {
-    						droolsElements = new ArrayList();
-    						resourcesMap.put(file, droolsElements);
-    					}
-    					droolsElements.add(function);
-    				}
-    			} catch (Throwable t) {
-    				DroolsEclipsePlugin.log(t);
-    			}
-    			return false;
+                    && javaProject.isOnClasspath(resource)) {
+                IFile file = (IFile) resource;
+    		    if ("drl".equals(resource.getFileExtension())
+    				        || "dslr".equals(resource.getFileExtension())) {
+        			try {
+        				DRLInfo drlInfo = DroolsEclipsePlugin.getDefault().parseResource(resource, false);
+        				String packageName = drlInfo.getPackageName();
+        				Package pkg = ruleSet.getPackage(packageName);
+        				if (pkg == null) {
+        					pkg = DroolsModelBuilder.addPackage(ruleSet, packageName, 0, 0);
+        				}
+        				// add rules
+        				List rules = drlInfo.getPackageDescr().getRules();
+        				for (Iterator iterator = rules.iterator(); iterator.hasNext();) {
+        					RuleDescr ruleDescr = (RuleDescr) iterator.next();
+        					boolean isQuery = ruleDescr instanceof QueryDescr;
+        					String ruleName = ruleDescr.getName();
+        					if (!isQuery) {
+        						Rule rule = DroolsModelBuilder.addRule(
+    								pkg, ruleName, file, ruleDescr.getStartCharacter(),
+    								ruleDescr.getEndCharacter() - ruleDescr.getStartCharacter() + 1, null);
+    	    					// create link between resource and created rule nodes
+    	    					List droolsElements = (List) resourcesMap.get(file);
+    	    					if (droolsElements == null) {
+    	    						droolsElements = new ArrayList();
+    	    						resourcesMap.put(file, droolsElements);
+    	    					}
+    	    					droolsElements.add(rule);
+        					} else {
+        						Query query = DroolsModelBuilder.addQuery(
+    								pkg, ruleName, file, ruleDescr.getStartCharacter(), 
+    								ruleDescr.getEndCharacter() - ruleDescr.getStartCharacter() + 1);
+    	    					// create link between resource and created rule nodes
+    	    					List droolsElements = (List) resourcesMap.get(file);
+    	    					if (droolsElements == null) {
+    	    						droolsElements = new ArrayList();
+    	    						resourcesMap.put(file, droolsElements);
+    	    					}
+    	    					droolsElements.add(query);
+        					}
+        				}
+        				// add templates
+        				List templates = drlInfo.getPackageDescr().getFactTemplates();
+        				for (Iterator iterator = templates.iterator(); iterator.hasNext();) {
+        					FactTemplateDescr templateDescr = (FactTemplateDescr) iterator.next();
+    						Template template = DroolsModelBuilder.addTemplate(
+    							pkg, templateDescr.getName(), file, templateDescr.getStartCharacter(),
+    							templateDescr.getEndCharacter() - templateDescr.getStartCharacter() + 1);
+        					// create link between resource and created rule nodes
+        					List droolsElements = (List) resourcesMap.get(file);
+        					if (droolsElements == null) {
+        						droolsElements = new ArrayList();
+        						resourcesMap.put(file, droolsElements);
+        					}
+        					droolsElements.add(template);
+        				}
+        				// add globals
+        				List globals = drlInfo.getPackageDescr().getGlobals();
+        				for (Iterator iterator = globals.iterator(); iterator.hasNext();) {
+        					GlobalDescr globalDescr = (GlobalDescr) iterator.next();
+        					Global global = DroolsModelBuilder.addGlobal(
+    							pkg, globalDescr.getIdentifier(), file, globalDescr.getStartCharacter(),
+    							globalDescr.getEndCharacter() - globalDescr.getStartCharacter() + 1);
+        					// create link between resource and created rule nodes
+        					List droolsElements = (List) resourcesMap.get(file);
+        					if (droolsElements == null) {
+        						droolsElements = new ArrayList();
+        						resourcesMap.put(file, droolsElements);
+        					}
+        					droolsElements.add(global);
+        				}
+        				// add functions
+        				List functions = drlInfo.getPackageDescr().getFunctions();
+        				for (Iterator iterator = functions.iterator(); iterator.hasNext();) {
+        					FunctionDescr functionDescr = (FunctionDescr) iterator.next();
+        					String functionName = functionDescr.getName();
+        					Function function = DroolsModelBuilder.addFunction(
+    							pkg, functionName, file, functionDescr.getStartCharacter(),
+    							functionDescr.getEndCharacter() - functionDescr.getStartCharacter() + 1);
+        					// create link between resource and created rule nodes
+        					List droolsElements = (List) resourcesMap.get(file);
+        					if (droolsElements == null) {
+        						droolsElements = new ArrayList();
+        						resourcesMap.put(file, droolsElements);
+        					}
+        					droolsElements.add(function);
+        				}
+        			} catch (Throwable t) {
+        				DroolsEclipsePlugin.log(t);
+        			}
+        			return false;
+    		    } else if ("rf".equals(resource.getFileExtension())) {
+    		        try {
+        	            String processString = convertToString(file.getContents());
+        	            XStream stream = new XStream();
+        	            stream.setMode(XStream.ID_REFERENCES);
+        	            
+        	            ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
+        	            ClassLoader newLoader = this.getClass().getClassLoader();
+        	            try {
+        	                Thread.currentThread().setContextClassLoader(newLoader);
+        	                Object o = stream.fromXML(processString);
+        	                if (o instanceof ProcessWrapper) {
+        	                    String packageName = ((ProcessWrapper) o).getProcess().getPackageName();
+                                Package pkg = ruleSet.getPackage(packageName);
+                                if (pkg == null) {
+                                    pkg = DroolsModelBuilder.addPackage(ruleSet, packageName, 0, 0);
+                                }
+                                Process process = DroolsModelBuilder.addProcess(pkg, ((ProcessWrapper) o).getProcess().getId(), file);
+                                List droolsElements = (List) resourcesMap.get(file);
+                                if (droolsElements == null) {
+                                    droolsElements = new ArrayList();
+                                    resourcesMap.put(file, droolsElements);
+                                }
+                                droolsElements.add(process);
+        	                }
+        	            } finally {
+        	                Thread.currentThread().setContextClassLoader(oldLoader);
+        	            }           
+        		    } catch (Throwable t) {
+                        DroolsEclipsePlugin.log(t);
+                    }     
+    		        return false;
+    		    }
     		}
         }
         return true;
@@ -285,4 +330,14 @@
 		}
 	}
 
+    private static String convertToString(final InputStream inputStream) throws IOException {
+        Reader reader = new InputStreamReader(inputStream);
+        final StringBuffer text = new StringBuffer();
+        final char[] buf = new char[1024];
+        int len = 0;
+        while ((len = reader.read(buf)) >= 0) {
+            text.append(buf, 0, len);
+        }
+        return text.toString();
+    }
 }




More information about the jboss-svn-commits mailing list