[jbosstools-commits] JBoss Tools SVN: r13075 - trunk/jbpm/plugins/org.jboss.tools.flow.jpdl4/src/org/jboss/tools/flow/jpdl4/editor.

jbosstools-commits at lists.jboss.org jbosstools-commits at lists.jboss.org
Thu Jan 15 16:00:15 EST 2009


Author: koen.aers at jboss.com
Date: 2009-01-15 16:00:15 -0500 (Thu, 15 Jan 2009)
New Revision: 13075

Modified:
   trunk/jbpm/plugins/org.jboss.tools.flow.jpdl4/src/org/jboss/tools/flow/jpdl4/editor/JpdlDeserializer.java
   trunk/jbpm/plugins/org.jboss.tools.flow.jpdl4/src/org/jboss/tools/flow/jpdl4/editor/JpdlSerializer.java
Log:
GPD-287: Unknown nodes, text (and whitespace) and comments are preserved.

Modified: trunk/jbpm/plugins/org.jboss.tools.flow.jpdl4/src/org/jboss/tools/flow/jpdl4/editor/JpdlDeserializer.java
===================================================================
--- trunk/jbpm/plugins/org.jboss.tools.flow.jpdl4/src/org/jboss/tools/flow/jpdl4/editor/JpdlDeserializer.java	2009-01-15 19:55:17 UTC (rev 13074)
+++ trunk/jbpm/plugins/org.jboss.tools.flow.jpdl4/src/org/jboss/tools/flow/jpdl4/editor/JpdlDeserializer.java	2009-01-15 21:00:15 UTC (rev 13075)
@@ -11,7 +11,6 @@
 import org.jboss.tools.flow.common.model.Flow;
 import org.jboss.tools.flow.common.registry.ElementRegistry;
 import org.jboss.tools.flow.common.wrapper.ConnectionWrapper;
-import org.jboss.tools.flow.common.wrapper.ContainerWrapper;
 import org.jboss.tools.flow.common.wrapper.FlowWrapper;
 import org.jboss.tools.flow.common.wrapper.NodeWrapper;
 import org.jboss.tools.flow.common.wrapper.Wrapper;
@@ -63,22 +62,24 @@
 	
 	class ProcessChildNodeHandler implements ChildNodeHandler {
 		public Wrapper processChildNode(Wrapper parent, Node node) {
-			if (!(parent instanceof FlowWrapper)) return null;
+			Wrapper result = null;
+			if (!(parent instanceof FlowWrapper)) return result;
 			FlowWrapper flowWrapper = (FlowWrapper)parent;
 			if (node instanceof Element) {
-				Wrapper childWrapper = createWrapper((Element)node);
-				if (childWrapper != null && childWrapper instanceof NodeWrapper) {
-					flowWrapper.addElement((NodeWrapper)childWrapper);
+				result = createWrapper((Element)node);
+				if (result != null && result instanceof NodeWrapper) {
+					flowWrapper.addElement((NodeWrapper)result);
 				}
 			}
-			return null;
+			return result;
 		}
 	}
 	
 	class NodeChildNodeHandler implements ChildNodeHandler {
 		@SuppressWarnings("unchecked")
 		public Wrapper processChildNode(Wrapper parent, Node node) {
-			if (!(parent instanceof NodeWrapper)) return null;
+			Wrapper result = null;
+			if (!(parent instanceof NodeWrapper)) return result;
 			NodeWrapper nodeWrapper = (NodeWrapper)parent;
 			ArrayList<ConnectionWrapper> flows = (ArrayList<ConnectionWrapper>)nodeWrapper.getElement().getMetaData("flows");
 			if (flows == null) {
@@ -86,12 +87,12 @@
 				nodeWrapper.getElement().setMetaData("flows", flows);
 			}
 			if (node instanceof Element) {
-				Wrapper childWrapper = createWrapper((Element)node);
-				if (childWrapper != null && childWrapper instanceof ConnectionWrapper) {
-					flows.add((ConnectionWrapper)childWrapper);
+				result = createWrapper((Element)node);
+				if (result != null && result instanceof ConnectionWrapper) {
+					flows.add((ConnectionWrapper)result);
 				}
 			}
-			return null;
+			return result;
 		}
 	}
 	
@@ -127,8 +128,6 @@
 		try {
 			Document document = documentBuilderFactory.newDocumentBuilder().parse(is);
 			result = createWrapper(document.getDocumentElement());
-//			Element element = document.getDocumentElement();
-//			result = createFlowWrapper(element);
 		} catch (Exception e) {
 			Logger.logError("An error occurred while creating the diagram", e);
 		}
@@ -213,56 +212,6 @@
 		else return null;
 	}
 	
-	private Wrapper createFlowWrapper(Element element) {
-		FlowWrapper result = null;
-		if ("process".equals(element.getNodeName())) {
-			result = createProcessWrapper(element);
-		}
-		return result;
-	}
-	
-	private FlowWrapper createProcessWrapper(Element element) {
-		FlowWrapper result = (FlowWrapper)ElementRegistry.createWrapper("org.jboss.tools.flow.jpdl4.process");
-		if (result != null) {
-			result.getElement().setMetaData("flows", new ArrayList<ConnectionWrapper>());
-			addName(result, element);
-			addNodes(result, element);
-			resolveSequenceFlowTargets(result);
-			result.getElement().setMetaData("flows", null);
-		}
-		return result;
-	}
-	
-	@SuppressWarnings("unchecked")
-	private void resolveSequenceFlowTargets(FlowWrapper flowWrapper) {
-		ArrayList<ConnectionWrapper> flows = (ArrayList<ConnectionWrapper>)flowWrapper.getElement().getMetaData("flows");
-		for (ConnectionWrapper flow : flows) {
-			resolveSequenceFlowTarget(flow);
-		}		
-	}
-	
-	private void resolveSequenceFlowTarget(ConnectionWrapper connectionWrapper) {
-		String to = (String)connectionWrapper.getElement().getMetaData("to");
-		if (to == null) {
-			Logger.logInfo("Ignoring sequenceflow without target");	
-			return;
-		}
-		connectionWrapper.getElement().setMetaData("to", null);
-		NodeWrapper source = (NodeWrapper)connectionWrapper.getElement().getMetaData("from");
-		if (source == null) {
-			Logger.logInfo("Ignoring sequenceflow without source");
-			return;
-		}
-		connectionWrapper.getElement().setMetaData("from", null);
-		FlowWrapper flowWrapper = source.getParent().getFlowWrapper();
-		NodeWrapper target = getNamedNode(to, flowWrapper);
-		if (target != null) {
-			connectionWrapper.connect(source, target);
-		} else {
-			Logger.logInfo("Ignoring unknown target " + to + " while resolving sequenceflow target.");
-		}
-	}
-	
 	private NodeWrapper getNamedNode(String name, FlowWrapper flowWrapper) {
 		if (name == null) return null;
 		for (NodeWrapper nodeWrapper : flowWrapper.getElements()) {
@@ -271,89 +220,6 @@
 		return null;
 	}
 	
-	private void addName(Wrapper wrapper,  Element element) {
-		String name = element.getAttribute("name");
-		if (name == null) return;
-		if (wrapper instanceof FlowWrapper) {
-			((Flow)((FlowWrapper)wrapper).getElement()).setName(name);
-		} else if (wrapper instanceof NodeWrapper){
-			((NodeWrapper)wrapper).setName(name);
-		}
-	}
-	
-	private void addNodes(FlowWrapper wrapper, Element element) {
-		NodeList nodeList = element.getChildNodes();
-		for (int i = 0; i < nodeList.getLength(); i++) {
-			Node child = nodeList.item(i);
-			NodeWrapper result = null;
-			if ("start".equals(child.getNodeName())) {
-				result = (NodeWrapper)ElementRegistry.createWrapper("org.jboss.tools.flow.jpdl4.startEvent");
-			} else if ("end".equals(child.getNodeName())) {
-				result = (NodeWrapper)ElementRegistry.createWrapper("org.jboss.tools.flow.jpdl4.terminateEndEvent");
-			} else if ("end-error".equals(child.getNodeName())) {
-				result = (NodeWrapper)ElementRegistry.createWrapper("org.jboss.tools.flow.jpdl4.errorEndEvent");
-			} else if ("end-cancel".equals(child.getNodeName())) {
-				result = (NodeWrapper)ElementRegistry.createWrapper("org.jboss.tools.flow.jpdl4.cancelEndEvent");
-			} else if ("state".equals(child.getNodeName())) {
-				result = (NodeWrapper)ElementRegistry.createWrapper("org.jboss.tools.flow.jpdl4.waitTask");
-			} else if ("hql".equals(child.getNodeName())) {
-				result = (NodeWrapper)ElementRegistry.createWrapper("org.jboss.tools.flow.jpdl4.hqlTask");
-			} else if ("sql".equals(child.getNodeName())) {
-				result = (NodeWrapper)ElementRegistry.createWrapper("org.jboss.tools.flow.jpdl4.sqlTask");
-			} else if ("java".equals(child.getNodeName())) {
-				result = (NodeWrapper)ElementRegistry.createWrapper("org.jboss.tools.flow.jpdl4.javaTask");
-			} else if ("script".equals(child.getNodeName())) {
-				result = (NodeWrapper)ElementRegistry.createWrapper("org.jboss.tools.flow.jpdl4.scriptTask");
-			} else if ("esb".equals(child.getNodeName())) {
-				result = (NodeWrapper)ElementRegistry.createWrapper("org.jboss.tools.flow.jpdl4.serviceTask");
-			} else if ("task".equals(child.getNodeName())) {
-				result = (NodeWrapper)ElementRegistry.createWrapper("org.jboss.tools.flow.jpdl4.humanTask");
-			} else if ("exclusive".equals(child.getNodeName())) {
-				result = (NodeWrapper)ElementRegistry.createWrapper("org.jboss.tools.flow.jpdl4.exclusiveGateway");
-			} else if ("join".equals(child.getNodeName())) {
-				result = (NodeWrapper)ElementRegistry.createWrapper("org.jboss.tools.flow.jpdl4.parallelJoinGateway");
-			} else if ("fork".equals(child.getNodeName())) {
-				result = (NodeWrapper)ElementRegistry.createWrapper("org.jboss.tools.flow.jpdl4.parallelForkGateway");
-			}
-			if (result != null) {
-				wrapper.addElement(result);
-				addName(result, (Element)child);
-				addGraphics(result, (Element)child);
-				addSequenceFlow(result, (Element)child);
-			}
-		}
-	}
-	
-	@SuppressWarnings("unchecked")
-	private void addSequenceFlow(NodeWrapper wrapper, Element element) {
-		NodeList nodeList = element.getElementsByTagName("flow");
-		for (int i = 0; i < nodeList.getLength(); i++) {
-			Node child = nodeList.item(i);
-			ConnectionWrapper result = 
-				createConnectionWrapper((Element)child, "org.jboss.tools.flow.jpdl4.sequenceFlow");
-			if (result != null) {
-				result.getElement().setMetaData("from", wrapper);
-				String to = ((Element)child).getAttribute("to");
-				result.getElement().setMetaData("to", to);
-				ContainerWrapper parent = wrapper.getParent();
-				FlowWrapper flowWrapper = parent.getFlowWrapper();
-				ArrayList<ConnectionWrapper> flows = 
-					(ArrayList<ConnectionWrapper>)flowWrapper.getElement().getMetaData("flows");
-				flows.add(result);
-			}
-		}
-	}
-	
-	
-	private ConnectionWrapper createConnectionWrapper(Element element, String elementType) {
-		ConnectionWrapper result = (ConnectionWrapper)ElementRegistry.createWrapper(elementType);
-		if (result != null) {
-			addName(result, element);
-			addGraphics(result, element);
-		}
-		return result;
-	}
-	
 	private void addGraphics(ConnectionWrapper wrapper, Element element) {
 		String graphics = element.getAttribute("g");
 		if (graphics != null) {

Modified: trunk/jbpm/plugins/org.jboss.tools.flow.jpdl4/src/org/jboss/tools/flow/jpdl4/editor/JpdlSerializer.java
===================================================================
--- trunk/jbpm/plugins/org.jboss.tools.flow.jpdl4/src/org/jboss/tools/flow/jpdl4/editor/JpdlSerializer.java	2009-01-15 19:55:17 UTC (rev 13074)
+++ trunk/jbpm/plugins/org.jboss.tools.flow.jpdl4/src/org/jboss/tools/flow/jpdl4/editor/JpdlSerializer.java	2009-01-15 21:00:15 UTC (rev 13075)
@@ -3,9 +3,20 @@
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
+import java.io.StringWriter;
 import java.io.Writer;
+import java.util.ArrayList;
 import java.util.List;
 
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Result;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
 import org.eclipse.draw2d.geometry.Point;
 import org.eclipse.draw2d.geometry.Rectangle;
 import org.jboss.tools.flow.common.model.Element;
@@ -13,6 +24,7 @@
 import org.jboss.tools.flow.common.wrapper.ContainerWrapper;
 import org.jboss.tools.flow.common.wrapper.NodeWrapper;
 import org.jboss.tools.flow.common.wrapper.Wrapper;
+import org.jboss.tools.flow.jpdl4.Logger;
 import org.jboss.tools.flow.jpdl4.model.CancelEndEvent;
 import org.jboss.tools.flow.jpdl4.model.ErrorEndEvent;
 import org.jboss.tools.flow.jpdl4.model.ExclusiveGateway;
@@ -30,9 +42,22 @@
 import org.jboss.tools.flow.jpdl4.model.SuperState;
 import org.jboss.tools.flow.jpdl4.model.TerminateEndEvent;
 import org.jboss.tools.flow.jpdl4.model.WaitTask;
+import org.w3c.dom.Node;
 
 public class JpdlSerializer {
-
+	
+	private static TransformerFactory transformerFactory = TransformerFactory.newInstance();
+	private static Transformer transformer = null;
+	
+	static {
+		try {
+			transformer = transformerFactory.newTransformer();
+			transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+		} catch (TransformerConfigurationException e) {				
+			Logger.logError("Error while creating XML tranformer.", e);	
+		}
+	}
+	
     public void serialize(Wrapper wrapper, OutputStream os) throws IOException {
     	StringBuffer buffer = new StringBuffer();
     	appendToBuffer(buffer, wrapper, 0);
@@ -56,12 +81,41 @@
        	}
     }
     
-    private void appendOpening(StringBuffer buffer, Wrapper wrapper, int level) {
+    
+    
+    private void appendNodeList(StringBuffer buffer, ArrayList<Node> nodeList) {
+    	if (transformer == null) {
+    		Logger.logInfo("Skipping append nodes as transformer is not initialized.");
+    		return;
+    	}
+    	DOMSource domSource = new DOMSource();
+    	for (Node node : nodeList) {
+        	StringWriter writer = new StringWriter();
+        	domSource.setNode(node);
+        	Result result = new StreamResult(writer);
+        	try {
+				transformer.transform(domSource, result);
+			} catch (TransformerException e) {
+				Logger.logError("Exception while transforming xml.", e);
+			}
+    		buffer.append(writer.getBuffer());
+    	}
+    }
+    
+    @SuppressWarnings("unchecked")
+	private void appendOpening(StringBuffer buffer, Wrapper wrapper, int level) {
     	Element element = (Element)wrapper.getElement();
+    	ArrayList<Node> leadingNodeList = (ArrayList<Node>)element.getMetaData("leadingNodes");
+    	boolean appendLeadingNodes = leadingNodeList != null && !leadingNodeList.isEmpty();
+    	if (appendLeadingNodes) {
+    		appendNodeList(buffer, leadingNodeList);
+    	}
     	if (element instanceof SequenceFlow) {
     		SequenceFlow transition = (SequenceFlow)element;
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendLeadingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("<flow");
     		if (transition.getTo() != null) {
     			buffer.append(" ");
@@ -72,8 +126,10 @@
     		appendConnectionGraphics(buffer, (ConnectionWrapper)wrapper);
     	} else if (element instanceof TerminateEndEvent) {
     		TerminateEndEvent terminateEndEvent = (TerminateEndEvent)element;
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendLeadingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("<end");
     		if (!isEmpty(terminateEndEvent.getName())) {
     			buffer.append(" ");
@@ -83,8 +139,10 @@
     		appendNodeGraphics(buffer, (NodeWrapper)wrapper);
     	} else if (element instanceof ErrorEndEvent) {
     		ErrorEndEvent errorEndEvent = (ErrorEndEvent)element;
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendLeadingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("<end-error");
     		if (!isEmpty(errorEndEvent.getName())) {
     			buffer.append(" ");
@@ -94,8 +152,10 @@
     		appendNodeGraphics(buffer, (NodeWrapper)wrapper);
     	} else if (element instanceof CancelEndEvent) {
     		CancelEndEvent cancelEndEvent = (CancelEndEvent)element;
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendLeadingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("<end-cancel");
     		if (!isEmpty(cancelEndEvent.getName())) {
     			buffer.append(" ");
@@ -105,8 +165,10 @@
     		appendNodeGraphics(buffer, (NodeWrapper)wrapper);
     	} else if (element instanceof StartEvent) {
     		StartEvent startEvent = (StartEvent)element;
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendLeadingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("<start");
     		if (!isEmpty(startEvent.getName())) {
     			buffer.append(" ");
@@ -116,8 +178,10 @@
     		appendNodeGraphics(buffer, (NodeWrapper)wrapper);
     	} else if (element instanceof SuperState) {
     		SuperState superState = (SuperState)element;
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendLeadingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("<super-state");
     		if (!isEmpty(superState.getName())) {
     			buffer.append(" ");
@@ -126,8 +190,10 @@
     		}
     	} else if (element instanceof WaitTask) {
     		WaitTask waitTask = (WaitTask)element;
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendLeadingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("<state");
     		if (!isEmpty(waitTask.getName())) {
     			buffer.append(" ");
@@ -137,8 +203,10 @@
     		appendNodeGraphics(buffer, (NodeWrapper)wrapper);
     	} else if (element instanceof HqlTask) {
     		HqlTask hqlTask = (HqlTask)element;
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendLeadingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("<hql");
     		if (!isEmpty(hqlTask.getName())) {
     			buffer.append(" ");
@@ -148,8 +216,10 @@
     		appendNodeGraphics(buffer, (NodeWrapper)wrapper);
     	} else if (element instanceof SqlTask) {
     		SqlTask sqlTask = (SqlTask)element;
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendLeadingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("<sql");
     		if (!isEmpty(sqlTask.getName())) {
     			buffer.append(" ");
@@ -159,8 +229,10 @@
     		appendNodeGraphics(buffer, (NodeWrapper)wrapper);
     	} else if (element instanceof JavaTask) {
     		JavaTask javaTask = (JavaTask)element;
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendLeadingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("<java");
     		if (!isEmpty(javaTask.getName())) {
     			buffer.append(" ");
@@ -170,8 +242,10 @@
     		appendNodeGraphics(buffer, (NodeWrapper)wrapper);
     	} else if (element instanceof ScriptTask) {
     		ScriptTask scriptTask = (ScriptTask)element;
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendLeadingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("<script");
     		if (!isEmpty(scriptTask.getName())) {
     			buffer.append(" ");
@@ -181,8 +255,10 @@
     		appendNodeGraphics(buffer, (NodeWrapper)wrapper);
     	} else if (element instanceof ServiceTask) {
     		ServiceTask serviceTask = (ServiceTask)element;
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendLeadingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("<esb");
     		if (!isEmpty(serviceTask.getName())) {
     			buffer.append(" ");
@@ -192,8 +268,10 @@
     		appendNodeGraphics(buffer, (NodeWrapper)wrapper);
     	} else if (element instanceof HumanTask) {
     		HumanTask humanTask = (HumanTask)element;
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendLeadingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("<task");
     		if (!isEmpty(humanTask.getName())) {
     			buffer.append(" ");
@@ -203,8 +281,10 @@
     		appendNodeGraphics(buffer, (NodeWrapper)wrapper);
     	} else if (element instanceof ExclusiveGateway) {
     		ExclusiveGateway exclusiveGateway = (ExclusiveGateway)element;
-    		buffer.append("\n");
-    		appendPadding(buffer, level);
+    		if (!appendLeadingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("<exclusive");
     		if (!isEmpty(exclusiveGateway.getName())) {
     			buffer.append(" ");
@@ -214,8 +294,10 @@
     		appendNodeGraphics(buffer, (NodeWrapper)wrapper);
     	} else if (element instanceof ForkParallelGateway) {
     		ForkParallelGateway parallelForkGateway = (ForkParallelGateway)element;
-    		buffer.append("\n");
-    		appendPadding(buffer, level);
+    		if (!appendLeadingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("<fork");
     		if (!isEmpty(parallelForkGateway.getName())) {
     			buffer.append(" ");
@@ -225,8 +307,10 @@
     		appendNodeGraphics(buffer, (NodeWrapper)wrapper);
     	} else if (element instanceof JoinParallelGateway) {
     		JoinParallelGateway parallelJoinGateway = (JoinParallelGateway)element;
-    		buffer.append("\n");
-    		appendPadding(buffer, level);
+    		if (!appendLeadingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("<join");
     		if (!isEmpty(parallelJoinGateway.getName())) {
     			buffer.append(" ");
@@ -264,75 +348,115 @@
     	}
     }
     
-    private void appendClosing(StringBuffer buffer, Wrapper wrapper, int level) {
+    @SuppressWarnings("unchecked")
+	private void appendClosing(StringBuffer buffer, Wrapper wrapper, int level) {
     	Element element = (Element)wrapper.getElement();
+    	ArrayList<Node> trailingNodeList = (ArrayList<Node>)element.getMetaData("trailingNodes");
+    	boolean appendTrailingNodes = trailingNodeList != null && !trailingNodeList.isEmpty();
+    	if (appendTrailingNodes) {
+    		appendNodeList(buffer, trailingNodeList);
+    	}
     	if (element instanceof SequenceFlow) {
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendTrailingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("</flow>");
     	} else if (element instanceof TerminateEndEvent) {
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendTrailingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("</end>");
     	} else if (element instanceof ErrorEndEvent) {
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendTrailingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("</end-error>");
     	} else if (element instanceof CancelEndEvent) {
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendTrailingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("</end-cancel>");
     	} else if (element instanceof StartEvent) {
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
-    		buffer.append("</start>");
+    		if (!appendTrailingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
+   		buffer.append("</start>");
     	} else if (element instanceof SuperState) {
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendTrailingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("</super-state>");
     	} else if (element instanceof WaitTask) {
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendTrailingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("</state>");
     	} else if (element instanceof HqlTask) {
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendTrailingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("</hql>");
     	} else if (element instanceof SqlTask) {
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendTrailingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("</sql>");
     	} else if (element instanceof JavaTask) {
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendTrailingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("</java>");
     	} else if (element instanceof ScriptTask) {
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendTrailingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("</script>");
     	} else if (element instanceof ServiceTask) {
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendTrailingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("</esb>");
     	} else if (element instanceof HumanTask) {
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendTrailingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("</task>");
     	} else if (element instanceof ExclusiveGateway) {
-    		buffer.append("\n");
-    		appendPadding(buffer, level);
+    		if (!appendTrailingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("</exclusive>");
     	} else if (element instanceof ForkParallelGateway) {
-    		buffer.append("\n");
-    		appendPadding(buffer, level);
+    		if (!appendTrailingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("</fork>");
     	} else if (element instanceof JoinParallelGateway) {
-    		buffer.append("\n");
-    		appendPadding(buffer, level);
+    		if (!appendTrailingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("</join>");
     	} else if (element instanceof Process) {
-        	buffer.append("\n");
-        	appendPadding(buffer, level);
+    		if (!appendTrailingNodes) {
+    			buffer.append("\n");
+    			appendPadding(buffer, level);
+    		}
     		buffer.append("</process>");
     	}	
     }




More information about the jbosstools-commits mailing list