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.assessment.schematron;
28
29 import gov.nist.secauto.decima.core.assessment.Assessment;
30 import gov.nist.secauto.decima.core.assessment.AssessmentException;
31 import gov.nist.secauto.decima.core.assessment.result.AssessmentResultBuilder;
32 import gov.nist.secauto.decima.core.assessment.result.AssessmentResults;
33 import gov.nist.secauto.decima.core.assessment.result.BasicTestResult;
34 import gov.nist.secauto.decima.core.assessment.result.TestStatus;
35 import gov.nist.secauto.decima.xml.assessment.result.XPathContext;
36 import gov.nist.secauto.decima.xml.document.SimpleXPathContext;
37 import gov.nist.secauto.decima.xml.document.XMLDocument;
38 import gov.nist.secauto.decima.xml.document.XPathEvaluator;
39
40 import org.apache.logging.log4j.LogManager;
41 import org.apache.logging.log4j.Logger;
42 import org.jdom2.Element;
43
44 import java.util.HashMap;
45 import java.util.List;
46 import java.util.Map;
47
48 import javax.xml.xpath.XPathExpressionException;
49 import javax.xml.xpath.XPathFactoryConfigurationException;
50
51 public abstract class AbstractSVRLHandler implements SVRLHandler {
52 private static final Logger log = LogManager.getLogger(AbstractSVRLHandler.class);
53
54 private final AssessmentResultBuilder assessmentResultBuilder;
55 private final Assessment<? extends XMLDocument> assessment;
56 private final XMLDocument assessedDocument;
57 private final XPathEvaluator xpathEvaluator;
58 private final Map<String, String> prefixToNamespaceMap = new HashMap<>();
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 public AbstractSVRLHandler(Assessment<? extends XMLDocument> assessment, XMLDocument sourceDocument,
74 AssessmentResultBuilder assessmentResultBuilder) throws AssessmentException {
75 this.assessment = assessment;
76 this.assessedDocument = sourceDocument;
77 this.assessmentResultBuilder = assessmentResultBuilder;
78 try {
79 this.xpathEvaluator = assessedDocument.newXPathEvaluator();
80 } catch (XPathFactoryConfigurationException e) {
81 throw new AssessmentException("Unable to create new XPathEvaluator", e);
82 }
83 }
84
85
86
87
88
89
90 public Assessment<? extends XMLDocument> getAssessment() {
91 return assessment;
92 }
93
94
95
96
97
98
99 public XMLDocument getAssessedDocument() {
100 return assessedDocument;
101 }
102
103
104
105
106
107
108 protected XPathEvaluator getXPathEvaluator() {
109 return xpathEvaluator;
110
111 }
112
113 public AssessmentResultBuilder getValidationResultBuilder() {
114 return assessmentResultBuilder;
115 }
116
117 @Override
118 public void handleNSPrefix(Element prefix) {
119 prefixToNamespaceMap.put(prefix.getAttributeValue("prefix"), prefix.getAttributeValue("uri"));
120 }
121
122 @Override
123 public void handleActivePattern(Element activePattern) {
124
125 }
126
127 @Override
128 public void handleFiredRule(Element xmlObject) {
129
130 }
131
132 protected void handleAssertionResult(String derivedRequirementId, String assertionId, TestStatus testStatus,
133 String xpath, List<String> values) {
134 if (log.isTraceEnabled()) {
135 log.trace("Adding '{}' assertion result for: {}", testStatus, derivedRequirementId);
136 }
137 XPathEvaluator evaluator = getXPathEvaluator();
138 XPathContext context = null;
139
140 if (xpath != null) {
141 try {
142 context = evaluator.getContext(xpath);
143 } catch (XPathExpressionException e) {
144 log.error("Unable to resolve XPath context", e);
145 }
146 }
147
148 if (context == null) {
149 context = new SimpleXPathContext(xpath, getAssessedDocument().getSystemId(), -1, -1);
150 }
151 BasicTestResult result = new BasicTestResult(assertionId, testStatus, context);
152 result.addResultValues(values);
153 Assessment<? extends XMLDocument> assessment = getAssessment();
154 XMLDocument document = getAssessedDocument();
155 getValidationResultBuilder().addTestResult(assessment, document, derivedRequirementId, result);
156 }
157
158 }