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.templating.document.post.template;
28
29 import gov.nist.secauto.decima.core.document.DocumentException;
30 import gov.nist.secauto.decima.core.document.handling.DocumentPostProcessor;
31 import gov.nist.secauto.decima.core.document.handling.ResourceResolver;
32 import gov.nist.secauto.decima.xml.document.MutableXMLDocument;
33 import gov.nist.secauto.decima.xml.document.XMLDocument;
34
35 import org.jdom2.Attribute;
36 import org.jdom2.Document;
37 import org.jdom2.Element;
38
39 public class TemplatePostProcessor implements DocumentPostProcessor<MutableXMLDocument> {
40 public static final String TEMPLATE_NAMESPACE_URI = "http://csrc.nist.gov/ns/decima/template/1.0";
41 public static final String TEMPLATE_LOCAL_NAME = "template";
42 public static final String TEMPLATE_XPATH;
43 public static final String TEMPLATE_ATTRIBUTE = "template";
44
45 static {
46 StringBuilder builder = new StringBuilder();
47 builder.append("/*[namespace-uri()='");
48 builder.append(TEMPLATE_NAMESPACE_URI);
49 builder.append("' and local-name() = '");
50 builder.append(TEMPLATE_LOCAL_NAME);
51 builder.append("']");
52 TEMPLATE_XPATH = builder.toString();
53 }
54
55 public TemplatePostProcessor() {
56 super();
57 }
58
59 @Override
60 public boolean handles(MutableXMLDocument subject) throws DocumentException {
61 Document document = subject.getJDOMDocument(false);
62 boolean retval = false;
63 if (document.hasRootElement()) {
64 Element root = document.getRootElement();
65 if (TEMPLATE_LOCAL_NAME.equals(root.getName()) && TEMPLATE_NAMESPACE_URI.equals(root.getNamespace().getURI())) {
66 retval = true;
67 }
68 }
69 return retval;
70 }
71
72 @Override
73 public MutableXMLDocument process(MutableXMLDocument subject, ResourceResolver<MutableXMLDocument> resolver)
74 throws DocumentException {
75 Document document = subject.getJDOMDocument(false);
76 Element root = document.getRootElement();
77 Attribute attribute = root.getAttribute(TEMPLATE_ATTRIBUTE);
78 if (attribute == null) {
79 throw new DocumentException("The document's root element doesn't have an attribute named 'template'.");
80 }
81
82 TemplateProcessor tp = newTemplateProcessor(subject);
83 return tp.generate(resolver);
84 }
85
86 protected TemplateProcessor newTemplateProcessor(XMLDocument document) throws DocumentException {
87 TemplateProcessor retval;
88 try {
89 retval = TemplateParser.getInstance().parse(document);
90 } catch (TemplateParserException e) {
91 throw new DocumentException("Unable to parse template", e);
92 }
93 return retval;
94 }
95
96 }