package org.testng.xml; import java.io.IOException; import java.io.InputStream; import javax.xml.parsers.FactoryConfigurationError; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.testng.TestNGException; import org.testng.internal.ClassHelper; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; abstract public class XMLParser<T> implements IFileParser<T> { private final static SAXParser m_saxParser; static { SAXParserFactory spf = loadSAXParserFactory(); if (supportsValidation(spf)) { spf.setNamespaceAware(true); spf.setValidating(true); } SAXParser parser = null; try { parser = spf.newSAXParser(); } catch (ParserConfigurationException | SAXException e) { e.printStackTrace(); } m_saxParser = parser; } public void parse(InputStream is, DefaultHandler dh) throws SAXException, IOException { synchronized (m_saxParser) { m_saxParser.parse(is, dh); } } /** * Tries to load a <code>SAXParserFactory</code> by trying in order the following: * <tt>com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl</tt> (SUN JDK5) * <tt>org.apache.crimson.jaxp.SAXParserFactoryImpl</tt> (SUN JDK1.4) and * last <code>SAXParserFactory.newInstance()</code>. * * @return a <code>SAXParserFactory</code> implementation * @throws TestNGException thrown if no <code>SAXParserFactory</code> can be loaded */ private static SAXParserFactory loadSAXParserFactory() { SAXParserFactory spf = null; StringBuilder errorLog= new StringBuilder(); try { Class factoryClass= ClassHelper.forName("com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl"); spf = (SAXParserFactory) factoryClass.newInstance(); } catch(Exception ex) { errorLog.append("JDK5 SAXParserFactory cannot be loaded: ").append(ex.getMessage()); } if(null == spf) { // If running with JDK 1.4 try { Class factoryClass = ClassHelper.forName("org.apache.crimson.jaxp.SAXParserFactoryImpl"); spf = (SAXParserFactory) factoryClass.newInstance(); } catch(Exception ex) { errorLog.append("\n").append("JDK1.4 SAXParserFactory cannot be loaded: ").append(ex.getMessage()); } } Throwable cause= null; if(null == spf) { try { spf= SAXParserFactory.newInstance(); } catch(FactoryConfigurationError fcerr) { cause= fcerr; } } if(null == spf) { throw new TestNGException("Cannot initialize a SAXParserFactory\n" + errorLog.toString(), cause); } return spf; } /** * Tests if the current <code>SAXParserFactory</code> supports DTD validation. */ private static boolean supportsValidation(SAXParserFactory spf) { try { spf.getFeature("http://xml.org/sax/features/validation"); return true; } catch(Exception ex) { return false; } } // private static void ppp(String s) { // System.out.println("[Parser] " + s); // } // /** // * // * @param argv ignored // * @throws FileNotFoundException if the // * @throws ParserConfigurationException // * @throws SAXException // * @throws IOException // * @since 1.0 // */ // public static void main(String[] argv) // throws FileNotFoundException, ParserConfigurationException, SAXException, IOException // { // XmlSuite l = // new Parser("c:/eclipse-workspace/testng/test/testng.xml").parse(); // // System.out.println(l); // } @Override }