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 }