package sushi.xml.importer;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import signavio.xml.converter.AbstractSignavioXMLElement;
import signavio.xml.converter.SignavioBPMNProcess;
import signavio.xml.converter.SignavioEndEvent;
import signavio.xml.converter.SignavioExclusiveGateway;
import signavio.xml.converter.SignavioParallelGateway;
import signavio.xml.converter.SignavioSequenceFlow;
import signavio.xml.converter.SignavioStartEvent;
import signavio.xml.converter.SignavioTask;
import sushi.event.SushiEvent;
import sushi.event.collection.SushiMapTree;
/**
* Converts BPM2XML to Signavio.xml to visualize it with the CoreComponents.
* @author Ben
*
*/
public class BPM2XMLToSignavioXMLConverter extends AbstractXMLParser{
private String bpm2FilePath, fileNameWithoutExtenxions;
private SignavioBPMNProcess process;
private final String pathToCoreComponentsFolder = "/home/platformaccount/signaviocore-workspace";
/**
* @param bpm2FilePath
*/
public BPM2XMLToSignavioXMLConverter(String bpm2FilePath){
this.bpm2FilePath = bpm2FilePath;
File file = new File(bpm2FilePath);
String fileName = file.getName();
fileNameWithoutExtenxions = fileName.replaceAll("\\..*", "");
}
/**
* @param bpm2FilePath
* @return
*/
public String generateSignavioXMLFromBPM2XML(){
SignavioBPMNProcess process = parseBPM2XML();
// File file = new File(System.getProperty("user.dir")+"/src/test/resources/bpmn/" + fileNameWithoutExtenxions + ".signavio.xml");
File file = new File(pathToCoreComponentsFolder + fileNameWithoutExtenxions + ".signavio.xml");
try {
FileWriter writer = new FileWriter(file ,false);
writer.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
writer.write(System.getProperty("line.separator"));
writer.write("<oryxmodel>");
writer.write(System.getProperty("line.separator"));
writer.write("<description></description>");
writer.write(System.getProperty("line.separator"));
writer.write("<type>BPMN 2.0</type>");
writer.write(System.getProperty("line.separator"));
writer.write("<json-representation><![CDATA[");
writer.write(process.generateSignavioXMLString());
writer.write("]]></json-representation>");
writer.write(System.getProperty("line.separator"));
writer.write("</oryxmodel>");
//Stream in Datei schreiben
writer.flush();
// Schließt den Stream
writer.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return file.getName();
}
/**
* @return
*/
public SignavioBPMNProcess parseBPM2XML() {
Document doc = readXMLDocument(bpm2FilePath);
//XXX
process = new SignavioBPMNProcess();
Node definitionNode = getDefinitionsElementFromBPM(doc);
if(definitionNode != null){
process.addPropertyValue("targetnamespace", definitionNode.getAttributes().getNamedItem("targetNamespace").getNodeValue());
process.addPropertyValue("expressionlanguage", definitionNode.getAttributes().getNamedItem("expressionLanguage").getNodeValue());
process.addPropertyValue("typelanguage", definitionNode.getAttributes().getNamedItem("typeLanguage").getNodeValue());
}
//XXX
NodeList processChilds = getProcessElementsFromBPM(doc);
for(int i = 0; i < processChilds.getLength(); i++){
process.addChildShape(getProcessChildFromXML(processChilds.item(i), doc));
}
return process;
}
private AbstractSignavioXMLElement getProcessChildFromXML(Node item, Document doc) {
AbstractSignavioXMLElement signavioXMLElement;
if(item.getNodeName().equals("startEvent")){
signavioXMLElement = generateStartEventFromXML(item);
}
else if(item.getNodeName().equals("endEvent")){
signavioXMLElement = generateEndEventFromXML(item);
}
else if(item.getNodeName().equals("sequenceFlow")){
signavioXMLElement = generateSequenceFlowFromXML(item);
}
else if(item.getNodeName().equals("exclusiveGateway")){
signavioXMLElement = generateExclusiveGatewayFromXML(item);
}
else if(item.getNodeName().equals("parallelGateway")){
signavioXMLElement = generateParallelGatewayFromXML(item);
}
else{
signavioXMLElement = generateTaskFromXML(item);
}
signavioXMLElement.addPropertyValue("name", item.getAttributes().getNamedItem("name").getNodeValue());
Node planeNode = getPlaneElementFromBPM(doc);
NodeList childNodes = planeNode.getChildNodes();
for(int i = 0; i < childNodes.getLength(); i++){
Node child = childNodes.item(i);
if(child.hasAttributes() && child.getAttributes().getNamedItem("bpmnElement").getNodeValue().equals(signavioXMLElement.getResourceId())){
signavioXMLElement.getBoundsFromXMLNode(child);
break;
}
}
return signavioXMLElement;
}
private AbstractSignavioXMLElement generateParallelGatewayFromXML(Node item) {
String itemId = item.getAttributes().getNamedItem("id").getNodeValue();
SignavioParallelGateway parallelGateway = new SignavioParallelGateway(itemId);
return parallelGateway;
}
private AbstractSignavioXMLElement generateExclusiveGatewayFromXML(Node item) {
String itemId = item.getAttributes().getNamedItem("id").getNodeValue();
SignavioExclusiveGateway exclusiveGateway = new SignavioExclusiveGateway(itemId);
return exclusiveGateway;
}
private AbstractSignavioXMLElement generateSequenceFlowFromXML(Node item) {
String itemId = item.getAttributes().getNamedItem("id").getNodeValue();
SignavioSequenceFlow sequenceFlow = new SignavioSequenceFlow(itemId);
Node sourceNode = item.getAttributes().getNamedItem("sourceRef");
if(sourceNode != null) {
String source = sourceNode.getNodeValue();
for(AbstractSignavioXMLElement child : process.getChildShapes()){
if(child.getResourceId().equals(source)){
child.addOutgoing(itemId);
sequenceFlow.setPredecessor(child);
}
}
}
Node targetNode = item.getAttributes().getNamedItem("targetRef");
if(targetNode != null){
String target = targetNode.getNodeValue();
sequenceFlow.addOutgoing(target);
for(AbstractSignavioXMLElement child : process.getChildShapes()){
if(child.getResourceId().equals(target)){
sequenceFlow.setSucessor(child);
}
}
}
return sequenceFlow;
}
private AbstractSignavioXMLElement generateEndEventFromXML(Node item) {
String itemId = item.getAttributes().getNamedItem("id").getNodeValue();
SignavioEndEvent endEvent = new SignavioEndEvent(itemId);
return endEvent;
}
private AbstractSignavioXMLElement generateTaskFromXML(Node item) {
String itemId = item.getAttributes().getNamedItem("id").getNodeValue();
SignavioTask task = new SignavioTask(itemId);
return task;
}
private AbstractSignavioXMLElement generateStartEventFromXML(Node item) {
String itemId = item.getAttributes().getNamedItem("id").getNodeValue();
SignavioStartEvent startEvent = new SignavioStartEvent(itemId);
NodeList children = item.getChildNodes();
for(int i = 0; i < children.getLength(); i++){
Node child = children.item(i);
if(child.getNodeName().equals("messageEventDefinition")){
startEvent.setMessageEvent();
}
if(child.getNodeName().equals("timerEventDefinition")){
startEvent.setTimerEvent();
}
if(child.getNodeName().equals("escalationEventDefinition")){
startEvent.setEscalationEvent();
}
if(child.getNodeName().equals("conditionalEventDefinition")){
startEvent.setConditionalEvent();
}
if(child.getNodeName().equals("errorEventDefinition")){
startEvent.setErrorEvent();
}
if(child.getNodeName().equals("compensateEventDefinition")){
startEvent.setCompensateEvent();
}
if(child.getNodeName().equals("signalEventDefinition")){
startEvent.setSignalEvent();
}
}
return startEvent;
}
/**
* @param doc
*/
private Node getDefinitionsElementFromBPM(Document doc){
XPath xpath = XPathFactory.newInstance().newXPath();
xpath.setNamespaceContext(new SignavioBPMNNameSpaceContext());
// XPath Query for showing all nodes value
XPathExpression definitionsExpression = null;
try {
definitionsExpression = xpath.compile("//ns:definitions");
} catch (XPathExpressionException e) {
e.printStackTrace();
}
Object definitionsResult = null;
try {
definitionsResult = definitionsExpression.evaluate(doc, XPathConstants.NODESET);
} catch (XPathExpressionException e) {
e.printStackTrace();
}
NodeList definitions = (NodeList)definitionsResult;
if(definitions.getLength() > 0){
return definitions.item(0);
} else {
return null;
}
}
/**
* @param doc
*/
private NodeList getProcessElementsFromBPM(Document doc){
XPath xpath = XPathFactory.newInstance().newXPath();
xpath.setNamespaceContext(new SignavioBPMNNameSpaceContext());
// XPath Query for showing all nodes value
XPathExpression processElementsExpression = null;
try {
processElementsExpression = xpath.compile("//ns:process/*");
} catch (XPathExpressionException e) {
e.printStackTrace();
}
Object processElementsResult = null;
try {
processElementsResult = processElementsExpression.evaluate(doc, XPathConstants.NODESET);
} catch (XPathExpressionException e) {
e.printStackTrace();
}
return (NodeList) processElementsResult;
}
private Node getDiagramElementFromBPM(Document doc){
Node definitionNode = getDefinitionsElementFromBPM(doc);
if(definitionNode != null){
return XMLParser.getFirstChildWithNameFromNode("bpmndi:BPMNDiagram", definitionNode);
}
return null;
}
private Node getPlaneElementFromBPM(Document doc){
Node diagramNode = getDiagramElementFromBPM(doc);
if(diagramNode != null){
return XMLParser.getFirstChildWithNameFromNode("bpmndi:BPMNPlane", diagramNode);
}
return null;
}
}