/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * 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. */ package org.jbpm.process.svg; import java.io.IOException; import java.io.StringReader; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; 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.apache.batik.dom.svg.SAXSVGDocumentFactory; import org.apache.batik.util.XMLResourceDescriptor; import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import static org.junit.Assert.*; public class TestEvalutionSVG { private XPath xpath = XPathFactory.newInstance().newXPath(); @Test public void test() throws Exception { List<String> completed = new ArrayList<String>(); completed.add("_343B16DA-961A-49BF-8697-9A86DEAFBAF4"); List<String> active = new ArrayList<String>(); active.add("_6063D302-9D81-4C86-920B-E808A45377C2"); String svg = SVGImageProcessor.transform(TestEvalutionSVG.class.getResourceAsStream("/evaluation-svg.svg"), completed, active); // verify transformation Document svgDocument = readSVG(svg); validateNodesMarkedAsActive(svgDocument, active); validateNodesMarkedAsCompleted(svgDocument, completed); } @Test public void testByName() throws Exception { List<String> completedID = new ArrayList<String>(); completedID.add("_6063D302-9D81-4C86-920B-E808A45377C2"); List<String> activeID = new ArrayList<String>(); activeID.add("_AE5BF0DC-B720-4FDE-9499-5ED89D41FB1A"); List<String> completed = new ArrayList<String>(); completed.add("Self Evaluation"); List<String> active = new ArrayList<String>(); active.add("PM Evaluation"); String svg = SVGImageProcessor.transformByName(TestEvalutionSVG.class.getResourceAsStream("/evaluation-svg.svg"), completed, active); // verify transformation Document svgDocument = readSVG(svg); validateNodesMarkedAsActive(svgDocument, activeID); validateNodesMarkedAsCompleted(svgDocument, completedID); } @Test public void testCompletedAndActive() throws Exception { List<String> completed = new ArrayList<String>(); completed.add("_343B16DA-961A-49BF-8697-9A86DEAFBAF4"); completed.add("_6063D302-9D81-4C86-920B-E808A45377C2"); List<String> active = new ArrayList<String>(); active.add("_6063D302-9D81-4C86-920B-E808A45377C2"); String svg = SVGImageProcessor.transform(TestEvalutionSVG.class.getResourceAsStream("/evaluation-svg.svg"), completed, active); // verify transformation Document svgDocument = readSVG(svg); validateNodesMarkedAsActive(svgDocument, active); // remove it as it should be not considered completed and was already asserted as active completed.remove("_6063D302-9D81-4C86-920B-E808A45377C2"); validateNodesMarkedAsCompleted(svgDocument, completed); } @Test public void testSubProcessLink() throws Exception { List<String> completed = new ArrayList<String>(); List<String> active = new ArrayList<String>(); active.add("_35262208-8B3E-457E-8D8A-798E70CC280D"); Map<String, String> links = new HashMap<>(); links.put("_35262208-8B3E-457E-8D8A-798E70CC280D", "http://localhost/processes/1"); String svg = SVGImageProcessor.transform(TestEvalutionSVG.class.getResourceAsStream("/call-activity-svg.svg"), completed, active, links); // verify transformation Document svgDocument = readSVG(svg); validateNodesMarkedAsActive(svgDocument, active); validateCallActivityLinked(svgDocument, active, links); } // helper methods for verifying svg transformation private void validateNodesMarkedAsActive(Document svgDocument, List<String> activeNodes) throws XPathExpressionException { for (String activeNode : activeNodes) { XPathExpression expr = xpath.compile("//*[@bpmn2nodeid='" + activeNode + "']"); Element element = (Element) expr.evaluate(svgDocument, XPathConstants.NODE); if (element == null) { fail("Active element " + activeNode + " not found in the document"); } String svgId = element.getAttribute("id"); Element border = svgDocument.getElementById(svgId + "bg_frame"); String marker = border.getAttribute("stroke"); assertNotNull(marker); assertEquals("#FF0000", marker); String markerWidth = border.getAttribute("stroke-width"); assertNotNull(markerWidth); assertEquals("2", markerWidth); } } private void validateNodesMarkedAsCompleted(Document svgDocument, List<String> completedNodes) throws XPathExpressionException { for (String completedNode : completedNodes) { XPathExpression expr = xpath.compile("//*[@bpmn2nodeid='" + completedNode + "']"); Element element = (Element) expr.evaluate(svgDocument, XPathConstants.NODE); if (element == null) { fail("Completed element " + completedNode + " not found in the document"); } String svgId = element.getAttribute("id"); Element background = svgDocument.getElementById(svgId + "fill_el"); String marker = background.getAttribute("stop-color"); assertNotNull(marker); assertEquals("#C0C0C0", marker); } } private void validateCallActivityLinked(Document svgDocument, List<String> activeNodes, Map<String, String> links) throws XPathExpressionException { for (String activeNode : activeNodes) { XPathExpression expr = xpath.compile("//*[@bpmn2nodeid='" + activeNode + "']"); Element element = (Element) expr.evaluate(svgDocument, XPathConstants.NODE); if (element == null) { fail("Active element " + activeNode + " not found in the document"); } String svgId = element.getAttribute("id"); Element border = svgDocument.getElementById(svgId + "pimg"); String onclick = border.getAttribute("onclick"); assertNotNull(onclick); assertEquals("", onclick); String link = border.getAttributeNS("http://www.w3.org/1999/xlink", "href"); assertNotNull(link); assertEquals(links.get(activeNode), link); String target = border.getAttribute("target"); assertNotNull(target); assertEquals("_blank", target); } } private Document readSVG(String svgContent) throws IOException { String parser = XMLResourceDescriptor.getXMLParserClassName(); SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(parser); factory.setValidating(false); Document svgDocument = factory.createDocument("http://jbpm.org", new StringReader(svgContent)); return svgDocument; } }