001 /*
002 * Copyright (c) 2007 Mozilla Foundation
003 *
004 * Permission is hereby granted, free of charge, to any person obtaining a
005 * copy of this software and associated documentation files (the "Software"),
006 * to deal in the Software without restriction, including without limitation
007 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
008 * and/or sell copies of the Software, and to permit persons to whom the
009 * Software is furnished to do so, subject to the following conditions:
010 *
011 * The above copyright notice and this permission notice shall be included in
012 * all copies or substantial portions of the Software.
013 *
014 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
015 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
016 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
017 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
018 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
019 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
020 * DEALINGS IN THE SOFTWARE.
021 */
022
023 package nu.validator.xml;
024
025 import java.io.IOException;
026
027 import org.xml.sax.ContentHandler;
028 import org.xml.sax.DTDHandler;
029 import org.xml.sax.EntityResolver;
030 import org.xml.sax.ErrorHandler;
031 import org.xml.sax.InputSource;
032 import org.xml.sax.SAXException;
033 import org.xml.sax.SAXNotRecognizedException;
034 import org.xml.sax.SAXNotSupportedException;
035 import org.xml.sax.XMLReader;
036 import org.xml.sax.ext.LexicalHandler;
037
038 public class WiretapXMLReaderWrapper implements XMLReader {
039
040 private final XMLReader wrappedReader;
041
042 private ContentHandler contentHandler;
043
044 private ContentHandler wiretapContentHander;
045
046 private LexicalHandler lexicalHandler;
047
048 private LexicalHandler wiretapLexicalHandler;
049
050 /**
051 * @param wrappedReader
052 */
053 public WiretapXMLReaderWrapper(final XMLReader wrappedReader) {
054 this.wrappedReader = wrappedReader;
055 contentHandler = wrappedReader.getContentHandler();
056 try {
057 lexicalHandler = (LexicalHandler) wrappedReader.getProperty("http://xml.org/sax/properties/lexical-handler");
058 } catch (SAXNotRecognizedException e) {
059 } catch (SAXNotSupportedException e) {
060 }
061 }
062
063 /**
064 * Sets the wiretapContentHander.
065 *
066 * @param wiretapContentHander
067 * the wiretapContentHander to set
068 */
069 public void setWiretapContentHander(ContentHandler wiretapContentHander) {
070 this.wiretapContentHander = wiretapContentHander;
071 updateWiretap();
072 }
073
074 /**
075 * Sets the wiretapLexicalHandler.
076 *
077 * @param wiretapLexicalHandler
078 * the wiretapLexicalHandler to set
079 */
080 public void setWiretapLexicalHandler(LexicalHandler wiretapLexicalHandler) {
081 this.wiretapLexicalHandler = wiretapLexicalHandler;
082 updateWiretap();
083 }
084
085 /**
086 * @return
087 * @see org.xml.sax.XMLReader#getContentHandler()
088 */
089 public ContentHandler getContentHandler() {
090 return contentHandler;
091 }
092
093 /**
094 * @return
095 * @see org.xml.sax.XMLReader#getDTDHandler()
096 */
097 public DTDHandler getDTDHandler() {
098 return wrappedReader.getDTDHandler();
099 }
100
101 /**
102 * @return
103 * @see org.xml.sax.XMLReader#getEntityResolver()
104 */
105 public EntityResolver getEntityResolver() {
106 return wrappedReader.getEntityResolver();
107 }
108
109 /**
110 * @return
111 * @see org.xml.sax.XMLReader#getErrorHandler()
112 */
113 public ErrorHandler getErrorHandler() {
114 return wrappedReader.getErrorHandler();
115 }
116
117 /**
118 * @param arg0
119 * @return
120 * @throws SAXNotRecognizedException
121 * @throws SAXNotSupportedException
122 * @see org.xml.sax.XMLReader#getFeature(java.lang.String)
123 */
124 public boolean getFeature(String arg0) throws SAXNotRecognizedException,
125 SAXNotSupportedException {
126 return wrappedReader.getFeature(arg0);
127 }
128
129 /**
130 * @param name
131 * @return
132 * @throws SAXNotRecognizedException
133 * @throws SAXNotSupportedException
134 * @see org.xml.sax.XMLReader#getProperty(java.lang.String)
135 */
136 public Object getProperty(String name) throws SAXNotRecognizedException,
137 SAXNotSupportedException {
138 if ("http://xml.org/sax/properties/lexical-handler".equals(name)) {
139 return lexicalHandler;
140 } else {
141 return wrappedReader.getProperty(name);
142 }
143 }
144
145 /**
146 * @param arg0
147 * @throws IOException
148 * @throws SAXException
149 * @see org.xml.sax.XMLReader#parse(org.xml.sax.InputSource)
150 */
151 public void parse(InputSource arg0) throws IOException, SAXException {
152 wrappedReader.parse(arg0);
153 }
154
155 /**
156 * @param arg0
157 * @throws IOException
158 * @throws SAXException
159 * @see org.xml.sax.XMLReader#parse(java.lang.String)
160 */
161 public void parse(String arg0) throws IOException, SAXException {
162 wrappedReader.parse(arg0);
163 }
164
165 /**
166 * @param arg0
167 * @see org.xml.sax.XMLReader#setContentHandler(org.xml.sax.ContentHandler)
168 */
169 public void setContentHandler(ContentHandler contentHandler) {
170 this.contentHandler = contentHandler;
171 updateWiretap();
172 }
173
174 /**
175 * @param arg0
176 * @see org.xml.sax.XMLReader#setDTDHandler(org.xml.sax.DTDHandler)
177 */
178 public void setDTDHandler(DTDHandler arg0) {
179 wrappedReader.setDTDHandler(arg0);
180 }
181
182 /**
183 * @param arg0
184 * @see org.xml.sax.XMLReader#setEntityResolver(org.xml.sax.EntityResolver)
185 */
186 public void setEntityResolver(EntityResolver arg0) {
187 wrappedReader.setEntityResolver(arg0);
188 }
189
190 /**
191 * @param arg0
192 * @see org.xml.sax.XMLReader#setErrorHandler(org.xml.sax.ErrorHandler)
193 */
194 public void setErrorHandler(ErrorHandler arg0) {
195 wrappedReader.setErrorHandler(arg0);
196 }
197
198 /**
199 * @param arg0
200 * @param arg1
201 * @throws SAXNotRecognizedException
202 * @throws SAXNotSupportedException
203 * @see org.xml.sax.XMLReader#setFeature(java.lang.String, boolean)
204 */
205 public void setFeature(String arg0, boolean arg1)
206 throws SAXNotRecognizedException, SAXNotSupportedException {
207 wrappedReader.setFeature(arg0, arg1);
208 }
209
210 /**
211 * @param name
212 * @param value
213 * @throws SAXNotRecognizedException
214 * @throws SAXNotSupportedException
215 * @see org.xml.sax.XMLReader#setProperty(java.lang.String,
216 * java.lang.Object)
217 */
218 public void setProperty(String name, Object value)
219 throws SAXNotRecognizedException, SAXNotSupportedException {
220 if ("http://xml.org/sax/properties/lexical-handler".equals(name)) {
221 lexicalHandler = (LexicalHandler) value;
222 updateWiretap();
223 } else {
224 wrappedReader.setProperty(name, value);
225 }
226 }
227
228 private void updateWiretap() {
229 if (contentHandler != null) {
230 if (wiretapContentHander != null) {
231 wrappedReader.setContentHandler(new CombineContentHandler(
232 wiretapContentHander, contentHandler));
233 } else {
234 wrappedReader.setContentHandler(contentHandler);
235 }
236 } else {
237 wrappedReader.setContentHandler(wiretapContentHander);
238 }
239
240 try {
241 if (lexicalHandler != null) {
242 if (wiretapLexicalHandler != null) {
243 wrappedReader.setProperty(
244 "http://xml.org/sax/properties/lexical-handler",
245 new CombineLexicalHandler(wiretapLexicalHandler,
246 lexicalHandler));
247 } else {
248 wrappedReader.setProperty(
249 "http://xml.org/sax/properties/lexical-handler",
250 lexicalHandler);
251 }
252 } else {
253 wrappedReader.setProperty(
254 "http://xml.org/sax/properties/lexical-handler",
255 wiretapLexicalHandler);
256 }
257 } catch (SAXNotRecognizedException e) {
258 } catch (SAXNotSupportedException e) {
259 }
260 }
261
262 }