From 97746d7142d16bce968f570086411fc1be47eb60 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Wed, 26 Sep 2007 09:35:57 +0000 Subject: [PATCH] SWS-198 --- .../ws/soap/saaj/SaajSoapMessageFactory.java | 2 +- .../ws/soap/saaj/support/SaajUtils.java | 64 +++++++++++++------ 2 files changed, 44 insertions(+), 22 deletions(-) diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageFactory.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageFactory.java index 4690ed92..16100fea 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageFactory.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageFactory.java @@ -88,7 +88,7 @@ public class SaajSoapMessageFactory implements SoapMessageFactory, InitializingB } else { throw new IllegalArgumentException( - "Invalid version [" + version + "]. " + "Expected the SOAP_11 or SOAP_12 constant"); + "Invalid version [" + version + "]. Expected the SOAP_11 or SOAP_12 constant"); } } else if (SoapVersion.SOAP_11 != version) { diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/support/SaajUtils.java b/core/src/main/java/org/springframework/ws/soap/saaj/support/SaajUtils.java index a8e39155..fcf98800 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/support/SaajUtils.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/support/SaajUtils.java @@ -23,6 +23,7 @@ import javax.xml.namespace.QName; import javax.xml.soap.MessageFactory; import javax.xml.soap.MimeHeaders; import javax.xml.soap.Name; +import javax.xml.soap.SOAPConstants; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPException; @@ -36,8 +37,8 @@ import org.springframework.xml.namespace.QNameUtils; import org.w3c.dom.Element; /** - * Collection of generic utility methods to work with SAAJ. Includes conversion from Names to - * QNames and vice-versa, and SAAJ version checking. + * Collection of generic utility methods to work with SAAJ. Includes conversion from SAAJ {@link Name} objects to {@link + * QName}s and vice-versa, and SAAJ version checking. * * @author Arjen Poutsma * @see Name @@ -57,37 +58,58 @@ public abstract class SaajUtils { private static int saajVersion = SAAJ_12; static { - try { - ClassUtils.forName(SAAJ_13_CLASS_NAME); + if (isSaaj13()) { saajVersion = SAAJ_13; } + else if (isSaaj12()) { + saajVersion = SAAJ_12; + } + else { + saajVersion = SAAJ_11; + } + } + + private static boolean isSaaj13() { + try { + ClassUtils.forName(SAAJ_13_CLASS_NAME); + MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL); + return true; + } catch (ClassNotFoundException ex) { - if (Element.class.isAssignableFrom(SOAPElement.class) && !isWebLogic9Implementation()) { - saajVersion = SAAJ_12; - } - else { - saajVersion = SAAJ_11; - } + return false; + } + catch (NoSuchMethodError ex) { + return false; + } + catch (SOAPException ex) { + return false; } } /** - * Checks whether we are dealing with a WebLogic 9 implementation of SAAJ. WebLogic 9 does implement SAAJ 1.2, but - * throws UnsupportedOperationExceptions when a SAAJ 1.2 method is called. + * Checks whether we can find a SAAJ 1.2 implementation, being aware of the broken WebLogic 9 SAAJ implementation. + *

+ * WebLogic 9 does implement SAAJ 1.2, but throws UnsupportedOperationExceptions when a SAAJ 1.2 method is called. */ - private static boolean isWebLogic9Implementation() { - try { - MessageFactory messageFactory = MessageFactory.newInstance(); - SOAPMessage message = messageFactory.createMessage(); + private static boolean isSaaj12() { + if (Element.class.isAssignableFrom(SOAPElement.class)) { + // see if we are dealing with WebLogic 9 try { - message.getSOAPBody(); + MessageFactory messageFactory = MessageFactory.newInstance(); + SOAPMessage message = messageFactory.createMessage(); + try { + message.getSOAPBody(); + return true; + } + catch (UnsupportedOperationException ex) { + return false; + } } - catch (UnsupportedOperationException ex) { - return true; + catch (SOAPException e) { + return false; } - return false; } - catch (SOAPException e) { + else { return false; } }