You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by da...@apache.org on 2008/03/08 17:49:10 UTC

svn commit: r635006 - in /webservices/axis2/trunk/java/modules/jaxws: src/org/apache/axis2/jaxws/server/ src/org/apache/axis2/jaxws/server/dispatcher/ src/org/apache/axis2/jaxws/spi/ test/org/apache/axis2/jaxws/server/

Author: damrhei
Date: Sat Mar  8 08:49:09 2008
New Revision: 635006

URL: http://svn.apache.org/viewvc?rev=635006&view=rev
Log:
Extend the InvocationListener interface to allow notification upon exceptions in the JAX-WS server-side code flow. Changes JAX-WS server-side code to properly call out to the InvocationListener.notifyOnException methods when an exception is caught either from the invocation of the endpoint or just a general system exception. Addresses AXIS2-3582.

Added:
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/InvocationHelper.java
Modified:
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointCallback.java
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointInvocationContext.java
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointInvocationContextImpl.java
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/InvocationListener.java
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/InvocationListenerBean.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/src/org/apache/axis2/jaxws/spi/Constants.java
    webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/server/JAXWSServerTests.java

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointCallback.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointCallback.java?rev=635006&r1=635005&r2=635006&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointCallback.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointCallback.java Sat Mar  8 08:49:09 2008
@@ -21,6 +21,7 @@
 
 import java.util.List;
 
+import org.apache.axis2.AxisFault;
 import org.apache.axis2.context.OperationContext;
 import org.apache.axis2.engine.AxisEngine;
 import org.apache.axis2.jaxws.ExceptionFactory;
@@ -75,6 +76,12 @@
                 t.printStackTrace();
             }
             
+            Throwable faultMessage = InvocationHelper.determineMappedException(t, eic);
+            if(faultMessage != null) {
+                t = faultMessage;
+            }
+            eic.getResponseMessageContext().setCausedByException(AxisFault.makeFault(t));
+            
             ThreadContextMigratorUtil.performThreadCleanup(Constants.THREAD_CONTEXT_MIGRATOR_LIST_ID,
                 eic.getRequestMessageContext().getAxisMessageContext());
             
@@ -105,8 +112,12 @@
             engine.sendFault(axisResponseMsgCtx);
             
         } catch (Throwable t) {
-            // TODO Auto-generated catch block
-            t.printStackTrace();
+            Throwable faultMessage = InvocationHelper.determineMappedException(t, eic);
+            if(faultMessage != null) {
+                t = faultMessage;
+            }
+            
+            throw ExceptionFactory.makeWebServiceException(AxisFault.makeFault(t));
         }
     }
     

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java?rev=635006&r1=635005&r2=635006&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointController.java Sat Mar  8 08:49:09 2008
@@ -91,16 +91,15 @@
         if (log.isDebugEnabled()) {
             log.debug("Invocation pattern: synchronous");
         }
-
-        boolean good = handleRequest(eic);
-
-        if (!good) {
-            return eic;
-        }
         
         MessageContext request = eic.getRequestMessageContext();
-        MessageContext response = null;
         try {
+            boolean good = handleRequest(eic);
+
+            if (!good) {
+                return eic;
+            }
+            MessageContext response = null;
             EndpointDispatcher dispatcher = eic.getDispatcher();
             if (request != null && dispatcher != null) {
                 response = dispatcher.invoke(request);    
@@ -110,14 +109,17 @@
                 throw ExceptionFactory.makeWebServiceException(Messages.getMessage("invokeErr"));
             }
         } catch (Exception e) {
-            throw ExceptionFactory.makeWebServiceException(e);
+            Throwable toBeThrown = InvocationHelper.determineMappedException(e, eic);
+            if(toBeThrown == null) {
+                toBeThrown = e;
+            }
+            throw ExceptionFactory.makeWebServiceException(toBeThrown);
         } finally {
             // Passed pivot point
             request.getMessage().setPostPivot();
+            handleResponse(eic);    
         }
         
-        handleResponse(eic);            
-        
         return eic;
     }
     
@@ -126,14 +128,13 @@
             log.debug("Invocation pattern: asynchronous");
         }
         
-        boolean good = handleRequest(eic);
-
-        if (!good) {
-            return;
-        }
-        
         MessageContext request = eic.getRequestMessageContext();
         try {
+            boolean good = handleRequest(eic);
+
+            if (!good) {
+                return;
+            }
             EndpointDispatcher dispatcher = eic.getDispatcher();
             if (request != null && dispatcher != null) {
                 dispatcher.invokeAsync(request, eic.getCallback());    
@@ -142,7 +143,11 @@
                 throw ExceptionFactory.makeWebServiceException(Messages.getMessage("invokeErr"));
             }
         } catch (Exception e) {
-            throw ExceptionFactory.makeWebServiceException(e);
+            Throwable toBeThrown = InvocationHelper.determineMappedException(e, eic);
+            if(toBeThrown == null) {
+                toBeThrown = e;
+            }
+            throw ExceptionFactory.makeWebServiceException(toBeThrown);
         } finally {
             // FIXME (NLG): Probably need to revisit this location.  Should it be moved down?
             // Passed pivot point
@@ -157,14 +162,14 @@
             log.debug("Invocation pattern: one-way");
         }
     
-        boolean good = handleRequest(eic);
 
-        if (!good) {
-            return;
-        }
-        
         MessageContext request = eic.getRequestMessageContext();
         try {
+            boolean good = handleRequest(eic);
+
+            if (!good) {
+                return;
+            }
             EndpointDispatcher dispatcher = eic.getDispatcher();
             if (request != null && dispatcher != null) {
                 dispatcher.invokeOneWay(request);    
@@ -173,7 +178,11 @@
                 throw ExceptionFactory.makeWebServiceException(Messages.getMessage("invokeErr"));
             }
         } catch (Exception e) {
-            throw ExceptionFactory.makeWebServiceException(e);
+            Throwable toBeThrown = InvocationHelper.determineMappedException(e, eic);
+            if(toBeThrown == null) {
+                toBeThrown = e;
+            }
+            throw ExceptionFactory.makeWebServiceException(toBeThrown);
         } finally {
             // Passed pivot point
             request.getMessage().setPostPivot();
@@ -184,31 +193,7 @@
     
     protected boolean handleRequest(EndpointInvocationContext eic) {
         
-        requestReceived(eic);
-        
-        MessageContext request = eic.getRequestMessageContext();
-        
-        Class serviceEndpoint = getServiceImplementation(request);
-        EndpointDescription endpointDesc = getEndpointDescription(request, serviceEndpoint);
-        request.setEndpointDescription(endpointDesc);
-        
-        //  TODO: review: make sure the handlers are set on the InvocationContext
-        //  This implementation of the JAXWS runtime does not use Endpoint, which
-        //  would normally be the place to initialize and store the handler list.
-        //  In lieu of that, we will have to intialize and store them on the 
-        //  InvocationContext.  also see the InvocationContextFactory.  On the client
-        //  side, the binding is not yet set when we call into that factory, so the
-        //  handler list doesn't get set on the InvocationContext object there.  Thus
-        //  we gotta do it here.
-        //  
-        //  Since we're on the server, and there apparently is no Binding object
-        //  anywhere to be found...
-        if (eic.getHandlers() == null) {
-            if (log.isDebugEnabled()) {
-                log.debug("No handlers found on the InvocationContext, initializing handler list.");
-            }
-            eic.setHandlers(new HandlerResolverImpl(endpointDesc.getServiceDescription()).getHandlerChain(endpointDesc.getPortInfo()));
-        }
+
 
         //Not needed since this is already handled when eic reaches this level
         //if (!Utils.bindingTypesMatch(request, endpointDesc.getServiceDescription())) {
@@ -221,6 +206,32 @@
         MessageContext responseMsgContext = null;
 
         try {
+            requestReceived(eic);
+            
+            MessageContext request = eic.getRequestMessageContext();
+            
+            Class serviceEndpoint = getServiceImplementation(request);
+            EndpointDescription endpointDesc = getEndpointDescription(request, serviceEndpoint);
+            request.setEndpointDescription(endpointDesc);
+            
+            //  TODO: review: make sure the handlers are set on the InvocationContext
+            //  This implementation of the JAXWS runtime does not use Endpoint, which
+            //  would normally be the place to initialize and store the handler list.
+            //  In lieu of that, we will have to intialize and store them on the 
+            //  InvocationContext.  also see the InvocationContextFactory.  On the client
+            //  side, the binding is not yet set when we call into that factory, so the
+            //  handler list doesn't get set on the InvocationContext object there.  Thus
+            //  we gotta do it here.
+            //  
+            //  Since we're on the server, and there apparently is no Binding object
+            //  anywhere to be found...
+            if (eic.getHandlers() == null) {
+                if (log.isDebugEnabled()) {
+                    log.debug("No handlers found on the InvocationContext, initializing handler list.");
+                }
+                eic.setHandlers(new HandlerResolverImpl(endpointDesc.getServiceDescription()).getHandlerChain(endpointDesc.getPortInfo()));
+            }
+            
             // Get the service instance.  This will run the @PostConstruct code.
             ServiceInstanceFactory instanceFactory = (ServiceInstanceFactory) 
                 FactoryRegistry.getFactory(ServiceInstanceFactory.class);
@@ -292,7 +303,11 @@
            } 
         } catch (Exception e) {
             // TODO for now, throw it.  We probably should try to make an XMLFault object and set it on the message
-            throw ExceptionFactory.makeWebServiceException(e);  
+            Throwable toBeThrown = InvocationHelper.determineMappedException(e, eic);
+            if(toBeThrown == null) {
+                toBeThrown = e;
+            }
+            throw ExceptionFactory.makeWebServiceException(toBeThrown);
         } finally {
         	// at this point, we are done with handler instances on the server; call @PreDestroy on all of them
             HandlerLifecycleManager hlm = createHandlerlifecycleManager();
@@ -551,6 +566,9 @@
                     }
                 }
             }
+            MessageContext request = eic.getRequestMessageContext();
+            request.setProperty(org.apache.axis2.jaxws.spi.Constants.INVOCATION_LISTENER_LIST, 
+                                eic.getInvocationListeners());
         }
     }
     
@@ -581,4 +599,5 @@
                 .getFactory(HandlerLifecycleManagerFactory.class);
         return elmf.createHandlerLifecycleManager();
     }
+    
 }

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointInvocationContext.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointInvocationContext.java?rev=635006&r1=635005&r2=635006&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointInvocationContext.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointInvocationContext.java Sat Mar  8 08:49:09 2008
@@ -93,6 +93,11 @@
     public void addInvocationListener(InvocationListener listener);
     
     /**
+     * Sets list of InvocationListener instances
+     */
+    public void setInvocationListeners(List<InvocationListener> listeners);
+    
+    /**
      * Gets the InvocationListener instances from the context.
      */
     public List<InvocationListener> getInvocationListeners();

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointInvocationContextImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointInvocationContextImpl.java?rev=635006&r1=635005&r2=635006&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointInvocationContextImpl.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/EndpointInvocationContextImpl.java Sat Mar  8 08:49:09 2008
@@ -108,6 +108,14 @@
     
     /*
      * (non-Javadoc)
+     * @see org.apache.axis2.jaxws.server.EndpointInvocationContext#setInvocationListeners(List<InvocationListener> listeners)
+     */
+    public void setInvocationListeners(List<InvocationListener> listeners) {
+        this.ilInstances = listeners;
+    }
+    
+    /*
+     * (non-Javadoc)
      * @see org.apache.axis2.jaxws.server.EndpointInvocationContext#addInvocationListener(InvocationListener)
      */
     public void addInvocationListener(InvocationListener listener) {

Added: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/InvocationHelper.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/InvocationHelper.java?rev=635006&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/InvocationHelper.java (added)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/InvocationHelper.java Sat Mar  8 08:49:09 2008
@@ -0,0 +1,98 @@
+package org.apache.axis2.jaxws.server;
+
+import java.util.List;
+
+import org.apache.axis2.jaxws.core.MessageContext;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * This class represents static methods that are utilized during the course
+ * of invocation of a JAX-WS endpoint. This utility class is specifically
+ * meant to be used within the JAX-WS server-side flow.
+ *
+ */
+public class InvocationHelper {
+    
+    private static final Log log = LogFactory.getLog(InvocationHelper.class);
+    
+    /**
+     * This method is responsible for driving the method below. It will appropriately
+     * wrap the MessageContext in an EndpointInvocationContext. The MessageContext 
+     * instance MUST be a request MessageContext.
+     */
+    public static void callListenersForException(Throwable t, MessageContext context) {
+        EndpointInvocationContext eic = new EndpointInvocationContextImpl();
+        eic.setRequestMessageContext(context);
+        eic.setInvocationListeners((List<InvocationListener>)context.getProperty(org.apache.axis2.jaxws.spi.Constants.INVOCATION_LISTENER_LIST));
+        callListenersForException(t, eic);
+    }
+    
+    /**
+     * This method is responsible for driving the InvocationListener instances'
+     * 'notifyOnException' method. This method will be called anytime that an
+     * exception occurs within the JAX-WS server side code flow.
+     */
+    public static void callListenersForException(Throwable t, EndpointInvocationContext eic) {
+        List<InvocationListener> invocationListeners = eic.getInvocationListeners();
+        Throwable returnException = null;
+        if(invocationListeners != null && !invocationListeners.isEmpty()) {
+            InvocationListenerBean bean = new InvocationListenerBean();
+            bean.setEndpointInvocationContext(eic);
+            bean.setState(eic.getResponseMessageContext() != null ? InvocationListenerBean.State.RESPONSE : 
+                InvocationListenerBean.State.REQUEST);
+            bean.setThrowable(t);
+            for(InvocationListener listener : invocationListeners) {
+                listener.notifyOnException(bean);
+            }
+        }
+    }
+    
+    /**
+     * This method will drive the call to the above methods. It will drive the call to
+     * the 'notifyOnException' methods of all InvocationListeners. After doing this, it
+     * will determine if another exception has been set as the mapped exception, and if
+     * so it will return this exception. Otherwise, null is returned.
+     */
+    public static Throwable determineMappedException(Throwable t, EndpointInvocationContext eic) {
+        Throwable returnThrowable = null;
+        callListenersForException(t, eic);
+        MessageContext requestContext = eic.getRequestMessageContext();
+        MessageContext responseContext = eic.getResponseMessageContext();
+        if(requestContext != null 
+                && 
+                requestContext.getProperty(org.apache.axis2.jaxws.spi.Constants.MAPPED_EXCEPTION) != null) {
+            returnThrowable = (Throwable) requestContext.getProperty(org.apache.axis2.jaxws.spi.Constants.MAPPED_EXCEPTION);
+            if(log.isDebugEnabled()) {
+                log.debug("Setting mapped exception to: " + returnThrowable + " from request " +
+                		"MessageContext");
+            }
+        }
+        else if(responseContext != null
+                &&
+                responseContext.getProperty(org.apache.axis2.jaxws.spi.Constants.MAPPED_EXCEPTION) != null) {
+            returnThrowable = (Throwable) responseContext.getProperty(org.apache.axis2.jaxws.spi.Constants.MAPPED_EXCEPTION);
+            if(log.isDebugEnabled()) {
+                log.debug("Setting mapped exception to: " + returnThrowable + " from response " +
+                                "MessageContext");
+            }
+        }
+        return returnThrowable;
+    }
+    
+    /**
+     * This method will drive the call to the above methods. It will drive the call to
+     * the 'notifyOnException' methods of all InvocationListeners. After doing this, it
+     * will determine if another exception has been set as the mapped exception, and if
+     * so it will return this exception. Otherwise, null is returned.
+     */
+    public static Throwable determineMappedException(Throwable t, MessageContext context) {
+        Throwable returnThrowable = null;
+        EndpointInvocationContext eic = new EndpointInvocationContextImpl();
+        eic.setRequestMessageContext(context);
+        eic.setInvocationListeners((List<InvocationListener>)context.getProperty(org.apache.axis2.jaxws.spi.Constants.INVOCATION_LISTENER_LIST));
+        return determineMappedException(t, eic);
+    }
+
+}

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/InvocationListener.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/InvocationListener.java?rev=635006&r1=635005&r2=635006&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/InvocationListener.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/InvocationListener.java Sat Mar  8 08:49:09 2008
@@ -35,4 +35,14 @@
      */
     public void notify(InvocationListenerBean bean) throws Exception;
     
+    /**
+     * This method will be called anytime that an exception occurs
+     * within the JAX-WS server-side code flow. InvocationListener
+     * instances may change the exception being operated on by setting 
+     * the org.apache.axis2.jaxws.spi.Constants.MAPPED_EXCEPTION
+     * property on either the request or response MessageContext. The
+     * value of the property should be an instance of Throwable.
+     */
+    public void notifyOnException(InvocationListenerBean bean);
+    
 }

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/InvocationListenerBean.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/InvocationListenerBean.java?rev=635006&r1=635005&r2=635006&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/InvocationListenerBean.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/InvocationListenerBean.java Sat Mar  8 08:49:09 2008
@@ -28,6 +28,8 @@
  */
 public class InvocationListenerBean {
     
+    private Throwable throwable;
+    
     public InvocationListenerBean() {
         
     }
@@ -39,7 +41,8 @@
     
     public static enum State {
         REQUEST,
-        RESPONSE
+        RESPONSE,
+        EXCEPTION
     }
     
     private EndpointInvocationContext eic;
@@ -60,6 +63,14 @@
 
     public void setState(State state) {
         this.state = state;
+    }
+    
+    public void setThrowable(Throwable throwable) {
+        this.throwable = throwable;
+    }
+    
+    public Throwable getThrowable() {
+        return throwable;
     }
     
 }

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/apache/axis2/jaxws/server/dispatcher/JavaBeanDispatcher.java?rev=635006&r1=635005&r2=635006&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 Sat Mar  8 08:49:09 2008
@@ -35,6 +35,7 @@
 import org.apache.axis2.jaxws.registry.FactoryRegistry;
 import org.apache.axis2.jaxws.server.EndpointCallback;
 import org.apache.axis2.jaxws.server.EndpointInvocationContext;
+import org.apache.axis2.jaxws.server.InvocationHelper;
 import org.apache.axis2.jaxws.server.ServerConstants;
 import org.apache.axis2.jaxws.server.endpoint.Utils;
 import org.apache.axis2.jaxws.spi.Constants;
@@ -326,6 +327,15 @@
     }
     
     public MessageContext createFaultResponse(MessageContext request, Protocol p, Throwable t) {
+        
+        // call the InvocationListener instances before marshalling
+        // the fault into a message
+        // call the InvocationListener instances before marshalling
+        // the fault into a message
+        Throwable faultMessage = InvocationHelper.determineMappedException(t, request);
+        if(faultMessage != null) {
+            t = faultMessage;
+        }
         
         MethodMarshaller marshaller = getMethodMarshaller(p, request.getOperationDescription(),
                                                           request);

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/apache/axis2/jaxws/server/dispatcher/JavaDispatcher.java?rev=635006&r1=635005&r2=635006&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 Sat Mar  8 08:49:09 2008
@@ -23,6 +23,7 @@
 import org.apache.axis2.jaxws.core.MessageContext;
 import org.apache.axis2.jaxws.server.EndpointCallback;
 import org.apache.axis2.jaxws.server.EndpointInvocationContext;
+import org.apache.axis2.jaxws.server.InvocationHelper;
 import org.apache.axis2.jaxws.server.InvocationListener;
 import org.apache.axis2.jaxws.server.InvocationListenerBean;
 import org.apache.axis2.jaxws.utility.ClassUtils;
@@ -145,6 +146,10 @@
                 } 
                 catch (Exception e) {
                     fault = ClassUtils.getRootCause(e);
+                    Throwable newFault = InvocationHelper.determineMappedException(fault, eic);
+                    if(newFault != null) {
+                        fault = newFault;
+                    }
                     faultThrown = true;
                 }
                 
@@ -153,6 +158,7 @@
                     if (log.isDebugEnabled()) {
                         log.debug("Invocation pattern was one way, work complete.");
                     }
+                    
                     responseReady(eic);
                     return null;
                 }

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/apache/axis2/jaxws/server/dispatcher/ProviderDispatcher.java?rev=635006&r1=635005&r2=635006&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 Sat Mar  8 08:49:09 2008
@@ -38,6 +38,7 @@
 import org.apache.axis2.jaxws.registry.FactoryRegistry;
 import org.apache.axis2.jaxws.server.EndpointCallback;
 import org.apache.axis2.jaxws.server.EndpointInvocationContext;
+import org.apache.axis2.jaxws.server.InvocationHelper;
 import org.apache.axis2.jaxws.server.ServerConstants;
 import org.apache.axis2.jaxws.utility.ClassUtils;
 import org.apache.axis2.jaxws.utility.ExecutorFactory;
@@ -367,6 +368,14 @@
         if (log.isDebugEnabled()) {
             log.debug("Create XMLFault for createFaultResponse");
         }
+        
+        // call the InvocationListener instances before marshalling
+        // the fault into a message
+        Throwable faultMessage = InvocationHelper.determineMappedException(fault, request);
+        if(faultMessage != null) {
+            fault = faultMessage;
+        }
+        
         Message m;
         try {
             EndpointDescription endpointDesc = request.getEndpointDescription();

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/spi/Constants.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/spi/Constants.java?rev=635006&r1=635005&r2=635006&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/spi/Constants.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/spi/Constants.java Sat Mar  8 08:49:09 2008
@@ -56,6 +56,16 @@
     // one that was used to create the request
     public static final String CACHE_CLASSLOADER = "CACHE_CLASSLOADER";
     
+    // Value = List
+    // Usage: Store list of InvocationListener instances for a given request/response
+    public static final String INVOCATION_LISTENER_LIST = 
+        "org.apache.axis2.jaxws.spi.INVOCATION_LISTENER_LIST";
+    
+    // Value = Throwable
+    // Usage: Store Throwable type that should be used when constructing message to be
+    // sent back to the client
+    public static final String MAPPED_EXCEPTION = "org.apache.axis2.jaxws.spi.MAPPED_EXCEPTION";
+    
     /** Intentionally Private */
     private Constants() {
     }

Modified: webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/server/JAXWSServerTests.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/server/JAXWSServerTests.java?rev=635006&r1=635005&r2=635006&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/server/JAXWSServerTests.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/server/JAXWSServerTests.java Sat Mar  8 08:49:09 2008
@@ -19,6 +19,7 @@
 
 package org.apache.axis2.jaxws.server;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
@@ -111,6 +112,74 @@
         assertTrue((Boolean) response.getProperty("responseReady"));
     }
     
+    /**
+     * This will test that exceptions are properly handed down to the registered
+     * instances of InvocationListener objects.
+     */
+    public void testHandleException() {
+        EndpointController controller = new EndpointController();
+        EndpointCallback callback = new EndpointCallback();
+        EndpointInvocationContext eic = new EndpointInvocationContextImpl();
+        MessageContext request = new MessageContext();
+        eic.setRequestMessageContext(request);
+        eic.addInvocationListener(new TestInvocationListener());
+        Exception e = new Exception();
+        InvocationHelper.callListenersForException(e, eic);
+        assertNotNull(request.getProperty(org.apache.axis2.jaxws.spi.Constants.MAPPED_EXCEPTION));
+        
+        // now test that in the case this happens on a response, we set values 
+        // on the response message context
+        MessageContext response = new MessageContext();
+        eic.setResponseMessageContext(response);
+        eic.addInvocationListener(new TestInvocationListener());
+        e = new Exception();
+        InvocationHelper.callListenersForException(e, eic);
+        assertNotNull(response.getProperty(org.apache.axis2.jaxws.spi.Constants.MAPPED_EXCEPTION));
+        
+        // now test the InvocationHelper method that accepts a throwable and
+        // MessageContext
+        controller = new EndpointController();
+        callback = new EndpointCallback();
+        eic = new EndpointInvocationContextImpl();
+        request = new MessageContext();
+        eic.setRequestMessageContext(request);
+        eic.addInvocationListener(new TestInvocationListener());
+        e = new Exception();
+        request.setProperty(org.apache.axis2.jaxws.spi.Constants.INVOCATION_LISTENER_LIST, 
+                            eic.getInvocationListeners());
+        InvocationHelper.callListenersForException(e, request);
+        assertNotNull(request.getProperty(org.apache.axis2.jaxws.spi.Constants.MAPPED_EXCEPTION));
+        
+    }
+    
+    /**
+     * This test will verify that the InvocationHelper.determineMappedException method is 
+     * capable of correctly identifying the method to be thrown on the server-side.
+     */
+    public void testDetermineException() {
+        
+        // test the signature of determineMappedException that takes an EndpointInvocationContext
+        EndpointController controller = new EndpointController();
+        EndpointInvocationContext eic = new EndpointInvocationContextImpl();
+        MessageContext request = new MessageContext();
+        eic.setRequestMessageContext(request);
+        eic.addInvocationListener(new TestInvocationListener());
+        Throwable t = InvocationHelper.determineMappedException(new ArrayIndexOutOfBoundsException(), eic);
+        assertNotNull(t);
+        assertTrue(t.getClass().getName().equals(NullPointerException.class.getName()));
+        
+        // test the signature of determineMappedException that takes a MessageContext
+        controller = new EndpointController();
+        request = new MessageContext();
+        List<InvocationListener> invocationListeners = new ArrayList<InvocationListener>();
+        invocationListeners.add(new TestInvocationListener());
+        request.setProperty(org.apache.axis2.jaxws.spi.Constants.INVOCATION_LISTENER_LIST, 
+                            invocationListeners);
+        t = InvocationHelper.determineMappedException(new ArrayIndexOutOfBoundsException(), request);
+        assertNotNull(t);
+        assertTrue(t.getClass().getName().equals(NullPointerException.class.getName()));
+    }
+    
     static class TestInvocationProcessorFactory1 implements InvocationListenerFactory {
         public InvocationListener createInvocationListener(MessageContext context) {
             return new TestInvocationListener();
@@ -131,9 +200,22 @@
                 bean.getEndpointInvocationContext().getRequestMessageContext().
                     setProperty("requestReceived", true);
             }
-            else {
+            else if (bean.getState().equals(InvocationListenerBean.State.RESPONSE)){
                 bean.getEndpointInvocationContext().getResponseMessageContext().
                     setProperty("responseReady", true);
+            }
+        }
+        
+        public void notifyOnException(InvocationListenerBean bean) {
+            if(bean.getState().equals(InvocationListenerBean.State.REQUEST)) {
+                bean.getEndpointInvocationContext().getRequestMessageContext().
+                    setProperty(org.apache.axis2.jaxws.spi.Constants.MAPPED_EXCEPTION, 
+                                new NullPointerException());
+            }
+            else if (bean.getState().equals(InvocationListenerBean.State.RESPONSE)){
+                bean.getEndpointInvocationContext().getResponseMessageContext().
+                    setProperty(org.apache.axis2.jaxws.spi.Constants.MAPPED_EXCEPTION, 
+                                new NullPointerException());
             }
         }
     }



---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org