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