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    }