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);
}