private static XMLReader loadClass(ClassLoader loader, String className) throws SAXException { try { return (XMLReader) NewInstance.newInstance(loader, className); } catch (ClassNotFoundException e1) { throw new SAXException("SAX2 driver class " + className + " not found", e1); } catch (IllegalAccessException e2) { throw new SAXException("SAX2 driver class " + className + " found but cannot be loaded", e2); } catch (InstantiationException e3) { throw new SAXException( "SAX2 driver class " + className + " loaded but cannot be instantiated (no empty public constructor?)", e3); } catch (ClassCastException e4) { throw new SAXException( "SAX2 driver class " + className + " does not implement XMLReader", e4); } }
/** * Attempt to create an XML reader from a class name. * * <p>Given a class name, this method attempts to load and instantiate the class as an XML reader. * * <p>Note that this method will not be usable in environments where the caller (perhaps an * applet) is not permitted to load classes dynamically. * * @return A new XML reader. * @exception org.xml.sax.SAXException If the class cannot be loaded, instantiated, and cast to * XMLReader. * @see #createXMLReader() */ public static XMLReader createXMLReader(String className) throws SAXException { return loadClass(NewInstance.getClassLoader(), className); }
/** * Attempt to create an XMLReader from system defaults. In environments which can support it, the * name of the XMLReader class is determined by trying each these options in order, and using the * first one which succeeds: * * <ul> * <li>If the system property <code>org.xml.sax.driver</code> has a value, that is used as an * XMLReader class name. * <li>The JAR "Services API" is used to look for a class name in the * <em>META-INF/services/org.xml.sax.driver</em> file in jarfiles available to the runtime. * <li>SAX parser distributions are strongly encouraged to provide a default XMLReader class * name that will take effect only when previous options (on this list) are not successful. * <li>Finally, if {@link ParserFactory#makeParser()} can return a system default SAX1 parser, * that parser is wrapped in a {@link ParserAdapter}. (This is a migration aid for SAX1 * environments, where the <code>org.xml.sax.parser</code> system property will often be * usable.) * </ul> * * <p>In environments such as small embedded systems, which can not support that flexibility, * other mechanisms to determine the default may be used. * * <p>Note that many Java environments allow system properties to be initialized on a command * line. This means that <em>in most cases</em> setting a good value for that property ensures * that calls to this method will succeed, except when security policies intervene. This will also * maximize application portability to older SAX environments, with less robust implementations of * this method. * * @return A new XMLReader. * @exception org.xml.sax.SAXException If no default XMLReader class can be identified and * instantiated. * @see #createXMLReader(java.lang.String) */ public static XMLReader createXMLReader() throws SAXException { String className = null; ClassLoader loader = NewInstance.getClassLoader(); // 1. try the JVM-instance-wide system property try { className = System.getProperty(property); } catch (RuntimeException e) { /* normally fails for applets */ } // 2. if that fails, try META-INF/services/ if (className == null) { if (!_jarread) { final ClassLoader loader1 = loader; _jarread = true; _clsFromJar = (String) AccessController.doPrivileged( new PrivilegedAction() { public Object run() { String clsName = null; try { String service = "META-INF/services/" + property; InputStream in; BufferedReader reader; if (loader1 == null) in = ClassLoader.getSystemResourceAsStream(service); else in = loader1.getResourceAsStream(service); if (in != null) { reader = new BufferedReader(new InputStreamReader(in, "UTF8")); clsName = reader.readLine(); in.close(); } } catch (Exception e) { } return clsName; } }); } className = _clsFromJar; } // 3. Distro-specific fallback if (className == null) { // BEGIN DISTRIBUTION-SPECIFIC // EXAMPLE: // className = "com.example.sax.XmlReader"; // or a $JAVA_HOME/jre/lib/*properties setting... className = "com.sun.org.apache.xerces.internal.parsers.SAXParser"; // END DISTRIBUTION-SPECIFIC } // do we know the XMLReader implementation class yet? if (className != null) return loadClass(loader, className); // 4. panic -- adapt any SAX1 parser try { return new ParserAdapter(ParserFactory.makeParser()); } catch (Exception e) { throw new SAXException( "Can't create default XMLReader; " + "is system property org.xml.sax.driver set?"); } }