30 oct 2009

OIOSAML and Blackboard / WebCT Vista/CE 8.0

Summary


When installing OIOSAML, incompatibility issues arise. This blog entry provides detailed information about how to fix this problem and may be applicable to other applications that need to run with Sun Java 1.5 and updated versions of JAXP 1.3.

Introduction


Blackboard Vista / CE 8.0, formerly known as WebCT, uses Bea Weblogic 9.2 application server, including Sun Java 1.5. OIOSAML requires and provides an updated version of JAXP 1.3, which is part of Java 1.5 core library. To override internal libs in Java 1.5, you have to "endorse" the new libraries. This is correctly described in OIOSAML docs.

Symptoms


When starting the Weblogic server, the following error appears:
weblogic.management.ManagementException: [Management:141266]Parsing Failure in config.xml:
javax.xml.namespace.QName; local class incompatible:
stream classdesc serialVersionUID = 4418622981026545151, local class serialVersionUID = -9120448754896609940


How to fix the problem


You have to include the following option in JAVA_OPTIONS ($webct_domain_dir/customconfig/startup.properties):
-Dorg.apache.xml.namespace.QName.useCompatibleSerialVersionUID=1.0


The startup.properties already contains:
-Dcom.sun.xml.namespace.QName.useCompatibleSerialVersionUID=1.0


But the provided xerces library (2.9.1) has another property name as the one provided with Sun Java 1.5.

Detailed description


When Sun included JAXP 1.3 in Java 1.5, it changed the namespace in all source files. It also specified an explicit serialVersionUID for javax.xml.namespace.QName. In Java 1.5, the serialVersionUID was explicitly specified as 4418622981026545151 (0x3d521a30bc76fdff). But in previous versions of JAXP (xerces) this was implicitly calculated as : -9120448754896609940 ( 0x816da82dfc3bdd6c).

The already serialized data could not be deserialized. SUN corrected this error in next releases, introducing a compatibility flag

com.sun.xml.namespace.QName.useCompatibleSerialVersionUID
which having the value 1.0 switches to the Java 1.5 serial UID.

The Xerces project people picked up this change in newer version of xerces, but changed the flag name to
class="wiki">org.apache.xml.namespace.QName.useCompatibleSerialVersionUID


I recommend setting both of the settings. As the 'com.sun' options is already specified you just need to specify the 'org.apache' one:
JAVA_OPTIONS="$JAVA_OPTIONS -Dorg.apache.xml.namespace.QName.useCompatibleSerialVersionUID=1.0