Skip to content

Commit a46a07e

Browse files
committed
fix test
Signed-off-by: Stefan Niederhauser <[email protected]>
1 parent 21bbbc4 commit a46a07e

File tree

3 files changed

+77
-43
lines changed

3 files changed

+77
-43
lines changed

graphviz-java/src/main/java/guru/nidi/graphviz/engine/SvgElementFinder.java renamed to graphviz-java/src/main/java/guru/nidi/graphviz/model/SvgElementFinder.java

Lines changed: 55 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -13,40 +13,45 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package guru.nidi.graphviz.engine;
16+
package guru.nidi.graphviz.model;
1717

18-
import guru.nidi.graphviz.model.Graph;
19-
import guru.nidi.graphviz.model.Link;
2018
import org.w3c.dom.Document;
21-
import org.w3c.dom.Node;
19+
import org.w3c.dom.Element;
2220
import org.xml.sax.InputSource;
2321
import org.xml.sax.SAXException;
2422

2523
import javax.annotation.Nullable;
24+
import javax.xml.XMLConstants;
2625
import javax.xml.namespace.QName;
2726
import javax.xml.parsers.*;
28-
import javax.xml.transform.TransformerException;
29-
import javax.xml.transform.TransformerFactory;
27+
import javax.xml.transform.*;
3028
import javax.xml.transform.dom.DOMSource;
3129
import javax.xml.transform.stream.StreamResult;
3230
import javax.xml.xpath.*;
3331
import java.io.*;
32+
import java.util.function.Consumer;
3433

3534
public class SvgElementFinder {
36-
private static final DocumentBuilderFactory FACTORY = DocumentBuilderFactory.newInstance();
37-
private static final TransformerFactory TRANSFORMER_FACTORY = TransformerFactory.newInstance();
35+
private static final DocumentBuilderFactory FACTORY = builderFactory();
36+
private static final TransformerFactory TRANSFORMER_FACTORY = transformerFactory();
3837
private static final VariableResolver RESOLVER = new VariableResolver();
3938
private static final XPath X_PATH = xPath(RESOLVER);
4039
private static final XPathExpression EXPR_G = pathExpression(X_PATH, "//g");
4140
private static final XPathExpression EXPR_TITLE = pathExpression(X_PATH, "//title[text()=$var]");
4241
private static final XPathExpression EXPR_TITLE_OR = pathExpression(X_PATH, "//title[text()=$var or text()=$alt]");
4342
private final Document doc;
4443

44+
public static String use(String svg, Consumer<SvgElementFinder> actions) {
45+
final SvgElementFinder finder = new SvgElementFinder(svg);
46+
actions.accept(finder);
47+
return finder.getSvg();
48+
}
49+
4550
public SvgElementFinder(String svg) {
4651
try {
4752
doc = builder().parse(new InputSource(new StringReader(svg)));
4853
} catch (SAXException | IOException e) {
49-
throw new GraphvizException("Could not read SVG", e);
54+
throw new AssertionError("Could not read SVG", e);
5055
}
5156
}
5257

@@ -60,58 +65,79 @@ public String getSvg() {
6065
}
6166
}
6267

63-
public Node findGraph() {
64-
return nodeExpr(EXPR_G, "");
68+
public Element findGraph() {
69+
return (Element) nodeExpr(EXPR_G, "");
6570
}
6671

6772
@Nullable
68-
public Node findNode(guru.nidi.graphviz.model.Node node) {
73+
public Element findNode(guru.nidi.graphviz.model.Node node) {
6974
return findNode(node.name().toString());
7075
}
7176

7277
@Nullable
73-
public Node findNode(String name) {
74-
final Node title = nodeExpr(EXPR_TITLE, name);
75-
return title == null ? null : title.getParentNode();
78+
public Element findNode(String name) {
79+
final org.w3c.dom.Node title = nodeExpr(EXPR_TITLE, name);
80+
return title == null ? null : (Element) title.getParentNode();
7681
}
7782

7883
@Nullable
79-
public Node findLink(Link link) {
84+
public Element findLink(Link link) {
8085
return findLink(link.from().name().toString(), link.to().name().toString());
8186
}
8287

8388
@Nullable
84-
public Node findLink(String from, String to) {
85-
final Node title = nodeExpr(EXPR_TITLE_OR, from + "--" + to);
86-
return title == null ? null : title.getParentNode();
89+
public Element findLink(String from, String to) {
90+
final org.w3c.dom.Node title = nodeExpr(EXPR_TITLE_OR, from + "--" + to);
91+
return title == null ? null : (Element) title.getParentNode();
8792
}
8893

8994
@Nullable
90-
public Node findCluster(Graph cluster) {
95+
public Element findCluster(Graph cluster) {
9196
return findCluster(cluster.name().toString());
9297
}
9398

9499
@Nullable
95-
public Node findCluster(String name) {
96-
final Node title = nodeExpr(EXPR_TITLE, "cluster_" + name);
97-
return title == null ? null : title.getParentNode();
100+
public Element findCluster(String name) {
101+
final org.w3c.dom.Node title = nodeExpr(EXPR_TITLE, "cluster_" + name);
102+
return title == null ? null : (Element) title.getParentNode();
98103
}
99104

100105
@Nullable
101-
private Node nodeExpr(XPathExpression expr, String var) {
106+
private org.w3c.dom.Node nodeExpr(XPathExpression expr, String var) {
102107
RESOLVER.set(var);
103108
try {
104-
return (Node) expr.evaluate(doc, XPathConstants.NODE);
109+
return (org.w3c.dom.Node) expr.evaluate(doc, XPathConstants.NODE);
105110
} catch (XPathExpressionException e) {
106111
throw new AssertionError("Could not execute XPath", e);
107112
}
108113
}
109114

115+
private static DocumentBuilderFactory builderFactory() {
116+
try {
117+
final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
118+
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
119+
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
120+
return factory;
121+
} catch (ParserConfigurationException e) {
122+
throw new AssertionError("Could not initialize DOM", e);
123+
}
124+
}
125+
126+
private static TransformerFactory transformerFactory() {
127+
try {
128+
final TransformerFactory factory = TransformerFactory.newInstance();
129+
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
130+
return factory;
131+
} catch (TransformerConfigurationException e) {
132+
throw new AssertionError("Could not initialize DOM", e);
133+
}
134+
}
135+
110136
private DocumentBuilder builder() {
111137
try {
112138
return FACTORY.newDocumentBuilder();
113139
} catch (ParserConfigurationException e) {
114-
throw new RuntimeException("Could not initialize DOM", e);
140+
throw new AssertionError("Could not initialize DOM", e);
115141
}
116142
}
117143

@@ -130,15 +156,15 @@ private static XPathExpression pathExpression(XPath xPath, String exp) {
130156
}
131157

132158
private static class VariableResolver implements XPathVariableResolver {
133-
private final static ThreadLocal<String> var = new ThreadLocal<>();
159+
private static final ThreadLocal<String> VAR = new ThreadLocal<>();
134160

135161
public void set(String value) {
136-
var.set(value);
162+
VAR.set(value);
137163
}
138164

139165
@Override
140166
public Object resolveVariable(QName varName) {
141-
return varName.getLocalPart().equals("var") ? var.get() : var.get().replace("--", "->");
167+
return varName.getLocalPart().equals("var") ? VAR.get() : VAR.get().replace("--", "->");
142168
}
143169
}
144170
}

graphviz-java/src/test/java/guru/nidi/graphviz/CodeAnalysisTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ protected FindBugsResult analyzeFindBugs() {
8888
In.loc("SimpleLabel").ignore("IM_BAD_CHECK_FOR_ODD"),
8989
In.loc("JavascriptEngineTest").ignore("PREDICTABLE_RANDOM"),
9090
In.loc("DatatypeTest").ignore("SIC_INNER_SHOULD_BE_STATIC"),
91+
In.loc("SvgElementFinder").ignore("XXE_DOCUMENT"),
9192
In.loc("Communicator").ignore("RR_NOT_CHECKED"));
9293
return new FindBugsAnalyzer(AnalyzerConfig.maven().mainAndTest(), collector).analyze();
9394
}
@@ -108,7 +109,7 @@ protected PmdResult analyzePmd() {
108109
.because("it's ok here",
109110
In.loc("Rasterizer#getDefault").ignore("CompareObjectsWithEquals"),
110111
In.locs("Format", "AttributeConfigs").ignore("AvoidDuplicateLiterals"),
111-
In.locs("LabelTest", "RankTest", "*DatatypeTest", "AttributeValidatorTest", "ParserTest", "JavascriptEngineTest", "GraphvizServerTest")
112+
In.locs("LabelTest", "RankTest", "*DatatypeTest", "AttributeValidatorTest", "ParserTest", "JavascriptEngineTest", "GraphvizServerTest", "SvgElementFinderTest")
112113
.ignore("JUnitTestContainsTooManyAsserts"),
113114
In.locs("DatatypeTest").ignore("TestClassWithoutTestCases"),
114115
In.loc("SerializerImpl").ignore("AvoidStringBufferField", "CompareObjectsWithEquals"),

graphviz-java/src/test/java/guru/nidi/graphviz/engine/SvgElementFinderTest.java renamed to graphviz-java/src/test/java/guru/nidi/graphviz/model/SvgElementFinderTest.java

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,17 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package guru.nidi.graphviz.engine;
16+
package guru.nidi.graphviz.model;
1717

1818
import guru.nidi.graphviz.attribute.Label;
19-
import guru.nidi.graphviz.model.Graph;
20-
import guru.nidi.graphviz.model.Node;
19+
import guru.nidi.graphviz.engine.Graphviz;
20+
import guru.nidi.graphviz.model.*;
2121
import org.junit.jupiter.api.Test;
2222

2323
import static guru.nidi.graphviz.engine.Format.SVG;
2424
import static guru.nidi.graphviz.model.Factory.*;
25+
import static org.hamcrest.Matchers.containsString;
26+
import static org.junit.Assert.assertThat;
2527
import static org.junit.jupiter.api.Assertions.assertEquals;
2628

2729
class SvgElementFinderTest {
@@ -30,39 +32,44 @@ void findGraph() {
3032
final Graph g = graph().graphAttr().with("class", "g").with(node("a"));
3133
final String svg = Graphviz.fromGraph(g).render(SVG).toString();
3234
final SvgElementFinder finder = new SvgElementFinder(svg);
33-
assertEquals("graph g", classAttr(finder.findGraph()));
35+
assertEquals("graph g", finder.findGraph().getAttribute("class"));
3436
}
3537

3638
@Test
3739
void findNode() {
3840
final Node a = node("a'").with("class", "aclass").with(Label.of("hula")).link("b");
3941
final String svg = Graphviz.fromGraph(graph().with(a)).render(SVG).toString();
4042
final SvgElementFinder finder = new SvgElementFinder(svg);
41-
assertEquals("node aclass", classAttr(finder.findNode("a'")));
42-
assertEquals("node aclass", classAttr(finder.findNode(a)));
43+
assertEquals("node aclass", finder.findNode("a'").getAttribute("class"));
44+
assertEquals("node aclass", finder.findNode(a).getAttribute("class"));
4345
}
4446

4547
@Test
4648
void findEdge() {
4749
final Node a = node("a'").with(Label.of("hula")).link(to(node("b")).with("class", "link"));
4850
final String svg = Graphviz.fromGraph(graph().with(a)).render(SVG).toString();
4951
final SvgElementFinder finder = new SvgElementFinder(svg);
50-
assertEquals("edge link", classAttr(finder.findLink("a'", "b")));
51-
assertEquals("edge link", classAttr(finder.findLink(a.links().get(0))));
52+
assertEquals("edge link", finder.findLink("a'", "b").getAttribute("class"));
53+
assertEquals("edge link", finder.findLink(a.links().get(0)).getAttribute("class"));
5254
final String svg2 = Graphviz.fromGraph(graph().directed().with(a)).render(SVG).toString();
53-
assertEquals("edge link", classAttr(new SvgElementFinder(svg2).findLink("a'", "b")));
55+
assertEquals("edge link", new SvgElementFinder(svg2).findLink("a'", "b").getAttribute("class"));
5456
}
5557

5658
@Test
5759
void findCluster() {
5860
final Graph sub = graph("sub").cluster().graphAttr().with("class", "c").with(node("a"));
5961
final String svg = Graphviz.fromGraph(graph().with(sub)).render(SVG).toString();
6062
final SvgElementFinder finder = new SvgElementFinder(svg);
61-
assertEquals("cluster c", classAttr(finder.findCluster("sub")));
62-
assertEquals("cluster c", classAttr(finder.findCluster(sub)));
63+
assertEquals("cluster c", finder.findCluster("sub").getAttribute("class"));
64+
assertEquals("cluster c", finder.findCluster(sub).getAttribute("class"));
6365
}
6466

65-
private String classAttr(org.w3c.dom.Node node) {
66-
return node.getAttributes().getNamedItem("class").getNodeValue();
67+
@Test
68+
void use() {
69+
final String svg = Graphviz.fromGraph(graph().with(node("node"))).render(SVG).toString();
70+
final String newSvg = SvgElementFinder.use(svg, finder -> {
71+
finder.findNode("node").setAttribute("class", "hula");
72+
});
73+
assertThat(newSvg, containsString("<g class=\"hula\""));
6774
}
6875
}

0 commit comments

Comments
 (0)