You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commons-dev@ws.apache.org by ve...@apache.org on 2009/07/31 00:41:00 UTC

svn commit: r799465 - /webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/dialect/StAXDialectDetector.java

Author: veithen
Date: Thu Jul 30 22:41:00 2009
New Revision: 799465

URL: http://svn.apache.org/viewvc?rev=799465&view=rev
Log:
Improved the detection of the Sun StAX implementation in Java 1.6.

Modified:
    webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/dialect/StAXDialectDetector.java

Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/dialect/StAXDialectDetector.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/dialect/StAXDialectDetector.java?rev=799465&r1=799464&r2=799465&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/dialect/StAXDialectDetector.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/dialect/StAXDialectDetector.java Thu Jul 30 22:41:00 2009
@@ -168,6 +168,27 @@
         return dialect;
     }
     
+    /**
+     * Check that a given class is part of the bootstrap classes. This method is used to detect
+     * different JRE flavors and to check which StAX implementation is part of the JRE.
+     * <p>
+     * Note: We look for a well defined class instead of just checking the package name of the class
+     * passed to {@link #getDialect(Class)} because on some JREs, the implementations of the StAX
+     * interfaces (factories, readers and writers) are not in the same package.
+     * 
+     * @param className
+     *            the class name
+     * @return <code>true</code> if the class can be loaded from the bootstrap class loader
+     */
+    private static boolean isBootstrapClass(String className) {
+        try {
+            Class cls = ClassLoader.getSystemClassLoader().loadClass(className);
+            return cls.getClassLoader() == null;
+        } catch (ClassNotFoundException ex) {
+            return false;
+        }
+    }
+    
     private static StAXDialect detectDialectFromJRE() {
         String vendor = System.getProperty("java.vendor");
         String version = System.getProperty("java.version");
@@ -176,7 +197,7 @@
                     "  Vendor:  " + vendor + "\n" +
                     "  Version: " + version);
         }
-        if (vendor.startsWith("Sun") || vendor.startsWith("Apple")) {
+        if (isBootstrapClass("com.sun.xml.internal.stream.XMLInputFactoryImpl")) {
             return SJSXPDialect.INSTANCE;
         } else {
             log.warn("Unable to determine dialect of StAX implementation provided by the JRE");