1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package gov.nist.secauto.decima.xml.document;
28
29 import gov.nist.secauto.decima.core.document.DocumentException;
30 import gov.nist.secauto.decima.xml.assessment.result.XPathContext;
31 import org.jdom2.Attribute;
32 import org.jdom2.Element;
33 import org.jdom2.Text;
34 import org.jdom2.filter.Filters;
35 import org.junit.Assert;
36 import org.junit.Test;
37
38 import java.io.File;
39 import java.io.FileNotFoundException;
40
41 import javax.xml.xpath.XPathExpressionException;
42
43 public class JDOMBasedXPathEvaluatorTest {
44 private static final File DOCUMENT = new File("src/test/resources/test-document.xml");
45
46 @Test
47 public void testXPathRoot() throws FileNotFoundException, DocumentException, XPathExpressionException {
48 JDOMDocument doc = new JDOMDocument(DOCUMENT);
49
50 JDOMBasedXPathEvaluator eval = new JDOMBasedXPathEvaluator(doc.getJDOMDocument(false));
51 XPathNamespaceContext nsContext = new XPathNamespaceContext("NS");
52 nsContext.addNamespace("ns", "NS");
53 eval.setNamespaceContext(nsContext);
54 Element root = eval.evaluateSingle("/ns:root", Filters.element());
55 Assert.assertNotNull(root);
56
57 XPathContext context = doc.getContext(root);
58
59 ContextAssert.assertContext("/*[local-name()='root' and namespace-uri()='NS'][1]", 2, 36,
60 DOCUMENT.toURI().toString(), context);
61 }
62
63 @Test
64 public void testXPathChild() throws FileNotFoundException, DocumentException, XPathExpressionException {
65 JDOMDocument doc = new JDOMDocument(DOCUMENT);
66
67 JDOMBasedXPathEvaluator eval = new JDOMBasedXPathEvaluator(doc.getJDOMDocument(false));
68 XPathNamespaceContext nsContext = new XPathNamespaceContext("NS");
69 nsContext.addNamespace("ns", "NS");
70 eval.setNamespaceContext(nsContext);
71 Element child = eval.evaluateSingle("/ns:root/ns:child[@id='A']", Filters.element());
72
73 XPathContext context = doc.getContext(child);
74
75 ContextAssert.assertContext(
76 "/*[local-name()='root' and namespace-uri()='NS'][1]/*[local-name()='child' and namespace-uri()='NS'][1]", 3,
77 33, DOCUMENT.toURI().toString(), context);
78 }
79
80 @Test
81 public void testContextAttribute() throws FileNotFoundException, DocumentException, XPathExpressionException {
82 JDOMDocument doc = new JDOMDocument(DOCUMENT);
83
84 JDOMBasedXPathEvaluator eval = new JDOMBasedXPathEvaluator(doc.getJDOMDocument(false));
85 XPathNamespaceContext nsContext = new XPathNamespaceContext("NS");
86 nsContext.addNamespace("ns", "NS");
87 eval.setNamespaceContext(nsContext);
88 Attribute attr = eval.evaluateSingle("/ns:root/ns:child[@id='A']/@id", Filters.attribute());
89 XPathContext context = doc.getContext(attr);
90
91 ContextAssert.assertContext(
92 "/*[local-name()='root' and namespace-uri()='NS'][1]/*[local-name()='child' and namespace-uri()='NS'][1]/@*[local-name()='id']",
93 3, 33, DOCUMENT.toURI().toString(), context);
94 }
95
96 @Test
97 public void testContextAttributeNS() throws FileNotFoundException, DocumentException, XPathExpressionException {
98 JDOMDocument doc = new JDOMDocument(DOCUMENT);
99
100 JDOMBasedXPathEvaluator eval = new JDOMBasedXPathEvaluator(doc.getJDOMDocument(false));
101 XPathNamespaceContext nsContext = new XPathNamespaceContext("NS");
102 nsContext.addNamespace("ns", "NS");
103 nsContext.addNamespace("ns2", "otherNS");
104 eval.setNamespaceContext(nsContext);
105 Attribute attr = eval.evaluateSingle("/ns:root/ns:child[@id='A']/@ns2:test", Filters.attribute());
106
107 XPathContext context = doc.getContext(attr);
108
109 ContextAssert.assertContext(
110 "/*[local-name()='root' and namespace-uri()='NS'][1]/*[local-name()='child' and namespace-uri()='NS'][1]/@*[local-name()='test' and namespace-uri()='otherNS']",
111 3, 33, DOCUMENT.toURI().toString(), context);
112 }
113
114 @Test
115 public void testContextText() throws FileNotFoundException, DocumentException, XPathExpressionException {
116 JDOMDocument doc = new JDOMDocument(DOCUMENT);
117
118 JDOMBasedXPathEvaluator eval = new JDOMBasedXPathEvaluator(doc.getJDOMDocument(false));
119 XPathNamespaceContext nsContext = new XPathNamespaceContext("NS");
120 nsContext.addNamespace("ns", "NS");
121 nsContext.addNamespace("ns2", "otherNS");
122 eval.setNamespaceContext(nsContext);
123 Text text = eval.evaluateSingle("/ns:root/ns:child[@id='B']/text()", Filters.text());
124
125 XPathContext context = doc.getContext(text);
126
127 ContextAssert.assertContext(
128 "/*[local-name()='root' and namespace-uri()='NS'][1]/*[local-name()='child' and namespace-uri()='NS'][2]/text()",
129 4, 22, DOCUMENT.toURI().toString(), context);
130 }
131 }