[jboss-svn-commits] JBL Code SVN: r23600 - in labs/jbossrules/trunk: drools-compiler/src/main/java/org/drools/xml and 25 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Oct 27 20:27:54 EDT 2008


Author: KrisVerlaenen
Date: 2008-10-27 20:27:54 -0400 (Mon, 27 Oct 2008)
New Revision: 23600

Added:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/FunctionImportHandler.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessMultiThreadTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_ProcessMultithreadEvent.rf
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/color/
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/color/ColorCellEditor.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/color/ColorPropertyDescriptor.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/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/resources/META-INF/drools-processes-4.0.xsd
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/DataType.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/BooleanDataType.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/FloatDataType.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/IntegerDataType.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/ListDataType.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/ObjectDataType.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/StringDataType.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/UndefinedDataType.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/workflow/core/WorkflowProcess.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/WorkflowProcessImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/HumanTaskNode.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/MilestoneNodeInstance.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/RuleSetNodeInstance.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/editors/DRLRuleEditor.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/CompletionContext.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/DefaultCompletionProcessor.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/RuleCompletionProcessor.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/core/DefaultElementWrapper.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/editpart/figure/AbstractElementFigure.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/editpart/figure/ElementContainerFigure.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/editpart/figure/ElementFigure.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/AbstractNodeWrapper.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/HumanTaskNodeWrapper.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/ActionEditPart.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/action/ActionCompletionProcessor.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/flow/ruleflow/view/property/constraint/ConstraintCompletionProcessor.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowConstraintDialog.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/preferences/DroolsPreferencePage.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-test/src/test/java/org/drools/eclipse/editors/completion/CompletionContextTest.java
Log:
JBRULES-1825: Support function imports for processes
 - added function import support
 - fixed code completion accordingly
JBRULES-1824: Multi-threading for process instances
 - multiple threads are not allowed to access process instances simultaneously

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-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -208,6 +208,12 @@
                     builder.append( "import " + importString + ";\n" );
                 }
             }
+            List<String> functionImports = ruleFlow.getFunctionImports();
+            if ( functionImports != null ) {
+                for ( String importString: functionImports ) {
+                    builder.append( "import function " + importString + ";\n" );
+                }
+            }
             Map<String, String> globals = ruleFlow.getGlobals();
             if ( globals != null ) {
                 for ( Map.Entry<String, String> entry: globals.entrySet()) {

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-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/ProcessSemanticModule.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -10,6 +10,7 @@
 import org.drools.xml.processes.ExceptionHandlerHandler;
 import org.drools.xml.processes.FaultNodeHandler;
 import org.drools.xml.processes.ForEachNodeHandler;
+import org.drools.xml.processes.FunctionImportHandler;
 import org.drools.xml.processes.GlobalHandler;
 import org.drools.xml.processes.HumanTaskNodeHandler;
 import org.drools.xml.processes.ImportHandler;
@@ -70,6 +71,8 @@
                            new ConnectionHandler() );
         addHandler( "import",
                            new ImportHandler() );
+        addHandler( "functionImport",
+                           new FunctionImportHandler() );
         addHandler( "global",
                            new GlobalHandler() );        
         addHandler( "variable",

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-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlWorkflowProcessDumper.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -81,6 +81,7 @@
     private void visitHeader(WorkflowProcess process, StringBuffer xmlDump, boolean includeMeta) {
         xmlDump.append("  <header>" + EOL);
         visitImports(process.getImports(), xmlDump);
+        visitFunctionImports(process.getFunctionImports(), xmlDump);
         visitGlobals(process.getGlobals(), xmlDump);
         VariableScope variableScope = (VariableScope) process.getDefaultContext(VariableScope.VARIABLE_SCOPE);
         if (variableScope != null) {
@@ -107,6 +108,16 @@
         }
     }
     
+    private void visitFunctionImports(List<String> imports, StringBuffer xmlDump) {
+        if (imports != null && imports.size() > 0) {
+            xmlDump.append("    <functionImports>" + EOL);
+            for (String importString: imports) {
+                xmlDump.append("      <functionImport name=\"" + importString + "\" />" + EOL);
+            }
+            xmlDump.append("    </functionImports>" + EOL);
+        }
+    }
+    
     private void visitGlobals(Map<String, String> globals, StringBuffer xmlDump) {
         if (globals != null && globals.size() > 0) {
             xmlDump.append("    <globals>" + EOL);

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-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/AbstractNodeHandler.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -106,6 +106,14 @@
                 throw new SAXParseException("<" + localName + "> requires an Integer 'height' attribute", parser.getLocator());
             }
         }
+        final String color = element.getAttribute("color");
+        if (color != null && color.length() != 0) {
+            try {
+                node.setMetaData("color", new Integer(color));
+            } catch (NumberFormatException exc) {
+                throw new SAXParseException("<" + localName + "> requires an Integer 'color' attribute", parser.getLocator());
+            }
+        }
     }
     
     protected void handleAction(final Node node, final Element element, String type) {
@@ -151,6 +159,7 @@
             Integer y = (Integer) node.getMetaData("y");
             Integer width = (Integer) node.getMetaData("width");
             Integer height = (Integer) node.getMetaData("height");
+            Integer color = (Integer) node.getMetaData("color");
             if (x != null && x != 0) {
                 xmlDump.append("x=\"" + x + "\" ");
             }
@@ -163,6 +172,9 @@
             if (height != null && height != -1) {
                 xmlDump.append("height=\"" + height + "\" ");
             }
+            if (color != null && color != 0) {
+                xmlDump.append("color=\"" + color + "\" ");
+            }
         }
     }
     

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/FunctionImportHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/FunctionImportHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/FunctionImportHandler.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -0,0 +1,63 @@
+package org.drools.xml.processes;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+
+import org.drools.process.core.Process;
+import org.drools.workflow.core.impl.WorkflowProcessImpl;
+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;
+
+public class FunctionImportHandler extends BaseAbstractHandler
+    implements
+    Handler {
+    public FunctionImportHandler() {
+        if ( (this.validParents == null) && (this.validPeers == null) ) {
+            this.validParents = new HashSet();
+            this.validParents.add( Process.class );
+
+            this.validPeers = new HashSet();         
+            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 );
+        
+        WorkflowProcessImpl  process = ( WorkflowProcessImpl ) parser.getParent();        
+        
+        final String name = attrs.getValue( "name" );        
+        emptyAttributeCheck( localName, "name", name, parser );       
+        
+        java.util.List<String> list = process.getFunctionImports();
+        if ( list == null ) {
+            list = new ArrayList<String>();
+            process.setFunctionImports( list );
+        }
+        list.add( name );
+        
+        return null;
+    }    
+    
+    public Object end(final String uri,
+                      final String localName,
+                      final ExtensibleXmlParser parser) throws SAXException {
+        final Element element = parser.endElementBuilder();
+        return null;
+    }
+
+    public Class generateNodeFor() {
+        return null;
+    }    
+
+}

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-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-4.0.xsd	2008-10-28 00:27:54 UTC (rev 23600)
@@ -19,6 +19,7 @@
 		<xs:complexType>
 			<xs:choice minOccurs="0" maxOccurs="unbounded">
 				<xs:element ref="drools:imports"/>
+				<xs:element ref="drools:functionImports"/>
 				<xs:element ref="drools:globals"/>
 				<xs:element ref="drools:variables"/>
 				<xs:element ref="drools:swimlanes"/>
@@ -38,6 +39,18 @@
 			<xs:attribute name="name" type="xs:string" use="required"/>
 		</xs:complexType>
 	</xs:element>
+	<xs:element name="functionImports">
+		<xs:complexType>
+			<xs:sequence minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:functionImport"/>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="functionImport">
+		<xs:complexType>
+			<xs:attribute name="name" type="xs:string" use="required"/>
+		</xs:complexType>
+	</xs:element>
 	<xs:element name="globals">
 		<xs:complexType>
 			<xs:sequence minOccurs="0" maxOccurs="unbounded">

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessMultiThreadTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessMultiThreadTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessMultiThreadTest.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -0,0 +1,102 @@
+package org.drools.integrationtests;
+
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.StatefulSession;
+import org.drools.compiler.DroolsError;
+import org.drools.compiler.PackageBuilder;
+import org.drools.process.instance.ProcessInstance;
+
+public class ProcessMultiThreadTest extends TestCase {
+	
+	public void testMultiThreadProcessInstanceSignalling() {
+        final int THREAD_COUNT = 30;
+        try {
+            boolean success = true;
+            final Thread[] t = new Thread[THREAD_COUNT];
+            
+            final PackageBuilder builder = new PackageBuilder();
+            builder.addProcessFromXml(new InputStreamReader( getClass().getResourceAsStream( "test_ProcessMultithreadEvent.rf" ) ) );
+            if (builder.getErrors().getErrors().length > 0) {
+            	for (DroolsError error: builder.getErrors().getErrors()) {
+            		System.err.println(error);
+            	}
+            	fail("Could not parse process");
+            }
+            RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+            ruleBase.addPackage( builder.getPackage() );
+            ruleBase = SerializationHelper.serializeObject(ruleBase);
+            StatefulSession session = ruleBase.newStatefulSession();
+            session = SerializationHelper.getSerialisedStatefulSession(session);
+            List<String> list = new ArrayList<String>();
+            session.setGlobal("list", list);
+            ProcessInstance processInstance = session.startProcess("org.drools.integrationtests.multithread");
+            final ProcessInstanceSignalRunner[] r = new ProcessInstanceSignalRunner[THREAD_COUNT];
+            for ( int i = 0; i < t.length; i++ ) {
+                r[i] = new ProcessInstanceSignalRunner(i, processInstance, "event" + (i+1));
+                t[i] = new Thread( r[i], "thread-" + i );
+                t[i].start();
+            }
+            for ( int i = 0; i < t.length; i++ ) {
+                t[i].join();
+                if ( r[i].getStatus() == ProcessInstanceSignalRunner.Status.FAIL ) {
+                    success = false;
+                }
+            }
+            if ( !success ) {
+                fail( "Multithread test failed. Look at the stack traces for details. " );
+            }
+            assertEquals(2, list.size());
+            assertFalse(list.get(0).equals(list.get(1)));
+            assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+        } catch ( Exception e ) {
+            e.printStackTrace();
+            fail( "Should not raise any exception: " + e.getMessage() );
+        }
+	}
+	
+    public static class ProcessInstanceSignalRunner implements Runnable {
+
+	    private ProcessInstance processInstance;
+	    private String type;
+        private Status status;
+        private int id;
+	
+	    public ProcessInstanceSignalRunner(int id, ProcessInstance processInstance, String type) {
+	        this.id = id;
+	    	this.processInstance = processInstance;
+	    	this.type = type;
+	        this.status = Status.SUCCESS;
+	    }
+	
+	    public void run() {
+	        try {
+	        	processInstance.signalEvent(type, null);
+	        } catch ( Exception e ) {
+	            this.status = Status.FAIL;
+	            System.out.println( Thread.currentThread().getName() + " failed: " + e.getMessage() );
+	            e.printStackTrace();
+	        }
+	    }
+	
+	    public static enum Status {
+	        SUCCESS, FAIL
+	    }
+	
+	    public int getId() {
+	        return id;
+	    }
+	
+	    public Status getStatus() {
+	        return status;
+	    }
+	
+	}
+    
+}

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_ProcessMultithreadEvent.rf
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_ProcessMultithreadEvent.rf	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_ProcessMultithreadEvent.rf	2008-10-28 00:27:54 UTC (rev 23600)
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?> 
+<process xmlns="http://drools.org/drools-4.0/process"
+         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+         xs:schemaLocation="http://drools.org/drools-4.0/process drools-processes-4.0.xsd"
+         type="RuleFlow" name="flow" id="org.drools.integrationtests.multithread" package-name="org.drools.integrationtests" >
+
+  <header>
+    <globals>
+	  <global identifier="list" type="java.util.List" />
+	</globals>
+    <variables>
+      <variable name="var" >
+        <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+      </variable>
+    </variables>
+  </header>
+
+  <nodes>
+    <start id="1" name="Start" />
+    <join id="2" name="Join" type="1" />
+    <end id="3" name="End" />
+    <eventNode id="4" name="Event" >
+      <eventFilters>
+        <eventFilter type="eventType" eventType="event1" />
+      </eventFilters>
+    </eventNode>
+    <actionNode id="5" name="action1" >
+      <action type="expression" dialect="java" >context.setVariable("var", "action1"); try { Thread.sleep(3000); } catch (Throwable t) {} list.add(context.getVariable("var"));</action>
+    </actionNode>
+    <eventNode id="6" name="Event" >
+      <eventFilters>
+        <eventFilter type="eventType" eventType="event2" />
+      </eventFilters>
+    </eventNode>
+    <actionNode id="7" name="action2" >
+      <action type="expression" dialect="java" >context.setVariable("var", "action2"); try { Thread.sleep(3000); } catch (Throwable t) {} list.add(context.getVariable("var"));</action>
+    </actionNode>
+  </nodes>
+
+  <connections>
+    <connection from="1" to="2" />
+    <connection from="2" to="3" />
+    <connection from="4" to="5" />
+    <connection from="5" to="2" />
+    <connection from="6" to="7" />
+    <connection from="7" to="2" />
+  </connections>
+
+</process>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/DataType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/DataType.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/DataType.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -33,5 +33,10 @@
     String writeValue(Object value);
     
     Object readValue(String value);
+    
+    /**
+     * Returns the corresponding Java type of this datatype
+     */
+    String getStringType();
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/BooleanDataType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/BooleanDataType.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/BooleanDataType.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -53,4 +53,8 @@
 	public String writeValue(Object value) {
 		return (Boolean) value ? "true" : "false";
 	}
+
+	public String getStringType() {
+		return "Boolean";
+	}
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/FloatDataType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/FloatDataType.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/FloatDataType.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -57,4 +57,8 @@
 		Float f = (Float) value;
 		return f == null ? "" : f.toString();
 	}
+
+	public String getStringType() {
+		return "Float";
+	}
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/IntegerDataType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/IntegerDataType.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/IntegerDataType.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -58,4 +58,8 @@
 		return i == null ? "" : i.toString();
 	}
 
+	public String getStringType() {
+		return "String";
+	}
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/ListDataType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/ListDataType.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/ListDataType.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -19,7 +19,6 @@
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.util.Iterator;
 import java.util.List;
 
 import org.drools.process.core.TypeObject;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/ObjectDataType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/ObjectDataType.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/ObjectDataType.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -83,4 +83,8 @@
 		XStream xstream = new XStream();
 		return xstream.toXML(value);
 	}
+
+	public String getStringType() {
+		return className == null ? "Object" : className;
+	}
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/StringDataType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/StringDataType.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/StringDataType.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -55,4 +55,7 @@
 		return (String) value;
 	}
 	
+	public String getStringType() {
+		return "String";
+	}
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/UndefinedDataType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/UndefinedDataType.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/datatype/impl/type/UndefinedDataType.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -60,4 +60,7 @@
 		throw new IllegalArgumentException("Undefined datatype");
 	}
 
+	public String getStringType() {
+		return "Object";
+	}
 }

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-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/ProcessInstanceImpl.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -38,7 +38,9 @@
  */
 public abstract class ProcessInstanceImpl implements ProcessInstance, Serializable {
 
-    private long id;
+	private static final long serialVersionUID = 4L;
+	
+	private long id;
     private String processId;
     private transient Process process;
     private int state = STATE_PENDING;
@@ -159,11 +161,13 @@
     }
 
     public void start() {
-        if ( getState() != ProcessInstanceImpl.STATE_PENDING ) {
-            throw new IllegalArgumentException( "A process instance can only be started once" );
-        }
-        setState( ProcessInstanceImpl.STATE_ACTIVE );
-        internalStart();
+    	synchronized (this) {
+            if ( getState() != ProcessInstanceImpl.STATE_PENDING ) {
+                throw new IllegalArgumentException( "A process instance can only be started once" );
+            }
+            setState( ProcessInstanceImpl.STATE_ACTIVE );
+            internalStart();
+		}
     }
     
     protected abstract void internalStart();

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/WorkflowProcess.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/WorkflowProcess.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/WorkflowProcess.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -37,6 +37,14 @@
     List<String> getImports();
     
     /**
+     * Returns the function imports of this RuleFlow process.
+     * They are defined as a List of fully qualified class names.
+     * 
+     * @return	the function imports of this RuleFlow process
+     */
+    List<String> getFunctionImports();
+    
+    /**
      * Sets the imports of this RuleFlow process
      * 
      * @param imports	the imports as a List of fully qualified class names
@@ -44,6 +52,13 @@
     void setImports(List<String> imports);
 
     /**
+     * Sets the imports of this RuleFlow process
+     * 
+     * @param imports	the imports as a List of fully qualified class names
+     */
+    void setFunctionImports(List<String> functionImports);
+
+    /**
      * Returns the globals of this RuleFlow process.
      * They are defined as a Map with the name as key and the type as value.
      * 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/WorkflowProcessImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/WorkflowProcessImpl.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/WorkflowProcessImpl.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -37,6 +37,7 @@
 
     private NodeContainer nodeContainer;
     private List<String> imports;
+    private List<String> functionImports;
     private Map<String, String> globals;
     
     public WorkflowProcessImpl() {
@@ -77,6 +78,14 @@
         this.imports = imports;
     }
     
+    public List<String> getFunctionImports() {
+        return functionImports;
+    }
+
+    public void setFunctionImports(List<String> functionImports) {
+        this.functionImports = functionImports;
+    }
+    
     public Map<String, String> getGlobals() {
         return globals;
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/HumanTaskNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/HumanTaskNode.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/HumanTaskNode.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -24,6 +24,7 @@
         parameterDefinitions.add(new ParameterDefinitionImpl("Priority", new StringDataType()));
         parameterDefinitions.add(new ParameterDefinitionImpl("Comment", new StringDataType()));
         parameterDefinitions.add(new ParameterDefinitionImpl("Skippable", new StringDataType()));
+        parameterDefinitions.add(new ParameterDefinitionImpl("Content", new StringDataType()));
         // TODO: initiator
         // TODO: attachments
         // TODO: deadlines

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-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -153,26 +153,28 @@
     }
     
     public void setState(final int state) {
-        super.setState( state );
-        // TODO move most of this to ProcessInstanceImpl
-        if ( state == ProcessInstance.STATE_COMPLETED 
-                || state == ProcessInstance.STATE_ABORTED ) {
-            InternalWorkingMemory workingMemory = (InternalWorkingMemory) getWorkingMemory();
-            ((EventSupport) getWorkingMemory()).getRuleFlowEventSupport()
-                .fireBeforeRuleFlowProcessCompleted( this, workingMemory );
-            // deactivate all node instances of this process instance
-            while ( !nodeInstances.isEmpty() ) {
-                NodeInstance nodeInstance = (NodeInstance) nodeInstances.get( 0 );
-                nodeInstance.cancel();
-            }
-            removeEventListeners();
-            workingMemory.removeProcessInstance( this );
-            ((EventSupport) workingMemory).getRuleFlowEventSupport()
-                .fireAfterRuleFlowProcessCompleted( this, workingMemory );
-            
-			String type = "processInstanceCompleted:" + getId();
-			workingMemory.getSignalManager().signalEvent(type, this);
-        }
+    	synchronized (this) {
+	        super.setState( state );
+	        // TODO move most of this to ProcessInstanceImpl
+	        if ( state == ProcessInstance.STATE_COMPLETED 
+	                || state == ProcessInstance.STATE_ABORTED ) {
+	            InternalWorkingMemory workingMemory = (InternalWorkingMemory) getWorkingMemory();
+	            ((EventSupport) getWorkingMemory()).getRuleFlowEventSupport()
+	                .fireBeforeRuleFlowProcessCompleted( this, workingMemory );
+	            // deactivate all node instances of this process instance
+	            while ( !nodeInstances.isEmpty() ) {
+	                NodeInstance nodeInstance = (NodeInstance) nodeInstances.get( 0 );
+	                nodeInstance.cancel();
+	            }
+	            removeEventListeners();
+	            workingMemory.removeProcessInstance( this );
+	            ((EventSupport) workingMemory).getRuleFlowEventSupport()
+	                .fireAfterRuleFlowProcessCompleted( this, workingMemory );
+	            
+				String type = "processInstanceCompleted:" + getId();
+				workingMemory.getSignalManager().signalEvent(type, this);
+	        }
+    	}
     }
 
     public void disconnect() {
@@ -207,9 +209,11 @@
     }
     
     public void start() {
-    	registerExternalEventNodeListeners();
-    	super.start();
-    }
+    	synchronized (this) {
+    		registerExternalEventNodeListeners();
+    		super.start();
+    	}
+	}
     
     private void registerExternalEventNodeListeners() {
     	for (Node node: getWorkflowProcess().getNodes()) {
@@ -228,31 +232,33 @@
     }
     
     public void signalEvent(String type, Object event) {
-    	List<EventListener> listeners = eventListeners.get(type);
-    	if (listeners != null) {
-    		for (EventListener listener: listeners) {
-    			listener.signalEvent(type, event);
-    		}
-    	}
-    	listeners = externalEventListeners.get(type);
-    	if (listeners != null) {
-    		for (EventListener listener: listeners) {
-    			listener.signalEvent(type, event);
-    		}
-    	}
-    	for (Node node: getWorkflowProcess().getNodes()) {
-			if (node instanceof EventNodeInterface) {
-				if (((EventNodeInterface) node).acceptsEvent(type, event)) {
-					if (node instanceof EventNode) {
-    					EventNodeInstance eventNodeInstance = (EventNodeInstance) getNodeInstance(node);
-    					eventNodeInstance.signalEvent(type, event);
-					} else {
-    					List<NodeInstance> nodeInstances = getNodeInstances(node.getId());
-    					if (nodeInstances != null && !nodeInstances.isEmpty()) {
-    						for (NodeInstance nodeInstance: nodeInstances) {
-    							((EventNodeInstanceInterface) nodeInstance).signalEvent(type, event);
-    						}
-    					}
+    	synchronized (this) {
+	    	List<EventListener> listeners = eventListeners.get(type);
+	    	if (listeners != null) {
+	    		for (EventListener listener: listeners) {
+	    			listener.signalEvent(type, event);
+	    		}
+	    	}
+	    	listeners = externalEventListeners.get(type);
+	    	if (listeners != null) {
+	    		for (EventListener listener: listeners) {
+	    			listener.signalEvent(type, event);
+	    		}
+	    	}
+	    	for (Node node: getWorkflowProcess().getNodes()) {
+				if (node instanceof EventNodeInterface) {
+					if (((EventNodeInterface) node).acceptsEvent(type, event)) {
+						if (node instanceof EventNode) {
+	    					EventNodeInstance eventNodeInstance = (EventNodeInstance) getNodeInstance(node);
+	    					eventNodeInstance.signalEvent(type, event);
+						} else {
+	    					List<NodeInstance> nodeInstances = getNodeInstances(node.getId());
+	    					if (nodeInstances != null && !nodeInstances.isEmpty()) {
+	    						for (NodeInstance nodeInstance: nodeInstances) {
+	    							((EventNodeInstanceInterface) nodeInstance).signalEvent(type, event);
+	    						}
+	    					}
+						}
 					}
 				}
 			}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/MilestoneNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/MilestoneNodeInstance.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/MilestoneNodeInstance.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -87,8 +87,10 @@
             String ruleName = event.getActivation().getRule().getName();
             String milestoneName = "RuleFlow-Milestone-" + getProcessInstance().getProcess().getId() + "-" + getNodeId();
             if (milestoneName.equals(ruleName)) {
-                removeEventListeners();
-                triggerCompleted();
+            	synchronized(getProcessInstance()) {
+	                removeEventListeners();
+	                triggerCompleted();
+            	}
             }
         }
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/RuleSetNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/RuleSetNodeInstance.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/RuleSetNodeInstance.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -68,8 +68,10 @@
     }
 
     public void ruleFlowGroupDeactivated() {
-        removeEventListeners();
-        triggerCompleted();
+    	synchronized (getProcessInstance()) {
+            removeEventListeners();
+            triggerCompleted();
+		}
     }
 
 }
\ No newline at end of file

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	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/DroolsEclipsePlugin.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -247,6 +247,8 @@
                           true );
         store.setDefault( IDroolsConstants.SKIN,
                           "default" );
+        store.setDefault( IDroolsConstants.ALLOW_NODE_CUSTOMIZATION,
+        				  false );
     }
 
     public DRLInfo parseResource(IResource resource,

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/DRLRuleEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/DRLRuleEditor.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/DRLRuleEditor.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -38,39 +38,39 @@
  */
 public class DRLRuleEditor extends AbstractRuleEditor {
 
-    protected List imports;
-    protected List functions;
-    protected Map templates;
+    protected List<String> imports;
+    protected List<String> functions;
+    protected Map<String, FactTemplateDescr> templates;
     protected List<GlobalDescr> globals;
     protected String packageName;
-    protected List classesInPackage;
-	protected Map attributes;
+    protected List<String> classesInPackage;
+	protected Map<String, String> attributes;
 
     public DRLRuleEditor() {
 	}
 
-	public List getImports() {
+	public List<String> getImports() {
 		if (imports == null || isDirty()) {
 			loadImportsAndFunctions();
 		}
 		return imports;
 	}
 
-	public List getFunctions() {
+	public List<String> getFunctions() {
 		if (functions == null) {
 			loadImportsAndFunctions();
 		}
 		return functions;
 	}
 
-	public Set getTemplates() {
+	public Set<String> getTemplates() {
 		if (templates == null) {
 			loadImportsAndFunctions();
 		}
 		return templates.keySet();
 	}
 
-	public Map getAttributes() {
+	public Map<String, String> getAttributes() {
 		if ( attributes == null ) {
 			loadImportsAndFunctions();
 		}
@@ -81,7 +81,7 @@
 		if (templates == null) {
 			loadImportsAndFunctions();
 		}
-		return (FactTemplateDescr) templates.get(name);
+		return templates.get(name);
 	}
 
 	public List<GlobalDescr> getGlobals() {
@@ -98,15 +98,15 @@
 		return packageName;
 	}
 
-	public List getClassesInPackage() {
+	public List<String> getClassesInPackage() {
 		if (classesInPackage == null) {
 			classesInPackage = getAllClassesInPackage(getPackage());
 		}
 		return classesInPackage;
 	}
 
-	protected List getAllClassesInPackage(String packageName) {
-		List list = new ArrayList();
+	protected List<String> getAllClassesInPackage(String packageName) {
+		List<String> list = new ArrayList<String>();
 		if (packageName != null) {
 			IEditorInput input = getEditorInput();
 			if (input instanceof IFileEditorInput) {
@@ -118,8 +118,8 @@
 		return list;
 	}
 
-	public static List getAllClassesInPackage(String packageName, IJavaProject javaProject) {
-		final List list = new ArrayList();
+	public static List<String> getAllClassesInPackage(String packageName, IJavaProject javaProject) {
+		final List<String> list = new ArrayList<String>();
 		CompletionRequestor requestor = new CompletionRequestor() {
 			public void accept(org.eclipse.jdt.core.CompletionProposal proposal) {
 				String className = new String(proposal.getCompletion());
@@ -138,8 +138,8 @@
 		return list;
 	}
 
-	protected List getAllStaticMethodsInClass(String className) {
-		final List list = new ArrayList();
+	protected List<String> getAllStaticMethodsInClass(String className) {
+		final List<String> list = new ArrayList<String>();
 		if (className != null) {
 			IEditorInput input = getEditorInput();
 			if (input instanceof IFileEditorInput) {
@@ -173,14 +173,14 @@
             // package
             this.packageName = drlInfo.getPackageName();
             // imports
-            List allImports = descr.getImports();
-            this.imports = new ArrayList();
+            List<ImportDescr> allImports = descr.getImports();
+            this.imports = new ArrayList<String>();
             if (packageName != null) {
                 imports.addAll(getAllClassesInPackage(packageName));
             }
-            Iterator iterator = allImports.iterator();
+            Iterator<ImportDescr> iterator = allImports.iterator();
             while (iterator.hasNext()) {
-                String importName = ((ImportDescr) iterator.next()).getTarget();
+                String importName = iterator.next().getTarget();
                 if (importName.endsWith(".*")) {
                     String packageName = importName.substring(0, importName.length() - 2);
                     imports.addAll(getAllClassesInPackage(packageName));
@@ -189,16 +189,16 @@
                 }
             }
             // functions
-            List functionDescrs = descr.getFunctions();
-            List functionImports = descr.getFunctionImports();
-            functions = new ArrayList(functionDescrs.size());
-            iterator = functionDescrs.iterator();
-            while (iterator.hasNext()) {
-                functions.add(((FunctionDescr) iterator.next()).getName());
+            List<FunctionDescr> functionDescrs = descr.getFunctions();
+            List<FunctionImportDescr> functionImports = descr.getFunctionImports();
+            functions = new ArrayList<String>(functionDescrs.size());
+            Iterator<FunctionDescr> iterator2 = functionDescrs.iterator();
+            while (iterator2.hasNext()) {
+                functions.add(iterator2.next().getName());
             }
-            iterator = functionImports.iterator();
-            while (iterator.hasNext()) {
-                String functionImport = ((FunctionImportDescr) iterator.next()).getTarget();
+            Iterator<FunctionImportDescr> iterator3 = functionImports.iterator();
+            while (iterator3.hasNext()) {
+                String functionImport = iterator3.next().getTarget();
                 if (functionImport.endsWith(".*")) {
                     String className = functionImport.substring(0, functionImport.length() - 2);
                     functions.addAll(getAllStaticMethodsInClass(className));
@@ -210,26 +210,25 @@
                 }
             }
             // templates
-            List templateDescrs = descr.getFactTemplates();
-            templates = new HashMap(templateDescrs.size());
-            iterator = templateDescrs.iterator();
-            while (iterator.hasNext()) {
-                FactTemplateDescr template = (FactTemplateDescr) iterator.next();
+            List<FactTemplateDescr> templateDescrs = descr.getFactTemplates();
+            templates = new HashMap<String, FactTemplateDescr>(templateDescrs.size());
+            Iterator<FactTemplateDescr> iterator4 = templateDescrs.iterator();
+            while (iterator4.hasNext()) {
+                FactTemplateDescr template = iterator4.next();
                 templates.put(template.getName(), template);
             }
             // globals
-            List globalDescrs = descr.getGlobals();
+            List<GlobalDescr> globalDescrs = descr.getGlobals();
             globals = new ArrayList<GlobalDescr>();
-            iterator = globalDescrs.iterator();
-            while (iterator.hasNext()) {
-                GlobalDescr global = (GlobalDescr) iterator.next();
-                globals.add(global);
+            Iterator<GlobalDescr> iterator5 = globalDescrs.iterator();
+            while (iterator5.hasNext()) {
+                globals.add(iterator5.next());
             }
 
             //attributes
-            this.attributes = new HashMap();
-        	for (Iterator attrIter = descr.getAttributes().iterator(); attrIter.hasNext();) {
-        		AttributeDescr attribute = (AttributeDescr) attrIter.next();
+            this.attributes = new HashMap<String, String>();
+        	for (Iterator<AttributeDescr> attrIter = descr.getAttributes().iterator(); attrIter.hasNext();) {
+        		AttributeDescr attribute = attrIter.next();
         		if (attribute != null && attribute.getName() != null) {
         			attributes.put(attribute.getName(), attribute.getValue());
         		}

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/CompletionContext.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/CompletionContext.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/CompletionContext.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -300,10 +300,16 @@
 			case Location.LOCATION_RHS:
 				String rhs = "";
 				i = locationIndex + 1;
+				int endLocationOfLast = Integer.MAX_VALUE - 1;
 				while (i < parserList.size()) {
 					Object o = parserList.get(i++);
 					if (o instanceof DroolsToken) {
-						rhs += ((DroolsToken) o).getText(); 
+						DroolsToken token = (DroolsToken) o;
+						if (endLocationOfLast + 1 < token.getStartIndex()) {
+							rhs += " ";
+						}
+						rhs += token.getText();
+						endLocationOfLast = token.getStopIndex();
 					}
 				}
 				location.setProperty(Location.LOCATION_RHS_CONTENT, rhs);	

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/DefaultCompletionProcessor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/DefaultCompletionProcessor.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/DefaultCompletionProcessor.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -105,7 +105,8 @@
                                                         functionText,
                                                         prefix,
                                                         params,
-                                                        false );
+                                                        false,
+                                                        false);
                     filterProposalsOnPrefix( prefix,
                                              props );
                 } else {
@@ -193,11 +194,11 @@
         return result;
     }
 
-    protected List getPossibleProposals(ITextViewer viewer,
+    protected List<RuleCompletionProposal> getPossibleProposals(ITextViewer viewer,
                                         int documentOffset,
                                         String backText,
                                         final String prefix) {
-        List list = new ArrayList();
+        List<RuleCompletionProposal> list = new ArrayList<RuleCompletionProposal>();
         list.add( new RuleCompletionProposal( documentOffset - prefix.length(),
                                               prefix.length(),
                                               "rule",
@@ -246,25 +247,27 @@
         return list;
     }
 
-    protected List getJavaCompletionProposals(final int documentOffset,
+    protected List<RuleCompletionProposal> getJavaCompletionProposals(final int documentOffset,
                                               final String javaText,
                                               final String prefix,
                                               Map params) {
-        return getJavaCompletionProposals(documentOffset, javaText, prefix, params, true);
+        return getJavaCompletionProposals(documentOffset, javaText, prefix, params, true, false);
     }
     
-    protected List getJavaCompletionProposals(final int documentOffset,
+    protected List<RuleCompletionProposal> getJavaCompletionProposals(final int documentOffset,
                                               final String javaText,
                                               final String prefix,
                                               Map params,
-                                              boolean useDrools) {
-        final List list = new ArrayList();
+                                              boolean useDrools,
+                                              boolean useContext) {
+        final List<RuleCompletionProposal> list = new ArrayList<RuleCompletionProposal>();
         requestJavaCompletionProposals( javaText,
                                         prefix,
                                         documentOffset,
                                         params,
                                         list,
-                                        useDrools );
+                                        useDrools,
+                                        useContext);
         return list;
     }
 
@@ -297,7 +300,7 @@
                                                   final int documentOffset,
                                                   Map params,
                                                   Collection results) {
-        requestJavaCompletionProposals(javaText, prefix, documentOffset, params, results, true);
+        requestJavaCompletionProposals(javaText, prefix, documentOffset, params, results, true, false);
     }
 
     protected void requestJavaCompletionProposals(final String javaText,
@@ -305,7 +308,8 @@
                                                   final int documentOffset,
                                                   Map params,
                                                   Collection results,
-                                                  boolean useDrools) {
+                                                  boolean useDrools,
+                                                  boolean useContext) {
 
 
         String javaTextWithoutPrefix = CompletionUtil.getTextWithoutPrefix( javaText,
@@ -340,6 +344,9 @@
             if (useDrools) {
                 javaTextWithParams.append( "org.drools.spi.KnowledgeHelper drools;" );
             }
+            if (useContext) {
+                javaTextWithParams.append( "org.drools.spi.ProcessContext context;" );
+            }
             javaTextWithParams.append( javaText );
             String jtext = javaTextWithParams.toString();
             String fixedText = new KnowledgeHelperFixer().fix( jtext );
@@ -378,7 +385,7 @@
         return "";
     }
 
-    protected List getImports() {
+    protected List<String> getImports() {
         if ( getEditor() instanceof DRLRuleEditor ) {
             return ((DRLRuleEditor) getEditor()).getImports();
         }
@@ -426,7 +433,7 @@
         return Collections.EMPTY_LIST;
     }
 
-    protected List getClassesInPackage() {
+    protected List<String> getClassesInPackage() {
         if ( getEditor() instanceof DRLRuleEditor ) {
             return ((DRLRuleEditor) getEditor()).getClassesInPackage();
         }

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/RuleCompletionProcessor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/RuleCompletionProcessor.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/RuleCompletionProcessor.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -20,16 +20,9 @@
 import org.drools.eclipse.editors.AbstractRuleEditor;
 import org.drools.eclipse.util.ProjectClassLoader;
 import org.drools.lang.Location;
-import org.drools.lang.descr.AndDescr;
-import org.drools.lang.descr.BaseDescr;
-import org.drools.lang.descr.ExistsDescr;
 import org.drools.lang.descr.FactTemplateDescr;
-import org.drools.lang.descr.FieldBindingDescr;
 import org.drools.lang.descr.FieldTemplateDescr;
 import org.drools.lang.descr.GlobalDescr;
-import org.drools.lang.descr.NotDescr;
-import org.drools.lang.descr.OrDescr;
-import org.drools.lang.descr.PatternDescr;
 import org.drools.rule.builder.dialect.mvel.MVELConsequenceBuilder;
 import org.drools.rule.builder.dialect.mvel.MVELDialect;
 import org.drools.spi.KnowledgeHelper;
@@ -139,7 +132,8 @@
         }
 
         boolean startOfDialectExpression = CompletionUtil.isStartOfDialectExpression( consequenceWithoutPrefix );
-        if ( isJavaDialect() && startOfDialectExpression ) {
+        if ( //isJavaDialect() && 
+        		startOfDialectExpression ) {
             addRHSKeywordCompletionProposals( list,
                                               documentOffset,
                                               prefix );
@@ -196,7 +190,7 @@
         return false;
     }
 
-    protected void addLHSCompletionProposals(List list,
+    protected void addLHSCompletionProposals(List<RuleCompletionProposal> list,
                                              int documentOffset,
                                              Location location,
                                              String prefix,
@@ -261,9 +255,9 @@
             case Location.LOCATION_LHS_FROM_COLLECT :
             case Location.LOCATION_LHS_BEGIN_OF_CONDITION_EXISTS :
                 // and add imported classes
-                Iterator iterator = getImports().iterator();
+                Iterator<String> iterator = getImports().iterator();
                 while ( iterator.hasNext() ) {
-                    String name = (String) iterator.next();
+                    String name = iterator.next();
                     int index = name.lastIndexOf( "." );
                     if ( index != -1 ) {
                         String className = name.substring( index + 1 );
@@ -279,7 +273,7 @@
                 }
                 iterator = getClassesInPackage().iterator();
                 while ( iterator.hasNext() ) {
-                    String name = (String) iterator.next();
+                    String name = iterator.next();
                     int index = name.lastIndexOf( "." );
                     if ( index != -1 ) {
                         String className = name.substring( index + 1 );
@@ -569,10 +563,9 @@
                     }
                 }
                 // add globals with possibly matching type
-                List globals = getGlobals();
+                List<GlobalDescr> globals = getGlobals();
                 if ( globals != null ) {
-                    for ( iterator = globals.iterator(); iterator.hasNext(); ) {
-                        GlobalDescr global = (GlobalDescr) iterator.next();
+                    for ( GlobalDescr global: globals ) {
                         if ( isSubtypeOf( global.getType(),
                                           type ) ) {
                             RuleCompletionProposal proposal = new RuleCompletionProposal( documentOffset - prefix.length(),

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/core/DefaultElementWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/core/DefaultElementWrapper.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/core/DefaultElementWrapper.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -22,8 +22,13 @@
 import java.util.Collections;
 import java.util.List;
 
+import org.drools.eclipse.DroolsEclipsePlugin;
+import org.drools.eclipse.flow.ruleflow.view.property.color.ColorPropertyDescriptor;
+import org.drools.eclipse.preferences.IDroolsConstants;
 import org.eclipse.draw2d.geometry.Rectangle;
 import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.views.properties.IPropertyDescriptor;
 import org.eclipse.ui.views.properties.IPropertySource;
@@ -36,19 +41,35 @@
  */
 public abstract class DefaultElementWrapper implements ElementWrapper, IPropertySource, Serializable {
 
-    protected static IPropertyDescriptor[] descriptors;
+	private static boolean allowNodeCustomization =
+		DroolsEclipsePlugin.getDefault().getPreferenceStore().getBoolean(IDroolsConstants.ALLOW_NODE_CUSTOMIZATION);
 
+	protected static IPropertyDescriptor[] descriptors;
+
     public static final String NAME = "Name";
     public static final String ID = "Id";
+    public static final String COLOR = "Color";
     static {
-        descriptors = new IPropertyDescriptor[] {
-            new TextPropertyDescriptor(NAME, "Name"),
-            new TextPropertyDescriptor(ID, "Id") {
-            	public CellEditor createPropertyEditor(Composite parent) {
-                    return null;
-                }
-            },
-        };
+    	if (allowNodeCustomization) {
+	        descriptors = new IPropertyDescriptor[] {
+	            new TextPropertyDescriptor(NAME, "Name"),
+	            new TextPropertyDescriptor(ID, "Id") {
+	            	public CellEditor createPropertyEditor(Composite parent) {
+	                    return null;
+	                }
+	            },
+	            new ColorPropertyDescriptor(COLOR, "Color"),
+	        };
+    	} else {
+    		descriptors = new IPropertyDescriptor[] {
+	            new TextPropertyDescriptor(NAME, "Name"),
+	            new TextPropertyDescriptor(ID, "Id") {
+	            	public CellEditor createPropertyEditor(Composite parent) {
+	                    return null;
+	                }
+	            },
+	        };
+    	}
     }
     
     private Object element;
@@ -57,6 +78,7 @@
     private List<ElementConnection> incomingConnections = new ArrayList<ElementConnection>();
     private List<ElementConnection> outgoingConnections = new ArrayList<ElementConnection>();
     private transient List<ModelListener> listeners = new ArrayList<ModelListener>();
+    protected Color color;
     
     protected void setElement(Object element) {
 		this.element = element;
@@ -150,7 +172,27 @@
 
 	protected void internalSetName(String name) {
 	}
+	
+	public Color getColor() {
+		if (color == null) {
+			color = internalGetColor();
+		}
+		return color;
+	}
+	
+	protected Color internalGetColor() {
+		return null;
+	}
+	
+	public void setColor(Color color) {
+		this.color = color;
+		internalSetColor(color == null ? null : RGBToInteger(color.getRGB()));
+		notifyListeners(CHANGE_NAME);
+	}
 
+	protected void internalSetColor(Integer color) {
+	}
+	
 	public void addListener(ModelListener listener) {
 		listeners.add(listener);
 	}
@@ -191,6 +233,9 @@
 		if (ID.equals(id)) {
 			return getId();
 		}
+		if (COLOR.equals(id)) {
+			return getColor();
+		}
 		return null;
 	}
 
@@ -198,11 +243,29 @@
 		if (NAME.equals(id)) {
 			setName("");
 		}
+		if (COLOR.equals(id)) {
+			setColor(null);
+		}
 	}
 
 	public void setPropertyValue(Object id, Object value) {
 		if (NAME.equals(id)) {
 			setName((String) value);
 		}
+		if (COLOR.equals(id)) {
+			setColor((Color) value);
+		}
 	}
+	
+	public static Integer RGBToInteger(RGB rgb) {
+		return new Integer((rgb.blue << 16) | (rgb.green << 8) | rgb.red);
+	}
+
+	public static RGB integerToRGB(Integer color) {
+		int n = color.intValue();
+		return new RGB(			
+			(n & 0x000000FF),
+			(n & 0x0000FF00) >> 8,
+			(n & 0x00FF0000) >> 16);
+	}
 }

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/editpart/figure/AbstractElementFigure.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/editpart/figure/AbstractElementFigure.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/editpart/figure/AbstractElementFigure.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -18,6 +18,7 @@
 import org.eclipse.draw2d.Label;
 import org.eclipse.draw2d.Panel;
 import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.Image;
 
 /**
@@ -66,4 +67,8 @@
     public void setFocus(boolean b) {
         repaint();
     }
+
+	public void setColor(Color newColor) {
+	}
+	
 }

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/editpart/figure/ElementContainerFigure.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/editpart/figure/ElementContainerFigure.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/editpart/figure/ElementContainerFigure.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -11,6 +11,7 @@
 import org.eclipse.draw2d.LineBorder;
 import org.eclipse.draw2d.ScrollPane;
 import org.eclipse.draw2d.StackLayout;
+import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.Image;
 
 public class ElementContainerFigure extends Figure implements ElementFigure {
@@ -62,4 +63,7 @@
         return pane;
     }
 
+	public void setColor(Color newColor) {
+	}
+	
 }

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/editpart/figure/ElementFigure.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/editpart/figure/ElementFigure.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/editpart/figure/ElementFigure.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -17,6 +17,7 @@
 
 import org.eclipse.draw2d.IFigure;
 import org.eclipse.draw2d.Label;
+import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.Image;
 
 /**
@@ -35,5 +36,7 @@
     boolean isSelected();
     
     Label getLabel();
+    
+    void setColor(Color color);
 
 }

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/AbstractNodeWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/AbstractNodeWrapper.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/AbstractNodeWrapper.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -20,6 +20,8 @@
 import org.drools.eclipse.flow.common.editor.core.ElementWrapper;
 import org.drools.workflow.core.Node;
 import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Display;
 
 /**
  * Wrapper for a node.
@@ -52,6 +54,18 @@
         notifyListeners(CHANGE_NAME);
     }
     
+	public Color internalGetColor() {
+		Integer rgb = (Integer) getNode().getMetaData("color");
+		if (rgb != null) {
+			return new Color(Display.getCurrent(), integerToRGB(rgb));
+		}
+		return null;
+	}
+	
+	protected void internalSetColor(Integer color) {
+		getNode().setMetaData("color", color);
+	}
+	
     protected void internalSetConstraint(Rectangle constraint) {
         Node node = getNode();
         node.setMetaData("x", constraint.x);

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/HumanTaskNodeWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/HumanTaskNodeWrapper.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/HumanTaskNodeWrapper.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -50,6 +50,7 @@
         parameterDefinitions.add(new ParameterDefinitionImpl("Priority", new StringDataType()));
         parameterDefinitions.add(new ParameterDefinitionImpl("Comment", new StringDataType()));
         parameterDefinitions.add(new ParameterDefinitionImpl("Skippable", new StringDataType()));
+        parameterDefinitions.add(new ParameterDefinitionImpl("Content", new StringDataType()));
         ((WorkDefinitionExtensionImpl) WORK_DEFINITION).setParameters(parameterDefinitions);
         ((WorkDefinitionExtensionImpl) WORK_DEFINITION).setIcon("icons/human_task.gif");
     }

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/ActionEditPart.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/ActionEditPart.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/editor/editpart/ActionEditPart.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -18,6 +18,7 @@
 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.drools.eclipse.flow.ruleflow.core.AbstractNodeWrapper;
 import org.drools.eclipse.flow.ruleflow.skin.SkinManager;
 import org.drools.eclipse.flow.ruleflow.skin.SkinProvider;
 import org.drools.eclipse.preferences.IDroolsConstants;
@@ -47,6 +48,12 @@
     	return skinProvider.createActionNodeFigure();
     }
     
+    public void refreshVisuals() {
+    	super.refreshVisuals();
+        ((AbstractElementFigure) getFigure()).setColor(
+    		((AbstractNodeWrapper) getElementWrapper()).getColor());
+    }
+    
     public static class ActionNodeFigure extends AbstractElementFigure {
         
         private static final Image ICON = ImageDescriptor.createFromURL(
@@ -74,6 +81,10 @@
             rectangle.setLineWidth(b ? 3 : 1);
             repaint();
         }
+        
+    	public void setColor(Color newColor) {
+    		rectangle.setBackgroundColor(newColor == null ? color : newColor );
+    	}
     }
     
 }

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/action/ActionCompletionProcessor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/action/ActionCompletionProcessor.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/action/ActionCompletionProcessor.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -17,7 +17,6 @@
  */
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -49,9 +48,10 @@
 public class ActionCompletionProcessor extends RuleCompletionProcessor {
 
 	private WorkflowProcess process;
-	private List imports;
+	private List<String> imports;
+	private List<String> functions;
 	private List<GlobalDescr> globals;
-	private Map attributes;
+	private Map<String, String> attributes;
 	private String dialect;
 	
 	public ActionCompletionProcessor(WorkflowProcess process) {
@@ -83,10 +83,10 @@
         String prefix = doc.get(startPart, documentOffset - startPart);
         return "rule dummy "
             + (dialect == null ? "" : " dialect \"" + dialect + "\" ")
-            + "\n when \n then \n org.drools.workflow.instance.NodeInstance nodeInstance; \n " + prefix;
+            + "\n when \n then \n org.drools.spi.ProcessContext context = null; \n " + prefix;
     }
     
-    public List getImports() {
+    public List<String> getImports() {
     	if (imports == null) {
     		loadImports();
     	}
@@ -94,12 +94,12 @@
     }
     
     private void loadImports() {
-    	this.imports = new ArrayList();
-    	List imports = process.getImports();
+    	this.imports = new ArrayList<String>();
+    	List<String> imports = process.getImports();
     	if (imports != null) {
-	    	Iterator iterator = imports.iterator();
+	    	Iterator<String> iterator = imports.iterator();
 	        while (iterator.hasNext()) {
-	            String importName = (String) iterator.next();
+	            String importName = iterator.next();
 	            if (importName.endsWith(".*")) {
 	            	IJavaProject javaProject = getJavaProject();
 	            	if (javaProject != null) {
@@ -128,17 +128,37 @@
     	}
     }
     
+    protected List<String> getFunctions() {
+    	if (functions == null) {
+    		loadFunctions();
+    	}
+    	return functions;
+    }
+    
+    private void loadFunctions() {
+    	this.functions = new ArrayList<String>();
+    	List<String> imports = process.getFunctionImports();
+    	if (imports != null) {
+	    	for (String functionImport: imports) {
+                int index = functionImport.lastIndexOf('.');
+                if (index != -1) {
+                    functions.add(functionImport.substring(index + 1));
+                }
+            }
+    	}
+    }
+    
     private void loadAttributes() {
         if (this.dialect == null) {
             attributes = Collections.EMPTY_MAP;
         } else {
-            Map result = new HashMap();
+            Map<String, String> result = new HashMap<String, String>();
             result.put("dialect", dialect);
             attributes = result;
         }
     }
     
-    protected Map getAttributes() {
+    protected Map<String, String> getAttributes() {
         if (attributes == null) {
             loadAttributes();
         }

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	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/action/ActionDialog.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -224,6 +224,8 @@
 				if (code != CANCEL) {
 					List imports = dialog.getImports();
 					process.setImports(imports);
+					List functionImports = dialog.getFunctionImports();
+					process.setFunctionImports(functionImports);
 					completionProcessor.reset();
 				}
 			}

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/color/ColorCellEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/color/ColorCellEditor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/color/ColorCellEditor.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -0,0 +1,27 @@
+package org.drools.eclipse.flow.ruleflow.view.property.color;
+
+import org.eclipse.jface.viewers.DialogCellEditor;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.ColorDialog;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+
+public class ColorCellEditor extends DialogCellEditor {
+
+    public ColorCellEditor(Composite parent) {
+        super(parent);
+    }
+    
+    protected Object openDialogBox(Control cellEditorWindow) {
+    	ColorDialog dialog = new ColorDialog(Display.getCurrent().getActiveShell());
+    	Color color = (Color) getValue();
+    	if (color != null) {
+    		dialog.setRGB(color.getRGB());
+    	}
+		RGB result = (RGB) dialog.open();
+		return result == null ? null : new Color(Display.getCurrent(), result);
+    }
+
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/color/ColorPropertyDescriptor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/color/ColorPropertyDescriptor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/color/ColorPropertyDescriptor.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -0,0 +1,26 @@
+package org.drools.eclipse.flow.ruleflow.view.property.color;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.drools.eclipse.flow.ruleflow.view.property.action.ActionCellEditor;
+import org.drools.workflow.core.WorkflowProcess;
+import org.drools.workflow.core.node.ActionNode;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+public class ColorPropertyDescriptor extends PropertyDescriptor {
+
+    public ColorPropertyDescriptor(Object id, String displayName) {
+        super(id, displayName);
+    }
+    
+    public CellEditor createPropertyEditor(Composite parent) {
+    	ColorCellEditor editor = new ColorCellEditor(parent);
+        if (getValidator() != null) {
+            editor.setValidator(getValidator());
+        }
+        return editor;
+    }
+    
+}

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/ConstraintCompletionProcessor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/ConstraintCompletionProcessor.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/ConstraintCompletionProcessor.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -17,13 +17,16 @@
  */
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 
 import org.drools.eclipse.editors.DRLRuleEditor;
 import org.drools.eclipse.editors.completion.RuleCompletionProcessor;
 import org.drools.lang.descr.GlobalDescr;
+import org.drools.process.core.context.variable.Variable;
+import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.core.datatype.DataType;
+import org.drools.process.core.datatype.impl.type.ObjectDataType;
 import org.drools.workflow.core.WorkflowProcess;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.runtime.CoreException;
@@ -48,6 +51,7 @@
 	private WorkflowProcess process;
 	private List<String> imports;
 	private List<GlobalDescr> globals;
+	private String type;
 	
 	public ConstraintCompletionProcessor(WorkflowProcess process) {
 		super(null);
@@ -67,11 +71,30 @@
 		}
 		return null;
 	}
+	
+	public void setType(String type) {
+		this.type = type;
+	}
 
     protected String readBackwards(int documentOffset, IDocument doc) throws BadLocationException {
-        int startPart = doc.getPartition(documentOffset).getOffset();
+    	int startPart = doc.getPartition(documentOffset).getOffset();
         String prefix = doc.get(startPart, documentOffset - startPart);
-        return "rule dummy \n when \n" + prefix;
+        if ("code".equals(type)) {
+        	if (prefix.startsWith("return ")) {
+        		prefix = prefix.substring(7);
+        	}
+        	String result = "rule dummy when eval( ";
+        	VariableScope variableScope = (VariableScope) process.getDefaultContext(VariableScope.VARIABLE_SCOPE);
+        	if (variableScope != null) {
+        		for (Variable variable: variableScope.getVariables()) {
+        			DataType type = variable.getType();
+        			result +=  type.getStringType() + " " + variable.getName() + "; ";	
+        		}
+        	}
+    		return result + prefix;
+    	} else {
+	        return "rule dummy \n when \n" + prefix;
+    	}
     }
     
     public List getImports() {

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowConstraintDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowConstraintDialog.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowConstraintDialog.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -208,9 +208,18 @@
         l3.setText("Type:");
         typeCombo = new Combo(top, SWT.DROP_DOWN | SWT.READ_ONLY);
         typeCombo.setItems(TYPES);
-        typeCombo.select(0);
         gd = new GridData();
         typeCombo.setLayoutData(gd);
+        typeCombo.addSelectionListener(new SelectionListener() {
+			public void widgetDefaultSelected(SelectionEvent e) {
+			}
+			public void widgetSelected(SelectionEvent e) {
+				if (completionProcessor != null) {
+					completionProcessor.setType(typeCombo.getText());
+				}
+			}
+        });
+        typeCombo.select(0);
         
         Label l4 = new Label(top, SWT.NONE);
         gd = new GridData();
@@ -357,6 +366,7 @@
                 index = found;
 	        }
 	        dialectCombo.select(index);
+            completionProcessor.setType(typeCombo.getText());
 			setConstraintText(constraint.getConstraint());
 		} else {
 			priorityText.setText("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-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/RuleFlowImportsDialog.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -55,12 +55,15 @@
 
 	private static final Pattern IMPORT_PATTERN = Pattern.compile(
 		"\\n\\s*import\\s+([^\\s;#]+);?", Pattern.DOTALL);
+	private static final Pattern FUNCTION_IMPORT_PATTERN = Pattern.compile(
+			"\\n\\s*import\\s+function\\s+([^\\s;#]+);?", Pattern.DOTALL);
 	
 	private WorkflowProcess process;
 	private boolean success;
 	private TabFolder tabFolder;
 	private SourceViewer importsViewer;
 	private List<String> imports;
+	private List<String> functionImports;
 
 	public RuleFlowImportsDialog(Shell parentShell, WorkflowProcess process) {
 		super(parentShell);
@@ -120,6 +123,12 @@
 				result += "import " + importString + "\n";
 			}
 		}
+		imports = process.getFunctionImports();
+		if (imports != null) {
+			for (String importString: imports) {
+				result += "import function " + importString + "\n";
+			}
+		}
 		return result;
 	}
 	
@@ -154,11 +163,23 @@
 		return imports;
 	}
 	
+	public List<String> getFunctionImports() {
+		return functionImports;
+	}
+	
 	private void updateImports() {
 		this.imports = new ArrayList<String>();
 		Matcher matcher = IMPORT_PATTERN.matcher(importsViewer.getDocument().get());
 		while (matcher.find()) {
-			this.imports.add(matcher.group(1));
+			String importString = matcher.group(1);
+			if (!"function".equals(importString)) {
+				this.imports.add(importString);
+			}
 		}
+		this.functionImports = new ArrayList<String>();
+		matcher = FUNCTION_IMPORT_PATTERN.matcher(importsViewer.getDocument().get());
+		while (matcher.find()) {
+			this.functionImports.add(matcher.group(1));
+		}
 	}
 }

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/preferences/DroolsPreferencePage.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/preferences/DroolsPreferencePage.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/preferences/DroolsPreferencePage.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -20,6 +20,7 @@
 	private Button collapseEditorCheckBox;
 	private Button cacheParsedRulesCheckBox;
 	private Combo processSkinCombo;
+	private Button allowNodeCustomizationCheckBox;
 	
 	protected Control createContents(Composite parent) {
 		final Composite composite = new Composite(parent, SWT.NONE);
@@ -38,6 +39,8 @@
 		processSkinCombo = new Combo(composite, SWT.LEFT);
 		processSkinCombo.add("default");
 		processSkinCombo.add("BPMN");
+		allowNodeCustomizationCheckBox = createCheckBox(composite,
+			"Allow the customization of process nodes.");
 
 		initializeValues();
 
@@ -68,7 +71,8 @@
         	index = 1;
         }
         processSkinCombo.select(index);
-    }
+        allowNodeCustomizationCheckBox.setSelection(store.getDefaultBoolean(IDroolsConstants.ALLOW_NODE_CUSTOMIZATION));
+	}
 
 	private void initializeValues() {
         IPreferenceStore store = getPreferenceStore();
@@ -81,6 +85,7 @@
         	index = 1;
         }
         processSkinCombo.select(index);
+        allowNodeCustomizationCheckBox.setSelection(store.getBoolean(IDroolsConstants.ALLOW_NODE_CUSTOMIZATION));
     }
 
 	protected void performDefaults() {
@@ -101,6 +106,7 @@
         store.setValue(IDroolsConstants.CACHE_PARSED_RULES, cacheParsedRulesCheckBox.getSelection());
         store.setValue(IDroolsConstants.SKIN,
     		(String) processSkinCombo.getItem(processSkinCombo.getSelectionIndex()));
+        store.setValue(IDroolsConstants.ALLOW_NODE_CUSTOMIZATION, allowNodeCustomizationCheckBox.getSelection());
     }
 
 	public void init(IWorkbench workbench) {

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	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/preferences/IDroolsConstants.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -9,5 +9,6 @@
 	String DRL_EDITOR_MATCHING_BRACKETS_COLOR = "Drools.DRLMatchingBracketsColor";
 	String DSL_RULE_EDITOR_COMPLETION_FULL_SENTENCES = "Drools.DSLRuleEditorCompletionFullSentences";
 	String SKIN = "Drools.Flow.Skin";
+	String ALLOW_NODE_CUSTOMIZATION = "Drools.Flow.AllowNodeCustomization";
 	
 }

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-test/src/test/java/org/drools/eclipse/editors/completion/CompletionContextTest.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-test/src/test/java/org/drools/eclipse/editors/completion/CompletionContextTest.java	2008-10-27 23:41:19 UTC (rev 23599)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-test/src/test/java/org/drools/eclipse/editors/completion/CompletionContextTest.java	2008-10-28 00:27:54 UTC (rev 23600)
@@ -1811,6 +1811,18 @@
         assertEquals("meth", location.getProperty(Location.LOCATION_RHS_CONTENT));
     }
 
+    public void testCheckRHSLocationDetermination4() {
+        String input =
+        	"rule MyRule \n" +
+        	"	when\n" +
+        	"		Class ( )\n" +
+        	"   then\n" +
+        	"       String s = ";
+        Location location = new CompletionContext(input).getLocation();
+        assertEquals(Location.LOCATION_RHS, location.getType());
+        assertEquals("String s =", location.getProperty(Location.LOCATION_RHS_CONTENT));
+    }
+
     public void testCheckRuleHeaderLocationDetermination() {
         String input =
         	"rule MyRule ";




More information about the jboss-svn-commits mailing list