
package org.dom4j.io;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.apache.xerces.xs.PSVIProvider;
import org.dom4j.DocumentFactory;
import org.xml.sax.Parser;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

/**
 *
 * @author  mike skells
 */
public class SchemaAwareSAXReader extends SAXReader{
    
    private PSVIProvider psviProvider;
    public SchemaAwareSAXReader() {
    }
    
    public SchemaAwareSAXReader(boolean validating) {
        super(validating);
    }
    
    public SchemaAwareSAXReader(DocumentFactory factory) {
        super(factory);
    }
    
    public SchemaAwareSAXReader(DocumentFactory factory, boolean validating) {
        super(factory, validating);
    }
    
    public SchemaAwareSAXReader(XMLReader xmlReader) {
        super(xmlReader);
    }
    
    public SchemaAwareSAXReader(XMLReader xmlReader, boolean validating) {
        super(xmlReader, validating);
    }
    
    public SchemaAwareSAXReader(String xmlReaderClassName) throws SAXException {
        super(xmlReaderClassName);
    }
    
    public SchemaAwareSAXReader(String xmlReaderClassName, boolean validating)
    throws SAXException {
        super(xmlReaderClassName, validating);
    }
    
    protected SAXContentHandler createContentHandler(XMLReader reader) {
        return new SchemaAwareSAXContentHandler(psviProvider, getDocumentFactory(), getDispatchHandler());
    }
    
    protected XMLReader createXMLReader() throws SAXException {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        factory.setValidating(true);
        factory.setNamespaceAware(true);
        XMLReader reader ;
        SAXParser parser ;
        try {
            parser = factory.newSAXParser();
            reader = parser.getXMLReader();
            if (parser instanceof PSVIProvider) {
                psviProvider = (PSVIProvider)parser;
            } else {
                if (reader instanceof PSVIProvider) {
                    psviProvider = (PSVIProvider)reader;
                } else {
                    throw new SAXException("parser is not a PSVIProvider "+parser.getClass());
                }
            }
        } catch (ParserConfigurationException pce) {
            throw new SAXException(pce);
        }
        return reader;
    }
    
    public void setXMLReader(XMLReader reader) {
        super.setXMLReader(reader);
    }
    
    
}
