Andreas,

sounds good.

Anyone who needs a copy for websphere, Please feel free to download the latest 
WAS 7.0 for developers [1]

thanks,
dims

[1] http://www.ibm.com/developerworks/downloads/ws/wasdevelopers/index.html

On 07/27/2009 03:27 PM, Andreas Veithen wrote:
Dims,

Because of the thread safety issue, it is important to show that
warning to the user. Since I have access to different WebSphere
environments (and also an IBM JDK on my Linux box), what I was going
to do is to improve the detection so that it is able to identify
XLXP-J. I guess that is OK for you IBM guys.

Andreas

On Mon, Jul 27, 2009 at 21:19, Davanum Srinivas<[email protected]>  wrote:
Andreas,

Can you please change the logging to debug? the stax implementation in
websphere will always end up showing this unnecessary warning

-- dims

On 07/27/2009 02:00 PM, [email protected] wrote:
Author: veithen
Date: Mon Jul 27 18:00:30 2009
New Revision: 798240

URL: http://svn.apache.org/viewvc?rev=798240&view=rev
Log:
Some improvements of the StAX dialect detection:
* Avoid NPE if the StAX implementation is part of the JRE (in which case
getClassLoader may return null).
* Detect the StAX implementation on Sun's JRE 1.6.
* Fixed another potential NPE when the manifest file doesn't have all
expected attributes.
* Added more logging to warn the user if the StAX implementation can't be
detected.

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=798240&r1=798239&r2=798240&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
Mon Jul 27 18:00:30 2009
@@ -53,6 +53,14 @@
      private static final Attributes.Name IMPLEMENTATION_VERSION =
              new Attributes.Name("Implementation-Version");

+    /**
+     * Map that stores detected dialects by location. The location is the
URL corresponding to the
+     * root folder of the classpath entry from which the StAX
implementation is loaded. Note that
+     * in the case of a JAR file, this is not the URL pointing to the
JAR, but a<tt>jar:</tt>
+     * URL that points to the root folder of the archive.
The<code>null</code>    location is used
+     * to represent StAX implementations that are loaded from the
bootstrap class loader, i.e.
+     * which are part of the JRE.
+     */
      private static final Map/*<URL,StAXDialect>*/ dialectByUrl =
              Collections.synchronizedMap(new HashMap());

@@ -119,15 +127,21 @@
       * @return the detected dialect
       */
      public static StAXDialect getDialect(Class implementationClass) {
-        URL rootUrl =
getRootUrlForResource(implementationClass.getClassLoader(),
-                implementationClass.getName().replace('.', '/') +
".class");
-        if (rootUrl == null) {
-            log.warn("Unable to determine location of StAX implementation
containing class "
-                    + implementationClass.getName() + "; using default
dialect");
-            return UnknownStAXDialect.INSTANCE;
+        URL rootUrl;
+        ClassLoader classLoader = implementationClass.getClassLoader();
+        if (classLoader == null) {
+            // null means bootstrap classloader; represent this location
as null
+            rootUrl = null;
          } else {
-            return getDialect(rootUrl);
+            rootUrl = getRootUrlForResource(classLoader,
+                    implementationClass.getName().replace('.', '/') +
".class");
+            if (rootUrl == null) {
+                log.warn("Unable to determine location of StAX
implementation containing class "
+                        + implementationClass.getName() + "; using
default dialect");
+                return UnknownStAXDialect.INSTANCE;
+            }
          }
+        return getDialect(rootUrl);
      }

      private static StAXDialect getDialect(URL rootUrl) {
@@ -142,6 +156,35 @@
      }

      private static StAXDialect detectDialect(URL rootUrl) {
+        StAXDialect dialect;
+        if (rootUrl == null) {
+            dialect = detectDialectFromJRE();
+        } else {
+            dialect = detectDialectFromJar(rootUrl);
+        }
+        if (log.isInfoEnabled()) {
+            log.info("Detected StAX dialect: " + dialect.getName());
+        }
+        return dialect;
+    }
+
+    private static StAXDialect detectDialectFromJRE() {
+        String vendor = System.getProperty("java.vendor");
+        String version = System.getProperty("java.version");
+        if (log.isDebugEnabled()) {
+            log.debug("StAX implementation is part of the JRE:\n" +
+                    "  Vendor:  " + vendor + "\n" +
+                    "  Version: " + version);
+        }
+        if (vendor.startsWith("Sun") || vendor.startsWith("Apple")) {
+            return SJSXPDialect.INSTANCE;
+        } else {
+            log.warn("Unable to determine dialect of StAX implementation
provided by the JRE");
+            return UnknownStAXDialect.INSTANCE;
+        }
+    }
+
+    private static StAXDialect detectDialectFromJar(URL rootUrl) {
          Manifest manifest;
          try {
              URL metaInfUrl = new URL(rootUrl, "META-INF/MANIFEST.MF");
@@ -167,13 +210,14 @@
          }
          // For the moment, the dialect detection is quite simple, but in
the future we will probably
          // have to differentiate by version number
-        if(vendor != null) {
-            if (vendor.toLowerCase().indexOf("woodstox") != -1) {
-                return WoodstoxDialect.INSTANCE;
-            } else if (title.indexOf("SJSXP") != -1) {
-                return SJSXPDialect.INSTANCE;
-            }
+        if (vendor != null&&    vendor.toLowerCase().indexOf("woodstox") !=
-1) {
+            return WoodstoxDialect.INSTANCE;
+        } else if (title != null&&    title.indexOf("SJSXP") != -1) {
+            return SJSXPDialect.INSTANCE;
+        } else {
+            log.warn("Unable to determine dialect of the StAX
implementation at " + rootUrl
+                    + " (using JAR manifest)");
+            return UnknownStAXDialect.INSTANCE;
          }
-        return UnknownStAXDialect.INSTANCE;
      }
  }


Reply via email to