1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.jxpath.xml;
19
20 import java.io.IOException;
21 import java.io.InputStream;
22 import java.net.URL;
23 import java.util.HashMap;
24
25 import org.apache.commons.jxpath.Container;
26 import org.apache.commons.jxpath.JXPathException;
27 import org.apache.commons.jxpath.util.ClassLoaderUtil;
28
29
30
31
32
33
34 public class DocumentContainer extends XMLParser2 implements Container {
35
36
37 public static final String MODEL_DOM = "DOM";
38
39 public static final String MODEL_JDOM = "JDOM";
40 private static final long serialVersionUID = -8713290334113427066L;
41 private static HashMap<String, String> parserClasses = new HashMap<>();
42
43 static {
44 parserClasses.put(MODEL_DOM, "org.apache.commons.jxpath.xml.DOMParser");
45 parserClasses.put(MODEL_JDOM, "org.apache.commons.jxpath.xml.JDOMParser");
46 }
47
48 private static HashMap<String, XMLParser> parsers = new HashMap<>();
49
50
51
52
53
54
55
56 private static XMLParser getParser(final String model) {
57 return parsers.computeIfAbsent(model, k -> {
58 final String className = parserClasses.get(model);
59 if (className == null) {
60 throw new JXPathException("Unsupported XML model: " + model);
61 }
62 try {
63 return ClassLoaderUtil.<XMLParser>getClass(className, true).getConstructor().newInstance();
64 } catch (final Exception ex) {
65 throw new JXPathException("Cannot allocate XMLParser: " + className, ex);
66 }
67 });
68 }
69
70
71
72
73
74
75
76 public static void registerXMLParser(final String model, final String parserClassName) {
77 parserClasses.put(model, parserClassName);
78 }
79
80
81
82
83
84
85
86 public static void registerXMLParser(final String model, final XMLParser parser) {
87 parsers.put(model, parser);
88 }
89
90
91
92
93 private Object document;
94
95
96
97
98 private final URL xmlUrl;
99
100
101
102
103 private final String model;
104
105
106
107
108
109
110 public DocumentContainer(final URL xmlURL) {
111 this(xmlURL, MODEL_DOM);
112 }
113
114
115
116
117
118
119
120
121 public DocumentContainer(final URL xmlUrl, final String model) {
122 this.xmlUrl = xmlUrl;
123 if (xmlUrl == null) {
124 throw new JXPathException("XML URL is null");
125 }
126 this.model = model;
127 }
128
129
130
131
132
133
134 @Override
135 public Object getValue() {
136 if (document == null) {
137 try {
138 InputStream stream = null;
139 try {
140 if (xmlUrl != null) {
141 stream = xmlUrl.openStream();
142 }
143 document = parseXML(stream);
144 } finally {
145 if (stream != null) {
146 stream.close();
147 }
148 }
149 } catch (final IOException ex) {
150 throw new JXPathException("Cannot read XML from: " + xmlUrl.toString(), ex);
151 }
152 }
153 return document;
154 }
155
156
157
158
159
160
161
162 @Override
163 public Object parseXML(final InputStream stream) {
164 final XMLParser parser = getParser(model);
165 if (parser instanceof XMLParser2) {
166 final XMLParser2 parser2 = (XMLParser2) parser;
167 parser2.setValidating(isValidating());
168 parser2.setNamespaceAware(isNamespaceAware());
169 parser2.setIgnoringElementContentWhitespace(isIgnoringElementContentWhitespace());
170 parser2.setExpandEntityReferences(isExpandEntityReferences());
171 parser2.setIgnoringComments(isIgnoringComments());
172 parser2.setCoalescing(isCoalescing());
173 }
174 return parser.parseXML(stream);
175 }
176
177
178
179
180
181
182 @Override
183 public void setValue(final Object value) {
184 throw new UnsupportedOperationException();
185 }
186 }