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.DefaultSourceInfo;
30 import gov.nist.secauto.decima.core.document.DocumentException;
31 import gov.nist.secauto.decima.core.document.SourceInfo;
32 import gov.nist.secauto.decima.xml.assessment.result.XPathContext;
33 import gov.nist.secauto.decima.xml.document.context.XMLContextResolver;
34 import gov.nist.secauto.decima.xml.jdom2.JDOMUtil;
35
36 import org.jdom2.Attribute;
37 import org.jdom2.Content;
38 import org.jdom2.Document;
39 import org.jdom2.Element;
40 import org.jdom2.output.Format;
41 import org.jdom2.output.XMLOutputter;
42 import org.jdom2.transform.JDOMSource;
43
44 import java.io.BufferedOutputStream;
45 import java.io.ByteArrayInputStream;
46 import java.io.ByteArrayOutputStream;
47 import java.io.File;
48 import java.io.FileNotFoundException;
49 import java.io.FileOutputStream;
50 import java.io.IOException;
51 import java.io.InputStream;
52 import java.io.OutputStream;
53 import java.util.Collections;
54 import java.util.List;
55
56 import javax.xml.transform.Result;
57 import javax.xml.transform.Source;
58 import javax.xml.transform.TransformerException;
59 import javax.xml.transform.TransformerFactory;
60 import javax.xml.transform.TransformerFactoryConfigurationError;
61 import javax.xml.transform.stream.StreamResult;
62 import javax.xml.xpath.XPathFactoryConfigurationException;
63
64 public abstract class AbstractJDOMDocument implements MutableXMLDocument {
65
66 public AbstractJDOMDocument() {
67 }
68
69 protected abstract XMLContextResolver getXMLContextResolver();
70
71 @Override
72 public String getSystemId() {
73 return getJDOMDocument(false).getBaseURI();
74 }
75
76 @Override
77 public String getSystemId(Content element) {
78 return getXMLContextResolver().getSystemId(element);
79 }
80
81 @Override
82 public Document getJDOMDocument() {
83 return getJDOMDocument(false);
84 }
85
86 @Override
87 public Source getSource() {
88 return new JDOMSource(getJDOMDocument(false));
89 }
90
91 @Override
92 public XPathEvaluator newXPathEvaluator() throws XPathFactoryConfigurationException {
93 Document document = getJDOMDocument();
94 return new JDOMBasedXPathEvaluator(document);
95 }
96
97 @Override
98 public InputStream newInputStream() {
99 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
100 Source xmlSource = getSource();
101 Result outputTarget = new StreamResult(outputStream);
102 try {
103 TransformerFactory.newInstance().newTransformer().transform(xmlSource, outputTarget);
104 } catch (TransformerException | TransformerFactoryConfigurationError e) {
105 throw new RuntimeException(e);
106 }
107 return new ByteArrayInputStream(outputStream.toByteArray());
108 }
109
110 @Override
111 public void copyTo(File file) throws FileNotFoundException, IOException {
112 XMLOutputter out = new XMLOutputter();
113 try (OutputStream os = new BufferedOutputStream(new FileOutputStream(file))) {
114 out.output(getJDOMDocument(false), os);
115 }
116 }
117
118 @Override
119 public XMLDocumentFragment newXMLDocumentFragment(String xpath) throws DocumentException {
120 return new XMLDocumentFragment(this, xpath);
121 }
122
123 @Override
124 public XMLDocumentFragment newXMLDocumentFragment(Element element) {
125 return new XMLDocumentFragment(this, element);
126 }
127
128 @Override
129 public String asString(Format format) {
130 return JDOMUtil.toString(getJDOMDocument(false), format);
131 }
132
133 @Override
134 public XPathContext getContext(Content content) {
135 return getXMLContextResolver().getContext(content);
136 }
137
138 @Override
139 public XPathContext getContext(Attribute attribute) {
140 return getXMLContextResolver().getContext(attribute);
141 }
142
143 @Override
144 public String getXPath(Content content) {
145 return getXMLContextResolver().getXPath(content);
146 }
147
148 @Override
149 public String getXPath(Attribute attribute) {
150 return getXMLContextResolver().getXPath(attribute);
151 }
152
153 @Override
154 public List<SourceInfo> getSourceInfo() {
155 List<SourceInfo> retval = Collections.singletonList(new DefaultSourceInfo(this));
156 return retval;
157 }
158 }