You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@synapse.apache.org by as...@apache.org on 2007/03/08 13:27:07 UTC

svn commit: r516021 - in /webservices/synapse/trunk/java: modules/core/src/main/java/org/apache/synapse/ modules/core/src/main/java/org/apache/synapse/config/xml/ modules/core/src/main/java/org/apache/synapse/core/axis2/ modules/core/src/main/java/org/...

Author: asankha
Date: Thu Mar  8 04:27:05 2007
New Revision: 516021

URL: http://svn.apache.org/viewvc?view=rev&rev=516021
Log:
Fix issues with fault handling, and allow propagation of actual cause to Synapse. Also allow Synapse to send back a fault message through a new MC property named RESPONSE to convert a messages' direction after the changes to the fault mediator

Modified:
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/Constants.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/FaultHandler.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/MessageContext.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/SequenceMediatorFactory.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/SequenceMediatorSerializer.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2MessageContext.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/ProxyServiceMessageReceiver.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseCallbackReceiver.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseMessageReceiver.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/AddressEndpoint.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/MediatorFaultHandler.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/base/SequenceMediator.java
    webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transform/FaultMediator.java
    webservices/synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/TestMessageContext.java
    webservices/synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMessageContext.java
    webservices/synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ThreadLocalMessageContext.java
    webservices/synapse/trunk/java/modules/extensions/src/test/java/org/apache/synapse/TestMessageContext.java
    webservices/synapse/trunk/java/repository/conf/sample/synapse_sample_4.xml
    webservices/synapse/trunk/java/src/site/resources/Synapse_Samples.html

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/Constants.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/Constants.java?view=diff&rev=516021&r1=516020&r2=516021
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/Constants.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/Constants.java Thu Mar  8 04:27:05 2007
@@ -119,6 +119,8 @@
     /** Refers the ReplyTo header */
     String HEADER_REPLY_TO = "ReplyTo";
 
+    String RESPONSE = "RESPONSE";
+
     /** The tracing state -off */
     int TRACING_OFF =0;
     /** The tracing state-on */

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/FaultHandler.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/FaultHandler.java?view=diff&rev=516021&r1=516020&r2=516021
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/FaultHandler.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/FaultHandler.java Thu Mar  8 04:27:05 2007
@@ -19,19 +19,50 @@
 
 package org.apache.synapse;
 
+import java.util.Stack;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.io.PrintWriter;
+
 /**
- * This is the generic interface for the fault handlers in synapse. In the synapse message context
- * it has a stck of fault handlers and when ever a Synapse (Runtime) Exception has thrown this stack
- * will be examined by one of the SynapseMR, ProxyServiceMR, or CallbackReceiver and faultStack
- * will be poped to get the most relevant FaultHandler and execute the handleFault method.
+ * This is an abstract class that handles an unexpected error during Synapse mediation, but looking
+ * at the stack of registered FaultHanders and invoking on them as appropriate. Sequences and
+ * Endpoints would be Synapse entities that handles faults. If such an entity is unable to handle
+ * an error condition, then a SynapseException should be thrown, which triggers this fault
+ * handling logic.
  */
 public abstract class FaultHandler {
 
     public void handleFault(MessageContext synCtx) {
+
         try {
             onFault(synCtx);
-        } catch (SynapseException syne) {
-            ((FaultHandler)synCtx.getFaultStack().pop()).handleFault(synCtx);
+
+        } catch (SynapseException e) {
+
+            Stack faultStack = synCtx.getFaultStack();
+            if (faultStack != null && !faultStack.isEmpty()) {
+                ((FaultHandler) faultStack.pop()).handleFault(synCtx);
+            }
+        }
+    }
+
+    public void handleFault(MessageContext synCtx, Exception e) {
+
+        synCtx.setProperty(Constants.ERROR_CODE, "00000"); //TODO not yet defined
+        // use only the first line as the message for multiline exception messages (Axis2 has these)
+        synCtx.setProperty(Constants.ERROR_MESSAGE, e.getMessage().split("\n")[0]);
+        synCtx.setProperty(Constants.ERROR_DETAIL, getStackTrace(e));
+
+        try {
+            onFault(synCtx);
+
+        } catch (SynapseException se) {
+
+            Stack faultStack = synCtx.getFaultStack();
+            if (faultStack != null && !faultStack.isEmpty()) {
+                ((FaultHandler) faultStack.pop()).handleFault(synCtx, se);
+            }
         }
     }
 
@@ -41,4 +72,11 @@
      * @throws SynapseException in case there is a failure in the fault execution
      */
     public abstract void onFault(MessageContext synCtx);
+
+    private static String getStackTrace(Throwable aThrowable) {
+        final Writer result = new StringWriter();
+        final PrintWriter printWriter = new PrintWriter(result);
+        aThrowable.printStackTrace(printWriter);
+        return result.toString();
+    }
 }

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/MessageContext.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/MessageContext.java?view=diff&rev=516021&r1=516020&r2=516021
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/MessageContext.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/MessageContext.java Thu Mar  8 04:27:05 2007
@@ -312,6 +312,6 @@
 
     public Stack getFaultStack();
 
-    public void pushFault(FaultHandler fault);
+    public void pushFaultHandler(FaultHandler fault);
 
 }

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/SequenceMediatorFactory.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/SequenceMediatorFactory.java?view=diff&rev=516021&r1=516020&r2=516021
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/SequenceMediatorFactory.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/SequenceMediatorFactory.java Thu Mar  8 04:27:05 2007
@@ -94,7 +94,7 @@
         } else {
             n = elem.getAttribute(new QName(Constants.NULL_NAMESPACE, "key"));
             if (n != null) {
-                seqMediator.setRef(n.getAttributeValue());
+                seqMediator.setKey(n.getAttributeValue());
                 if (e != null) {
                     String msg = "A sequence mediator swhich a reference to another sequence can not have 'ErrorHandler'";
                     log.error(msg);

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/SequenceMediatorSerializer.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/SequenceMediatorSerializer.java?view=diff&rev=516021&r1=516020&r2=516021
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/SequenceMediatorSerializer.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/SequenceMediatorSerializer.java Thu Mar  8 04:27:05 2007
@@ -99,9 +99,9 @@
                         Constants.STATISTICS_ATTRIB_NAME, nullNS, statisticsValue));
             }
 
-            if (mediator.getRef() != null) {
+            if (mediator.getKey() != null) {
                 sequence.addAttribute(fac.createOMAttribute(
-                        "key", nullNS, mediator.getRef()));
+                        "key", nullNS, mediator.getKey()));
             } else if (mediator.getName() != null) {
                 sequence.addAttribute(fac.createOMAttribute(
                         "name", nullNS, mediator.getName()));

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2MessageContext.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2MessageContext.java?view=diff&rev=516021&r1=516020&r2=516021
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2MessageContext.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2MessageContext.java Thu Mar  8 04:27:05 2007
@@ -175,7 +175,7 @@
         setAxis2MessageContext(axisMsgCtx);
         this.synCfg = synCfg;
         this.synEnv = synEnv;
-        this.pushFault(new MediatorFaultHandler(synCfg.getFaultSequence()));
+        this.pushFaultHandler(new MediatorFaultHandler(synCfg.getFaultSequence()));
     }
 
     public EndpointReference getFaultTo() {
@@ -292,6 +292,10 @@
     }
 
     public boolean isResponse() {
+        Object o = properties.get(Constants.RESPONSE);
+        if (o != null && o instanceof String && ((String) o).equalsIgnoreCase("true")) {
+            return true;
+        }
         return response;
     }
 
@@ -315,7 +319,7 @@
         return this.faultStack;
     }
 
-    public void pushFault(FaultHandler fault) {
+    public void pushFaultHandler(FaultHandler fault) {
         this.faultStack.push(fault);
     }
 
@@ -446,11 +450,5 @@
         }
 
         return sb.toString();
-    }
-
-    public static void setErrorInformation(MessageContext synCtx, SynapseException e) {
-        synCtx.setProperty(Constants.ERROR_CODE, "00000"); //TODO not yet defined
-        synCtx.setProperty(Constants.ERROR_MESSAGE, e.getMessage());
-        synCtx.setProperty(Constants.ERROR_DETAIL, e.getStackTrace().toString());
     }
 }

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/ProxyServiceMessageReceiver.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/ProxyServiceMessageReceiver.java?view=diff&rev=516021&r1=516020&r2=516021
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/ProxyServiceMessageReceiver.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/ProxyServiceMessageReceiver.java Thu Mar  8 04:27:05 2007
@@ -75,7 +75,7 @@
                     Mediator faultSequence = synCtx.getSequence(proxy.getTargetFaultSequence());
                     if (faultSequence != null) {
                         log.debug("setting the fault sequence of the proxy to context");
-                        synCtx.pushFault(new MediatorFaultHandler(
+                        synCtx.pushFaultHandler(new MediatorFaultHandler(
                                 synCtx.getSequence(proxy.getTargetFaultSequence())));
                     } else {
                         // when we can not find the reference to the fault sequence of the proxy service we should not
@@ -86,7 +86,7 @@
                     }
                 } else if (proxy.getTargetInLineFaultSequence() != null) {
                     log.debug("Setting the anonymous fault sequence of the proxy to context");
-                    synCtx.pushFault(new MediatorFaultHandler(proxy.getTargetInLineFaultSequence()));
+                    synCtx.pushFaultHandler(new MediatorFaultHandler(proxy.getTargetInLineFaultSequence()));
                 }
 
                 // Using inSequence for the incoming message mediation
@@ -136,8 +136,8 @@
                 throw new SynapseException("Proxy Service with the name " + name + " does not exists");
             }
         } catch (SynapseException syne) {
-            if(!synCtx.getFaultStack().empty()) {
-                ((FaultHandler) synCtx.getFaultStack().pop()).handleFault(synCtx);
+            if (!synCtx.getFaultStack().isEmpty()) {
+                ((FaultHandler) synCtx.getFaultStack().pop()).handleFault(synCtx, syne);
             } else {
                 log.error("Synapse encountered an exception, " +
                         "No error handlers found - [Message Dropped]\n" + syne.getMessage());

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseCallbackReceiver.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseCallbackReceiver.java?view=diff&rev=516021&r1=516020&r2=516021
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseCallbackReceiver.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseCallbackReceiver.java Thu Mar  8 04:27:05 2007
@@ -27,11 +27,9 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.synapse.Constants;
 import org.apache.synapse.FaultHandler;
+import org.apache.synapse.endpoints.Endpoint;
 
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Collections;
-import java.util.Iterator;
+import java.util.*;
 
 public class SynapseCallbackReceiver implements MessageReceiver {
 
@@ -79,10 +77,21 @@
         org.apache.synapse.MessageContext synapseOutMsgCtx) {
 
         if (response.getEnvelope().getBody().hasFault()) {            
-            Object o = synapseOutMsgCtx.getFaultStack().pop();
-            ((FaultHandler) o).handleFault(synapseOutMsgCtx);
+            Stack faultStack = synapseOutMsgCtx.getFaultStack();
+            if (faultStack != null && !faultStack.isEmpty()) {
+                ((FaultHandler) faultStack.pop()).handleFault(
+                    synapseOutMsgCtx,
+                    response.getEnvelope().getBody().getFault().getException());
+            }
 
         } else {
+
+            // there can always be only one instance of an Endpoint in the faultStack of a message
+            // if the send was successful, so remove it before we proceed any further
+            Stack faultStack = synapseOutMsgCtx.getFaultStack();
+            if (!faultStack.isEmpty() && faultStack.peek() instanceof Endpoint) {
+                faultStack.pop();
+            }
 
             if (log.isDebugEnabled()) {
                 log.debug("Synapse received an asynchronous response message");

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseMessageReceiver.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseMessageReceiver.java?view=diff&rev=516021&r1=516020&r2=516021
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseMessageReceiver.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseMessageReceiver.java Thu Mar  8 04:27:05 2007
@@ -62,8 +62,8 @@
             // invoke synapse message mediation
             synCtx.getEnvironment().injectMessage(synCtx);
         } catch (SynapseException syne) {
-            if(!synCtx.getFaultStack().empty()) {
-                ((FaultHandler) synCtx.getFaultStack().pop()).handleFault(synCtx);
+            if (!synCtx.getFaultStack().isEmpty()) {
+                ((FaultHandler) synCtx.getFaultStack().pop()).handleFault(synCtx, syne);
             } else {
                 log.error("Synapse encountered an exception, " +
                         "No error handlers found - [Message Dropped]\n" + syne.getMessage());

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/AddressEndpoint.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/AddressEndpoint.java?view=diff&rev=516021&r1=516020&r2=516021
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/AddressEndpoint.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/AddressEndpoint.java Thu Mar  8 04:27:05 2007
@@ -30,6 +30,8 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import java.util.Stack;
+
 /**
  * This class represents an actual endpoint to send the message. It is resposible for sending the
  * message, performing reries if a failure occured and informing the parent endpoint if a failure
@@ -137,7 +139,7 @@
                 synCtx.setProperty(Constants.OUTFLOW_ADDRESSING_ON, Boolean.TRUE);
             }
 
-            synCtx.pushFault(this);
+            synCtx.pushFaultHandler(this);
             synCtx.getEnvironment().send(endpoint, synCtx);
         }
     }
@@ -150,15 +152,17 @@
         this.parentEndpoint = parentEndpoint;
     }
 
-    public void onFault(MessageContext synCtx) throws SynapseException {
+    public void onFault(MessageContext synCtx) {
         // perform retries here
 
         // if this endpoint has actually failed, inform the parent.
         if (parentEndpoint != null) {
             parentEndpoint.onChildEndpointFail(this, synCtx);
         } else {
-            Object o = synCtx.getFaultStack().pop();
-            ((FaultHandler) o).handleFault(synCtx);
+            Stack faultStack = synCtx.getFaultStack();
+            if (!faultStack.isEmpty()) {
+                ((FaultHandler) faultStack.pop()).handleFault(synCtx);
+            }
         }
     }
 }

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/MediatorFaultHandler.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/MediatorFaultHandler.java?view=diff&rev=516021&r1=516020&r2=516021
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/MediatorFaultHandler.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/MediatorFaultHandler.java Thu Mar  8 04:27:05 2007
@@ -62,7 +62,6 @@
     public void onFault(MessageContext synCtx) throws SynapseException {
 
         log.debug("MediatorFaultHandler :: handleFault");
-
         this.faultMediator.mediate(synCtx);
     }
 

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/base/SequenceMediator.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/base/SequenceMediator.java?view=diff&rev=516021&r1=516020&r2=516021
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/base/SequenceMediator.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/base/SequenceMediator.java Thu Mar  8 04:27:05 2007
@@ -25,12 +25,14 @@
 import org.apache.synapse.Constants;
 import org.apache.synapse.MessageContext;
 import org.apache.synapse.SynapseException;
-import org.apache.synapse.core.axis2.Axis2MessageContext;
 import org.apache.synapse.mediators.AbstractListMediator;
+import org.apache.synapse.mediators.MediatorFaultHandler;
 import org.apache.synapse.statistics.StatisticsUtils;
 import org.apache.synapse.statistics.StatisticsStack;
 import org.apache.synapse.statistics.impl.SequenceStatisticsStack;
 
+import java.util.Stack;
+
 /**
  * The Sequence mediator either refers to a named Sequence mediator instance
  * or is a *Named* list/sequence of other (child) Mediators
@@ -45,7 +47,7 @@
     private static final Log log = LogFactory.getLog(SequenceMediator.class);
     private static final Log trace = LogFactory.getLog(Constants.TRACE_LOGGER);
     private String name = null;
-    private String ref = null;
+    private String key = null;
     private String errorHandler = null;
     /** is this definition dynamic */
     private boolean dynamic = false;
@@ -69,7 +71,7 @@
     public boolean mediate(MessageContext synCtx) {
         log.debug("Sequence mediator <" + (name == null ? "anonymous" : name) + "> :: mediate()");
         boolean shouldTrace = shouldTrace(synCtx.getTracingState());
-        if (ref == null) {
+        if (key == null) {
             // Setting Required property to collect the sequence statistics
             boolean isStatisticsEnable = (org.apache.synapse.Constants.STATISTICS_ON == statisticsEnable);
             if (isStatisticsEnable) {
@@ -86,42 +88,24 @@
                 if (shouldTrace) {
                     trace.trace("Start : Sequence <" + (name == null ? "anonymous" : name) + ">");
                 }
-                return super.mediate(synCtx);
-
-            } catch (SynapseException e) {
 
+                // push the errorHandler sequence into the current message as the fault handler
                 if (errorHandler != null) {
-                    if (shouldTrace) {
-                        trace.trace("Sequence " + name + " encountered an exception. " +
-                                "Locating error handler sequence : " + errorHandler);
-                    }
-                    // set exception information to message context
-                    Axis2MessageContext.setErrorInformation(synCtx, e);
-                    Mediator errHandler = synCtx.getSequence(errorHandler);
-                    if (errHandler == null) {
-                        if (shouldTrace) {
-                            trace.trace("Sequence " + name + "; error handler sequence named '" +
-                                    errorHandler + "' not found");
-                        }
-                        handleException("Error handler sequence mediator instance named " +
-                                errorHandler + " cannot be found");
-                    } else {
-                        if (shouldTrace) {
-                            trace.trace("Sequence " + name + "; Executing error handler sequence : "
-                                    + errorHandler);
-                        }
-                        return errHandler.mediate(synCtx);
-                    }
-
-                } else {
-                    if (shouldTrace) {
-                        trace.trace("Sequence " + name + " encountered an exception, but does " +
-                                "not specify an error handler");
-                    }
-                    throw e;
+                    synCtx.pushFaultHandler(
+                        new MediatorFaultHandler(synCtx.getSequence(errorHandler)));
                 }
 
+                return super.mediate(synCtx);
+
             } finally {
+
+                // pop our error handler from the fault stack if we pushed it
+                Stack faultStack = synCtx.getFaultStack();
+                if (errorHandler != null && !faultStack.isEmpty() &&
+                    synCtx.getSequence(errorHandler).equals(faultStack.peek())) {
+                    faultStack.pop();
+                }
+
                 //If this sequence is finished it's task normally
                 if (isStatisticsEnable) {
                     StatisticsUtils.processSequenceStatistics(synCtx);
@@ -134,15 +118,15 @@
             }
 
         } else {
-            Mediator m = synCtx.getSequence(ref);
+            Mediator m = synCtx.getSequence(key);
             if (m == null) {
                 if (shouldTrace) {
-                    trace.trace("Sequence named " + ref + " cannot be found.");
+                    trace.trace("Sequence named " + key + " cannot be found.");
                 }
-                handleException("Sequence named " + ref + " cannot be found.");
+                handleException("Sequence named " + key + " cannot be found.");
             } else {
                 if (shouldTrace) {
-                    trace.trace("Executing sequence named " + ref);
+                    trace.trace("Executing sequence named " + key);
                 }
                 return m.mediate(synCtx);
             }
@@ -163,12 +147,12 @@
         this.name = name;
     }
 
-    public String getRef() {
-        return ref;
+    public String getKey() {
+        return key;
     }
 
-    public void setRef(String ref) {
-        this.ref = ref;
+    public void setKey(String key) {
+        this.key = key;
     }
 
     public String getErrorHandler() {

Modified: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transform/FaultMediator.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transform/FaultMediator.java?view=diff&rev=516021&r1=516020&r2=516021
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transform/FaultMediator.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transform/FaultMediator.java Thu Mar  8 04:27:05 2007
@@ -21,6 +21,7 @@
 
 import org.apache.axiom.om.OMAbstractFactory;
 import org.apache.axiom.om.OMDocument;
+import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.xpath.AXIOMXPath;
 import org.apache.axiom.soap.*;
 import org.apache.axis2.AxisFault;
@@ -129,8 +130,13 @@
         Iterator iter = synCtx.getEnvelope().getHeader().examineAllHeaderBlocks();
         if (iter.hasNext()) {
             while (iter.hasNext()) {
-                SOAPHeaderBlock header = (SOAPHeaderBlock) iter.next();
-                faultEnvelope.getHeader().addChild(header);
+                Object o = iter.next();
+                if (o instanceof SOAPHeaderBlock) {
+                    SOAPHeaderBlock header = (SOAPHeaderBlock) o;
+                    faultEnvelope.getHeader().addChild(header);
+                } else if (o instanceof OMElement) {
+                    faultEnvelope.getHeader().addChild((OMElement) o);
+                }
             }
         }
         log.debug("The fault message as : " + fault);

Modified: webservices/synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/TestMessageContext.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/TestMessageContext.java?view=diff&rev=516021&r1=516020&r2=516021
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/TestMessageContext.java (original)
+++ webservices/synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/TestMessageContext.java Thu Mar  8 04:27:05 2007
@@ -256,7 +256,7 @@
         return null;
     }
 
-    public void pushFault(FaultHandler fault) {
+    public void pushFaultHandler(FaultHandler fault) {
     }
 
     public MessageContext getSynapseContext() {

Modified: webservices/synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMessageContext.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMessageContext.java?view=diff&rev=516021&r1=516020&r2=516021
==============================================================================
--- webservices/synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMessageContext.java (original)
+++ webservices/synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMessageContext.java Thu Mar  8 04:27:05 2007
@@ -275,8 +275,8 @@
         return mc.getFaultStack();
     }
 
-    public void pushFault(FaultHandler fault) {
-        mc.pushFault(fault);
+    public void pushFaultHandler(FaultHandler fault) {
+        mc.pushFaultHandler(fault);
     }
 
 }

Modified: webservices/synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ThreadLocalMessageContext.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ThreadLocalMessageContext.java?view=diff&rev=516021&r1=516020&r2=516021
==============================================================================
--- webservices/synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ThreadLocalMessageContext.java (original)
+++ webservices/synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ThreadLocalMessageContext.java Thu Mar  8 04:27:05 2007
@@ -269,7 +269,7 @@
         return getMC().getFaultStack();
     }
 
-    public void pushFault(FaultHandler fault) {
-        getMC().pushFault(fault);
+    public void pushFaultHandler(FaultHandler fault) {
+        getMC().pushFaultHandler(fault);
     }
 }

Modified: webservices/synapse/trunk/java/modules/extensions/src/test/java/org/apache/synapse/TestMessageContext.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/extensions/src/test/java/org/apache/synapse/TestMessageContext.java?view=diff&rev=516021&r1=516020&r2=516021
==============================================================================
--- webservices/synapse/trunk/java/modules/extensions/src/test/java/org/apache/synapse/TestMessageContext.java (original)
+++ webservices/synapse/trunk/java/modules/extensions/src/test/java/org/apache/synapse/TestMessageContext.java Thu Mar  8 04:27:05 2007
@@ -270,7 +270,7 @@
         return null;
     }
 
-    public void pushFault(FaultHandler fault) {
+    public void pushFaultHandler(FaultHandler fault) {
         return;
     }
 }

Modified: webservices/synapse/trunk/java/repository/conf/sample/synapse_sample_4.xml
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/repository/conf/sample/synapse_sample_4.xml?view=diff&rev=516021&r1=516020&r2=516021
==============================================================================
--- webservices/synapse/trunk/java/repository/conf/sample/synapse_sample_4.xml (original)
+++ webservices/synapse/trunk/java/repository/conf/sample/synapse_sample_4.xml Thu Mar  8 04:27:05 2007
@@ -17,71 +17,71 @@
   ~  under the License.
   -->
 
-<synapse xmlns="http://ws.apache.org/ns/synapse">
+<!-- introduction to error handling -->
+<definitions xmlns="http://ws.apache.org/ns/synapse">
 
-    <!-- illustration of various mediators : try-catch-finally and makefault mediators -->
-    <definitions>
-
-        <!-- define an endpoint for the stock quote service -->
-        <endpoint name="simple">
-            <address uri="http://localhost:9000/axis2/services/SimpleStockQuoteService"/>
-        </endpoint>
-
-        <!-- define a non-existent endpoint to test error handling -->
-        <endpoint name="bogus">
-            <address uri="http://localhost:9009/axis2/services/NonExistentStockQuoteService"/>
-        </endpoint>
-
-        <!-- define a sequence to be used for error handling -->
-        <sequence name="errorHandler">
-
-            <!-- Log the error -->
-            <log level="custom">
-                <property name="text" value="An unexpected error occured"/>
-                <property name="message" expression="get-property('ERROR_MESSAGE')"/>
-                <property name="detail" expression="get-property('ERROR_DETAIL')"/>
-            </log>
-
-            <!-- create a custom fault message -->
-            <makefault>
-                <code value="tns:Receiver" xmlns:tns="http://www.w3.org/2003/05/soap-envelope"/>
-                <reason expression="get-property('ERROR_MESSAGE')"/>
-            </makefault>
-
-            <send/>
-        </sequence>
-    </definitions>
-
-    <rules>
-
-        <try>
-            <sequence>
-                <switch source="//m0:getQuote/m0:request/m0:symbol"
-                        xmlns:m0="http://services.samples/xsd">
-                    <case regex="IBM">
-                        <send>
-                            <endpoint ref="simple"/>
-                        </send>
-                    </case>
-                    <case regex="MSFT">
-                        <send>
-                            <endpoint ref="bogus"/>
-                        </send>
-                    </case>
-                </switch>
-            </sequence>
-            <onError>
-                <sequence ref="errorHandler"/>
-            </onError>
-            <finally>
-                <log level="custom">
-                    <property name="message" value="Processed request"/>
-                </log>
-            </finally>
-        </try>
+    <!-- define an endpoint for the stock quote service -->
+    <endpoint name="simple">
+        <address uri="http://localhost:9000/axis2/services/SimpleStockQuoteService"/>
+    </endpoint>
+
+    <!-- define a non-existent host to test error handling (runtime exception for invalid host)-->
+    <endpoint name="bogusHost">
+        <address uri="http://bogus:9000/axis2/services/NonExistentStockQuoteService"/>
+    </endpoint>
+
+    <!-- define a non-existent port to test error handling (error handling) -->
+    <endpoint name="bogusPort">
+        <address uri="http://localhost:9009/axis2/services/NonExistentStockQuoteService"/>
+    </endpoint>
+
+    <!-- the default fault handling sequence used by Synapse - named 'fault' -->
+    <sequence name="fault">
+        <!-- Log the error -->
+        <log level="custom">
+            <property name="text" value="An unexpected error occured"/>
+            <property name="message" expression="get-property('ERROR_MESSAGE')"/>
+            <!--<property name="detail" expression="get-property('ERROR_DETAIL')"/>-->
+        </log>
+
+        <!-- create a custom fault message -->
+        <makefault>
+            <code value="tns:Receiver" xmlns:tns="http://www.w3.org/2003/05/soap-envelope"/>
+            <reason expression="get-property('ERROR_MESSAGE')"/>
+        </makefault>
 
+        <property name="RESPONSE" value="true"/>
+        <header name="To" expression="get-property('ReplyTo')"/>
         <send/>
+    </sequence>
+
+    <!-- default message handling sequence used by Synapse - named 'main' -->
+    <sequence name="main">
+        <in>
+            <switch source="//m0:getQuote/m0:request/m0:symbol"
+                    xmlns:m0="http://services.samples/xsd">
+                <case regex="IBM">
+                    <send>
+                        <endpoint key="simple"/>
+                    </send>
+                </case>
+                <case regex="MSFT">
+                    <send>
+                        <endpoint key="bogusHost"/>
+                    </send>
+                </case>
+                <case regex="SUN">
+                    <send>
+                        <endpoint key="bogusPort"/>
+                    </send>
+                </case>
+            </switch>
+            <drop/>
+        </in>
 
-    </rules>
+        <out>
+            <send/>
+        </out>
+    </sequence>
 
-</synapse> 
\ No newline at end of file
+</definitions>

Modified: webservices/synapse/trunk/java/src/site/resources/Synapse_Samples.html
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/src/site/resources/Synapse_Samples.html?view=diff&rev=516021&r1=516020&r2=516021
==============================================================================
--- webservices/synapse/trunk/java/src/site/resources/Synapse_Samples.html (original)
+++ webservices/synapse/trunk/java/src/site/resources/Synapse_Samples.html Thu Mar  8 04:27:05 2007
@@ -461,71 +461,76 @@
 <h2><a name="Sample4">HERE___</a></h2>
 
 <h2><a name="Sample41" id="Sample41">Sample 4:</a></h2>
-<pre>&lt;synapse xmlns="http://ws.apache.org/ns/synapse"&gt;
+<pre>&lt;!-- introduction to error handling --&gt;
+&lt;definitions xmlns="http://ws.apache.org/ns/synapse"&gt;
 
-    &lt;!-- illustration of various mediators : try-catch-finally and makefault mediators --&gt;
-    &lt;definitions&gt;
+    &lt;!-- define an endpoint for the stock quote service --&gt;
+    &lt;endpoint name="simple"&gt;
+        &lt;address uri="http://localhost:9000/axis2/services/SimpleStockQuoteService"/&gt;
+    &lt;/endpoint&gt;
+
+    &lt;!-- define a non-existent host to test error handling (runtime exception for invalid host)--&gt;
+    &lt;endpoint name="bogusHost"&gt;
+        &lt;address uri="http://bogus:9000/axis2/services/NonExistentStockQuoteService"/&gt;
+    &lt;/endpoint&gt;
+
+    &lt;!-- define a non-existent port to test error handling (error handling) --&gt;
+    &lt;endpoint name="bogusPort"&gt;
+        &lt;address uri="http://localhost:9009/axis2/services/NonExistentStockQuoteService"/&gt;
+    &lt;/endpoint&gt;
+
+    &lt;!-- the default fault handling sequence used by Synapse - named 'fault' --&gt;
+    &lt;sequence name="fault"&gt;
+        &lt;!-- Log the error --&gt;
+        &lt;log level="custom"&gt;
+            &lt;property name="text" value="An unexpected error occured"/&gt;
+            &lt;property name="message" expression="get-property('ERROR_MESSAGE')"/&gt;
+            &lt;!-- # pick stack trace # &lt;property name="detail" expression="get-property('ERROR_DETAIL')"/&gt;--&gt;
+        &lt;/log&gt;
+
+        &lt;!-- create a custom fault message --&gt;
+        &lt;makefault&gt;
+            &lt;code value="tns:Receiver" xmlns:tns="http://www.w3.org/2003/05/soap-envelope"/&gt;
+            &lt;reason expression="get-property('ERROR_MESSAGE')"/&gt;
+        &lt;/makefault&gt;
 
-        &lt;!-- define an endpoint for the stock quote service --&gt;
-        &lt;endpoint name="simple"
-                  address="http://localhost:9000/axis2/services/SimpleStockQuoteService"/&gt;
-
-        &lt;!-- define a non-existent endpoint to test error handling --&gt;
-        &lt;endpoint name="bogus"
-                  address="http://localhost:9009/axis2/services/NonExistentStockQuoteService"/&gt;
-
-        &lt;!-- define a sequence to be used for error handling --&gt;
-        &lt;sequence name="errorHandler"&gt;
-
-            &lt;!-- Log the error --&gt;
-            &lt;log level="custom"&gt;
-                &lt;property name="text" value="An unexpected error occured"/&gt;
-                &lt;property name="message" expression="get-property('ERROR_MESSAGE')"/&gt;
-                &lt;property name="detail" expression="get-property('ERROR_DETAIL')"/&gt;
-            &lt;/log&gt;
-
-            &lt;!-- create a custom fault message --&gt;
-            &lt;makefault&gt;
-                &lt;code value="tns:Receiver" xmlns:tns="http://www.w3.org/2003/05/soap-envelope"/&gt;
-                &lt;reason expression="get-property('ERROR_MESSAGE')"/&gt;
-            &lt;/makefault&gt;
-
-            &lt;send/&gt;
-        &lt;/sequence&gt;
-    &lt;/definitions&gt;
+        &lt;property name="RESPONSE" value="true"/&gt;
+        &lt;header name="To" expression="get-property('ReplyTo')"/&gt;
+        &lt;send/&gt;
+    &lt;/sequence&gt;
 
-    &lt;rules&gt;
+    &lt;!-- default message handling sequence used by Synapse - named 'main' --&gt;
+    &lt;sequence name="main"&gt;
+        &lt;in&gt;
+            &lt;switch source="//m0:getQuote/m0:request/m0:symbol"
+                    xmlns:m0="http://services.samples/xsd"&gt;
+                &lt;case regex="IBM"&gt;
+                    &lt;send&gt;
+                        &lt;endpoint key="simple"/&gt;
+                    &lt;/send&gt;
+                &lt;/case&gt;
+                &lt;case regex="MSFT"&gt;
+                    &lt;send&gt;
+                        &lt;endpoint key="bogusHost"/&gt;
+                    &lt;/send&gt;
+                &lt;/case&gt;
+                &lt;case regex="SUN"&gt;
+                    &lt;send&gt;
+                        &lt;endpoint key="bogusPort"/&gt;
+                    &lt;/send&gt;
+                &lt;/case&gt;
+            &lt;/switch&gt;
+            &lt;drop/&gt;
+        &lt;/in&gt;
 
-        &lt;try&gt;
-            &lt;sequence&gt;
-                &lt;switch source="//m0:getQuote/m0:request/m0:symbol"
-                        xmlns:m0="http://services.samples/xsd"&gt;
-                    &lt;case regex="IBM"&gt;
-                        &lt;send&gt;
-                            &lt;endpoint ref="simple"/&gt;
-                        &lt;/send&gt;
-                    &lt;/case&gt;
-                    &lt;case regex="MSFT"&gt;
-                        &lt;send&gt;
-                            &lt;endpoint ref="bogus"/&gt;
-                        &lt;/send&gt;
-                    &lt;/case&gt;
-                &lt;/switch&gt;
-            &lt;/sequence&gt;
-            &lt;onError&gt;
-                &lt;sequence ref="errorHandler"/&gt;
-            &lt;/onError&gt;
-            &lt;finally&gt;
-                &lt;log level="custom"&gt;
-                    &lt;property name="message" value="Processed request"/&gt;
-                &lt;/log&gt;
-            &lt;/finally&gt;
-        &lt;/try&gt;
+        &lt;out&gt;
+            &lt;send/&gt;
+        &lt;/out&gt;
+    &lt;/sequence&gt;
 
-        &lt;send/&gt;
+&lt;/definitions&gt;
 
-    &lt;/rules&gt;
-&lt;/synapse&gt; </pre>
+ </pre>
 
 <p><strong>Objective: Introduction to error handling with the try and
 makefault mediators</strong></p>



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