Author: midon
Date: Tue Apr 14 23:38:29 2009
New Revision: 765008

URL: http://svn.apache.org/viewvc?rev=765008&view=rev
Log:
ODE-578: better error reporting

Modified:
    
ode/branches/APACHE_ODE_1.X/axis2-war/src/test/java/org/apache/ode/axis2/FailFastTest.java
    
ode/branches/APACHE_ODE_1.X/axis2-war/src/test/resources/TestFailFast/HelloWorld2.bpel
    
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/ODEService.java
    
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/OdeFault.java
    
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/SoapExternalService.java
    
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/util/SoapMessageConverter.java
    
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
    
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/MessageExchangeImpl.java
    
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/INVOKE.java

Modified: 
ode/branches/APACHE_ODE_1.X/axis2-war/src/test/java/org/apache/ode/axis2/FailFastTest.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/axis2-war/src/test/java/org/apache/ode/axis2/FailFastTest.java?rev=765008&r1=765007&r2=765008&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/axis2-war/src/test/java/org/apache/ode/axis2/FailFastTest.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/axis2-war/src/test/java/org/apache/ode/axis2/FailFastTest.java
 Tue Apr 14 23:38:29 2009
@@ -22,8 +22,10 @@
             String response = 
server.sendRequestFile("http://localhost:8888/processes/helloWorld";,
                     bundleName, "testRequest.soap");
             System.out.println(response);
-            String badBadMessage = "java.util.concurrent.TimeoutException: 
Message exchange 
org.apache.ode.bpel.engine.MyRoleMessageExchangeImpl$ResponseFuture";
-            assertFalse("Client should NOT time out! It should receive the 
true failure", response.contains(badBadMessage));
+            String badMessage = "java.util.concurrent.TimeoutException: 
Message exchange 
org.apache.ode.bpel.engine.MyRoleMessageExchangeImpl$ResponseFuture";
+            String rightMessage = "The service cannot be found for the 
endpoint reference (EPR) 127.0.0.1/processes/DummyService";
+            assertFalse("Client should NOT time out! It should receive the 
true failure", response.contains(badMessage));
+            assertTrue("Client did not receive the right error message!", 
response.contains(rightMessage));
         } finally {
             server.undeployProcess(bundleName);
         }

Modified: 
ode/branches/APACHE_ODE_1.X/axis2-war/src/test/resources/TestFailFast/HelloWorld2.bpel
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/axis2-war/src/test/resources/TestFailFast/HelloWorld2.bpel?rev=765008&r1=765007&r2=765008&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/axis2-war/src/test/resources/TestFailFast/HelloWorld2.bpel
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/axis2-war/src/test/resources/TestFailFast/HelloWorld2.bpel
 Tue Apr 14 23:38:29 2009
@@ -39,9 +39,8 @@
     
    <variables>
      <variable name="myVar" messageType="test:HelloMessage"/>
-     <variable name="faultInput" messageType="dummy:helloRequest"/>
-     <variable name="faultOutput" messageType="dummy:helloResponse"/>
-     <variable name="faultVar" messageType="dummy:DummyExceptionType"/>
+     <variable name="opInput" messageType="dummy:helloRequest"/>
+     <variable name="opOutput" messageType="dummy:helloResponse"/>
      <variable name="tmpVar" type="xsd:string"/>
    </variables>
 
@@ -51,14 +50,12 @@
 
        <assign>
            <copy>
-                
<from><literal><dummy:faultTest><dummy:in>Hello</dummy:in></dummy:faultTest></literal></from>
-                <to>$faultInput.parameters</to>
+                
<from><literal><dummy:hello>Hello</dummy:hello></literal></from>
+                <to>$opInput.parameters</to>
            </copy>
        </assign>
-
        <invoke partnerLink="dummyPartnerLink" 
portType="test:DummyServicePortType"
-               operation="hello" inputVariable="faultInput" 
outputVariable="faultOutput"/>
-
+               operation="hello" inputVariable="opInput" 
outputVariable="opOutput"/>
        <assign>
            <copy>
                <from><literal>foo</literal></from>

Modified: 
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/ODEService.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/ODEService.java?rev=765008&r1=765007&r2=765008&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/ODEService.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/ODEService.java
 Tue Apr 14 23:38:29 2009
@@ -34,6 +34,7 @@
 import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPFault;
+import org.apache.axiom.om.OMElement;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.description.AxisService;
@@ -55,9 +56,13 @@
 import org.apache.ode.utils.GUID;
 import org.apache.ode.utils.Namespaces;
 import org.apache.ode.utils.Properties;
+import org.apache.ode.il.OMUtils;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
+import javax.xml.transform.dom.DOMSource;
+import java.io.IOException;
+
 /**
  * A running service, encapsulates the Axis service, its receivers and our
  * receivers as well.
@@ -258,7 +263,10 @@
                 writeHeader(msgContext, mex);
                 break;
             case FAILURE:
-                throw new OdeFault("Message exchange failure");
+                if (__log.isDebugEnabled())
+                    __log.debug("Failure response message: " + mex.getFault());
+                OdeFault odeFault = 
_converter.createOdeFault(mex.getFaultExplanation(), mex.getFaultResponse());
+                throw odeFault;
             default:
                 throw new OdeFault("Received ODE message exchange in 
unexpected state: " + mex.getStatus());
         }

Modified: 
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/OdeFault.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/OdeFault.java?rev=765008&r1=765007&r2=765008&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/OdeFault.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/OdeFault.java
 Tue Apr 14 23:38:29 2009
@@ -22,6 +22,7 @@
 import javax.xml.namespace.QName;
 
 import org.apache.axis2.AxisFault;
+import org.apache.axiom.om.OMElement;
 
 /**
  * User-friendly version of AxisFault
@@ -46,4 +47,7 @@
         super(new QName("java:"+cause.getClass().getPackage(), 
cause.getClass().getName(), "java"), message, cause);
     }
 
+    public OdeFault(String message, OMElement faultDetail) {
+        super(FAULT, message, null, null, faultDetail);
+    }
 }

Modified: 
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/SoapExternalService.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/SoapExternalService.java?rev=765008&r1=765007&r2=765008&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/SoapExternalService.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/SoapExternalService.java
 Tue Apr 14 23:38:29 2009
@@ -20,6 +20,8 @@
 package org.apache.ode.axis2;
 
 import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.axiom.soap.SOAPFaultReason;
+import org.apache.axiom.soap.SOAPFault;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.addressing.EndpointReference;
 import org.apache.axis2.client.OperationClient;
@@ -487,8 +489,11 @@
                             } else {
                                 if (__log.isWarnEnabled())
                                     __log.warn("Fault response: 
faultType=(unkown)\n" + reply.getEnvelope().toString());
-                                odeMex.replyWithFailure(FailureType.OTHER, 
reply.getEnvelope().getBody().getFault().getReason().getText(),
-                                        
OMUtils.toDOM(reply.getEnvelope().getBody()));
+                                final SOAPFaultReason r = 
reply.getEnvelope().getBody().getFault().getReason();
+                                SOAPFault f = 
reply.getEnvelope().getBody().getFault();
+                                String reason = r != null ? r.getText() : 
"Unspecified";
+                                Element details = f != null ? OMUtils.toDOM(f) 
: null;
+                                odeMex.replyWithFailure(FailureType.OTHER, 
reason, details);
                             }
                         } else {
                             Message response = 
odeMex.createMessage(odeMex.getOperation().getOutput().getMessage().getQName());

Modified: 
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/util/SoapMessageConverter.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/util/SoapMessageConverter.java?rev=765008&r1=765007&r2=765008&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/util/SoapMessageConverter.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/util/SoapMessageConverter.java
 Tue Apr 14 23:38:29 2009
@@ -44,7 +44,9 @@
 import javax.wsdl.extensions.soap.SOAPHeader;
 import javax.wsdl.extensions.soap.SOAPOperation;
 import javax.xml.namespace.QName;
+import javax.xml.transform.dom.DOMSource;
 import java.util.*;
+import java.io.IOException;
 
 import org.apache.axiom.om.OMAbstractFactory;
 import org.apache.axiom.om.OMElement;
@@ -544,4 +546,28 @@
         return WsdlUtils.inferFault(operation, elName);
     }
 
+    /**
+     *
+     * @param faultExplanation
+     * @param faultResponse
+     * @return an OdeFault
+     */
+    public OdeFault createOdeFault(String faultExplanation, 
org.apache.ode.bpel.iapi.Message faultResponse) {
+        String message = new StringBuilder("Message exchange failure due to: 
").append(faultExplanation).toString();
+        OMElement detail = null;
+        if (faultResponse!=null) {
+            Element messageElement = faultResponse.getMessage();
+            if (messageElement != null) {
+                Element detailElement = 
DOMUtils.getFirstChildElement(messageElement);
+                if (detailElement != null) {
+                    try {
+                        detail = OMUtils.toOM(new DOMSource(messageElement));
+                    } catch (IOException ignore) {
+                    }
+                }
+            }
+        }
+        return new OdeFault(message, detail);
+    }
+
 }

Modified: 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java?rev=765008&r1=765007&r2=765008&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
 Tue Apr 14 23:38:29 2009
@@ -50,7 +50,6 @@
 import org.apache.ode.bpel.evt.ProcessMessageExchangeEvent;
 import org.apache.ode.bpel.evt.ProcessTerminationEvent;
 import org.apache.ode.bpel.evt.ScopeEvent;
-import org.apache.ode.bpel.iapi.BpelEngine;
 import org.apache.ode.bpel.iapi.BpelEngineException;
 import org.apache.ode.bpel.iapi.ContextException;
 import org.apache.ode.bpel.iapi.Endpoint;
@@ -1240,6 +1239,7 @@
         MessageExchange.Status status = 
MessageExchange.Status.valueOf(dao.getStatus());
         switch (status) {
             case FAULT:
+            case FAILURE:
             case RESPONSE:
                 response = dao.getResponse();
                 if (response == null) {
@@ -1299,6 +1299,18 @@
         __log.info("ActivityRecovery: Registering activity " + activityId + ", 
failure reason: " + reason +
                 " on channel " + channel.export());
         _dao.createActivityRecovery(channel.export(), (int) activityId, 
reason, dateTime, details, actions, retries);
+        // Release and fail any outstanding request
+        String[] mexRefs = _outstandingRequests.releaseAll();
+        if(mexRefs!=null){
+            for(String mexRef:mexRefs){
+                MessageExchangeDAO mexDao = 
_dao.getConnection().getMessageExchange(mexRef);
+                if (mexDao !=null) {
+                    MyRoleMessageExchangeImpl mex = new 
MyRoleMessageExchangeImpl(_bpelProcess, _bpelProcess._engine, mexDao);
+                    _bpelProcess.initMyRoleMex(mex);
+                    mex.setFailure(FailureType.OTHER, reason, details);
+                }
+            }
+        }
     }
 
     public void unregisterActivityForRecovery(ActivityRecoveryChannel channel) 
{

Modified: 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/MessageExchangeImpl.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/MessageExchangeImpl.java?rev=765008&r1=765007&r2=765008&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/MessageExchangeImpl.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/MessageExchangeImpl.java
 Tue Apr 14 23:38:29 2009
@@ -28,6 +28,7 @@
 import org.apache.ode.bpel.iapi.Message;
 import org.apache.ode.bpel.iapi.MessageExchange;
 import org.apache.ode.utils.msg.MessageBundle;
+import org.apache.ode.utils.Namespaces;
 import org.w3c.dom.Element;
 
 import javax.wsdl.Operation;
@@ -175,9 +176,14 @@
     }
 
     void setFailure(FailureType type, String reason, Element details) throws 
BpelEngineException {
-        // TODO not using FailureType, nor details
+        // TODO not using FailureType
         setStatus(Status.FAILURE);
         getDAO().setFaultExplanation(reason);
+        if (details != null) {
+            Message message = createMessage(new 
QName(Namespaces.ODE_EXTENSION_NS, "failureMessage"));
+            message.setMessage(details);
+            getDAO().setResponse(((MessageImpl) message)._dao);
+        }
         responseReceived();        
     }
 

Modified: 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/INVOKE.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/INVOKE.java?rev=765008&r1=765007&r2=765008&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/INVOKE.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/INVOKE.java
 Tue Apr 14 23:38:29 2009
@@ -184,10 +184,10 @@
                         // and either retry or indicate failure condition.
                         // admin to resume the process.
                         String reason = 
getBpelRuntimeContext().getPartnerFaultExplanation(mexId);
+                        Element msg = 
getBpelRuntimeContext().getPartnerResponse(mexId);
                         __log.error("Failure during invoke: " + reason);
                         try {
-                            Element el = 
DOMUtils.stringToDOM("<invokeFailure><![CDATA["+reason+"]]></invokeFailure>");
-                            _self.parent.failure(reason, el);
+                            _self.parent.failure(reason, msg);
                         } catch (Exception e) {
                             _self.parent.failure(reason, null);
                         }


Reply via email to