blob: a634ecc3d5ccb989557f7e14fb5859477ebce0c9 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cocoon.components.validation.jing;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.ContentHandler;
import org.xml.sax.DTDHandler;
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 com.thaiopensource.xml.sax.DraconianErrorHandler;
/**
* <p>A trivial {@link XMLReader} implementation populating and clearing the
* {@link Stack} of {@link InputSource}s for URI resolution kept inside
* a {@link JingResolver}.</p>
*/
final class JingReader implements XMLReader {
/** <p>The underlying {@link XMLReader} to use.</p> */
private final XMLReader reader;
/** <p>The {@link JingResolver} associated with this instance.</p> */
private final JingResolver context;
/**
* <p>Create a new {@link JingReader} instance associated with the specified
* {@link JingResolver}.</p>
*/
protected JingReader(JingResolver context)
throws SAXException {
/*
* We have to look up the XMLReader using JAXP or SAX, as the SAXParser
* supplied by Avalon/Excalibur does not seem to work with JING.
*/
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(false);
this.reader = factory.newSAXParser().getXMLReader();
this.setEntityResolver(context);
this.setErrorHandler(new DraconianErrorHandler());
this.context = context;
} catch (ParserConfigurationException exception) {
throw new SAXException("Can't create XML reader instance", exception);
}
}
public boolean getFeature(String feature)
throws SAXNotRecognizedException, SAXNotSupportedException {
return this.reader.getFeature(feature);
}
public void setFeature(String feature, boolean value)
throws SAXNotRecognizedException, SAXNotSupportedException {
this.reader.setFeature(feature, value);
}
public Object getProperty(String property)
throws SAXNotRecognizedException, SAXNotSupportedException {
return this.reader.getProperty(property);
}
public void setProperty(String property, Object value)
throws SAXNotRecognizedException, SAXNotSupportedException {
this.reader.setProperty(property, value);
}
public void setEntityResolver(org.xml.sax.EntityResolver resolver) {
this.reader.setEntityResolver(resolver);
}
public org.xml.sax.EntityResolver getEntityResolver() {
return this.reader.getEntityResolver();
}
public void setDTDHandler(DTDHandler handler) {
this.reader.setDTDHandler(handler);
}
public DTDHandler getDTDHandler() {
return this.reader.getDTDHandler();
}
public void setContentHandler(ContentHandler handler) {
this.reader.setContentHandler(handler);
}
public ContentHandler getContentHandler() {
return this.reader.getContentHandler();
}
public void setErrorHandler(ErrorHandler handler) {
this.reader.setErrorHandler(handler);
}
public ErrorHandler getErrorHandler() {
return this.reader.getErrorHandler();
}
public void parse(InputSource source)
throws IOException, SAXException {
this.context.pushInputSource(source);
this.reader.parse(source);
this.context.popInputSource();
}
public void parse(String source)
throws IOException, SAXException {
this.parse(this.getEntityResolver().resolveEntity(null, source));
}
}