[prev in list] [next in list] [prev in thread] [next in thread] 

List:       axis-cvs
Subject:    svn commit: r697141 - in /webservices/axis2/trunk/java/modules:
From:       scheu () apache ! org
Date:       2008-09-19 16:11:04
Message-ID: 20080919161105.29C2D23889A0 () eris ! apache ! org
[Download RAW message or body]

Author: scheu
Date: Fri Sep 19 09:11:04 2008
New Revision: 697141

URL: http://svn.apache.org/viewvc?rev=697141&view=rev
Log:
AXIS2-4039
Summary of Changes:
  1) Added a new property "javax.outbound.response.webmethod.exception" that contains \
                the Exception thrown
     from a web service implementation.  This property is only available on the \
                outbound server response, and
     is provided so that a customer can access the exception in a jax-ws handler.
     
  2) Changed the AddNumberWithHandlers sample to test and verify the new code.  The \
                service is changed to 
     throw both checked and unchecked exceptions.  An outbound jaxws handler uses the \
                new property to 
     access the exception and add the stack trace to the faultString.  (This is one \
of the scenarios that  the customer will use).  The client verifies proper \
processing.  
  3) Also added a test to verify that this property does not hinder message context \
                persistence.
     We don't necessarily need to support persistence of this property...the test \
only ensures that the new   property does not break persistance.

Modified:
    webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/AddNumbersHandlerTests.java
  webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addnumbershandler/AddNumbersHandlerPortTypeImpl.java
  webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addnumbershandler/AddNumbersProtocolHandler.java
  webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/Constants.java
  webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/JavaBeanDispatcher.java
  webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/JavaDispatcher.java
  webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/ProviderDispatcher.java
  webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/MessagePersistanceTests.java
  webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/Constants.java

Modified: webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/AddNumbersHandlerTests.java
                
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws-integrati \
on/test/org/apache/axis2/jaxws/sample/AddNumbersHandlerTests.java?rev=697141&r1=697140&r2=697141&view=diff
 ==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/AddNumbersHandlerTests.java \
                (original)
+++ webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/AddNumbersHandlerTests.java \
Fri Sep 19 09:11:04 2008 @@ -32,6 +32,7 @@
 import java.util.concurrent.Future;
 
 import javax.xml.namespace.QName;
+import javax.xml.soap.SOAPFault;
 import javax.xml.transform.Result;
 import javax.xml.transform.Source;
 import javax.xml.transform.Transformer;
@@ -59,6 +60,7 @@
 import org.apache.axis2.jaxws.sample.addnumbershandler.AddNumbersClientLogicalHandler3;
  import org.apache.axis2.jaxws.sample.addnumbershandler.AddNumbersClientLogicalHandler4;
  import org.apache.axis2.jaxws.sample.addnumbershandler.AddNumbersClientProtocolHandler;
 +import org.apache.axis2.jaxws.sample.addnumbershandler.AddNumbersHandlerFault_Exception;
  import org.apache.axis2.jaxws.sample.addnumbershandler.AddNumbersHandlerPortType;
 import org.apache.axis2.jaxws.sample.addnumbershandler.AddNumbersHandlerService;
 import org.test.addnumbershandler.AddNumbersHandlerResponse;
@@ -143,6 +145,191 @@
 		}
 	}
     
+    /**
+     * Client app sends MAXVALUE, MAXVALUE as params to add.
+     * No client-side handlers are configured for this scenario.  
+     * The endpoint method (addNumbersHandler) will detect the possible overflow and
+     * throw an application exception, AddNumbersHandleFault_Exception.
+     * 
+     * The server-side AddNumbersProtocolHandler will
+     * access the thrown exception using the "jaxws.webmethod.exception"
+     * property and add the stack trace string to fault string.
+     * 
+     * The client should receive a AddNumbersHandlerFault_Exception that has a stack
+     * trace as part of the message.
+     * This test verifies the following:
+     * 
+     * 1)  Proper exception/fault processing when handlers are installed.
+     * 2)  Access to the special "jaxws.webmethod.exception"
+     * 3)  Proper exception call flow when an application exception is thrown.
+     */
+    public void testAddNumbersHandler_WithCheckedException() throws Exception {
+
+        TestLogger.logger.debug("----------------------------------");
+        TestLogger.logger.debug("test: " + getName());
+
+        AddNumbersHandlerService service = new AddNumbersHandlerService();
+        AddNumbersHandlerPortType proxy = service.getAddNumbersHandlerPort();
+
+        BindingProvider p = (BindingProvider)proxy;
+        p.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, \
axisEndpoint); +        AddNumbersHandlerFault_Exception expectedException = null;
+        Throwable t = null;
+        try {
+            proxy.addNumbersHandler(Integer.MAX_VALUE, Integer.MAX_VALUE);
+            
+        } catch (Throwable e) {
+            // An exception is expected
+            t = e;
+            
+        } 
+        
+        // Make sure the proper exception is thrown
+        if (t == null) {
+            fail("Expected AddNumbersHandlerFault_Exception to be thrown");
+        }
+        if (t instanceof AddNumbersHandlerFault_Exception) {
+            expectedException = (AddNumbersHandlerFault_Exception) t;
+        } else {
+            fail("Expected AddNumbersHandlerFault_Exception to be thrown, " +
+                        "but the exception is: " + t);
+        }
+       
+        // also confirm that @PreDestroy method is called.  Since it only makes \
sense to call it on the managed +        // (server) side and just before the handler \
instance goes out of scope, we are creating a file in the +        // @PreDestroy \
method, and will check for its existance here.  If the file does not exist, it means \
+        // @PreDestroy method was never called.  The file is set to .deleteOnExit(), \
so no need to delete it. +        File file = new \
File("AddNumbersProtocolHandler.preDestroy.txt"); +        assertTrue("File \
AddNumbersProtocolHandler.preDestroy.txt does not exist, meaning the @PreDestroy \
method was not called.", file.exists()); +
+        String log = readLogFile();
+        String expected_calls =
+            "AddNumbersLogicalHandler2 POST_CONSTRUCT\n"
+            + "AddNumbersProtocolHandler2 GET_HEADERS\n"
+            + "AddNumbersProtocolHandler GET_HEADERS\n"
+            + "AddNumbersProtocolHandler HANDLE_MESSAGE_INBOUND\n"
+            + "AddNumbersProtocolHandler2 HANDLE_MESSAGE_INBOUND\n"
+            + "AddNumbersLogicalHandler2 HANDLE_MESSAGE_INBOUND\n"
+            + "AddNumbersLogicalHandler HANDLE_MESSAGE_INBOUND\n"
+            + "AddNumbersLogicalHandler HANDLE_FAULT_OUTBOUND\n"
+            + "AddNumbersLogicalHandler2 HANDLE_FAULT_OUTBOUND\n"
+            + "AddNumbersProtocolHandler2 HANDLE_FAULT_OUTBOUND\n"
+            + "AddNumbersProtocolHandler HANDLE_FAULT_OUTBOUND\n"
+            + "AddNumbersLogicalHandler CLOSE\n"
+            + "AddNumbersLogicalHandler2 CLOSE\n"
+            + "AddNumbersProtocolHandler2 CLOSE\n"
+            + "AddNumbersProtocolHandler CLOSE\n"
+            + "AddNumbersProtocolHandler PRE_DESTROY\n";
+        
+        assertEquals(expected_calls, log);
+        
+        TestLogger.logger.debug("Expected Exception is " + 
+                                expectedException.getMessage());
+        
+        // The outbound service handler adds the stack trace to the 
+        // message.  Make sure the stack trace contains the \
AddNumbersHandlerPortTypeImpl +        assertTrue("A stack trace was not present in \
the returned exception's message:" +  +                   \
expectedException.getMessage(), +                   \
expectedException.getMessage().indexOf("AddNumbersHandlerPortTypeImpl") > 0); +
+        TestLogger.logger.debug("----------------------------------");
+        
+    }
+    
+    /**
+     * Client app sends MAXVALUE, MAXVALUE as params to add.
+     * No client-side handlers are configured for this scenario.  
+     * The endpoint method (addNumbersHandler) will detect the possible overflow and
+     * throw an unchecked exception, NullPointerException.
+     * 
+     * The server-side AddNumbersProtocolHandler will
+     * access the thrown exception using the "jaxws.webmethod.exception"
+     * property and add the stack trace string to fault string.
+     * 
+     * The client should receive a SOAPFaultException that has a stack
+     * trace as part of the message.
+     * This test verifies the following:
+     * 
+     * 1)  Proper exception/fault processing when handlers are installed.
+     * 2)  Access to the special "jaxws.webmethod.exception"
+     * 3)  Proper exception call flow when an unchecked exception is thrown.
+     */
+    public void testAddNumbersHandler_WithUnCheckedException() throws Exception {
+
+        TestLogger.logger.debug("----------------------------------");
+        TestLogger.logger.debug("test: " + getName());
+
+        AddNumbersHandlerService service = new AddNumbersHandlerService();
+        AddNumbersHandlerPortType proxy = service.getAddNumbersHandlerPort();
+
+        BindingProvider p = (BindingProvider)proxy;
+        p.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, \
axisEndpoint); +        SOAPFaultException expectedException = null;
+        Throwable t = null;
+        try {
+            proxy.addNumbersHandler(-1000, Integer.MIN_VALUE);
+            
+        } catch (Throwable e) {
+            // An exception is expected
+            t = e;
+            
+        } 
+        
+        // Make sure the proper exception is thrown
+        if (t == null) {
+            fail("Expected AddNumbersHandlerFault_Exception to be thrown");
+        }
+        if (t instanceof SOAPFaultException) {
+            expectedException = (SOAPFaultException) t;
+        } else {
+            fail("Expected SOAPFaultException to be thrown, " +
+                        "but the exception is: " + t);
+        }
+       
+        // also confirm that @PreDestroy method is called.  Since it only makes \
sense to call it on the managed +        // (server) side and just before the handler \
instance goes out of scope, we are creating a file in the +        // @PreDestroy \
method, and will check for its existance here.  If the file does not exist, it means \
+        // @PreDestroy method was never called.  The file is set to .deleteOnExit(), \
so no need to delete it. +        File file = new \
File("AddNumbersProtocolHandler.preDestroy.txt"); +        assertTrue("File \
AddNumbersProtocolHandler.preDestroy.txt does not exist, meaning the @PreDestroy \
method was not called.", file.exists()); +
+        String log = readLogFile();
+        String expected_calls =
+            "AddNumbersLogicalHandler2 POST_CONSTRUCT\n"
+            + "AddNumbersProtocolHandler2 GET_HEADERS\n"
+            + "AddNumbersProtocolHandler GET_HEADERS\n"
+            + "AddNumbersProtocolHandler HANDLE_MESSAGE_INBOUND\n"
+            + "AddNumbersProtocolHandler2 HANDLE_MESSAGE_INBOUND\n"
+            + "AddNumbersLogicalHandler2 HANDLE_MESSAGE_INBOUND\n"
+            + "AddNumbersLogicalHandler HANDLE_MESSAGE_INBOUND\n"
+            + "AddNumbersLogicalHandler HANDLE_FAULT_OUTBOUND\n"
+            + "AddNumbersLogicalHandler2 HANDLE_FAULT_OUTBOUND\n"
+            + "AddNumbersProtocolHandler2 HANDLE_FAULT_OUTBOUND\n"
+            + "AddNumbersProtocolHandler HANDLE_FAULT_OUTBOUND\n"
+            + "AddNumbersLogicalHandler CLOSE\n"
+            + "AddNumbersLogicalHandler2 CLOSE\n"
+            + "AddNumbersProtocolHandler2 CLOSE\n"
+            + "AddNumbersProtocolHandler CLOSE\n"
+            + "AddNumbersProtocolHandler PRE_DESTROY\n";
+        
+        assertEquals(expected_calls, log);
+        
+        // The outbound service handler adds the stack trace to the 
+        // message.  Make sure the stack trace contains the \
AddNumbersHandlerPortTypeImpl +        
+        TestLogger.logger.debug("Expected Exception is " + 
+                                expectedException.getMessage());
+        
+        SOAPFault fault = expectedException.getFault();
+        assertTrue("A stack trace was not present in the returned exception's \
message:" +  +                   fault.getFaultString(),
+                   fault.getFaultString().indexOf("AddNumbersHandlerPortTypeImpl") > \
0); +                   
+
+        TestLogger.logger.debug("----------------------------------");
+        
+    }
+    
     public void testAddNumbersHandlerDispatch() {
         try {
             QName serviceName =
@@ -511,9 +698,9 @@
             e.printStackTrace();
             assertTrue("Exception should be SOAPFaultException", e instanceof \
                SOAPFaultException);
             //AXIS2-2417 - assertEquals(((SOAPFaultException)e).getMessage(), \
                "AddNumbersLogicalHandler2 was here");
-            assertEquals(((SOAPFaultException)e).getMessage(), "Got value 101.  " +
+            assertTrue(((SOAPFaultException)e).getMessage().contains("Got value 101. \
                " +
             		"AddNumbersHandlerPortTypeImpl.addNumbersHandler method is " +
-            		"correctly throwing this exception as part of testing");
+            		"correctly throwing this exception as part of testing"));
             
             String log = readLogFile();
             String expected_calls = "AddNumbersClientLogicalHandler \
HANDLE_MESSAGE_OUTBOUND\n"

Modified: webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addnumbershandler/AddNumbersHandlerPortTypeImpl.java
                
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws-integrati \
on/test/org/apache/axis2/jaxws/sample/addnumbershandler/AddNumbersHandlerPortTypeImpl.java?rev=697141&r1=697140&r2=697141&view=diff
 ==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addnumbershandler/AddNumbersHandlerPortTypeImpl.java \
                (original)
+++ webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addnumbershandler/AddNumbersHandlerPortTypeImpl.java \
Fri Sep 19 09:11:04 2008 @@ -20,8 +20,10 @@
 package org.apache.axis2.jaxws.sample.addnumbershandler;
 
 import org.apache.axis2.jaxws.TestLogger;
+import org.test.addnumbershandler.AddNumbersHandlerFault;
 import org.test.addnumbershandler.AddNumbersHandlerResponse;
 
+
 import javax.annotation.Resource;
 import javax.jws.HandlerChain;
 import javax.jws.WebService;
@@ -37,17 +39,17 @@
 
     private WebServiceContext ctx;
     
-	/* (non-Javadoc)
-	 * @see org.apache.axis2.jaxws.sample.addnumbershandler.AddNumbersHandlerPortType#addNumbersHandler(int, \
                int)
-	 */
-	public int addNumbersHandler(int arg0, int arg1) throws \
AddNumbersHandlerFault_Exception { +    /* (non-Javadoc)
+     * @see org.apache.axis2.jaxws.sample.addnumbershandler.AddNumbersHandlerPortType#addNumbersHandler(int, \
int) +     */
+    public int addNumbersHandler(int arg0, int arg1) throws \
AddNumbersHandlerFault_Exception {  
-	    /* FIXME: getHeaders() is currently not called
+        /* FIXME: getHeaders() is currently not called
 	    if (!tracker.isCalled(HandlerTracker.Methods.GET_HEADERS)) {
 	        throw new RuntimeException("getHeaders() was not called on the handler");
 	    }
-	    */
-	    
+         */
+
         // for these properties tests to always pass, an inbound server-side handler \
must "put" them  MessageContext mc = ctx.getMessageContext();
         String propKey1 = "AddNumbersLogicalHandlerInboundAppScopedProperty";
@@ -57,14 +59,34 @@
             throw new RuntimeException("Property value for key \"" + propKey1 + "\" \
                was null, but is APPLICATION scoped and should be accessible by the \
                endpoint");
         if (mc.containsKey(propKey2))  // instead of "get", use "containsKey" to be \
a little more robust in testing  throw new \
RuntimeException("MessageContext.containsKey reported true for key \"" + propKey2 + \
"\" was not null.  This property is HANDLER scoped and should not be accessible by \
                the endpoint");
-        TestLogger.logger
-                .debug(">> Received addNumbersHandler request for " + arg0 + " and " \
                + arg1);
-        if (arg0 == 101)
-            throw new RuntimeException("Got value 101.  \
AddNumbersHandlerPortTypeImpl.addNumbersHandler method is correctly throwing this \
                exception as part of testing");
-        return arg0+arg1;
-	}
+        TestLogger.logger.debug(">> Received addNumbersHandler request for " + arg0 \
+ " and " + arg1); +        if (arg0 == 101) {
+            throw new RuntimeException("Got value 101.  " +
+                        "AddNumbersHandlerPortTypeImpl.addNumbersHandler method is " \
+ +                        "correctly throwing this exception as part of testing");
+        }
+        
+        long sum = (long) arg0 + (long) arg1;
+        TestLogger.logger.debug(">> Sum is " + sum);
+        TestLogger.logger.debug(">> MAX_VALUE is " + Integer.MAX_VALUE);
+        TestLogger.logger.debug(">> MIN_VALUE is " + Integer.MIN_VALUE);
+        
+        // For testing purposes, an overflow triggers an application exception \
AddNumbersHandlerPortType +        // For testing purposes, an underflow triggers an \
NPE. +        if (sum > Integer.MAX_VALUE) {
+            TestLogger.logger.debug("Overflow detected.  Throwing \
AddNumbersHandlerFault"); +            AddNumbersHandlerFault faultInfo = new \
AddNumbersHandlerFault(); +            faultInfo.setFaultInfo("overflow");
+            faultInfo.setMessage("overflow");
+            throw new AddNumbersHandlerFault_Exception("overflow", faultInfo);
+        } else if (sum < Integer.MIN_VALUE) {
+            TestLogger.logger.debug("Underflow detected.  Throwing \
NullPointerException"); +            throw new NullPointerException("underflow");
+        }
+        return (int) sum;
+    }
 
-	public Future<?> addNumbersHandlerAsync(int arg0, int arg1, \
AsyncHandler<AddNumbersHandlerResponse> asyncHandler) { +    public Future<?> \
addNumbersHandlerAsync(int arg0, int arg1, AsyncHandler<AddNumbersHandlerResponse> \
asyncHandler) {  return null;
     }
 

Modified: webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addnumbershandler/AddNumbersProtocolHandler.java
                
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws-integrati \
on/test/org/apache/axis2/jaxws/sample/addnumbershandler/AddNumbersProtocolHandler.java?rev=697141&r1=697140&r2=697141&view=diff
 ==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addnumbershandler/AddNumbersProtocolHandler.java \
                (original)
+++ webservices/axis2/trunk/java/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addnumbershandler/AddNumbersProtocolHandler.java \
Fri Sep 19 09:11:04 2008 @@ -20,11 +20,13 @@
 package org.apache.axis2.jaxws.sample.addnumbershandler;
 
 import org.apache.axis2.jaxws.ExceptionFactory;
+import org.apache.axis2.jaxws.TestLogger;
 
 import javax.annotation.PreDestroy;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBElement;
 import javax.xml.namespace.QName;
+import javax.xml.soap.SOAPFault;
 import javax.xml.ws.WebServiceException;
 import javax.xml.ws.handler.MessageContext;
 import javax.xml.ws.handler.soap.SOAPMessageContext;
@@ -48,6 +50,26 @@
     
     public boolean handleFault(SOAPMessageContext messagecontext) {
         tracker.handleFault((Boolean) \
messagecontext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY)); +        
+        try {
+            SOAPFault fault = messagecontext.getMessage().getSOAPBody().getFault();
+            String faultString = fault.getFaultString();
+            Throwable webmethodException = (Throwable)
+                messagecontext.get("jaxws.outbound.response.webmethod.exception");
+            
+            // Update the fault string with the stack trace
+            if (webmethodException != null) {
+                TestLogger.logger.debug("The webmethod exception is \
available...setting the fault string"); +                faultString += "stack = " +  \
stackToString(webmethodException); +                \
fault.setFaultString(faultString); +            } else {
+                TestLogger.logger.debug("The webmethod exception was not \
available"); +            }
+        } catch (Exception e) {
+            tracker.log("Exception occurred:" + e.getMessage(),
+                        (Boolean) \
messagecontext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY)); +        }
+        
         return true;
     }
 
@@ -109,4 +131,12 @@
     	}
     }
 
+    private static String stackToString(Throwable e) {
+        java.io.StringWriter sw = new java.io.StringWriter();
+        java.io.BufferedWriter bw = new java.io.BufferedWriter(sw);
+        java.io.PrintWriter pw = new java.io.PrintWriter(bw);
+        e.printStackTrace(pw);
+        pw.close();
+        return sw.getBuffer().toString();
+    }
 }

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/Constants.java
                
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/Constants.java?rev=697141&r1=697140&r2=697141&view=diff
 ==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/Constants.java \
                (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/Constants.java \
Fri Sep 19 09:11:04 2008 @@ -56,4 +56,11 @@
      */
     public static final String CHECKED_EXCEPTION =
         "org.apache.axis2.jaxws.checkedException";
+    
+    /**
+     * If an exception is thrown by the JAXWS webservice's webmethod, the 
+     * Throwable object is placed in the service outbound response context.
+     */
+    public static final String JAXWS_WEBMETHOD_EXCEPTION = 
+        org.apache.axis2.Constants.JAXWS_WEBMETHOD_EXCEPTION;
 }

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/JavaBeanDispatcher.java
                
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/a \
pache/axis2/jaxws/server/dispatcher/JavaBeanDispatcher.java?rev=697141&r1=697140&r2=697141&view=diff
 ==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/JavaBeanDispatcher.java \
                (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/JavaBeanDispatcher.java \
Fri Sep 19 09:11:04 2008 @@ -107,7 +107,7 @@
             return null;
         } else if (faultThrown) {
             response = createFaultResponse(mc, mc.getMessage().getProtocol(), \
                fault);
-            setCheckedExceptionProperty(response, target, fault);
+            setExceptionProperties(response, target, fault);
         } else {
             response = createResponse(mc, mc.getMessage().getProtocol(), \
methodInputParams, output);  }

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/JavaDispatcher.java
                
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/a \
pache/axis2/jaxws/server/dispatcher/JavaDispatcher.java?rev=697141&r1=697140&r2=697141&view=diff
 ==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/JavaDispatcher.java \
                (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/JavaDispatcher.java \
Fri Sep 19 09:11:04 2008 @@ -158,7 +158,7 @@
                     // If a fault was thrown, we need to create a slightly different
                     // MessageContext, than in the response path.
                     response = createFaultResponse(request, fault);
-                    setCheckedExceptionProperty(response, method, fault);
+                    setExceptionProperties(response, method, fault);
                 } else {
                     if (log.isDebugEnabled()) {
                         log.debug("Async invocation of the endpoint was successful.  \
Creating response message."); @@ -259,4 +259,35 @@
         }
     }
     
+    /**
+     * Store the actual exception on the response context
+     * @param response MessageContext
+     * @param t Throwable
+     */
+    protected static void setWebMethodExceptionProperty(MessageContext response, 
+                                                        Throwable t) {
+        // Get the root of the exception
+        if (t instanceof InvocationTargetException) {
+            t = ((InvocationTargetException) t).getTargetException();
+        }
+        
+        // Add the property
+        if (t != null) {
+            response.setProperty(Constants.JAXWS_WEBMETHOD_EXCEPTION, t);
+        }
+    }
+    
+    /**
+     * Information about the exception is stored on the outbound response context
+     * @param response MessageContext
+     * @param m Method
+     * @param t Throwable
+     */
+    protected static void setExceptionProperties(MessageContext response, 
+                                                 Method m, 
+                                                 Throwable t) {
+        setCheckedExceptionProperty(response, m, t);
+        setWebMethodExceptionProperty(response, t);
+    }
+    
 }

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/ProviderDispatcher.java
                
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/a \
pache/axis2/jaxws/server/dispatcher/ProviderDispatcher.java?rev=697141&r1=697140&r2=697141&view=diff
 ==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/ProviderDispatcher.java \
                (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/ProviderDispatcher.java \
Fri Sep 19 09:11:04 2008 @@ -140,7 +140,7 @@
             // If a fault was thrown, we need to create a slightly different
             // MessageContext, than in the response path.
             responseMsgCtx = createFaultResponse(request, fault);
-            setCheckedExceptionProperty(responseMsgCtx, target, fault);
+            setExceptionProperties(responseMsgCtx, target, fault);
         } else {
             responseMsgCtx = createResponse(request, input, responseParamValue);
         }

Modified: webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/MessagePersistanceTests.java
                
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/test/org/ \
apache/axis2/jaxws/message/MessagePersistanceTests.java?rev=697141&r1=697140&r2=697141&view=diff
 ==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/MessagePersistanceTests.java \
                (original)
+++ webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/MessagePersistanceTests.java \
Fri Sep 19 09:11:04 2008 @@ -30,6 +30,7 @@
 import org.apache.axiom.om.util.CopyUtils;
 import org.apache.axiom.soap.SOAPBody;
 import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.axis2.Constants;
 import org.apache.axis2.Constants.Configuration;
 import org.apache.axis2.datasource.jaxb.JAXBDataSource;
 import org.apache.axis2.jaxws.core.MessageContext;
@@ -122,6 +123,12 @@
         org.apache.axis2.context.MessageContext axisMC = \
                jaxwsMC.getAxisMessageContext();
         MessageUtils.putMessageOnMessageContext(m, jaxwsMC.getAxisMessageContext());
         
+        // Add other properties to the MessageContext
+        axisMC.setProperty(Constants.JAXWS_WEBMETHOD_EXCEPTION, new \
NullPointerException()); +        axisMC.setProperty("keyString", "valueString");
+        axisMC.setProperty("keyInteger", new Integer(5));
+        
+        
         // Make sure the Axiom structure is intact
         SOAPEnvelope env = axisMC.getEnvelope();
         SOAPBody body = env.getBody();
@@ -205,6 +212,23 @@
         // At this point in time, the restoredMessage will be a full tree.
         // TODO If this changes, please add more assertions here.
         
+        // Check persisted properties
+        
+        // The exception might be persisted....but in the very least it should
+        // not cause an exception.
+        Throwable t = (Throwable) \
restoredMC.getProperty(Constants.JAXWS_WEBMETHOD_EXCEPTION); +        assertTrue(t == \
null || t instanceof NullPointerException); +        
+        // Make sure the keyString property was persisted
+        String valueString =  (String) restoredMC.getProperty("keyString");
+        assertTrue("valueString".equals(valueString));
+        
+        // Make sure the keyInteger property was persisted.
+        Integer valueInteger =  (Integer) restoredMC.getProperty("keyInteger");
+        assertTrue(valueInteger == 5);
+        
+        axisMC.setProperty("keyInteger", new Integer(5));
+        
         // Simulate transport
         baos = new ByteArrayOutputStream();
         env = restoredMC.getEnvelope();

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/Constants.java
                
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/Constants.java?rev=697141&r1=697140&r2=697141&view=diff
 ==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/Constants.java \
                (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/Constants.java \
Fri Sep 19 09:11:04 2008 @@ -286,6 +286,11 @@
     // Keys to access JAXWS Request and Response SOAP Headers
     public static final String JAXWS_OUTBOUND_SOAP_HEADERS  = \
                "jaxws.binding.soap.headers.outbound";
     public static final String JAXWS_INBOUND_SOAP_HEADERS = \
"jaxws.binding.soap.headers.inbound"; +    
+    // If the JAXWS WebMethod throws an exception on the server, the exception is
+    // stored on the server outbound MessageContext.  This is the key to access that \
Throwable object. +    public static final String JAXWS_WEBMETHOD_EXCEPTION = 
+        "jaxws.outbound.response.webmethod.exception";
 
     /**
      * A MessageContext property or client Option stating the JMS correlation id


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic