Exemplo n.º 1
0
 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);
   }
 }
Exemplo n.º 2
0
 /**
  * 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);
 }
Exemplo n.º 3
0
  /**
   * 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?");
    }
  }