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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Jul 2 10:05:03 EDT 2010


Author: KrisVerlaenen
Date: 2010-07-02 10:05:02 -0400 (Fri, 02 Jul 2010)
New Revision: 33735

Added:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/MetaDataHandler.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/metadata/
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/metadata/MetaDataCellEditor.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/metadata/MetaDataDialog.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/metadata/MetaDataPropertyDescriptor.java
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/ProcessSemanticModule.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/AbstractNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/ActionNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/CompositeNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/EndNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/EventNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/FaultNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/HumanTaskNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/JoinNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/MilestoneNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/RuleSetNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/SplitNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/StartNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/StateNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/SubProcessNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/TimerNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/WorkItemNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-5.0.xsd
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/xml/processes/XMLPersistenceTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/NodeImpl.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/AbstractNodeWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/ActionWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/DynamicNodeWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/EndNodeWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/EventNodeWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/FaultNodeWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/JoinWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/SplitWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/StateBasedNodeWrapper.java
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/TimerWrapper.java
Log:
JBRULES-2565: Support for process node metadata
 - added support for metadata in compiler and eclipse plugin


Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/ProcessSemanticModule.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/ProcessSemanticModule.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/ProcessSemanticModule.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -18,6 +18,7 @@
 import org.drools.compiler.xml.processes.InPortHandler;
 import org.drools.compiler.xml.processes.JoinNodeHandler;
 import org.drools.compiler.xml.processes.MappingHandler;
+import org.drools.compiler.xml.processes.MetaDataHandler;
 import org.drools.compiler.xml.processes.MilestoneNodeHandler;
 import org.drools.compiler.xml.processes.OutPortHandler;
 import org.drools.compiler.xml.processes.ParameterHandler;
@@ -115,5 +116,7 @@
      		               new StateNodeHandler() );        
         addHandler( "dynamic",
  		                   new DynamicNodeHandler() );        
+        addHandler( "metaData",
+                           new MetaDataHandler() );        
     }
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/AbstractNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/AbstractNodeHandler.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/AbstractNodeHandler.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -14,6 +14,7 @@
 import org.drools.workflow.core.NodeContainer;
 import org.drools.workflow.core.impl.DroolsConsequenceAction;
 import org.drools.workflow.core.impl.ExtendedNodeImpl;
+import org.drools.workflow.core.impl.NodeImpl;
 import org.drools.xml.BaseAbstractHandler;
 import org.drools.xml.ExtensibleXmlParser;
 import org.drools.xml.Handler;
@@ -180,6 +181,37 @@
         }
     }
     
+    protected boolean containsMetaData(final Node node) {
+        for (Map.Entry<String, Object> entry: ((NodeImpl) node).getMetaData().entrySet()) {
+        	String name = entry.getKey();
+        	if (!"x".equals(name)
+        			 && !"y".equals(name)
+        			 && !"width".equals(name)
+        			 && !"height".equals(name)
+        			 && !"color".equals(name)
+        			 && entry.getValue() instanceof String) {
+        		return true;
+        	}
+        }
+        return false;
+    }
+    
+    protected void writeMetaData(final Node node, final StringBuilder xmlDump) {
+        for (Map.Entry<String, Object> entry: ((NodeImpl) node).getMetaData().entrySet()) {
+        	String name = entry.getKey();
+        	if (!"x".equals(name)
+        			 && !"y".equals(name)
+        			 && !"width".equals(name)
+        			 && !"height".equals(name)
+        			 && !"color".equals(name)
+        			 && entry.getValue() instanceof String) {
+        		xmlDump.append("      <metaData name=\"" + name + "\">" + EOL);
+        		xmlDump.append("        <value>" + entry.getValue() + "</value>" + EOL);
+        		xmlDump.append("      </metaData>" + EOL);
+        	}
+        }
+    }
+    
     protected void writeActions(final String type, List<DroolsAction> actions, final StringBuilder xmlDump) {
     	if (actions != null && actions.size() > 0) {
     		xmlDump.append("      <" + type + ">" + EOL);

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/ActionNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/ActionNodeHandler.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/ActionNodeHandler.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -36,9 +36,14 @@
 		ActionNode actionNode = (ActionNode) node;
 		writeNode("actionNode", actionNode, xmlDump, includeMeta);
         DroolsConsequenceAction action = (DroolsConsequenceAction) actionNode.getAction();
-        if (action != null) {
+        if (action != null || (includeMeta && containsMetaData(actionNode))) {
         	xmlDump.append(">" + EOL);
-        	writeAction(action, xmlDump);
+        	if (action != null) {
+        		writeAction(action, xmlDump);
+        	}
+        	if (includeMeta) {
+        		writeMetaData(actionNode, xmlDump);
+        	}
             endNode("actionNode", xmlDump);
         } else {
         	endNode(xmlDump);

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/CompositeNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/CompositeNodeHandler.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/CompositeNodeHandler.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -41,6 +41,9 @@
         CompositeNode compositeNode = (CompositeNode) node;
         writeAttributes(compositeNode, xmlDump, includeMeta);
         xmlDump.append(">" + EOL);
+        if (includeMeta) {
+        	writeMetaData(compositeNode, xmlDump);
+        }
     	for (String eventType: compositeNode.getActionTypes()) {
         	writeActions(eventType, compositeNode.getActions(eventType), xmlDump);
         }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/EndNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/EndNodeHandler.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/EndNodeHandler.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -34,7 +34,13 @@
         if (!terminate) {
             xmlDump.append("terminate=\"false\" ");
         }
-        endNode(xmlDump);
+        if (includeMeta && containsMetaData(endNode)) {
+        	xmlDump.append(">" + EOL);
+        	writeMetaData(endNode, xmlDump);
+        	endNode("end", xmlDump);
+        } else {
+            endNode(xmlDump);
+        }
 	}
 
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/EventNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/EventNodeHandler.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/EventNodeHandler.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -46,6 +46,9 @@
             xmlDump.append("scope=\"" + scope + "\" ");
         }
         xmlDump.append(">" + EOL);
+        if (includeMeta) {
+        	writeMetaData(eventNode, xmlDump);
+        }
         xmlDump.append("      <eventFilters>" + EOL);
         for (EventFilter filter: eventNode.getEventFilters()) {
         	if (filter instanceof EventTypeFilter) {

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/FaultNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/FaultNodeHandler.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/FaultNodeHandler.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -42,7 +42,13 @@
 		if (faultVariable != null && faultVariable.length() != 0) {
             xmlDump.append("faultVariable=\"" + faultVariable + "\" ");
         }
-        endNode(xmlDump);
+        if (includeMeta && containsMetaData(faultNode)) {
+        	xmlDump.append(">" + EOL);
+        	writeMetaData(faultNode, xmlDump);
+        	endNode("fault", xmlDump);
+        } else {
+            endNode(xmlDump);
+        }
 	}
 
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/HumanTaskNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/HumanTaskNodeHandler.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/HumanTaskNodeHandler.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -34,6 +34,9 @@
         writeNode("humanTask", workItemNode, xmlDump, includeMeta);
         visitParameters(workItemNode, xmlDump);
         xmlDump.append(">" + EOL);
+        if (includeMeta) {
+        	writeMetaData(workItemNode, xmlDump);
+        }
         Work work = workItemNode.getWork();
         visitWork(work, xmlDump, includeMeta);
         visitInMappings(workItemNode.getInMappings(), xmlDump);

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/JoinNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/JoinNodeHandler.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/JoinNodeHandler.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -44,7 +44,13 @@
 	            xmlDump.append("n=\"" + n + "\" ");
 	        }
         }
-        endNode(xmlDump);
+        if (includeMeta && containsMetaData(joinNode)) {
+        	xmlDump.append(">" + EOL);
+        	writeMetaData(joinNode, xmlDump);
+        	endNode("join", xmlDump);
+        } else {
+            endNode(xmlDump);
+        }
 	}
 
 }

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/MetaDataHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/MetaDataHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/MetaDataHandler.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -0,0 +1,73 @@
+package org.drools.compiler.xml.processes;
+
+import java.util.HashSet;
+
+import org.drools.process.core.ValueObject;
+import org.drools.process.core.datatype.DataType;
+import org.drools.process.core.datatype.impl.type.StringDataType;
+import org.drools.workflow.core.Node;
+import org.drools.xml.BaseAbstractHandler;
+import org.drools.xml.ExtensibleXmlParser;
+import org.drools.xml.Handler;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class MetaDataHandler extends BaseAbstractHandler
+    implements
+    Handler {
+    public MetaDataHandler() {
+        if ( (this.validParents == null) && (this.validPeers == null) ) {
+            this.validParents = new HashSet();
+            this.validParents.add( Node.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 );
+        Node node = (Node) parser.getParent();
+        final String name = attrs.getValue("name");
+        emptyAttributeCheck(localName, "name", name, parser);
+        return new MetaDataWrapper(node, name);
+    }    
+    
+    public Object end(final String uri,
+                      final String localName,
+                      final ExtensibleXmlParser parser) throws SAXException {
+        parser.endElementBuilder();
+        return null;
+    }
+
+    public Class generateNodeFor() {
+        return MetaDataWrapper.class;
+    }
+    
+    public class MetaDataWrapper implements ValueObject {
+    	private Node node;
+    	private String name;
+    	public MetaDataWrapper(Node node, String name) {
+    		this.node = node;
+    		this.name = name;
+    	}
+		public Object getValue() {
+			return node.getMetaData(name);
+		}
+		public void setValue(Object value) {
+			node.setMetaData(name, value);
+		}
+		public DataType getType() {
+			return new StringDataType();
+		}
+		public void setType(DataType type) {
+		}
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/MilestoneNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/MilestoneNodeHandler.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/MilestoneNodeHandler.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -35,6 +35,9 @@
         String constraint = milestoneNode.getConstraint();
         if (constraint != null || milestoneNode.getTimers() != null || milestoneNode.containsActions()) {
             xmlDump.append(">\n");
+            if (includeMeta) {
+            	writeMetaData(milestoneNode, xmlDump);
+            }
             if (constraint != null) {
             	xmlDump.append("      <constraint type=\"rule\" dialect=\"mvel\" >"
             			+ XmlDumper.replaceIllegalChars(constraint.trim()) + "</constraint>" + EOL);

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/RuleSetNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/RuleSetNodeHandler.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/RuleSetNodeHandler.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -35,9 +35,14 @@
         if (ruleFlowGroup != null) {
             xmlDump.append("ruleFlowGroup=\"" + ruleFlowGroup + "\" ");
         }
-        if (ruleSetNode.getTimers() != null) {
+        if (ruleSetNode.getTimers() != null || (includeMeta && containsMetaData(ruleSetNode))) {
             xmlDump.append(">\n");
-            writeTimers(ruleSetNode.getTimers(), xmlDump);
+            if (ruleSetNode.getTimers() != null) {
+            	writeTimers(ruleSetNode.getTimers(), xmlDump);
+            }
+            if (includeMeta) {
+            	writeMetaData(ruleSetNode, xmlDump);
+            }
             endNode("ruleSet", xmlDump);
         } else {
             endNode(xmlDump);

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/SplitNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/SplitNodeHandler.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/SplitNodeHandler.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -44,6 +44,9 @@
             endNode(xmlDump);
         } else {
             xmlDump.append(">" + EOL);
+            if (includeMeta) {
+            	writeMetaData(splitNode, xmlDump);
+            }
             xmlDump.append("      <constraints>" + EOL);
             for (Map.Entry<ConnectionRef, Constraint> entry: splitNode.getConstraints().entrySet()) {
                 ConnectionRef connection = entry.getKey();

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/StartNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/StartNodeHandler.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/StartNodeHandler.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -27,54 +27,59 @@
 		StartNode startNode = (StartNode) node;
 		writeNode("start", startNode, xmlDump, includeMeta);
 		List<Trigger> triggers = startNode.getTriggers();
-		if (triggers == null || triggers.isEmpty()) {
+		if ((triggers == null || triggers.isEmpty()) && (!includeMeta || !containsMetaData(startNode))) {
 			endNode(xmlDump);
 		} else {
 			xmlDump.append(">" + EOL);
-			xmlDump.append("        <triggers>" + EOL);
-			for (Trigger trigger: triggers) {
-				if (trigger instanceof ConstraintTrigger) {
-					xmlDump.append("         <trigger type=\"constraint\" >" + EOL);
-					xmlDump.append("           <constraint type=\"rule\" dialect=\"mvel\" >"
-						+ ((ConstraintTrigger) trigger).getConstraint() + "</constraint>" + EOL);
-					Map<String, String> inMappings = trigger.getInMappings();
-			    	if (inMappings != null && !inMappings.isEmpty()) {
-			    		for (Map.Entry<String, String> entry: inMappings.entrySet()) {
-				    		xmlDump.append("          <mapping type=\"in\" from=\""
-			    				+ XmlDumper.replaceIllegalChars(entry.getValue())
-			    				+ "\" to=\"" + entry.getKey() + "\" />" + EOL);
+			if (includeMeta) {
+				writeMetaData(startNode, xmlDump);
+			}
+			if (triggers != null) {
+				xmlDump.append("      <triggers>" + EOL);
+				for (Trigger trigger: triggers) {
+					if (trigger instanceof ConstraintTrigger) {
+						xmlDump.append("        <trigger type=\"constraint\" >" + EOL);
+						xmlDump.append("          <constraint type=\"rule\" dialect=\"mvel\" >"
+							+ ((ConstraintTrigger) trigger).getConstraint() + "</constraint>" + EOL);
+						Map<String, String> inMappings = trigger.getInMappings();
+				    	if (inMappings != null && !inMappings.isEmpty()) {
+				    		for (Map.Entry<String, String> entry: inMappings.entrySet()) {
+					    		xmlDump.append("          <mapping type=\"in\" from=\""
+				    				+ XmlDumper.replaceIllegalChars(entry.getValue())
+				    				+ "\" to=\"" + entry.getKey() + "\" />" + EOL);
+					    	}
 				    	}
-			    	}
-					xmlDump.append("         </trigger>" + EOL);
-				} else if (trigger instanceof EventTrigger) {
-					xmlDump.append("         <trigger type=\"event\" >" + EOL);
-			        xmlDump.append("           <eventFilters>" + EOL);
-					for (EventFilter filter: ((EventTrigger) trigger).getEventFilters()) {
-			        	if (filter instanceof EventTypeFilter) {
-			        		xmlDump.append("             <eventFilter "
-			                    + "type=\"eventType\" "
-			                    + "eventType=\"" + ((EventTypeFilter) filter).getType() + "\" />" + EOL);
-			        	} else {
-			        		throw new IllegalArgumentException(
-			    				"Unknown filter type: " + filter);
-			        	}
-			        }
-			        xmlDump.append("           </eventFilters>" + EOL);
-					Map<String, String> inMappings = trigger.getInMappings();
-			    	if (inMappings != null && !inMappings.isEmpty()) {
-			    		for (Map.Entry<String, String> entry: inMappings.entrySet()) {
-				    		xmlDump.append("          <mapping type=\"in\" from=\""
-			    				+ XmlDumper.replaceIllegalChars(entry.getValue())
-			    				+ "\" to=\"" + entry.getKey() + "\" />" + EOL);
+						xmlDump.append("        </trigger>" + EOL);
+					} else if (trigger instanceof EventTrigger) {
+						xmlDump.append("        <trigger type=\"event\" >" + EOL);
+				        xmlDump.append("          <eventFilters>" + EOL);
+						for (EventFilter filter: ((EventTrigger) trigger).getEventFilters()) {
+				        	if (filter instanceof EventTypeFilter) {
+				        		xmlDump.append("             <eventFilter "
+				                    + "type=\"eventType\" "
+				                    + "eventType=\"" + ((EventTypeFilter) filter).getType() + "\" />" + EOL);
+				        	} else {
+				        		throw new IllegalArgumentException(
+				    				"Unknown filter type: " + filter);
+				        	}
+				        }
+				        xmlDump.append("          </eventFilters>" + EOL);
+						Map<String, String> inMappings = trigger.getInMappings();
+				    	if (inMappings != null && !inMappings.isEmpty()) {
+				    		for (Map.Entry<String, String> entry: inMappings.entrySet()) {
+					    		xmlDump.append("          <mapping type=\"in\" from=\""
+				    				+ XmlDumper.replaceIllegalChars(entry.getValue())
+				    				+ "\" to=\"" + entry.getKey() + "\" />" + EOL);
+					    	}
 				    	}
-			    	}
-					xmlDump.append("         </trigger>" + EOL);
-				} else {
-					throw new IllegalArgumentException(
-						"Unknown trigger type " + trigger);
+						xmlDump.append("        </trigger>" + EOL);
+					} else {
+						throw new IllegalArgumentException(
+							"Unknown trigger type " + trigger);
+					}
 				}
+				xmlDump.append("      </triggers>" + EOL);
 			}
-			xmlDump.append("        </triggers>" + EOL);
 			endNode("start", xmlDump);
 		}
 	}

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/StateNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/StateNodeHandler.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/StateNodeHandler.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -36,6 +36,9 @@
 		StateNode stateNode = (StateNode) node;
 		writeNode("state", stateNode, xmlDump, includeMeta);
         xmlDump.append(">\n");
+        if (includeMeta) {
+        	writeMetaData(stateNode, xmlDump);
+        }
     	for (String eventType: stateNode.getActionTypes()) {
         	writeActions(eventType, stateNode.getActions(eventType), xmlDump);
         }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/SubProcessNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/SubProcessNodeHandler.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/SubProcessNodeHandler.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -51,6 +51,9 @@
             xmlDump.append("independent=\"false\" ");
         }
         xmlDump.append(">" + EOL);
+        if (includeMeta) {
+        	writeMetaData(subProcessNode, xmlDump);
+        }
         Map<String, String> inMappings = subProcessNode.getInMappings();
         for (Map.Entry<String, String> inMapping: inMappings.entrySet()) {
             xmlDump.append(

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/TimerNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/TimerNodeHandler.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/TimerNodeHandler.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -50,7 +50,13 @@
                 xmlDump.append(" period=\"" + timer.getPeriod() + "\" ");
             }
         }
-        endNode(xmlDump);
+        if (includeMeta && containsMetaData(timerNode)) {
+        	xmlDump.append(">" + EOL);
+        	writeMetaData(timerNode, xmlDump);
+        	endNode("timerNode", xmlDump);
+        } else {
+            endNode(xmlDump);
+        }
 	}
 
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/WorkItemNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/WorkItemNodeHandler.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/xml/processes/WorkItemNodeHandler.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -43,6 +43,9 @@
 		writeNode("workItem", workItemNode, xmlDump, includeMeta);
         visitParameters(workItemNode, xmlDump);
         xmlDump.append(">" + EOL);
+        if (includeMeta) {
+        	writeMetaData(workItemNode, xmlDump);
+        }
         Work work = workItemNode.getWork();
         visitWork(work, xmlDump, includeMeta);
         visitInMappings(workItemNode.getInMappings(), xmlDump);

Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-5.0.xsd
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-5.0.xsd	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools-processes-5.0.xsd	2010-07-02 14:05:02 UTC (rev 33735)
@@ -145,6 +145,14 @@
 			</xs:choice>
 		</xs:complexType>
 	</xs:element>
+	<xs:element name="metaData">
+		<xs:complexType>
+			<xs:choice minOccurs="0" maxOccurs="1">
+				<xs:element ref="drools:value"/>
+			</xs:choice>
+			<xs:attribute name="name" type="xs:string" use="required"/>
+		</xs:complexType>
+	</xs:element>
 	<xs:element name="timers">
 		<xs:complexType>
 			<xs:sequence minOccurs="0" maxOccurs="unbounded">
@@ -164,7 +172,8 @@
 	</xs:element>
 	<xs:element name="start">
 		<xs:complexType>
-			<xs:choice minOccurs="0" maxOccurs="1">
+			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:metaData"/>
 				<xs:element ref="drools:triggers"/>
 			</xs:choice>
 			<xs:attribute name="id" type="xs:string" use="required"/>
@@ -194,6 +203,9 @@
 	</xs:element>
 	<xs:element name="end">
 		<xs:complexType>
+			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:metaData"/>
+			</xs:choice>
 			<xs:attribute name="id" type="xs:string" use="required"/>
 			<xs:attribute name="name" type="xs:string"/>
 			<xs:attribute name="x" type="xs:string"/>
@@ -205,9 +217,10 @@
 	</xs:element>
 	<xs:element name="actionNode">
 		<xs:complexType>
-			<xs:sequence minOccurs="0" maxOccurs="1">
+			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:metaData"/>
 				<xs:element ref="drools:action"/>
-			</xs:sequence>
+			</xs:choice>
 			<xs:attribute name="id" type="xs:string" use="required"/>
 			<xs:attribute name="name" type="xs:string"/>
 			<xs:attribute name="x" type="xs:string"/>
@@ -230,6 +243,7 @@
 	<xs:element name="ruleSet">
 		<xs:complexType>
 			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:metaData"/>
 				<xs:element ref="drools:timers"/>
 			</xs:choice>
 			<xs:attribute name="id" type="xs:string" use="required"/>
@@ -243,9 +257,10 @@
 	</xs:element>
 	<xs:element name="split">
 		<xs:complexType>
-			<xs:sequence minOccurs="0">
+			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:metaData"/>
 				<xs:element ref="drools:constraints"/>
-			</xs:sequence>
+			</xs:choice>
 			<xs:attribute name="id" type="xs:string" use="required"/>
 			<xs:attribute name="name" type="xs:string"/>
 			<xs:attribute name="x" type="xs:string"/>
@@ -278,6 +293,9 @@
 	</xs:element>
 	<xs:element name="join">
 		<xs:complexType>
+			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:metaData"/>
+			</xs:choice>
 			<xs:attribute name="id" type="xs:string" use="required"/>
 			<xs:attribute name="name" type="xs:string"/>
 			<xs:attribute name="x" type="xs:string"/>
@@ -291,6 +309,7 @@
 	<xs:element name="milestone">
 		<xs:complexType>
 			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:metaData"/>
 				<xs:element ref="drools:constraint"/>
 				<xs:element ref="drools:timers"/>
 				<xs:element ref="drools:onEntry"/>
@@ -307,6 +326,7 @@
 	<xs:element name="subProcess">
 		<xs:complexType>
 			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:metaData"/>
 				<xs:element ref="drools:mapping"/>
 				<xs:element ref="drools:timers"/>
 				<xs:element ref="drools:onEntry"/>
@@ -326,6 +346,7 @@
 	<xs:element name="workItem">
 		<xs:complexType>
 			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:metaData"/>
 				<xs:element ref="drools:timers"/>
 				<xs:element ref="drools:work"/>
 				<xs:element ref="drools:mapping"/>
@@ -381,6 +402,9 @@
 	</xs:element>
 	<xs:element name="timerNode">
 		<xs:complexType>
+			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:metaData"/>
+			</xs:choice>
 			<xs:attribute name="id" type="xs:string" use="required"/>
 			<xs:attribute name="name" type="xs:string"/>
 			<xs:attribute name="x" type="xs:string"/>
@@ -394,6 +418,7 @@
 	<xs:element name="humanTask">
 		<xs:complexType>
 			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:metaData"/>
 				<xs:element ref="drools:work"/>
 				<xs:element ref="drools:mapping"/>
 				<xs:element ref="drools:timers"/>
@@ -413,6 +438,7 @@
 	<xs:element name="composite">
 		<xs:complexType>
 			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:metaData"/>
 				<xs:element ref="drools:timers"/>
 				<xs:element ref="drools:onEntry"/>
 				<xs:element ref="drools:onExit"/>
@@ -434,6 +460,7 @@
 	<xs:element name="forEach">
 		<xs:complexType>
 			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:metaData"/>
 				<xs:element ref="drools:nodes"/>
 				<xs:element ref="drools:connections"/>
 				<xs:element ref="drools:in-ports"/>
@@ -480,7 +507,8 @@
 	</xs:element>
 	<xs:element name="eventNode">
 		<xs:complexType>
-			<xs:choice minOccurs="0" maxOccurs="1">
+			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:metaData"/>
 				<xs:element ref="drools:eventFilters"/>
 			</xs:choice>
 			<xs:attribute name="id" type="xs:string" use="required"/>
@@ -508,6 +536,9 @@
 	</xs:element>
 	<xs:element name="fault">
 		<xs:complexType>
+			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:metaData"/>
+			</xs:choice>
 			<xs:attribute name="id" type="xs:string" use="required"/>
 			<xs:attribute name="name" type="xs:string"/>
 			<xs:attribute name="x" type="xs:string"/>
@@ -521,6 +552,7 @@
 	<xs:element name="state">
 		<xs:complexType>
 			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:metaData"/>
 				<xs:element ref="drools:timers"/>
 				<xs:element ref="drools:onEntry"/>
 				<xs:element ref="drools:onExit"/>
@@ -537,6 +569,7 @@
 	<xs:element name="dynamic">
 		<xs:complexType>
 			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="drools:metaData"/>
 				<xs:element ref="drools:variables"/>
 				<xs:element ref="drools:exceptionHandlers"/>
 				<xs:element ref="drools:nodes"/>

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/xml/processes/XMLPersistenceTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/xml/processes/XMLPersistenceTest.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/xml/processes/XMLPersistenceTest.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -191,6 +191,8 @@
         startNode.setMetaData("y", 2);
         startNode.setMetaData("width", 3);
         startNode.setMetaData("height", 4);
+        startNode.setMetaData("meta1", "someValue");
+        startNode.setMetaData("meta2", "someOtherValue");
         ConstraintTrigger constraintTrigger = new ConstraintTrigger();
         constraintTrigger.setConstraint("constraint");
         Map<String, String> inMapping = new HashMap<String, String>();

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/NodeImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/NodeImpl.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/NodeImpl.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -256,4 +256,12 @@
         return this.metaData.get(name);
     }
     
+    public Map<String, Object> getMetaData() {
+    	return this.metaData;
+    }
+    
+    public void setMetaData(Map<String, Object> metaData) {
+    	this.metaData = metaData;
+    }
+    
 }

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/AbstractNodeWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/AbstractNodeWrapper.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/AbstractNodeWrapper.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -15,13 +15,19 @@
  * limitations under the License.
  */
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.drools.eclipse.flow.common.editor.core.DefaultElementWrapper;
 import org.drools.eclipse.flow.common.editor.core.ElementConnection;
 import org.drools.eclipse.flow.common.editor.core.ElementWrapper;
+import org.drools.eclipse.flow.ruleflow.view.property.metadata.MetaDataPropertyDescriptor;
 import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.NodeImpl;
 import org.eclipse.draw2d.geometry.Rectangle;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
 
 /**
  * Wrapper for a node.
@@ -32,6 +38,16 @@
 	
 	private static final long serialVersionUID = 4L;
 
+    public static IPropertyDescriptor[] DESCRIPTORS;
+
+    public static final String METADATA = "MetaData";
+    static {
+    	DESCRIPTORS = new IPropertyDescriptor[DefaultElementWrapper.DESCRIPTORS.length + 1];
+        System.arraycopy(DefaultElementWrapper.DESCRIPTORS, 0, DESCRIPTORS, 0, DefaultElementWrapper.DESCRIPTORS.length);
+        DESCRIPTORS[DESCRIPTORS.length - 1] = 
+            new MetaDataPropertyDescriptor(METADATA, "MetaData");
+    }
+
 	public void setNode(Node node) {
         setElement(node);
     }
@@ -99,4 +115,31 @@
     		|| ((NodeWrapper) target).getNode() == getNode().getNodeContainer();
     }
     
+    public IPropertyDescriptor[] getPropertyDescriptors() {
+        return DESCRIPTORS;
+    }
+
+	public Object getPropertyValue(Object id) {
+		if (METADATA.equals(id)) {
+			return ((NodeImpl) getNode()).getMetaData();
+		}
+		return super.getPropertyValue(id);
+	}
+
+	public void resetPropertyValue(Object id) {
+		if (METADATA.equals(id)) {
+			((NodeImpl) getNode()).setMetaData(new HashMap<String, Object>());
+		} else {
+			super.resetPropertyValue(id);
+		}
+	}
+
+	public void setPropertyValue(Object id, Object value) {
+		if (METADATA.equals(id)) {
+			((NodeImpl) getNode()).setMetaData((Map<String, Object>) value);
+		} else {
+			super.setPropertyValue(id, value);
+		}
+	}
+	
 }

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/ActionWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/ActionWrapper.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/ActionWrapper.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -43,8 +43,8 @@
     }
     
     private void setDescriptors() {
-        descriptors = new IPropertyDescriptor[DefaultElementWrapper.DESCRIPTORS.length + 1];
-        System.arraycopy(DefaultElementWrapper.DESCRIPTORS, 0, descriptors, 0, DefaultElementWrapper.DESCRIPTORS.length);
+        descriptors = new IPropertyDescriptor[AbstractNodeWrapper.DESCRIPTORS.length + 1];
+        System.arraycopy(AbstractNodeWrapper.DESCRIPTORS, 0, descriptors, 0, AbstractNodeWrapper.DESCRIPTORS.length);
         descriptors[descriptors.length - 1] = 
             new ActionPropertyDescriptor(ACTION, "Action", getActionNode(), (WorkflowProcess) getParent().getProcessWrapper().getProcess());
     }

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/DynamicNodeWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/DynamicNodeWrapper.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/DynamicNodeWrapper.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -1,14 +1,31 @@
 package org.drools.eclipse.flow.ruleflow.core;
 
+import java.util.List;
+import java.util.Map;
+
+import org.drools.eclipse.flow.common.editor.core.DefaultElementWrapper;
 import org.drools.eclipse.flow.common.editor.core.ElementConnection;
 import org.drools.eclipse.flow.common.editor.core.ElementWrapper;
+import org.drools.eclipse.flow.ruleflow.view.property.action.OnEntryActionsPropertyDescriptor;
+import org.drools.eclipse.flow.ruleflow.view.property.action.OnExitActionsPropertyDescriptor;
+import org.drools.eclipse.flow.ruleflow.view.property.timers.TimersPropertyDescriptor;
 import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.core.timer.Timer;
+import org.drools.workflow.core.DroolsAction;
+import org.drools.workflow.core.WorkflowProcess;
+import org.drools.workflow.core.impl.ExtendedNodeImpl;
 import org.drools.workflow.core.node.DynamicNode;
+import org.drools.workflow.core.node.ForEachNode;
+import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
 
 public class DynamicNodeWrapper extends CompositeNodeWrapper {
 
+    public static final String AUTO_COMPLETE = "autoComplete";
+
     private static final long serialVersionUID = 4L;
-
+    
     public DynamicNodeWrapper() {
         setNode(new DynamicNode());
         getDynamicNode().setName("Dynamic");
@@ -21,6 +38,15 @@
     	return (DynamicNode) getNode();
     }
     
+    protected void initDescriptors() {
+    	super.initDescriptors();
+    	IPropertyDescriptor[] oldDescriptors = descriptors; 
+        descriptors = new IPropertyDescriptor[oldDescriptors.length + 1];
+        System.arraycopy(oldDescriptors, 0, descriptors, 0, oldDescriptors.length);
+        descriptors[descriptors.length - 1] = 
+        	new ComboBoxPropertyDescriptor(AUTO_COMPLETE, "Auto-complete", new String[] { "true", "false" });
+    }
+
     public boolean acceptsIncomingConnection(ElementConnection connection, ElementWrapper source) {
         return super.acceptsIncomingConnection(connection, source)
         	&& getIncomingConnections().isEmpty();
@@ -32,4 +58,27 @@
 //			|| (target.getParent() == this && getForEachNode().getLinkedIncomingNode(Node.CONNECTION_DEFAULT_TYPE) == null);
     }
     
+    public Object getPropertyValue(Object id) {
+        if (AUTO_COMPLETE.equals(id)) {
+        	return getDynamicNode().isAutoComplete() ? new Integer(0) : new Integer(1);
+        }
+        return super.getPropertyValue(id);
+    }
+
+    public void resetPropertyValue(Object id) {
+        if (AUTO_COMPLETE.equals(id)) {
+        	getDynamicNode().setAutoComplete(false);
+        } else {
+            super.resetPropertyValue(id);
+        }
+    }
+
+	public void setPropertyValue(Object id, Object value) {
+        if (AUTO_COMPLETE.equals(id)) {
+        	getDynamicNode().setAutoComplete(((Integer) value).intValue() == 0);
+        } else {
+            super.setPropertyValue(id, value);
+        }
+    }
+    
 }

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/EndNodeWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/EndNodeWrapper.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/EndNodeWrapper.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -37,8 +37,8 @@
     private static IPropertyDescriptor[] descriptors;
 
     static {
-        descriptors = new IPropertyDescriptor[DefaultElementWrapper.DESCRIPTORS.length + 1];
-        System.arraycopy(DefaultElementWrapper.DESCRIPTORS, 0, descriptors, 0, DefaultElementWrapper.DESCRIPTORS.length);
+        descriptors = new IPropertyDescriptor[AbstractNodeWrapper.DESCRIPTORS.length + 1];
+        System.arraycopy(AbstractNodeWrapper.DESCRIPTORS, 0, descriptors, 0, AbstractNodeWrapper.DESCRIPTORS.length);
         descriptors[descriptors.length - 1] = 
             new ComboBoxPropertyDescriptor(TERMINATE, "Terminate", new String[] { "true", "false" });
     }

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/EventNodeWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/EventNodeWrapper.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/EventNodeWrapper.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -42,8 +42,8 @@
     public static final String EVENT_TYPE = "eventType";
     public static final String SCOPE = "scope";
     static {
-        descriptors = new IPropertyDescriptor[DefaultElementWrapper.DESCRIPTORS.length + 3];
-        System.arraycopy(DefaultElementWrapper.DESCRIPTORS, 0, descriptors, 0, DefaultElementWrapper.DESCRIPTORS.length);
+        descriptors = new IPropertyDescriptor[AbstractNodeWrapper.DESCRIPTORS.length + 3];
+        System.arraycopy(AbstractNodeWrapper.DESCRIPTORS, 0, descriptors, 0, AbstractNodeWrapper.DESCRIPTORS.length);
         descriptors[descriptors.length - 3] = 
             new ComboBoxPropertyDescriptor(SCOPE, "Scope", new String[] { "internal", "external" });
         descriptors[descriptors.length - 2] = 

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/FaultNodeWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/FaultNodeWrapper.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/FaultNodeWrapper.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -35,8 +35,8 @@
 	private static final long serialVersionUID = 4L;
 	private static IPropertyDescriptor[] descriptors;
 	static {
-		descriptors = new IPropertyDescriptor[DefaultElementWrapper.DESCRIPTORS.length + 2];
-        System.arraycopy(DefaultElementWrapper.DESCRIPTORS, 0, descriptors, 0, DefaultElementWrapper.DESCRIPTORS.length);
+		descriptors = new IPropertyDescriptor[AbstractNodeWrapper.DESCRIPTORS.length + 2];
+        System.arraycopy(AbstractNodeWrapper.DESCRIPTORS, 0, descriptors, 0, AbstractNodeWrapper.DESCRIPTORS.length);
         descriptors[descriptors.length - 2] = 
             new TextPropertyDescriptor(FAULT_NAME, "FaultName");
         descriptors[descriptors.length - 1] = 

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/JoinWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/JoinWrapper.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/JoinWrapper.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -54,8 +54,8 @@
     }
 
     private void setDescriptors() {
-        descriptors = new IPropertyDescriptor[DefaultElementWrapper.DESCRIPTORS.length + 1];
-        System.arraycopy(DefaultElementWrapper.DESCRIPTORS, 0, descriptors, 0, DefaultElementWrapper.DESCRIPTORS.length);
+        descriptors = new IPropertyDescriptor[AbstractNodeWrapper.DESCRIPTORS.length + 1];
+        System.arraycopy(AbstractNodeWrapper.DESCRIPTORS, 0, descriptors, 0, AbstractNodeWrapper.DESCRIPTORS.length);
         descriptors[descriptors.length - 1] = 
             new ComboBoxPropertyDescriptor(TYPE, "Type", new String[] { "", "AND", "XOR", "Discriminator", "n-of-m" });
     }

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/SplitWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/SplitWrapper.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/SplitWrapper.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -88,8 +88,8 @@
     }
      
     private void setDescriptors() {
-        descriptors = new IPropertyDescriptor[DefaultElementWrapper.DESCRIPTORS.length + 1];
-        System.arraycopy(DefaultElementWrapper.DESCRIPTORS, 0, descriptors, 0, DefaultElementWrapper.DESCRIPTORS.length);
+        descriptors = new IPropertyDescriptor[AbstractNodeWrapper.DESCRIPTORS.length + 1];
+        System.arraycopy(AbstractNodeWrapper.DESCRIPTORS, 0, descriptors, 0, AbstractNodeWrapper.DESCRIPTORS.length);
         descriptors[descriptors.length - 1] = 
             new ComboBoxPropertyDescriptor(TYPE, "Type", 
                 new String[] { "", "AND", "XOR", "OR" });

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/StateBasedNodeWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/StateBasedNodeWrapper.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/StateBasedNodeWrapper.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -23,8 +23,8 @@
     }
 
     protected void initDescriptors() {
-    	descriptors = new IPropertyDescriptor[DefaultElementWrapper.DESCRIPTORS.length + 1];
-        System.arraycopy(DefaultElementWrapper.DESCRIPTORS, 0, descriptors, 0, DefaultElementWrapper.DESCRIPTORS.length);
+    	descriptors = new IPropertyDescriptor[AbstractNodeWrapper.DESCRIPTORS.length + 1];
+        System.arraycopy(AbstractNodeWrapper.DESCRIPTORS, 0, descriptors, 0, AbstractNodeWrapper.DESCRIPTORS.length);
         descriptors[descriptors.length - 1] = 
             new TimersPropertyDescriptor(TIMERS, "Timers", getStateBasedNode(),
         		(WorkflowProcess) getParent().getProcessWrapper().getProcess());

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/TimerWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/TimerWrapper.java	2010-07-02 13:54:36 UTC (rev 33734)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/core/TimerWrapper.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -44,8 +44,8 @@
     }
     
     private void setDescriptors() {
-        descriptors = new IPropertyDescriptor[DefaultElementWrapper.DESCRIPTORS.length + 2];
-        System.arraycopy(DefaultElementWrapper.DESCRIPTORS, 0, descriptors, 0, DefaultElementWrapper.DESCRIPTORS.length);
+        descriptors = new IPropertyDescriptor[AbstractNodeWrapper.DESCRIPTORS.length + 2];
+        System.arraycopy(AbstractNodeWrapper.DESCRIPTORS, 0, descriptors, 0, AbstractNodeWrapper.DESCRIPTORS.length);
         descriptors[descriptors.length - 2] = 
             new TextPropertyDescriptor(TIMER_DELAY, "Timer Delay");
         descriptors[descriptors.length - 1] = 

Added: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/metadata/MetaDataCellEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/metadata/MetaDataCellEditor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/metadata/MetaDataCellEditor.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -0,0 +1,43 @@
+package org.drools.eclipse.flow.ruleflow.view.property.metadata;
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.Map;
+
+import org.drools.eclipse.flow.common.view.property.BeanDialogCellEditor;
+import org.drools.eclipse.flow.common.view.property.EditBeanDialog;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Cell editor for meta data.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class MetaDataCellEditor extends BeanDialogCellEditor<Map<String, Object>> {
+
+    public MetaDataCellEditor(Composite parent) {
+        super(parent);
+    }
+
+    protected EditBeanDialog<Map<String, Object>> createDialog(Shell shell) {
+        return new MetaDataDialog(shell);
+    }
+    
+    protected String getLabelText(Object value) {
+		return "";
+    }
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/metadata/MetaDataDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/metadata/MetaDataDialog.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/metadata/MetaDataDialog.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -0,0 +1,245 @@
+package org.drools.eclipse.flow.ruleflow.view.property.metadata;
+/*
+ * 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.HashMap;
+import java.util.Map;
+
+import org.drools.eclipse.flow.common.view.property.EditBeanDialog;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.TableEditor;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Dialog for editing meta data.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class MetaDataDialog extends EditBeanDialog<Map<String, Object>> implements FocusListener, MouseListener {
+
+    private Table table;
+    private Button removeButton;
+    private Text text;
+    private TableEditor editor;
+    private int selectedColumn = -1;
+    
+	public MetaDataDialog(Shell parentShell) {
+		super(parentShell, "Meta Data");
+	}
+
+	protected Map<String, Object> updateValue(Map<String, Object> value) {
+	    Map<String, Object> mapping = new HashMap<String, Object>();
+	    for (TableItem item: table.getItems()) {
+	    	String name = item.getText();
+	    	String text = item.getText(1);
+	    	if ("x".equals(name) || "y".equals(name) || "width".equals(name) || "height".equals(name) || "color".equals(name)) {
+	    		mapping.put(name, new Integer(text));
+	    	} else {
+	    		mapping.put(item.getText(0), item.getText(1));
+	    	}
+	    }
+		return mapping;
+	}
+
+	protected Point getInitialSize() {
+		return new Point(450, 300);
+	}
+
+	public Control createDialogArea(Composite parent) {
+	    Composite composite = (Composite) super.createDialogArea(parent);
+		GridLayout layout = new GridLayout();
+        layout.numColumns = 2;
+        composite.setLayout(layout);
+
+        table = new Table(composite, SWT.SINGLE);
+        GridData gd = new GridData();
+        gd.verticalSpan = 3;
+        gd.grabExcessHorizontalSpace = true;
+        gd.grabExcessVerticalSpace = true;
+        gd.verticalAlignment = GridData.FILL;
+        gd.horizontalAlignment = GridData.FILL;
+        table.setLayoutData(gd);
+        table.addSelectionListener(new SelectionListener() {
+            public void widgetDefaultSelected(SelectionEvent e) {
+                removeButton.setEnabled(table.getSelectionIndex() != -1);
+            }
+            public void widgetSelected(SelectionEvent e) {
+                removeButton.setEnabled(table.getSelectionIndex() != -1);
+            }
+        });
+        table.addMouseListener(this);
+        table.setHeaderVisible(true);
+        table.setLinesVisible(true);
+        TableColumn variableNameColumn = new TableColumn(table, SWT.LEFT);
+        variableNameColumn.setText("Name");
+        variableNameColumn.setWidth(150);
+        TableColumn parameterNameColumn = new TableColumn(table, SWT.LEFT);
+        parameterNameColumn.setText("Value");
+        parameterNameColumn.setWidth(225);
+        
+        editor = new TableEditor(table);
+        text = new Text(table, SWT.NORMAL);
+        text.setVisible(false);
+        text.setText("");
+        editor.minimumWidth = text.getSize().x;
+        editor.horizontalAlignment = SWT.LEFT;
+        editor.grabHorizontal = true;
+
+		Button addButton = new Button(composite, SWT.PUSH);
+		addButton.setText("Add");
+		addButton.setFont(JFaceResources.getDialogFont());
+		addButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+				addButtonPressed();
+			}
+		});
+		gd = new GridData();
+		gd.horizontalAlignment = SWT.FILL;
+		addButton.setLayoutData(gd);
+
+		removeButton = new Button(composite, SWT.PUSH);
+		removeButton.setText("Remove");
+		removeButton.setFont(JFaceResources.getDialogFont());
+		removeButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+				removeButtonPressed();
+			}
+		});
+		gd = new GridData();
+		removeButton.setLayoutData(gd);
+		removeButton.setEnabled(false);
+
+        updateTable();
+        
+		return composite;
+	}
+	
+	private void updateTable() {
+        Map<String, Object> mapping = getValue();
+        if (mapping != null) {
+		    for (Map.Entry<String, Object> entry: mapping.entrySet()) {
+	            TableItem item = new TableItem(table, SWT.NONE);
+	            item.setText(new String[] { entry.getKey(),
+	        		entry.getValue() == null ? "" : entry.getValue().toString()} );
+	        }
+        }
+	}
+	
+	private void addButtonPressed() {
+	    TableItem item = new TableItem(table, SWT.NONE);
+        item.setText(0, "name");
+        item.setText(1, "value");
+        table.setSelection(item);
+	}
+	
+	private void removeButtonPressed() {
+        int i = table.getSelectionIndex();
+        if (i == -1) {
+            return;
+        }
+        table.remove(i);
+        removeButton.setEnabled(table.getItemCount() == 0);
+	}
+	
+	private void doEdit() {
+        if (text.isVisible()) {
+            endEdit();
+        }
+        if (table.getSelectionIndex() == -1 || selectedColumn == -1) return;
+        TableItem selection = table.getItem(table.getSelectionIndex());
+        String value = selection.getText(selectedColumn);
+        text.setText(value == null ? "" : value);
+        editor.setEditor(text, selection, selectedColumn);
+        text.setVisible(true);
+        text.selectAll();
+        text.setFocus();
+        text.addFocusListener(this);
+    }
+    
+    private void endEdit() {
+        text.setVisible(false);
+        text.setText("");
+        text.removeFocusListener(this);
+    }
+    
+    public void focusGained(FocusEvent e) {
+    }
+
+    public void focusLost(FocusEvent e) {
+        if (e.widget == text) {
+            applyValue();
+            endEdit();
+        }
+    }
+    
+    public void mouseDoubleClick(MouseEvent e) {
+    }
+
+    public void mouseDown(MouseEvent e) {
+        selectedColumn = getSelectedColumn(e.x, e.y);
+        if (selectedColumn == -1) return;
+        doEdit();
+    }
+    
+    public void mouseUp(MouseEvent e) {
+    }
+    
+    private int getSelectedColumn(int x, int y) {
+        int columnToEdit = -1;
+        int columns = table.getColumnCount();
+        if (table.getSelection().length == 0) {
+            return -1;
+        }
+        for (int i = 0; i < columns; i++) {
+            Rectangle bounds = table.getSelection()[0].getBounds(i);
+            if (bounds.contains(x, y)) {
+                columnToEdit = i;
+                break;
+            }
+        }   
+        return columnToEdit;
+    }
+
+
+    private void applyValue() {
+        int i = table.getSelectionIndex();
+        if (i == -1) {
+            return;
+        }
+        TableItem item = table.getItem(i);
+        item.setText(selectedColumn, text.getText());
+    }
+
+}

Added: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/metadata/MetaDataPropertyDescriptor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/metadata/MetaDataPropertyDescriptor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/metadata/MetaDataPropertyDescriptor.java	2010-07-02 14:05:02 UTC (rev 33735)
@@ -0,0 +1,21 @@
+package org.drools.eclipse.flow.ruleflow.view.property.metadata;
+
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+public class MetaDataPropertyDescriptor extends PropertyDescriptor {
+
+    public MetaDataPropertyDescriptor(Object id, String displayName) {
+        super(id, displayName);
+    }
+    
+    public CellEditor createPropertyEditor(Composite parent) {
+        MetaDataCellEditor editor = new MetaDataCellEditor(parent);
+        if (getValidator() != null) {
+            editor.setValidator(getValidator());
+        }
+        return editor;
+    }
+    
+}



More information about the jboss-svn-commits mailing list