You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by xu...@apache.org on 2011/04/29 05:44:10 UTC

svn commit: r1097678 - in /geronimo/server/trunk/plugins/axis2: axis2/src/main/plan/plan.xml geronimo-axis2/src/main/java/org/apache/geronimo/axis2/Axis2WebServiceContainer.java

Author: xuhaihong
Date: Fri Apr 29 03:44:09 2011
New Revision: 1097678

URL: http://svn.apache.org/viewvc?rev=1097678&view=rev
Log:
Use a property to identify when keeping compatible about SOAP 1.1 fault description. Uses might disable this, so that some detailed exception information could be found while addressing issues occurs.

Modified:
    geronimo/server/trunk/plugins/axis2/axis2/src/main/plan/plan.xml
    geronimo/server/trunk/plugins/axis2/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/Axis2WebServiceContainer.java

Modified: geronimo/server/trunk/plugins/axis2/axis2/src/main/plan/plan.xml
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/axis2/axis2/src/main/plan/plan.xml?rev=1097678&r1=1097677&r2=1097678&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/axis2/axis2/src/main/plan/plan.xml (original)
+++ geronimo/server/trunk/plugins/axis2/axis2/src/main/plan/plan.xml Fri Apr 29 03:44:09 2011
@@ -26,6 +26,7 @@
     <gbean name="Axis2SystemProperties" class="org.apache.geronimo.system.properties.SystemProperties">
         <attribute name="systemProperties">
             jaxws.runtime.usePostWebMethodRules=true
+            org.apache.geronimo.axis2.soap_1_1FaultDetailCompatibleWhenAddressingFaults=true
         </attribute>
     </gbean>
     

Modified: geronimo/server/trunk/plugins/axis2/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/Axis2WebServiceContainer.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/axis2/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/Axis2WebServiceContainer.java?rev=1097678&r1=1097677&r2=1097678&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/axis2/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/Axis2WebServiceContainer.java (original)
+++ geronimo/server/trunk/plugins/axis2/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/Axis2WebServiceContainer.java Fri Apr 29 03:44:09 2011
@@ -23,6 +23,8 @@ import java.net.HttpURLConnection;
 import java.net.URI;
 import java.net.URL;
 import java.util.List;
+import java.util.Map;
+
 import javax.naming.Context;
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
@@ -32,9 +34,11 @@ import javax.xml.ws.Binding;
 import javax.xml.ws.WebServiceException;
 import javax.xml.ws.handler.Handler;
 
+import org.apache.axiom.soap.SOAPFault;
 import org.apache.axiom.util.UIDGenerator;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.Constants;
+import org.apache.axis2.addressing.AddressingConstants.Final;
 import org.apache.axis2.addressing.AddressingHelper;
 import org.apache.axis2.addressing.EndpointReference;
 import org.apache.axis2.context.ConfigurationContext;
@@ -86,34 +90,45 @@ import org.slf4j.LoggerFactory;
 /**
  * @version $Rev$ $Date$
  */
-public abstract class Axis2WebServiceContainer implements WebServiceContainer
-{
+public abstract class Axis2WebServiceContainer implements WebServiceContainer {
+     
     private static final Logger LOG = LoggerFactory.getLogger(Axis2WebServiceContainer.class);
 
     public static final String REQUEST = Axis2WebServiceContainer.class.getName() + "@Request";
-    public static final String RESPONSE = Axis2WebServiceContainer.class.getName() + "@Response";
 
+    public static final String RESPONSE = Axis2WebServiceContainer.class.getName() + "@Response";    
+    
+    private static final Boolean SOAP_1_1_FAULT_DETAIL_COMPATIBLE_WHEN_ADDRESSING_FAULTS = Boolean.getBoolean("org.apache.geronimo.axis2.soap_1_1FaultDetailCompatibleWhenAddressingFaults");
+    
     private transient final Bundle bundle;
 
     protected String endpointClassName;
+
     protected org.apache.geronimo.jaxws.PortInfo portInfo;
+
     protected ConfigurationContext configurationContext;
+
     protected JNDIResolver jndiResolver;
+
     protected Class<?> endpointClass;
+
     protected AxisService service;
+
     protected WSDLQueryHandler wsdlQueryHandler;
+
     protected Binding binding;
+
     protected JAXWSAnnotationProcessor annotationProcessor;
+
     protected Context context;
+
     protected String address;
+
     protected GeronimoFactoryRegistry factoryRegistry;
+
     protected Axis2ModuleRegistry axis2ModuleRegistry;
 
-    public Axis2WebServiceContainer(PortInfo portInfo,
-                                    String endpointClassName,
-                                    Bundle bundle,
-                                    Context context,
-                                    Axis2ModuleRegistry axis2ModuleRegistry) {
+    public Axis2WebServiceContainer(PortInfo portInfo, String endpointClassName, Bundle bundle, Context context, Axis2ModuleRegistry axis2ModuleRegistry) {
         this.endpointClassName = endpointClassName;
         this.portInfo = portInfo;
         this.bundle = bundle;
@@ -128,8 +143,8 @@ public abstract class Axis2WebServiceCon
         Axis2ConfigGBean.registerClientConfigurationFactory(axis2ModuleRegistry);
 
         GeronimoConfigurator configurator = new GeronimoConfigurator("META-INF/geronimo-axis2.xml");
-        configurationContext = ConfigurationContextFactory.createConfigurationContext(configurator);
-
+        configurationContext = ConfigurationContextFactory.createConfigurationContext(configurator);        
+        
         axis2ModuleRegistry.configureModules(configurationContext);
         // check to see if the wsdlLocation property is set in portInfo,
         // if not checking if wsdlLocation exists in annotation
@@ -162,11 +177,9 @@ public abstract class Axis2WebServiceCon
          * Also, this does not affect service-ref clients, as we install our own
          * HandlerResolver.
          */
-        FactoryRegistry.setFactory(HandlerLifecycleManagerFactory.class,
-                                   new GeronimoHandlerLifecycleManagerFactory());
+        FactoryRegistry.setFactory(HandlerLifecycleManagerFactory.class, new GeronimoHandlerLifecycleManagerFactory());
 
-        FactoryRegistry.setFactory(EndpointLifecycleManagerFactory.class,
-                                   new GeronimoEndpointLifecycleManagerFactory());
+        FactoryRegistry.setFactory(EndpointLifecycleManagerFactory.class, new GeronimoEndpointLifecycleManagerFactory());
 
         configureAddressing();
 
@@ -180,7 +193,7 @@ public abstract class Axis2WebServiceCon
     synchronized void updateAddress(Request request) {
         if (this.address == null) {
             String requestAddress = getBaseUri(request.getURI());
-            this.service.setEPRs(new String [] {requestAddress});
+            this.service.setEPRs(new String[] { requestAddress });
             this.address = requestAddress;
         }
     }
@@ -210,8 +223,7 @@ public abstract class Axis2WebServiceCon
         }
     }
 
-    protected void doService(final Request request, final Response response)
-            throws Exception {
+    protected void doService(final Request request, final Response response) throws Exception {
 
         if (LOG.isDebugEnabled()) {
             LOG.debug("Target URI: " + request.getURI());
@@ -224,19 +236,17 @@ public abstract class Axis2WebServiceCon
         msgContext.setProperty(MessageContext.REMOTE_ADDR, request.getRemoteAddr());
 
         try {
-            TransportOutDescription transportOut = this.configurationContext.getAxisConfiguration()
-                    .getTransportOut(Constants.TRANSPORT_HTTP);
-            TransportInDescription transportIn = this.configurationContext.getAxisConfiguration()
-                    .getTransportIn(Constants.TRANSPORT_HTTP);
+            TransportOutDescription transportOut = this.configurationContext.getAxisConfiguration().getTransportOut(Constants.TRANSPORT_HTTP);
+            TransportInDescription transportIn = this.configurationContext.getAxisConfiguration().getTransportIn(Constants.TRANSPORT_HTTP);
 
             msgContext.setConfigurationContext(this.configurationContext);
 
             //TODO: Port this segment for session support.
-//            String sessionKey = (String) this.httpcontext.getAttribute(HTTPConstants.COOKIE_STRING);
-//            if (this.configurationContext.getAxisConfiguration().isManageTransportSession()) {
-//                SessionContext sessionContext = this.sessionManager.getSessionContext(sessionKey);
-//                msgContext.setSessionContext(sessionContext);
-//            }
+            //            String sessionKey = (String) this.httpcontext.getAttribute(HTTPConstants.COOKIE_STRING);
+            //            if (this.configurationContext.getAxisConfiguration().isManageTransportSession()) {
+            //                SessionContext sessionContext = this.sessionManager.getSessionContext(sessionKey);
+            //                msgContext.setSessionContext(sessionContext);
+            //            }
             msgContext.setTransportIn(transportIn);
             msgContext.setTransportOut(transportOut);
             msgContext.setServiceGroupContextId(UIDGenerator.generateURNString());
@@ -268,6 +278,19 @@ public abstract class Axis2WebServiceCon
 
         try {
             MessageContext faultContext = MessageContextBuilder.createFaultMessageContext(msgContext, e);
+            //Per SOAP 1.1 Fault description, if it is not allowed to use detail elements for carrying information about error information belonging to header entries.
+            if (SOAP_1_1_FAULT_DETAIL_COMPATIBLE_WHEN_ADDRESSING_FAULTS && faultContext.isSOAP11()) {
+                Map faultInfo = (Map) faultContext.getLocalProperty(Constants.FAULT_INFORMATION_FOR_HEADERS);
+                if (faultInfo != null) {
+                    String faultHeaderQName = (String) faultInfo.get(Final.FAULT_HEADER_PROB_HEADER_QNAME);
+                    if (faultHeaderQName != null) {
+                        SOAPFault soapFault = faultContext.getEnvelope().getBody().getFault();
+                        if (soapFault != null && soapFault.getDetail() != null) {
+                            soapFault.getDetail().detach();
+                        }
+                    }
+                }
+            }
             AxisEngine.sendFault(faultContext);
         } catch (Exception ex) {
             LOG.warn("Error sending fault", ex);
@@ -301,9 +324,7 @@ public abstract class Axis2WebServiceCon
         return contextPath;
     }
 
-    public void doService2(Request request,
-                           Response response,
-                           MessageContext msgContext) throws Exception {
+    public void doService2(Request request, Response response, MessageContext msgContext) throws Exception {
 
         if (request.getMethod() == Request.GET) {
             processGETRequest(request, response, this.service, msgContext);
@@ -344,6 +365,7 @@ public abstract class Axis2WebServiceCon
     }
 
     public static class Axis2TransportInfo implements OutTransportInfo {
+
         private Response response;
 
         public Axis2TransportInfo(Response response) {
@@ -355,18 +377,14 @@ public abstract class Axis2WebServiceCon
         }
     }
 
-    protected void processGETRequest(Request request, Response response, AxisService service, MessageContext msgContext) throws Exception{
+    protected void processGETRequest(Request request, Response response, AxisService service, MessageContext msgContext) throws Exception {
         String query = request.getURI().getQuery();
-        if (query != null &&
-            (query.startsWith("wsdl") || query.startsWith("WSDL") ||
-             query.startsWith("xsd") || query.startsWith("XSD"))) {
+        if (query != null && (query.startsWith("wsdl") || query.startsWith("WSDL") || query.startsWith("xsd") || query.startsWith("XSD"))) {
             // wsdl or xsd request
 
             if (portInfo.getWsdlFile() != null && !portInfo.getWsdlFile().equals("")) {
                 URL wsdlURL = AxisServiceGenerator.getWsdlURL(portInfo.getWsdlFile(), bundle);
-                this.wsdlQueryHandler.writeResponse(request.getURI().toString(),
-                                                    wsdlURL.toString(),
-                                                    response.getOutputStream());
+                this.wsdlQueryHandler.writeResponse(request.getURI().toString(), wsdlURL.toString(), response.getOutputStream());
             } else {
                 throw new Exception("Service does not have WSDL");
             }
@@ -390,26 +408,21 @@ public abstract class Axis2WebServiceCon
     protected void setMsgContextProperties(Request request, Response response, AxisService service, MessageContext msgContext) {
         msgContext.setProperty(MessageContext.TRANSPORT_OUT, response.getOutputStream());
         msgContext.setProperty(Constants.OUT_TRANSPORT_INFO, new Axis2TransportInfo(response));
-        msgContext.setProperty(RequestResponseTransport.TRANSPORT_CONTROL,
-                new Axis2RequestResponseTransport(response));
+        msgContext.setProperty(RequestResponseTransport.TRANSPORT_CONTROL, new Axis2RequestResponseTransport(response));
         msgContext.setProperty(Constants.Configuration.TRANSPORT_IN_URL, request.getURI().toString());
         msgContext.setIncomingTransportName(Constants.TRANSPORT_HTTP);
 
-        HttpServletRequest servletRequest =
-            (HttpServletRequest)request.getAttribute(WebServiceContainer.SERVLET_REQUEST);
+        HttpServletRequest servletRequest = (HttpServletRequest) request.getAttribute(WebServiceContainer.SERVLET_REQUEST);
         msgContext.setProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST, servletRequest);
 
-        HttpServletResponse servletResponse =
-            (HttpServletResponse)request.getAttribute(WebServiceContainer.SERVLET_RESPONSE);
+        HttpServletResponse servletResponse = (HttpServletResponse) request.getAttribute(WebServiceContainer.SERVLET_RESPONSE);
         msgContext.setProperty(HTTPConstants.MC_HTTP_SERVLETRESPONSE, servletResponse);
 
-        ServletContext servletContext =
-            (ServletContext)request.getAttribute(WebServiceContainer.SERVLET_CONTEXT);
+        ServletContext servletContext = (ServletContext) request.getAttribute(WebServiceContainer.SERVLET_CONTEXT);
         msgContext.setProperty(HTTPConstants.MC_HTTP_SERVLETCONTEXT, servletContext);
 
         if (servletRequest != null) {
-            msgContext.setProperty(MessageContext.TRANSPORT_HEADERS,
-                                   new TransportHeaders(servletRequest));
+            msgContext.setProperty(MessageContext.TRANSPORT_HEADERS, new TransportHeaders(servletRequest));
         }
 
         if (this.binding != null) {
@@ -419,10 +432,7 @@ public abstract class Axis2WebServiceCon
         msgContext.setTo(new EndpointReference(request.getURI().toString()));
     }
 
-    protected void processXMLRequest(Request request,
-                                     Response response,
-                                     AxisService service,
-                                     MessageContext msgContext) throws Exception {
+    protected void processXMLRequest(Request request, Response response, AxisService service, MessageContext msgContext) throws Exception {
         String contentType = request.getHeader(HTTPConstants.HEADER_CONTENT_TYPE);
         String soapAction = request.getHeader(HTTPConstants.HEADER_SOAP_ACTION);
         if (soapAction == null) {
@@ -435,24 +445,13 @@ public abstract class Axis2WebServiceCon
         setMsgContextProperties(request, response, service, msgContext);
 
         if (!HTTPTransportUtils.isRESTRequest(contentType)) {
-            HTTPTransportUtils.processHTTPPostRequest(msgContext,
-                                                      request.getInputStream(),
-                                                      response.getOutputStream(),
-                                                      contentType,
-                                                      soapAction,
-                                                      request.getURI().getPath());
+            HTTPTransportUtils.processHTTPPostRequest(msgContext, request.getInputStream(), response.getOutputStream(), contentType, soapAction, request.getURI().getPath());
         } else {
-            RESTUtil.processXMLRequest(msgContext,
-                                       request.getInputStream(),
-                                       response.getOutputStream(),
-                                       contentType);
+            RESTUtil.processXMLRequest(msgContext, request.getInputStream(), response.getOutputStream(), contentType);
         }
     }
 
-    protected void processURLRequest(Request request,
-                                     Response response,
-                                     AxisService service,
-                                     MessageContext msgContext) throws Exception {
+    protected void processURLRequest(Request request, Response response, AxisService service, MessageContext msgContext) throws Exception {
         String contentType = request.getHeader(HTTPConstants.HEADER_CONTENT_TYPE);
 
         ConfigurationContext configurationContext = msgContext.getConfigurationContext();
@@ -460,9 +459,7 @@ public abstract class Axis2WebServiceCon
 
         setMsgContextProperties(request, response, service, msgContext);
 
-        InvocationResponse processed = RESTUtil.processURLRequest(msgContext,
-                                                                  response.getOutputStream(),
-                                                                  contentType);
+        InvocationResponse processed = RESTUtil.processURLRequest(msgContext, response.getOutputStream(), contentType);
 
         if (!processed.equals(InvocationResponse.CONTINUE)) {
             response.setStatusCode(HttpURLConnection.HTTP_OK);
@@ -510,22 +507,17 @@ public abstract class Axis2WebServiceCon
         DescriptionUtils.registerHandlerHeaders(desc.getAxisService(), this.binding.getHandlerChain());
     }
 
-
-
     private void logHandlers(HandlerChainsType handlerChains) {
-        if (handlerChains == null || handlerChains.getHandlerChain() == null
-            || handlerChains.getHandlerChain().isEmpty()) {
+        if (handlerChains == null || handlerChains.getHandlerChain() == null || handlerChains.getHandlerChain().isEmpty()) {
             LOG.debug("No handlers");
             return;
         }
 
         for (HandlerChainType chains : handlerChains.getHandlerChain()) {
-            LOG.debug("Handler chain: " + chains.getServiceNamePattern() + " " +
-                      chains.getPortNamePattern() + " " + chains.getProtocolBindings());
+            LOG.debug("Handler chain: " + chains.getServiceNamePattern() + " " + chains.getPortNamePattern() + " " + chains.getProtocolBindings());
             if (chains.getHandler() != null) {
                 for (HandlerType chain : chains.getHandler()) {
-                    LOG.debug("  Handler: " + chain.getHandlerName().getValue() + " " +
-                              chain.getHandlerClass().getValue());
+                    LOG.debug("  Handler: " + chain.getHandlerName().getValue() + " " + chain.getHandlerClass().getValue());
                 }
             }
         }