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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu May 22 07:56:56 EDT 2008


Author: KrisVerlaenen
Date: 2008-05-22 07:56:56 -0400 (Thu, 22 May 2008)
New Revision: 20113

Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/DefaultSemanticModule.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/SemanticModule.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlRuleFlowProcessDumper.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/AbstractNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/ActionNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/CompositeNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/EndNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/JoinNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/MilestoneNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/RuleSetNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/SplitNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/StartNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/SubProcessNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/TimerNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/WorkItemNodeHandler.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/processes/XMLPersistenceTest.java
Log:
JBRULES-1616: Composite Node
 - improved xml serialization

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/DefaultSemanticModule.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/DefaultSemanticModule.java	2008-05-22 11:56:48 UTC (rev 20112)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/DefaultSemanticModule.java	2008-05-22 11:56:56 UTC (rev 20113)
@@ -6,10 +6,12 @@
 public class DefaultSemanticModule implements SemanticModule {
     public String uri;
     public Map<String, Handler> handlers;
+    public Map<Class<?>, Handler> handlersByClass;
     
     public DefaultSemanticModule(String uri) {
         this.uri = uri;
         this.handlers = new HashMap<String, Handler>();
+        this.handlersByClass = new HashMap<Class<?>, Handler>();
     }    
 
     public String getUri() {
@@ -18,10 +20,24 @@
     
     public void addHandler(String name, Handler handler) {
         this.handlers.put( name, handler );
+        if (handler != null && handler.generateNodeFor() != null) {
+        	this.handlersByClass.put( handler.generateNodeFor(), handler );
+        }
     }
 
     public Handler getHandler(String name) {
         return this.handlers.get( name );
     }
+    
+    public Handler getHandlerByClass(Class<?> clazz) {
+        while (clazz != null) {
+        	Handler handler = this.handlersByClass.get( clazz );
+            if (handler != null) {
+            	return handler;
+            }
+            clazz = clazz.getSuperclass();
+        }
+        return null;
+    }
             
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/SemanticModule.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/SemanticModule.java	2008-05-22 11:56:48 UTC (rev 20112)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/SemanticModule.java	2008-05-22 11:56:56 UTC (rev 20113)
@@ -6,4 +6,6 @@
     public void addHandler(String name, Handler handler);
 
     public Handler getHandler(String name);
+    
+    public Handler getHandlerByClass(Class<?> clazz);
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlRuleFlowProcessDumper.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlRuleFlowProcessDumper.java	2008-05-22 11:56:48 UTC (rev 20112)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlRuleFlowProcessDumper.java	2008-05-22 11:56:56 UTC (rev 20113)
@@ -4,48 +4,31 @@
 import java.util.List;
 import java.util.Map;
 
-import org.drools.process.core.ParameterDefinition;
-import org.drools.process.core.Work;
 import org.drools.process.core.context.variable.Variable;
 import org.drools.process.core.datatype.DataType;
-import org.drools.process.core.timer.Timer;
 import org.drools.ruleflow.core.RuleFlowProcess;
 import org.drools.workflow.core.Connection;
-import org.drools.workflow.core.Constraint;
 import org.drools.workflow.core.Node;
-import org.drools.workflow.core.impl.DroolsConsequenceAction;
 import org.drools.workflow.core.impl.NodeImpl;
-import org.drools.workflow.core.node.ActionNode;
-import org.drools.workflow.core.node.CompositeNode;
-import org.drools.workflow.core.node.EndNode;
-import org.drools.workflow.core.node.Join;
-import org.drools.workflow.core.node.MilestoneNode;
-import org.drools.workflow.core.node.RuleSetNode;
-import org.drools.workflow.core.node.Split;
-import org.drools.workflow.core.node.StartNode;
-import org.drools.workflow.core.node.SubProcessNode;
-import org.drools.workflow.core.node.TimerNode;
-import org.drools.workflow.core.node.WorkItemNode;
+import org.drools.xml.processes.AbstractNodeHandler;
 
 public class XmlRuleFlowProcessDumper {
     
-    // TODO writing out should also be part of the NodeHandler ?
-
     private final static String EOL = System.getProperty( "line.separator" );
     
-    private StringBuffer xmlDump;
+    private static final SemanticModule semanticModule = new ProcessSemanticModule();
     
-    public String dump(RuleFlowProcess process) {
+    public static String dump(RuleFlowProcess process) {
         return dump(process, true);
     }
     
-    public synchronized String dump(RuleFlowProcess process, boolean includeMeta) {
-        this.xmlDump = new StringBuffer();
-        visitProcess(process, includeMeta);
-        return this.xmlDump.toString();
+    public static String dump(RuleFlowProcess process, boolean includeMeta) {
+        StringBuffer xmlDump = new StringBuffer();
+        visitProcess(process, xmlDump, includeMeta);
+        return xmlDump.toString();
     }
     
-    private void visitProcess(RuleFlowProcess process, boolean includeMeta) {
+    private static void visitProcess(RuleFlowProcess process, StringBuffer xmlDump, boolean includeMeta) {
         xmlDump.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?> " + EOL
             + "<process xmlns=\"http://drools.org/drools-4.0/process\"" + EOL
             + "         xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"" + EOL
@@ -70,21 +53,21 @@
             }
         }
         xmlDump.append(">" + EOL + EOL);
-        visitHeader(process, includeMeta);
-        visitNodes(process, includeMeta);
-        visitConnections(process.getNodes(), includeMeta);
+        visitHeader(process, xmlDump, includeMeta);
+        visitNodes(process, xmlDump, includeMeta);
+        visitConnections(process.getNodes(), xmlDump, includeMeta);
         xmlDump.append("</process>");
     }
     
-    private void visitHeader(RuleFlowProcess process, boolean includeMeta) {
+    private static void visitHeader(RuleFlowProcess process, StringBuffer xmlDump, boolean includeMeta) {
         xmlDump.append("  <header>" + EOL);
-        visitImports(process.getImports());
-        visitGlobals(process.getGlobals());
-        visitVariables(process.getVariableScope().getVariables());
+        visitImports(process.getImports(), xmlDump);
+        visitGlobals(process.getGlobals(), xmlDump);
+        visitVariables(process.getVariableScope().getVariables(), xmlDump);
         xmlDump.append("  </header>" + EOL + EOL);
     }
     
-    private void visitImports(List<String> imports) {
+    private static void visitImports(List<String> imports, StringBuffer xmlDump) {
         if (imports != null && imports.size() > 0) {
             xmlDump.append("    <imports>" + EOL);
             for (String importString: imports) {
@@ -94,7 +77,7 @@
         }
     }
     
-    private void visitGlobals(Map<String, String> globals) {
+    private static void visitGlobals(Map<String, String> globals, StringBuffer xmlDump) {
         if (globals != null && globals.size() > 0) {
             xmlDump.append("    <globals>" + EOL);
             for (Map.Entry<String, String> global: globals.entrySet()) {
@@ -104,15 +87,15 @@
         }
     }
     
-    private void visitVariables(List<Variable> variables) {
+    private static void visitVariables(List<Variable> variables, StringBuffer xmlDump) {
         if (variables != null && variables.size() > 0) {
             xmlDump.append("    <variables>" + EOL);
             for (Variable variable: variables) {
                 xmlDump.append("      <variable name=\"" + variable.getName() + "\" >" + EOL);
-                visitDataType(variable.getType());
+                visitDataType(variable.getType(), xmlDump);
                 Object value = variable.getValue();
                 if (value != null) {
-                    visitValue(variable.getValue());
+                    visitValue(variable.getValue(), xmlDump);
                 }
                 xmlDump.append("      </variable>" + EOL);
             }
@@ -120,325 +103,45 @@
         }
     }
     
-    private void visitDataType(DataType dataType) {
+    private static void visitDataType(DataType dataType, StringBuffer xmlDump) {
         xmlDump.append("        <type name=\"" + dataType.getClass().getName() + "\" />" + EOL);
     }
     
-    private void visitValue(Object value) {
+    private static void visitValue(Object value, StringBuffer xmlDump) {
         xmlDump.append("        <value>" + value + "</value>" + EOL);
     }
     
-    private void visitNodes(RuleFlowProcess process, boolean includeMeta) {
+    private static void visitNodes(RuleFlowProcess process, StringBuffer xmlDump, boolean includeMeta) {
         xmlDump.append("  <nodes>" + EOL);
-        StartNode startNode = process.getStart();
-        if (startNode != null) {
-            visitStartNode(startNode, includeMeta);
-        }
         for (Node node: process.getNodes()) {
-            visitNode(node, includeMeta);
+            visitNode(node, xmlDump, includeMeta);
         }
         xmlDump.append("  </nodes>" + EOL + EOL);
     }
     
-    private void visitNode(Node node, boolean includeMeta) {
-        if (node instanceof StartNode) {
-            // Do nothing, start node already added
-        } else if (node instanceof EndNode) {
-            visitEndNode((EndNode) node, includeMeta);
-        } else if (node instanceof ActionNode) {
-            visitActionNode((ActionNode) node, includeMeta);
-        } else if (node instanceof RuleSetNode) {
-            visitRuleSetNode((RuleSetNode) node, includeMeta);
-        } else if (node instanceof SubProcessNode) {
-            visitSubProcessNode((SubProcessNode) node, includeMeta);
-        } else if (node instanceof WorkItemNode) {
-            visitWorkItemNode((WorkItemNode) node, includeMeta);
-        } else if (node instanceof Join) {
-            visitJoinNode((Join) node, includeMeta);
-        } else if (node instanceof Split) {
-            visitSplitNode((Split) node, includeMeta);
-        } else if (node instanceof MilestoneNode) {
-            visitMileStoneNode((MilestoneNode) node, includeMeta);
-        } else if (node instanceof TimerNode) {
-            visitTimerNode((TimerNode) node, includeMeta);
-        } else if (node instanceof CompositeNode) {
-            visitCompositeNode((CompositeNode) node, includeMeta);
-        } else if (node instanceof CompositeNode.CompositeNodeStart) {
-            // do nothing, can be recreated
-        } else if (node instanceof CompositeNode.CompositeNodeEnd) {
-            // do nothing, can be recreated
-        } else if (node instanceof CompositeNode) {
-            visitCompositeNode((CompositeNode) node, includeMeta);
+    public static void visitNode(Node node, StringBuffer xmlDump, boolean includeMeta) {
+     	Handler handler = semanticModule.getHandlerByClass(node.getClass());
+        if (handler != null) {
+        	((AbstractNodeHandler) handler).writeNode(node, xmlDump, includeMeta);
         } else {
-            throw new IllegalArgumentException(
+        	throw new IllegalArgumentException(
                 "Unknown node type: " + node);
         }
     }
     
-    private void visitNode(String name, Node node, boolean includeMeta) {
-        xmlDump.append("    <" + name + " id=\"" + node.getId() + "\" "); 
-        if (node.getName() != null) {
-            xmlDump.append("name=\"" + node.getName() + "\" ");
-        }
-        if (includeMeta) {
-            Integer x = (Integer) node.getMetaData("x");
-            Integer y = (Integer) node.getMetaData("y");
-            Integer width = (Integer) node.getMetaData("width");
-            Integer height = (Integer) node.getMetaData("height");
-            if (x != null && x != 0) {
-                xmlDump.append("x=\"" + x + "\" ");
-            }
-            if (y != null && y != 0) {
-                xmlDump.append("y=\"" + y + "\" ");
-            }
-            if (width != null && width != -1) {
-                xmlDump.append("width=\"" + width + "\" ");
-            }
-            if (height != null && height != -1) {
-                xmlDump.append("height=\"" + height + "\" ");
-            }
-        }
-    }
-    
-    private void endElement() {
-        xmlDump.append("/>" + EOL);
-    }
-    
-    private void endElement(String name) {
-        xmlDump.append("    </" + name + ">" + EOL);
-    }
-    
-    private void visitStartNode(StartNode startNode, boolean includeMeta) {
-        visitNode("start", startNode, includeMeta);
-        endElement();
-    }
-    
-    private void visitEndNode(EndNode endNode, boolean includeMeta) {
-        visitNode("end", endNode, includeMeta);
-        endElement();
-    }
-    
-    private void visitActionNode(ActionNode actionNode, boolean includeMeta) {
-        visitNode("action", actionNode, includeMeta);
-        DroolsConsequenceAction action = (DroolsConsequenceAction) actionNode.getAction();
-        if (action != null) {
-            String dialect = action.getDialect();
-            if (dialect != null) {
-                xmlDump.append("dialect=\"" + action.getDialect() + "\" ");
-            }
-            String consequence = action.getConsequence();
-            if (consequence == null) {
-                endElement();
-            } else {
-                xmlDump.append(">" + XmlDumper.replaceIllegalChars(consequence.trim()) + "</action>" + EOL);
-            }
-        } else {
-            endElement();
-        }
-    }
-    
-    private void visitRuleSetNode(RuleSetNode ruleSetNode, boolean includeMeta) {
-        visitNode("ruleSet", ruleSetNode, includeMeta);
-        String ruleFlowGroup = ruleSetNode.getRuleFlowGroup();
-        if (ruleFlowGroup != null) {
-            xmlDump.append("ruleFlowGroup=\"" + ruleFlowGroup + "\" ");
-        }
-        endElement();
-    }
-    
-    private void visitSubProcessNode(SubProcessNode subProcessNode, boolean includeMeta) {
-        visitNode("subProcess", subProcessNode, includeMeta);
-        String processId = subProcessNode.getProcessId();
-        if (processId != null) {
-            xmlDump.append("processId=\"" + processId + "\" ");
-        }
-        if (!subProcessNode.isWaitForCompletion()) {
-            xmlDump.append("waitForCompletion=\"false\" ");
-        }
-        endElement();
-    }
-    
-    private void visitJoinNode(Join joinNode, boolean includeMeta) {
-        visitNode("join", joinNode, includeMeta);
-        int type = joinNode.getType();
-        if (type != 0) {
-            xmlDump.append("type=\"" + type + "\" ");
-        }
-        endElement();
-    }
-    
-    private void visitSplitNode(Split splitNode, boolean includeMeta) {
-        visitNode("split", splitNode, includeMeta);
-        int type = splitNode.getType();
-        if (type != 0) {
-            xmlDump.append("type=\"" + type + "\" ");
-        }
-        if (splitNode.getConstraints().isEmpty()) {
-            endElement();
-        } else {
-            xmlDump.append(">" + EOL);
-            xmlDump.append("      <constraints>" + EOL);
-            for (Map.Entry<Split.ConnectionRef, Constraint> entry: splitNode.getConstraints().entrySet()) {
-                Split.ConnectionRef connection = entry.getKey();
-                Constraint constraint = entry.getValue();
-                xmlDump.append("        <constraint "
-                        + "toNodeId=\"" + connection.getNodeId() + "\" "
-                        + "toType=\"" + connection.getToType() + "\" ");
-                String name = constraint.getName();
-                if (name != null && !"".equals(name)) {
-                    xmlDump.append("name=\"" + constraint.getName() + "\" ");
-                }
-                int priority = constraint.getPriority();
-                if (priority != 0) {
-                    xmlDump.append("priority=\"" + constraint.getPriority() + "\" ");
-                }
-                xmlDump.append("type=\"" + constraint.getType() + "\" ");
-                String dialect = constraint.getDialect();
-                if (dialect != null && !"".equals(dialect)) {
-                    xmlDump.append("dialect=\"" + dialect + "\" ");
-                }
-                String constraintString = constraint.getConstraint();
-                if (constraintString != null) {
-                    xmlDump.append(">" + XmlDumper.replaceIllegalChars(constraintString) + "</constraint>" + EOL);
-                } else {
-                    xmlDump.append("/>" + EOL);
-                }
-            }
-            xmlDump.append("      </constraints>" + EOL);
-            endElement("split");
-        }
-    }
-    
-    private void visitMileStoneNode(MilestoneNode milestoneNode, boolean includeMeta) {
-        visitNode("milestone", milestoneNode, includeMeta);
-        String constraint = milestoneNode.getConstraint();
-        if (constraint != null) {
-            xmlDump.append(">" + XmlDumper.replaceIllegalChars(constraint.trim()) + "</milestone>" + EOL);
-        } else {
-            endElement();
-        }
-    }
-    
-    private void visitWorkItemNode(WorkItemNode workItemNode, boolean includeMeta) {
-        visitNode("workItem", workItemNode, includeMeta);
-        if (!workItemNode.isWaitForCompletion()) {
-            xmlDump.append("waitForCompletion=\"false\" ");
-        }
-        xmlDump.append(">" + EOL);
-        Work work = workItemNode.getWork();
-        if (work != null) {
-            visitWork(work, includeMeta);
-        }
-        Map<String, String> inMappings = workItemNode.getInMappings();
-        for (Map.Entry<String, String> inMapping: inMappings.entrySet()) {
-            xmlDump.append(
-                "      <mapping type=\"in\" "
-                             + "parameterName=\"" + inMapping.getKey() + "\" "
-                             + "variableName=\"" + inMapping.getValue() + "\" />" + EOL);
-        }
-        Map<String, String> outMappings = workItemNode.getOutMappings();
-        for (Map.Entry<String, String> outMapping: outMappings.entrySet()) {
-            xmlDump.append(
-                "      <mapping type=\"out\" "
-                             + "parameterName=\"" + outMapping.getKey() + "\" "
-                             + "variableName=\"" + outMapping.getValue() + "\" />" + EOL);
-        }
-        endElement("workItem");
-    }
-    
-    private void visitWork(Work work, boolean includeMeta) {
-        xmlDump.append("      <work name=\"" + work.getName() + "\" >" + EOL);
-        for (ParameterDefinition paramDefinition: work.getParameterDefinitions()) {
-            if (paramDefinition == null) {
-                throw new IllegalArgumentException(
-                    "Could not find parameter definition " + paramDefinition.getName()
-                        + " for work " + work.getName());
-            }
-            xmlDump.append("        <parameter name=\"" + paramDefinition.getName() + "\" " + 
-                                              "type=\"" + paramDefinition.getType().getClass().getName() + "\" ");
-            Object value = work.getParameter(paramDefinition.getName());
-            if (value == null) {
-                xmlDump.append("/>" + EOL);
-            } else {
-                xmlDump.append(">" + value + "</parameter>" + EOL);
-            }
-        }
-        xmlDump.append("      </work>" + EOL);
-    }
-    
-    private void visitTimerNode(TimerNode timerNode, boolean includeMeta) {
-        visitNode("timer", timerNode, includeMeta);
-        Timer timer = timerNode.getTimer();
-        if (timer != null) {
-            xmlDump.append("delay=\"" + timer.getDelay() + "\" ");
-            if (timer.getPeriod() > 0) {
-                xmlDump.append(" period=\"" + timer.getPeriod() + "\" ");
-            }
-        }
-        endElement();
-    }
-    
-    private void visitCompositeNode(CompositeNode compositeNode, boolean includeMeta) {
-        visitNode("composite", compositeNode, includeMeta);
-        xmlDump.append(">" + EOL);
-        xmlDump.append("      <nodes>" + EOL);
-        for (Node subNode: compositeNode.getNodes()) {
-            visitNode(subNode, includeMeta);
-        }
-        xmlDump.append("      </nodes>" + EOL);
+    private static void visitConnections(Node[] nodes, StringBuffer xmlDump, boolean includeMeta) {
         List<Connection> connections = new ArrayList<Connection>();
-        for (Node node: compositeNode.getNodes()) {
-            if (!(node instanceof CompositeNode.CompositeNodeEnd)) {
-                for (Connection connection: node.getIncomingConnections(Node.CONNECTION_DEFAULT_TYPE)) {
-                    if (!(connection.getFrom() instanceof CompositeNode.CompositeNodeStart)) {
-                        connections.add(connection);
-                    }
-                }
-            }
-        }
-        xmlDump.append("      <connections>" + EOL);
-        for (Connection connection: connections) {
-            visitConnection(connection, includeMeta);
-        }
-        xmlDump.append("      </connections>" + EOL);
-        xmlDump.append("      <in-ports>" + EOL);
-        for (Map.Entry<String, CompositeNode.NodeAndType> entry: compositeNode.getLinkedIncomingNodes().entrySet()) {
-            xmlDump.append("        <in-port type=\"" + entry.getKey() + "\" nodeId=\"" + entry.getValue().getNodeId() + "\" nodeInType=\"" + entry.getValue().getType() + "\" />" + EOL);
-        }
-        xmlDump.append("      </in-ports>" + EOL);
-        xmlDump.append("      <out-ports>" + EOL);
-        for (Map.Entry<String, CompositeNode.NodeAndType> entry: compositeNode.getLinkedOutgoingNodes().entrySet()) {
-            xmlDump.append("        <out-port type=\"" + entry.getKey() + "\" nodeId=\"" + entry.getValue().getNodeId() + "\" nodeOutType=\"" + entry.getValue().getType() + "\" />" + EOL);
-        }
-        xmlDump.append("      </out-ports>" + EOL);
-        endElement("composite");
-    }
-    
-//    private void visitCompositeNodeStart(CompositeNode.CompositeNodeStart compositeNodeStart, boolean includeMeta) {
-//        visitNode("composite-start", compositeNodeStart, includeMeta);
-//        xmlDump.append("in-nodeId=\"" + compositeNodeStart.getInNodeId() + "\" in-type=\"" + compositeNodeStart.getInType() + "\" />" + EOL);
-//        endElement();
-//    }
-//    
-//    private void visitCompositeNodeEnd(CompositeNode.CompositeNodeEnd compositeNodeEnd, boolean includeMeta) {
-//        visitNode("composite-end", compositeNodeEnd, includeMeta);
-//        xmlDump.append("out-nodeId=\"" + compositeNodeEnd.getOutNodeId() + "\" in-type=\"" + compositeNodeEnd.getOutType() + "\" />" + EOL);
-//        endElement();
-//    }
-    
-    private void visitConnections(Node[] nodes, boolean includeMeta) {
-        List<Connection> connections = new ArrayList<Connection>();
         for (Node node: nodes) {
             connections.addAll(node.getIncomingConnections(Node.CONNECTION_DEFAULT_TYPE));
         }
         xmlDump.append("  <connections>" + EOL);
         for (Connection connection: connections) {
-            visitConnection(connection, includeMeta);
+            visitConnection(connection, xmlDump, includeMeta);
         }
         xmlDump.append("  </connections>" + EOL + EOL);
     }
     
-    private void visitConnection(Connection connection, boolean includeMeta) {
+    public static void visitConnection(Connection connection, StringBuffer xmlDump, boolean includeMeta) {
         xmlDump.append("    <connection from=\"" + connection.getFrom().getId() + "\" ");
         if (!NodeImpl.CONNECTION_DEFAULT_TYPE.equals(connection.getFromType())) {
             xmlDump.append("fromType=\"" + connection.getFromType() + "\" ");

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-05-22 11:56:48 UTC (rev 20112)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/AbstractNodeHandler.java	2008-05-22 11:56:56 UTC (rev 20113)
@@ -16,6 +16,8 @@
 public abstract class AbstractNodeHandler extends BaseAbstractHandler implements
         Handler {
 
+    protected final static String EOL = System.getProperty( "line.separator" );
+
     public AbstractNodeHandler() {
         initValidParents();
         initValidPeers();
@@ -48,7 +50,6 @@
         node.setName(name);
 
         nodeContainer.addNode(node);
-        ((ProcessBuildData) parser.getData()).addNode(node);
 
         return node;
     }
@@ -98,5 +99,40 @@
             }
         }
     }
+    
+    public abstract void writeNode(final Node node, final StringBuffer xmlDump, final boolean includeMeta);
+    
+    protected void writeNode(final String name, final Node node, final StringBuffer xmlDump, final boolean includeMeta) {
+    	xmlDump.append("    <" + name + " id=\"" + node.getId() + "\" "); 
+        if (node.getName() != null) {
+            xmlDump.append("name=\"" + node.getName() + "\" ");
+        }
+        if (includeMeta) {
+            Integer x = (Integer) node.getMetaData("x");
+            Integer y = (Integer) node.getMetaData("y");
+            Integer width = (Integer) node.getMetaData("width");
+            Integer height = (Integer) node.getMetaData("height");
+            if (x != null && x != 0) {
+                xmlDump.append("x=\"" + x + "\" ");
+            }
+            if (y != null && y != 0) {
+                xmlDump.append("y=\"" + y + "\" ");
+            }
+            if (width != null && width != -1) {
+                xmlDump.append("width=\"" + width + "\" ");
+            }
+            if (height != null && height != -1) {
+                xmlDump.append("height=\"" + height + "\" ");
+            }
+        }
+    }
+    
+    protected void endNode(final StringBuffer xmlDump) {
+        xmlDump.append("/>" + EOL);
+    }
 
+    protected void endNode(final String name, final StringBuffer xmlDump) {
+        xmlDump.append("    </" + name + ">" + EOL);
+    }
+    
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/ActionNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/ActionNodeHandler.java	2008-05-22 11:56:48 UTC (rev 20112)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/ActionNodeHandler.java	2008-05-22 11:56:56 UTC (rev 20113)
@@ -5,6 +5,7 @@
 import org.drools.workflow.core.node.ActionNode;
 import org.drools.xml.Configuration;
 import org.drools.xml.ExtensibleXmlParser;
+import org.drools.xml.XmlDumper;
 import org.xml.sax.SAXException;
 
 public class ActionNodeHandler extends AbstractNodeHandler {
@@ -34,4 +35,24 @@
         return ActionNode.class;
     }
 
+	public void writeNode(Node node, StringBuffer xmlDump, boolean includeMeta) {
+		ActionNode actionNode = (ActionNode) node;
+		writeNode("action", actionNode, xmlDump, includeMeta);
+        DroolsConsequenceAction action = (DroolsConsequenceAction) actionNode.getAction();
+        if (action != null) {
+            String dialect = action.getDialect();
+            if (dialect != null) {
+                xmlDump.append("dialect=\"" + action.getDialect() + "\" ");
+            }
+            String consequence = action.getConsequence();
+            if (consequence == null) {
+                endNode(xmlDump);
+            } else {
+                xmlDump.append(">" + XmlDumper.replaceIllegalChars(consequence.trim()) + "</action>" + EOL);
+            }
+        } else {
+        	endNode(xmlDump);
+        }
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/CompositeNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/CompositeNodeHandler.java	2008-05-22 11:56:48 UTC (rev 20112)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/CompositeNodeHandler.java	2008-05-22 11:56:56 UTC (rev 20113)
@@ -1,7 +1,13 @@
 package org.drools.xml.processes;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.workflow.core.Connection;
 import org.drools.workflow.core.Node;
 import org.drools.workflow.core.node.CompositeNode;
+import org.drools.xml.XmlRuleFlowProcessDumper;
 
 public class CompositeNodeHandler extends AbstractNodeHandler {
 
@@ -13,4 +19,45 @@
         return CompositeNode.class;
     }
 
+    public void writeNode(Node node, StringBuffer xmlDump, boolean includeMeta) {
+        CompositeNode compositeNode = (CompositeNode) node;
+        writeNode("composite", compositeNode, xmlDump, includeMeta);
+        xmlDump.append(">" + EOL);
+        xmlDump.append("      <nodes>" + EOL);
+        for (Node subNode: compositeNode.getNodes()) {
+        	// filter out composite start and end nodes as they can be regenerated
+        	if ((!(subNode instanceof CompositeNode.CompositeNodeStart)) &&
+    			(!(subNode instanceof CompositeNode.CompositeNodeEnd))) {
+        		XmlRuleFlowProcessDumper.visitNode(subNode, xmlDump, includeMeta);
+        	}
+        }
+        xmlDump.append("      </nodes>" + EOL);
+        List<Connection> connections = new ArrayList<Connection>();
+        for (Node subNode: compositeNode.getNodes()) {
+        	// filter out composite start and end nodes as they can be regenerated
+            if (!(subNode instanceof CompositeNode.CompositeNodeEnd)) {
+                for (Connection connection: subNode.getIncomingConnections(Node.CONNECTION_DEFAULT_TYPE)) {
+                    if (!(connection.getFrom() instanceof CompositeNode.CompositeNodeStart)) {
+                        connections.add(connection);
+                    }
+                }
+            }
+        }
+        xmlDump.append("      <connections>" + EOL);
+        for (Connection connection: connections) {
+        	XmlRuleFlowProcessDumper.visitConnection(connection, xmlDump, includeMeta);
+        }
+        xmlDump.append("      </connections>" + EOL);
+        xmlDump.append("      <in-ports>" + EOL);
+        for (Map.Entry<String, CompositeNode.NodeAndType> entry: compositeNode.getLinkedIncomingNodes().entrySet()) {
+            xmlDump.append("        <in-port type=\"" + entry.getKey() + "\" nodeId=\"" + entry.getValue().getNodeId() + "\" nodeInType=\"" + entry.getValue().getType() + "\" />" + EOL);
+        }
+        xmlDump.append("      </in-ports>" + EOL);
+        xmlDump.append("      <out-ports>" + EOL);
+        for (Map.Entry<String, CompositeNode.NodeAndType> entry: compositeNode.getLinkedOutgoingNodes().entrySet()) {
+            xmlDump.append("        <out-port type=\"" + entry.getKey() + "\" nodeId=\"" + entry.getValue().getNodeId() + "\" nodeOutType=\"" + entry.getValue().getType() + "\" />" + EOL);
+        }
+        xmlDump.append("      </out-ports>" + EOL);
+        endNode("composite", xmlDump);
+    }
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/EndNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/EndNodeHandler.java	2008-05-22 11:56:48 UTC (rev 20112)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/EndNodeHandler.java	2008-05-22 11:56:56 UTC (rev 20113)
@@ -2,6 +2,7 @@
 
 import org.drools.workflow.core.Node;
 import org.drools.workflow.core.node.EndNode;
+import org.drools.workflow.core.node.StartNode;
 
 public class EndNodeHandler extends AbstractNodeHandler {
 
@@ -13,4 +14,10 @@
         return EndNode.class;
     }
 
+	public void writeNode(Node node, StringBuffer xmlDump, boolean includeMeta) {
+		EndNode endNode = (EndNode) node;
+		writeNode("end", endNode, xmlDump, includeMeta);
+        endNode(xmlDump);
+	}
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/JoinNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/JoinNodeHandler.java	2008-05-22 11:56:48 UTC (rev 20112)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/JoinNodeHandler.java	2008-05-22 11:56:56 UTC (rev 20113)
@@ -27,4 +27,14 @@
         return Join.class;
     }
 
+	public void writeNode(Node node, StringBuffer xmlDump, boolean includeMeta) {
+		Join joinNode = (Join) node;
+		writeNode("join", joinNode, xmlDump, includeMeta);
+        int type = joinNode.getType();
+        if (type != 0) {
+            xmlDump.append("type=\"" + type + "\" ");
+        }
+        endNode(xmlDump);
+	}
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/MilestoneNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/MilestoneNodeHandler.java	2008-05-22 11:56:48 UTC (rev 20112)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/MilestoneNodeHandler.java	2008-05-22 11:56:56 UTC (rev 20113)
@@ -4,6 +4,7 @@
 import org.drools.workflow.core.node.MilestoneNode;
 import org.drools.xml.Configuration;
 import org.drools.xml.ExtensibleXmlParser;
+import org.drools.xml.XmlDumper;
 import org.xml.sax.SAXException;
 
 public class MilestoneNodeHandler extends AbstractNodeHandler {
@@ -31,4 +32,15 @@
         return MilestoneNode.class;
     }
 
+	public void writeNode(Node node, StringBuffer xmlDump, boolean includeMeta) {
+		MilestoneNode milestoneNode = (MilestoneNode) node;
+		writeNode("milestone", milestoneNode, xmlDump, includeMeta);
+        String constraint = milestoneNode.getConstraint();
+        if (constraint != null) {
+            xmlDump.append(">" + XmlDumper.replaceIllegalChars(constraint.trim()) + "</milestone>" + EOL);
+        } else {
+            endNode(xmlDump);
+        }
+	}
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/RuleSetNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/RuleSetNodeHandler.java	2008-05-22 11:56:48 UTC (rev 20112)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/RuleSetNodeHandler.java	2008-05-22 11:56:56 UTC (rev 20113)
@@ -25,4 +25,14 @@
         return RuleSetNode.class;
     }
 
+	public void writeNode(Node node, StringBuffer xmlDump, boolean includeMeta) {
+		RuleSetNode ruleSetNode = (RuleSetNode) node;
+		writeNode("ruleSet", ruleSetNode, xmlDump, includeMeta);
+        String ruleFlowGroup = ruleSetNode.getRuleFlowGroup();
+        if (ruleFlowGroup != null) {
+            xmlDump.append("ruleFlowGroup=\"" + ruleFlowGroup + "\" ");
+        }
+        endNode(xmlDump);
+	}
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/SplitNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/SplitNodeHandler.java	2008-05-22 11:56:48 UTC (rev 20112)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/SplitNodeHandler.java	2008-05-22 11:56:56 UTC (rev 20113)
@@ -1,9 +1,13 @@
 package org.drools.xml.processes;
 
+import java.util.Map;
+
+import org.drools.workflow.core.Constraint;
 import org.drools.workflow.core.Node;
 import org.drools.workflow.core.node.Split;
 import org.drools.xml.Configuration;
 import org.drools.xml.ExtensibleXmlParser;
+import org.drools.xml.XmlDumper;
 import org.xml.sax.SAXException;
 
 public class SplitNodeHandler extends AbstractNodeHandler {
@@ -27,4 +31,47 @@
         return Split.class;
     }
 
+	public void writeNode(Node node, StringBuffer xmlDump, boolean includeMeta) {
+		Split splitNode = (Split) node;
+		writeNode("split", splitNode, xmlDump, includeMeta);
+        int type = splitNode.getType();
+        if (type != 0) {
+            xmlDump.append("type=\"" + type + "\" ");
+        }
+        if (splitNode.getConstraints().isEmpty()) {
+            endNode(xmlDump);
+        } else {
+            xmlDump.append(">" + EOL);
+            xmlDump.append("      <constraints>" + EOL);
+            for (Map.Entry<Split.ConnectionRef, Constraint> entry: splitNode.getConstraints().entrySet()) {
+                Split.ConnectionRef connection = entry.getKey();
+                Constraint constraint = entry.getValue();
+                xmlDump.append("        <constraint "
+                        + "toNodeId=\"" + connection.getNodeId() + "\" "
+                        + "toType=\"" + connection.getToType() + "\" ");
+                String name = constraint.getName();
+                if (name != null && !"".equals(name)) {
+                    xmlDump.append("name=\"" + constraint.getName() + "\" ");
+                }
+                int priority = constraint.getPriority();
+                if (priority != 0) {
+                    xmlDump.append("priority=\"" + constraint.getPriority() + "\" ");
+                }
+                xmlDump.append("type=\"" + constraint.getType() + "\" ");
+                String dialect = constraint.getDialect();
+                if (dialect != null && !"".equals(dialect)) {
+                    xmlDump.append("dialect=\"" + dialect + "\" ");
+                }
+                String constraintString = constraint.getConstraint();
+                if (constraintString != null) {
+                    xmlDump.append(">" + XmlDumper.replaceIllegalChars(constraintString) + "</constraint>" + EOL);
+                } else {
+                    xmlDump.append("/>" + EOL);
+                }
+            }
+            xmlDump.append("      </constraints>" + EOL);
+            endNode("split", xmlDump);
+        }
+	}
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/StartNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/StartNodeHandler.java	2008-05-22 11:56:48 UTC (rev 20112)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/StartNodeHandler.java	2008-05-22 11:56:56 UTC (rev 20113)
@@ -11,13 +11,14 @@
         return new StartNode();
     }
     
-    protected void initValidPeers() {
-        this.validPeers = new HashSet();
-        this.validPeers.add(null);
-    }
-
     public Class generateNodeFor() {
         return StartNode.class;
     }
 
+	public void writeNode(Node node, StringBuffer xmlDump, boolean includeMeta) {
+		StartNode startNode = (StartNode) node;
+		writeNode("start", startNode, xmlDump, includeMeta);
+        endNode(xmlDump);
+	}
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/SubProcessNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/SubProcessNodeHandler.java	2008-05-22 11:56:48 UTC (rev 20112)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/SubProcessNodeHandler.java	2008-05-22 11:56:56 UTC (rev 20113)
@@ -27,4 +27,17 @@
         return SubProcessNode.class;
     }
 
+	public void writeNode(Node node, StringBuffer xmlDump, boolean includeMeta) {
+		SubProcessNode subProcessNode = (SubProcessNode) node;
+		writeNode("subProcess", subProcessNode, xmlDump, includeMeta);
+        String processId = subProcessNode.getProcessId();
+        if (processId != null) {
+            xmlDump.append("processId=\"" + processId + "\" ");
+        }
+        if (!subProcessNode.isWaitForCompletion()) {
+            xmlDump.append("waitForCompletion=\"false\" ");
+        }
+        endNode(xmlDump);
+	}
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/TimerNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/TimerNodeHandler.java	2008-05-22 11:56:48 UTC (rev 20112)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/TimerNodeHandler.java	2008-05-22 11:56:56 UTC (rev 20113)
@@ -39,4 +39,17 @@
         return TimerNode.class;
     }
 
+	public void writeNode(Node node, StringBuffer xmlDump, boolean includeMeta) {
+		TimerNode timerNode = (TimerNode) node;
+		writeNode("timer", timerNode, xmlDump, includeMeta);
+        Timer timer = timerNode.getTimer();
+        if (timer != null) {
+            xmlDump.append("delay=\"" + timer.getDelay() + "\" ");
+            if (timer.getPeriod() > 0) {
+                xmlDump.append(" period=\"" + timer.getPeriod() + "\" ");
+            }
+        }
+        endNode(xmlDump);
+	}
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/WorkItemNodeHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/WorkItemNodeHandler.java	2008-05-22 11:56:48 UTC (rev 20112)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/processes/WorkItemNodeHandler.java	2008-05-22 11:56:56 UTC (rev 20113)
@@ -1,5 +1,9 @@
 package org.drools.xml.processes;
 
+import java.util.Map;
+
+import org.drools.process.core.ParameterDefinition;
+import org.drools.process.core.Work;
 import org.drools.workflow.core.Node;
 import org.drools.workflow.core.node.WorkItemNode;
 import org.drools.xml.Configuration;
@@ -25,4 +29,51 @@
         return WorkItemNode.class;
     }
 
+	public void writeNode(Node node, StringBuffer xmlDump, boolean includeMeta) {
+		WorkItemNode workItemNode = (WorkItemNode) node;
+		writeNode("workItem", workItemNode, xmlDump, includeMeta);
+        if (!workItemNode.isWaitForCompletion()) {
+            xmlDump.append("waitForCompletion=\"false\" ");
+        }
+        xmlDump.append(">" + EOL);
+        Work work = workItemNode.getWork();
+        if (work != null) {
+            visitWork(work, xmlDump, includeMeta);
+        }
+        Map<String, String> inMappings = workItemNode.getInMappings();
+        for (Map.Entry<String, String> inMapping: inMappings.entrySet()) {
+            xmlDump.append(
+                "      <mapping type=\"in\" "
+                             + "parameterName=\"" + inMapping.getKey() + "\" "
+                             + "variableName=\"" + inMapping.getValue() + "\" />" + EOL);
+        }
+        Map<String, String> outMappings = workItemNode.getOutMappings();
+        for (Map.Entry<String, String> outMapping: outMappings.entrySet()) {
+            xmlDump.append(
+                "      <mapping type=\"out\" "
+                             + "parameterName=\"" + outMapping.getKey() + "\" "
+                             + "variableName=\"" + outMapping.getValue() + "\" />" + EOL);
+        }
+        endNode("workItem", xmlDump);
+    }
+    
+    private void visitWork(Work work, StringBuffer xmlDump, boolean includeMeta) {
+        xmlDump.append("      <work name=\"" + work.getName() + "\" >" + EOL);
+        for (ParameterDefinition paramDefinition: work.getParameterDefinitions()) {
+            if (paramDefinition == null) {
+                throw new IllegalArgumentException(
+                    "Could not find parameter definition " + paramDefinition.getName()
+                        + " for work " + work.getName());
+            }
+            xmlDump.append("        <parameter name=\"" + paramDefinition.getName() + "\" " + 
+                                              "type=\"" + paramDefinition.getType().getClass().getName() + "\" ");
+            Object value = work.getParameter(paramDefinition.getName());
+            if (value == null) {
+                xmlDump.append("/>" + EOL);
+            } else {
+                xmlDump.append(">" + value + "</parameter>" + EOL);
+            }
+        }
+        xmlDump.append("      </work>" + EOL);
+    }
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/processes/XMLPersistenceTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/processes/XMLPersistenceTest.java	2008-05-22 11:56:48 UTC (rev 20112)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/processes/XMLPersistenceTest.java	2008-05-22 11:56:56 UTC (rev 20113)
@@ -65,7 +65,7 @@
             throw new IllegalArgumentException("Failed to persist empty nodes!");
         }
         
-//        System.out.println(xml);
+        System.out.println(xml);
         
         XmlProcessReader reader = new XmlProcessReader(
             new PackageBuilderConfiguration().getSemanticModules());
@@ -245,7 +245,7 @@
             throw new IllegalArgumentException("Failed to persist empty nodes!");
         }
         
-//        System.out.println(xml);
+        System.out.println(xml);
         
         XmlProcessReader reader = new XmlProcessReader(
             new PackageBuilderConfiguration().getSemanticModules());




More information about the jboss-svn-commits mailing list