You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2011/03/11 05:24:42 UTC

svn commit: r1080440 - in /cxf/trunk/rt: bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/ frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ frontend/jaxws/src/main/java/org/apache/cxf/jaxws/binding/soap/ frontend/jaxws/src/main/java/org/a...

Author: dkulp
Date: Fri Mar 11 04:24:41 2011
New Revision: 1080440

URL: http://svn.apache.org/viewvc?rev=1080440&view=rev
Log:
[CXF-3363] Make creation of various SAAJ factories go through a common
class that can handle various J2EE issues and SAAJ version issues and
such.

Added:
    cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJFactoryResolver.java   (with props)
Modified:
    cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java
    cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJOutInterceptor.java
    cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java
    cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/binding/soap/SOAPBindingImpl.java
    cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerChainInvoker.java
    cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/logical/LogicalMessageImpl.java

Added: cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJFactoryResolver.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJFactoryResolver.java?rev=1080440&view=auto
==============================================================================
--- cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJFactoryResolver.java (added)
+++ cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJFactoryResolver.java Fri Mar 11 04:24:41 2011
@@ -0,0 +1,102 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.cxf.binding.soap.saaj;
+
+import javax.xml.soap.MessageFactory;
+import javax.xml.soap.SOAPConstants;
+import javax.xml.soap.SOAPException;
+import javax.xml.soap.SOAPFactory;
+
+import org.apache.cxf.binding.soap.Soap11;
+import org.apache.cxf.binding.soap.Soap12;
+import org.apache.cxf.binding.soap.SoapVersion;
+
+/**
+ * 
+ */
+public final class SAAJFactoryResolver {
+
+    public static final String MESSAGE_FACTORY_KEY 
+        = "org.apache.cxf.binding.soap.messageFactoryClassName";
+    public static final String SOAP_FACTORY_KEY 
+        = "org.apache.cxf.binding.soap.soapFactoryClassName";
+
+    private SAAJFactoryResolver() {
+        //utility class
+    }
+
+    public static MessageFactory createMessageFactory(SoapVersion version) throws SOAPException {
+        MessageFactory messageFactory;
+        String messageFactoryClassName = System.getProperty(MESSAGE_FACTORY_KEY);
+        if (messageFactoryClassName != null) {
+            messageFactory = newInstanceCxfMessageFactory(messageFactoryClassName,
+                                                          MessageFactory.class);
+        } else if (version instanceof Soap11) {
+            try {
+                messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
+            } catch (Throwable t) {
+                messageFactory = MessageFactory.newInstance();
+            }
+        } else if (version instanceof Soap12) {
+            messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
+        } else {
+            messageFactory = MessageFactory.newInstance();
+        }
+        return messageFactory;
+    }
+
+    public static SOAPFactory createSOAPFactory(SoapVersion version) throws SOAPException {
+        SOAPFactory soapFactory;
+        String soapFactoryClassName = System.getProperty(SOAP_FACTORY_KEY);
+        if (soapFactoryClassName != null) {
+            soapFactory = newInstanceCxfMessageFactory(soapFactoryClassName,
+                                                       SOAPFactory.class);
+        } else if (version instanceof Soap11) {
+            try {
+                soapFactory = SOAPFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
+            } catch (Throwable t) {
+                soapFactory = SOAPFactory.newInstance();
+            }
+        } else if (version instanceof Soap12) {
+            soapFactory = SOAPFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
+        } else {
+            soapFactory = SOAPFactory.newInstance();
+        }
+        return soapFactory;
+    }
+
+    private static <T> T newInstanceCxfMessageFactory(String factoryName, Class<T> cls)
+        throws SOAPException {
+        try {
+            Class<?> klass = Class.forName(factoryName);
+            return cls.cast(klass.newInstance());
+        } catch (ClassNotFoundException cnfe) {
+            throw new SOAPException("Provider " + factoryName + " could not be instantiated: "
+                                    + cnfe, cnfe);
+        } catch (InstantiationException ie) {
+            throw new SOAPException("Provider " + factoryName + " could not be instantiated: "
+                                    + ie, ie);
+        } catch (IllegalAccessException iae) {
+            throw new SOAPException("Provider " + factoryName + " could not be instantiated: "
+                                    + iae, iae);
+        }
+    }
+
+}

Propchange: cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJFactoryResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJFactoryResolver.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java?rev=1080440&r1=1080439&r2=1080440&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java (original)
+++ cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java Fri Mar 11 04:24:41 2011
@@ -31,7 +31,6 @@ import javax.xml.namespace.QName;
 import javax.xml.soap.AttachmentPart;
 import javax.xml.soap.Detail;
 import javax.xml.soap.MessageFactory;
-import javax.xml.soap.SOAPConstants;
 import javax.xml.soap.SOAPException;
 import javax.xml.soap.SOAPFault;
 import javax.xml.soap.SOAPHeader;
@@ -49,6 +48,7 @@ import org.w3c.dom.Node;
 import org.apache.cxf.Bus;
 import org.apache.cxf.attachment.AttachmentDataSource;
 import org.apache.cxf.binding.soap.Soap11;
+import org.apache.cxf.binding.soap.Soap12;
 import org.apache.cxf.binding.soap.SoapFault;
 import org.apache.cxf.binding.soap.SoapHeader;
 import org.apache.cxf.binding.soap.SoapMessage;
@@ -145,14 +145,17 @@ public class SAAJInInterceptor extends A
         public synchronized MessageFactory getFactory(SoapMessage message) throws SOAPException {
             if (message.getVersion() instanceof Soap11) {
                 if (factory11 == null) { 
-                    factory11 = MessageFactory.newInstance();
+                    factory11 = SAAJFactoryResolver.createMessageFactory(message.getVersion());
                 } 
                 return factory11;
             }
-            if (factory12 == null) {
-                factory12 = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
+            if (message.getVersion() instanceof Soap12) {
+                if (factory12 == null) {
+                    factory12 = SAAJFactoryResolver.createMessageFactory(message.getVersion());
+                }
+                return factory12;
             }
-            return factory12;
+            return SAAJFactoryResolver.createMessageFactory(null);
         }
     }
     

Modified: cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJOutInterceptor.java?rev=1080440&r1=1080439&r2=1080440&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJOutInterceptor.java (original)
+++ cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJOutInterceptor.java Fri Mar 11 04:24:41 2011
@@ -29,7 +29,6 @@ import java.util.ResourceBundle;
 import javax.xml.soap.AttachmentPart;
 import javax.xml.soap.MessageFactory;
 import javax.xml.soap.MimeHeader;
-import javax.xml.soap.SOAPConstants;
 import javax.xml.soap.SOAPException;
 import javax.xml.soap.SOAPMessage;
 import javax.xml.soap.SOAPPart;
@@ -41,6 +40,7 @@ import org.w3c.dom.Node;
 
 import org.apache.cxf.attachment.AttachmentImpl;
 import org.apache.cxf.binding.soap.Soap11;
+import org.apache.cxf.binding.soap.Soap12;
 import org.apache.cxf.binding.soap.SoapFault;
 import org.apache.cxf.binding.soap.SoapMessage;
 import org.apache.cxf.binding.soap.SoapVersion;
@@ -82,14 +82,17 @@ public class SAAJOutInterceptor extends 
     public synchronized MessageFactory getFactory(SoapMessage message) throws SOAPException {
         if (message.getVersion() instanceof Soap11) {
             if (factory11 == null) { 
-                factory11 = MessageFactory.newInstance();
+                factory11 = SAAJFactoryResolver.createMessageFactory(message.getVersion());
             } 
             return factory11;
         }
-        if (factory12 == null) {
-            factory12 = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
+        if (message.getVersion() instanceof Soap12) {
+            if (factory12 == null) {
+                factory12 = SAAJFactoryResolver.createMessageFactory(message.getVersion());
+            }
+            return factory12;
         }
-        return factory12;
+        return SAAJFactoryResolver.createMessageFactory(null);
     }
     public void handleMessage(SoapMessage message) throws Fault {
         SOAPMessage saaj = message.getContent(SOAPMessage.class);

Modified: cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java?rev=1080440&r1=1080439&r2=1080440&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java (original)
+++ cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java Fri Mar 11 04:24:41 2011
@@ -31,7 +31,6 @@ import java.util.logging.Logger;
 
 import javax.xml.soap.SOAPConstants;
 import javax.xml.soap.SOAPException;
-import javax.xml.soap.SOAPFactory;
 import javax.xml.soap.SOAPFault;
 import javax.xml.ws.AsyncHandler;
 import javax.xml.ws.Binding;
@@ -48,6 +47,7 @@ import javax.xml.ws.soap.SOAPFaultExcept
 import org.w3c.dom.Node;
 
 import org.apache.cxf.binding.soap.SoapFault;
+import org.apache.cxf.binding.soap.saaj.SAAJFactoryResolver;
 import org.apache.cxf.common.i18n.Message;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.endpoint.Client;
@@ -199,7 +199,7 @@ public class JaxWsClientProxy extends or
                     .equals(((SoapFault)ex).getFaultCode().getNamespaceURI())) {
                 //change to 1.1
                 try {
-                    soapFault = SOAPFactory.newInstance().createFault();
+                    soapFault = SAAJFactoryResolver.createSOAPFactory(null).createFault();
                 } catch (Throwable t) {
                     //ignore
                 }

Modified: cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/binding/soap/SOAPBindingImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/binding/soap/SOAPBindingImpl.java?rev=1080440&r1=1080439&r2=1080440&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/binding/soap/SOAPBindingImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/binding/soap/SOAPBindingImpl.java Fri Mar 11 04:24:41 2011
@@ -24,7 +24,6 @@ import java.util.ResourceBundle;
 import java.util.Set;
 import java.util.logging.Logger;
 import javax.xml.soap.MessageFactory;
-import javax.xml.soap.SOAPConstants;
 import javax.xml.soap.SOAPException;
 import javax.xml.soap.SOAPFactory;
 import javax.xml.ws.WebServiceException;
@@ -34,6 +33,7 @@ import org.apache.cxf.binding.soap.Soap1
 import org.apache.cxf.binding.soap.Soap12;
 import org.apache.cxf.binding.soap.SoapBindingConstants;
 import org.apache.cxf.binding.soap.model.SoapBindingInfo;
+import org.apache.cxf.binding.soap.saaj.SAAJFactoryResolver;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.jaxws.binding.AbstractBindingImpl;
 import org.apache.cxf.jaxws.support.JaxWsEndpointImpl;
@@ -95,11 +95,7 @@ public class SOAPBindingImpl extends Abs
         if (this.soapBinding instanceof SoapBindingInfo) {
             SoapBindingInfo bindingInfo = (SoapBindingInfo) this.soapBinding;
             try {
-                if (bindingInfo.getSoapVersion() instanceof Soap11) {
-                    return MessageFactory.newInstance();
-                } else if (bindingInfo.getSoapVersion() instanceof Soap12) {
-                    return MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
-                }
+                return SAAJFactoryResolver.createMessageFactory(bindingInfo.getSoapVersion());
             } catch (SOAPException e) {
                 throw new WebServiceException(BUNDLE.getString("SAAJ_FACTORY_ERR"), e);
             }
@@ -111,11 +107,7 @@ public class SOAPBindingImpl extends Abs
         if (this.soapBinding instanceof SoapBindingInfo) {
             SoapBindingInfo bindingInfo = (SoapBindingInfo) this.soapBinding;
             try {
-                if (bindingInfo.getSoapVersion() instanceof Soap11) {
-                    return SOAPFactory.newInstance();
-                } else if (bindingInfo.getSoapVersion() instanceof Soap12) {
-                    return SOAPFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
-                }
+                return SAAJFactoryResolver.createSOAPFactory(bindingInfo.getSoapVersion());
             } catch (SOAPException e) {
                 throw new WebServiceException(BUNDLE.getString("SAAJ_FACTORY_ERR"), e);
             }

Modified: cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerChainInvoker.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerChainInvoker.java?rev=1080440&r1=1080439&r2=1080440&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerChainInvoker.java (original)
+++ cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerChainInvoker.java Fri Mar 11 04:24:41 2011
@@ -26,9 +26,7 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import javax.xml.namespace.QName;
-import javax.xml.soap.MessageFactory;
 import javax.xml.soap.SOAPBody;
-import javax.xml.soap.SOAPConstants;
 import javax.xml.soap.SOAPException;
 import javax.xml.soap.SOAPFault;
 import javax.xml.soap.SOAPMessage;
@@ -45,6 +43,8 @@ import org.w3c.dom.Node;
 
 import org.apache.cxf.binding.soap.SoapFault;
 import org.apache.cxf.binding.soap.SoapMessage;
+import org.apache.cxf.binding.soap.SoapVersion;
+import org.apache.cxf.binding.soap.saaj.SAAJFactoryResolver;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.interceptor.Fault;
 import org.apache.cxf.jaxws.context.WebServiceContextImpl;
@@ -434,11 +434,11 @@ public class HandlerChainInvoker {
         try {
             SOAPMessage soapMessage = null;
 
-            if (!(msg instanceof SoapMessage) || ((SoapMessage)msg).getVersion().getVersion() <= 1.11d) {
-                soapMessage = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL).createMessage();
-            } else {
-                soapMessage = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL).createMessage();
+            SoapVersion version = null;
+            if (msg instanceof SoapMessage) {
+                version = ((SoapMessage)msg).getVersion();
             }
+            soapMessage = SAAJFactoryResolver.createMessageFactory(version).createMessage();
             msg.setContent(SOAPMessage.class, soapMessage);
 
             SOAPBody body = soapMessage.getSOAPBody();

Modified: cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/logical/LogicalMessageImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/logical/LogicalMessageImpl.java?rev=1080440&r1=1080439&r2=1080440&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/logical/LogicalMessageImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/logical/LogicalMessageImpl.java Fri Mar 11 04:24:41 2011
@@ -28,7 +28,6 @@ import javax.activation.DataSource;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
 import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.soap.MessageFactory;
 import javax.xml.soap.SOAPException;
 import javax.xml.soap.SOAPMessage;
 import javax.xml.stream.XMLStreamException;
@@ -45,6 +44,7 @@ import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
 import org.apache.cxf.binding.soap.SoapMessage;
+import org.apache.cxf.binding.soap.saaj.SAAJFactoryResolver;
 import org.apache.cxf.common.WSDLConstants;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.interceptor.Fault;
@@ -250,9 +250,9 @@ public class LogicalMessageImpl implemen
     private SOAPMessage initSOAPMessage(InputStream is) throws SOAPException, IOException {
         SOAPMessage msg = null;
         if (is != null) {
-            msg = MessageFactory.newInstance().createMessage(null, is);
+            msg = SAAJFactoryResolver.createMessageFactory(null).createMessage(null, is);
         } else {
-            msg = MessageFactory.newInstance().createMessage();
+            msg = SAAJFactoryResolver.createMessageFactory(null).createMessage();
         }
         msg.setProperty(SOAPMessage.WRITE_XML_DECLARATION, "true");
         msg.getSOAPPart().getEnvelope().addNamespaceDeclaration(WSDLConstants.NP_SCHEMA_XSD,