| /* |
| * 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)); |
| } |
| } |