001 package com.thaiopensource.validate.schematron;
002
003 import javax.xml.transform.Templates;
004 import javax.xml.transform.TransformerConfigurationException;
005 import javax.xml.transform.TransformerException;
006 import javax.xml.transform.sax.SAXResult;
007 import javax.xml.transform.sax.SAXTransformerFactory;
008 import javax.xml.transform.sax.TransformerHandler;
009
010 import org.xml.sax.ContentHandler;
011 import org.xml.sax.DTDHandler;
012 import org.xml.sax.EntityResolver;
013 import org.xml.sax.ErrorHandler;
014 import org.xml.sax.SAXException;
015
016 import com.thaiopensource.util.PropertyMap;
017 import com.thaiopensource.validate.SchemaReaderLoader;
018 import com.thaiopensource.validate.ValidateProperty;
019 import com.thaiopensource.validate.Validator;
020 import com.thaiopensource.xml.sax.DelegatingContentHandler;
021 import com.thaiopensource.xml.sax.Jaxp11XMLReaderCreator;
022 import com.thaiopensource.xml.sax.XMLReaderCreator;
023
024 class ValidatorImpl extends DelegatingContentHandler implements Validator {
025 private final static SchemaReaderLoader loader = new SchemaReaderLoader();
026
027 private final SAXTransformerFactory factory;
028 private final Templates templates;
029
030 private final ContentHandler outputHandler;
031
032 ValidatorImpl(Templates templates, PropertyMap properties) {
033 this.templates = templates;
034 ErrorHandler eh = ValidateProperty.ERROR_HANDLER.get(properties);
035 XMLReaderCreator xrc = ValidateProperty.XML_READER_CREATOR.get(properties);
036 EntityResolver er = ValidateProperty.ENTITY_RESOLVER.get(properties);
037 outputHandler = new OutputHandler(eh);
038 factory = loader.createSAXTransformerFactory();
039 if (er != null) {
040 if (xrc == null) {
041 xrc = new Jaxp11XMLReaderCreator();
042 }
043 factory.setURIResolver(new SAXURIResolver(xrc, er));
044 }
045 factory.setErrorListener(new DraconianErrorListener());
046 reset();
047 }
048
049 public ContentHandler getContentHandler() {
050 return this;
051 }
052
053 public DTDHandler getDTDHandler() {
054 return null;
055 }
056
057 public void reset() {
058 try {
059 TransformerHandler handler = factory.newTransformerHandler(templates);
060 handler.setResult(new SAXResult(outputHandler));
061 this.setDelegate(handler);
062 } catch (TransformerConfigurationException e) {
063 throw new RuntimeException(e);
064 }
065 }
066
067 static SAXException toSAXException(TransformerException transformerException) {
068 // Unwrap where possible
069 Throwable wrapped = transformerException.getException();
070 if (wrapped instanceof SAXException)
071 return (SAXException)wrapped;
072 if (wrapped instanceof RuntimeException)
073 throw (RuntimeException)wrapped;
074 if (wrapped instanceof Exception)
075 return new SAXException((Exception)wrapped);
076 return new SAXException(transformerException);
077 }
078 }