/*
* Copyright (c) 2007 Mozilla Foundation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
package nu.validator.xml;
import java.io.IOException;
import org.xml.sax.ContentHandler;
import org.xml.sax.DTDHandler;
import org.xml.sax.EntityResolver;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;
import org.xml.sax.XMLReader;
import org.xml.sax.ext.LexicalHandler;
public class WiretapXMLReaderWrapper implements XMLReader {
private final XMLReader wrappedReader;
private ContentHandler contentHandler;
private ContentHandler wiretapContentHander;
private LexicalHandler lexicalHandler;
private LexicalHandler wiretapLexicalHandler;
/**
* @param wrappedReader
*/
public WiretapXMLReaderWrapper(final XMLReader wrappedReader) {
this.wrappedReader = wrappedReader;
contentHandler = wrappedReader.getContentHandler();
try {
lexicalHandler = (LexicalHandler) wrappedReader.getProperty("http://xml.org/sax/properties/lexical-handler");
} catch (SAXNotRecognizedException | SAXNotSupportedException e) {
}
}
/**
* Sets the wiretapContentHander.
*
* @param wiretapContentHander
* the wiretapContentHander to set
*/
public void setWiretapContentHander(ContentHandler wiretapContentHander) {
this.wiretapContentHander = wiretapContentHander;
updateWiretap();
}
/**
* Sets the wiretapLexicalHandler.
*
* @param wiretapLexicalHandler
* the wiretapLexicalHandler to set
*/
public void setWiretapLexicalHandler(LexicalHandler wiretapLexicalHandler) {
this.wiretapLexicalHandler = wiretapLexicalHandler;
updateWiretap();
}
/**
* @return
* @see org.xml.sax.XMLReader#getContentHandler()
*/
@Override
public ContentHandler getContentHandler() {
return contentHandler;
}
/**
* @return
* @see org.xml.sax.XMLReader#getDTDHandler()
*/
@Override
public DTDHandler getDTDHandler() {
return wrappedReader.getDTDHandler();
}
/**
* @return
* @see org.xml.sax.XMLReader#getEntityResolver()
*/
@Override
public EntityResolver getEntityResolver() {
return wrappedReader.getEntityResolver();
}
/**
* @return
* @see org.xml.sax.XMLReader#getErrorHandler()
*/
@Override
public ErrorHandler getErrorHandler() {
return wrappedReader.getErrorHandler();
}
/**
* @param arg0
* @return
* @throws SAXNotRecognizedException
* @throws SAXNotSupportedException
* @see org.xml.sax.XMLReader#getFeature(java.lang.String)
*/
@Override
public boolean getFeature(String arg0) throws SAXNotRecognizedException,
SAXNotSupportedException {
return wrappedReader.getFeature(arg0);
}
/**
* @param name
* @return
* @throws SAXNotRecognizedException
* @throws SAXNotSupportedException
* @see org.xml.sax.XMLReader#getProperty(java.lang.String)
*/
@Override
public Object getProperty(String name) throws SAXNotRecognizedException,
SAXNotSupportedException {
if ("http://xml.org/sax/properties/lexical-handler".equals(name)) {
return lexicalHandler;
} else {
return wrappedReader.getProperty(name);
}
}
/**
* @param arg0
* @throws IOException
* @throws SAXException
* @see org.xml.sax.XMLReader#parse(org.xml.sax.InputSource)
*/
@Override
public void parse(InputSource arg0) throws IOException, SAXException {
wrappedReader.parse(arg0);
}
/**
* @param arg0
* @throws IOException
* @throws SAXException
* @see org.xml.sax.XMLReader#parse(java.lang.String)
*/
@Override
public void parse(String arg0) throws IOException, SAXException {
wrappedReader.parse(arg0);
}
/**
* @param contentHandler
* @see org.xml.sax.XMLReader#setContentHandler(org.xml.sax.ContentHandler)
*/
@Override
public void setContentHandler(ContentHandler contentHandler) {
this.contentHandler = contentHandler;
updateWiretap();
}
/**
* @param arg0
* @see org.xml.sax.XMLReader#setDTDHandler(org.xml.sax.DTDHandler)
*/
@Override
public void setDTDHandler(DTDHandler arg0) {
wrappedReader.setDTDHandler(arg0);
}
/**
* @param arg0
* @see org.xml.sax.XMLReader#setEntityResolver(org.xml.sax.EntityResolver)
*/
@Override
public void setEntityResolver(EntityResolver arg0) {
wrappedReader.setEntityResolver(arg0);
}
/**
* @param arg0
* @see org.xml.sax.XMLReader#setErrorHandler(org.xml.sax.ErrorHandler)
*/
@Override
public void setErrorHandler(ErrorHandler arg0) {
wrappedReader.setErrorHandler(arg0);
}
/**
* @param arg0
* @param arg1
* @throws SAXNotRecognizedException
* @throws SAXNotSupportedException
* @see org.xml.sax.XMLReader#setFeature(java.lang.String, boolean)
*/
@Override
public void setFeature(String arg0, boolean arg1)
throws SAXNotRecognizedException, SAXNotSupportedException {
wrappedReader.setFeature(arg0, arg1);
}
/**
* @param name
* @param value
* @throws SAXNotRecognizedException
* @throws SAXNotSupportedException
* @see org.xml.sax.XMLReader#setProperty(java.lang.String,
* java.lang.Object)
*/
@Override
public void setProperty(String name, Object value)
throws SAXNotRecognizedException, SAXNotSupportedException {
if ("http://xml.org/sax/properties/lexical-handler".equals(name)) {
lexicalHandler = (LexicalHandler) value;
updateWiretap();
} else {
wrappedReader.setProperty(name, value);
}
}
private void updateWiretap() {
if (contentHandler != null) {
if (wiretapContentHander != null) {
wrappedReader.setContentHandler(new CombineContentHandler(
wiretapContentHander, contentHandler));
} else {
wrappedReader.setContentHandler(contentHandler);
}
} else {
wrappedReader.setContentHandler(wiretapContentHander);
}
try {
if (lexicalHandler != null) {
if (wiretapLexicalHandler != null) {
wrappedReader.setProperty(
"http://xml.org/sax/properties/lexical-handler",
new CombineLexicalHandler(wiretapLexicalHandler,
lexicalHandler));
} else {
wrappedReader.setProperty(
"http://xml.org/sax/properties/lexical-handler",
lexicalHandler);
}
} else {
wrappedReader.setProperty(
"http://xml.org/sax/properties/lexical-handler",
wiretapLexicalHandler);
}
} catch (SAXNotRecognizedException | SAXNotSupportedException e) {
}
}
}