package sushi.xml.importer;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import sushi.bpmn.element.BPMNProcess;
import sushi.bpmn.element.BPMNSubProcess;
/**
* This class tests the import of BPMN processes and subprocesses from XML.
* @author micha
*/
public class BPMNParserTest {
private static String filePath = System.getProperty("user.dir")+"/src/test/resources/bpmn/Kinomodell.bpmn20.xml";
private static String complexfilePath = System.getProperty("user.dir")+"/src/test/resources/bpmn/complexProcess.bpmn20.xml";
private static String subProcessfilePath = System.getProperty("user.dir")+"/src/test/resources/bpmn/Automontage_TwoTerminal.bpmn20.xml";
@Test
public void testXPathParsing() throws ParserConfigurationException, SAXException, IOException, XPathExpressionException{
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(false);
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(filePath);
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile("//process/*");
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
printNodes(nodes, 1);
}
private void printNodes(NodeList nodes, int level) {
for (int i = 0; i < nodes.getLength(); i++) {
Node actualNode = nodes.item(i);
if(actualNode.getNodeType() == 1){
System.out.println(actualNode.getNodeName() + " " + level);
}
if(actualNode.hasChildNodes()){
printNodes(actualNode.getChildNodes(), level + 1);
}
}
}
@Test
public void testComplexProcess() throws XPathExpressionException, ParserConfigurationException, SAXException, IOException{
BPMNProcess BPMNProcess = BPMNParser.generateProcessFromXML(complexfilePath);
assertNotNull(BPMNProcess);
assertTrue(BPMNProcess.getBPMNElementsWithOutSequenceFlows().size() == 21);
assertTrue(BPMNProcess.getStartEvent().getId().equals("sid-EC585815-8EAC-411C-89C2-553ACA85CF5A"));
}
@Test
public void testSubProcessImport() {
BPMNProcess BPMNProcess = BPMNParser.generateProcessFromXML(subProcessfilePath);
assertNotNull(BPMNProcess);
assertTrue(BPMNProcess.getBPMNElementsWithOutSequenceFlows().size() == 7);
assertTrue(BPMNProcess.hasSubProcesses());
BPMNSubProcess subProcess = BPMNProcess.getSubProcesses().get(0);
assertNotNull(subProcess);
assertFalse(subProcess.getStartEvent().getSuccessors().isEmpty());
}
}