Return-Path: Delivered-To: apmail-ode-commits-archive@www.apache.org Received: (qmail 31587 invoked from network); 9 Oct 2007 17:43:35 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 9 Oct 2007 17:43:35 -0000 Received: (qmail 87628 invoked by uid 500); 9 Oct 2007 17:43:23 -0000 Delivered-To: apmail-ode-commits-archive@ode.apache.org Received: (qmail 87587 invoked by uid 500); 9 Oct 2007 17:43:23 -0000 Mailing-List: contact commits-help@ode.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ode.apache.org Delivered-To: mailing list commits@ode.apache.org Received: (qmail 87578 invoked by uid 99); 9 Oct 2007 17:43:22 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 09 Oct 2007 10:43:22 -0700 X-ASF-Spam-Status: No, hits=-100.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 09 Oct 2007 17:43:23 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 30BCC1A9832; Tue, 9 Oct 2007 10:42:33 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r583235 - in /ode/trunk: axis2/src/main/java/org/apache/ode/axis2/ axis2/src/main/java/org/apache/ode/axis2/hooks/ axis2/src/main/java/org/apache/ode/axis2/util/ utils/src/main/java/org/apache/ode/utils/ Date: Tue, 09 Oct 2007 17:42:32 -0000 To: commits@ode.apache.org From: mriou@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20071009174233.30BCC1A9832@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: mriou Date: Tue Oct 9 10:42:31 2007 New Revision: 583235 URL: http://svn.apache.org/viewvc?rev=583235&view=rev Log: ODE-194 Soap faults extravaganza, made sure we got them properly, transmit them properly and return them properly. Should comply a bit more with the profile as well. Modified: ode/trunk/axis2/src/main/java/org/apache/ode/axis2/ExternalService.java ode/trunk/axis2/src/main/java/org/apache/ode/axis2/ODEService.java ode/trunk/axis2/src/main/java/org/apache/ode/axis2/hooks/ODEMessageReceiver.java ode/trunk/axis2/src/main/java/org/apache/ode/axis2/util/SoapMessageConverter.java ode/trunk/utils/src/main/java/org/apache/ode/utils/Namespaces.java Modified: ode/trunk/axis2/src/main/java/org/apache/ode/axis2/ExternalService.java URL: http://svn.apache.org/viewvc/ode/trunk/axis2/src/main/java/org/apache/ode/axis2/ExternalService.java?rev=583235&r1=583234&r2=583235&view=diff ============================================================================== --- ode/trunk/axis2/src/main/java/org/apache/ode/axis2/ExternalService.java (original) +++ ode/trunk/axis2/src/main/java/org/apache/ode/axis2/ExternalService.java Tue Oct 9 10:42:31 2007 @@ -115,6 +115,7 @@ options.setAction(mctx.getSoapAction()); options.setTo(axisEPR); options.setTimeOutInMilliSeconds(60000); + options.setExceptionToBeThrownOnSOAPFault(false); CachedServiceClient cached = _cachedClients.get(); long now = System.currentTimeMillis(); @@ -139,10 +140,13 @@ operationClient.execute(true); MessageContext response = operationClient.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE); MessageContext flt = operationClient.getMessageContext(WSDLConstants.MESSAGE_LABEL_FAULT_VALUE); + if (response != null && __log.isDebugEnabled()) + __log.debug("Got service response: " + response.getEnvelope().toString()); + if (flt != null) { reply(mexId, operation, flt, true); } else { - reply(mexId, operation, response, false); + reply(mexId, operation, response, response.isFault()); } } catch (Throwable t) { String errmsg = "Error sending message to Axis2 for ODE mex " + odeMex; @@ -269,19 +273,23 @@ try { if (fault) { faultType = _converter.parseSoapFault(odeMsgEl, reply.getEnvelope(), operation); + if (__log.isDebugEnabled()) __log.debug("Reply is a fault, found type: " + faultType); } else { faultType = null; _converter.parseSoapResponse(odeMsgEl, reply.getEnvelope(), operation); } } catch (AxisFault af) { + __log.warn("Message format error, failing.", af); replyWithFailure(odeMexId, FailureType.FORMAT_ERROR, af.getMessage(), null); return; } try { PartnerRoleMessageExchange odeMex = (PartnerRoleMessageExchange) _server.getMessageExchange(odeMexId); - Message response = fault ? odeMex.createMessage(odeMex.getOperation().getFault(faultType.getLocalPart()).getMessage() - .getQName()) : odeMex.createMessage(odeMex.getOperation().getOutput().getMessage().getQName()); + QName nonNullFT = faultType != null ? faultType : new QName(Namespaces.ODE_EXTENSION_NS, "unknownFault"); + Message response = fault ? odeMex.createMessage(odeMex.getOperation() + .getFault(nonNullFT.getLocalPart()).getMessage().getQName()) : odeMex + .createMessage(odeMex.getOperation().getOutput().getMessage().getQName()); try { if (__log.isDebugEnabled()) { __log.debug("Received response for MEX " + odeMex); Modified: ode/trunk/axis2/src/main/java/org/apache/ode/axis2/ODEService.java URL: http://svn.apache.org/viewvc/ode/trunk/axis2/src/main/java/org/apache/ode/axis2/ODEService.java?rev=583235&r1=583234&r2=583235&view=diff ============================================================================== --- ode/trunk/axis2/src/main/java/org/apache/ode/axis2/ODEService.java (original) +++ ode/trunk/axis2/src/main/java/org/apache/ode/axis2/ODEService.java Tue Oct 9 10:42:31 2007 @@ -27,8 +27,7 @@ import javax.xml.namespace.QName; import org.apache.axiom.om.OMElement; -import org.apache.axiom.soap.SOAPEnvelope; -import org.apache.axiom.soap.SOAPFactory; +import org.apache.axiom.soap.*; import org.apache.axis2.AxisFault; import org.apache.axis2.context.MessageContext; import org.apache.axis2.description.AxisService; @@ -128,7 +127,6 @@ __log.debug("Handling response for MEX " + odeMex); onResponse(odeMex, outMsgContext); } - } catch (Exception e) { String errmsg = "Call to " + _serviceName + "." + odeMex.getOperationName() + " caused an exception."; __log.error(errmsg, e); @@ -156,9 +154,12 @@ case FAULT: if (__log.isDebugEnabled()) __log.debug("Fault response message: " + mex.getFault()); - OMElement detail = _converter.createSoapFault(mex.getFaultResponse().getMessage(), mex.getFault(), mex.getOperation()); - String reason = mex.getFault()+" "+mex.getFaultExplanation(); - throw new AxisFault(mex.getFault(), reason, null, null, detail); + SOAPFault fault = _converter.createSoapFault(mex.getFaultResponse().getMessage(), mex.getFault(), mex.getOperation()); + msgContext.getEnvelope().getBody().addFault(fault); + + if (__log.isDebugEnabled()) + __log.debug("Returning fault: " + msgContext.getEnvelope().toString()); + break; case ONEWAY: case RESPONSE: _converter.createSoapResponse(msgContext, mex.getResponse().getMessage(), mex.getOperation()); Modified: ode/trunk/axis2/src/main/java/org/apache/ode/axis2/hooks/ODEMessageReceiver.java URL: http://svn.apache.org/viewvc/ode/trunk/axis2/src/main/java/org/apache/ode/axis2/hooks/ODEMessageReceiver.java?rev=583235&r1=583234&r2=583235&view=diff ============================================================================== --- ode/trunk/axis2/src/main/java/org/apache/ode/axis2/hooks/ODEMessageReceiver.java (original) +++ ode/trunk/axis2/src/main/java/org/apache/ode/axis2/hooks/ODEMessageReceiver.java Tue Oct 9 10:42:31 2007 @@ -35,56 +35,57 @@ */ public class ODEMessageReceiver extends AbstractMessageReceiver { - private static final Log __log = LogFactory.getLog(ODEMessageReceiver.class); + private static final Log __log = LogFactory.getLog(ODEMessageReceiver.class); - private ODEService _service; + private ODEService _service; - public final void invokeBusinessLogic(final MessageContext msgContext) throws AxisFault { - if (hasResponse(msgContext.getAxisOperation())) { + public final void invokeBusinessLogic(final MessageContext msgContext) throws AxisFault { + if (hasResponse(msgContext.getAxisOperation())) { if (__log.isDebugEnabled()) __log.debug("Received request message for " + msgContext.getAxisService().getName() + "." + msgContext.getAxisOperation().getName()); - // Client is expecting a response, running in the same thread - MessageContext outMsgContext = Utils.createOutMessageContext(msgContext); - outMsgContext.getOperationContext().addMessageContext(outMsgContext); - invokeBusinessLogic(msgContext, outMsgContext); - if (__log.isDebugEnabled()) { + // Client is expecting a response, running in the same thread + MessageContext outMsgContext = Utils.createOutMessageContext(msgContext); + outMsgContext.getOperationContext().addMessageContext(outMsgContext); + invokeBusinessLogic(msgContext, outMsgContext); + if (__log.isDebugEnabled()) { __log.debug("Reply for " + msgContext.getAxisService().getName() + "." + msgContext.getAxisOperation().getName()); - __log.debug("Reply message " + outMsgContext.getEnvelope()); - } + __log.debug("Reply message " + outMsgContext.getEnvelope()); + } AxisEngine engine = new AxisEngine(msgContext.getOperationContext().getServiceContext() .getConfigurationContext()); - engine.send(outMsgContext); - } else { + engine.send(outMsgContext); + } else { if (__log.isDebugEnabled()) __log.debug("Received one-way message for " + msgContext.getAxisService().getName() + "." + msgContext.getAxisOperation().getName()); invokeBusinessLogic(msgContext, null); + } } - } - private void invokeBusinessLogic(MessageContext msgContext, MessageContext outMsgContext) - throws AxisFault { - _service.onAxisMessageExchange(msgContext, outMsgContext, getSOAPFactory(msgContext)); - } - - public void setService(ODEService service) { - _service = service; - } + private void invokeBusinessLogic(MessageContext msgContext, MessageContext outMsgContext) + throws AxisFault { + _service.onAxisMessageExchange(msgContext, outMsgContext, getSOAPFactory(msgContext)); - private boolean hasResponse(AxisOperation op) { + } + + public void setService(ODEService service) { + _service = service; + } + + private boolean hasResponse(AxisOperation op) { switch (op.getAxisSpecificMEPConstant()) { - case WSDLConstants.MEP_CONSTANT_IN_OUT: - return true; - case WSDLConstants.MEP_CONSTANT_OUT_ONLY: - return true; - case WSDLConstants.MEP_CONSTANT_OUT_OPTIONAL_IN: - return true; - case WSDLConstants.MEP_CONSTANT_ROBUST_OUT_ONLY: - return true; - default: - return false; + case WSDLConstants.MEP_CONSTANT_IN_OUT: + return true; + case WSDLConstants.MEP_CONSTANT_OUT_ONLY: + return true; + case WSDLConstants.MEP_CONSTANT_OUT_OPTIONAL_IN: + return true; + case WSDLConstants.MEP_CONSTANT_ROBUST_OUT_ONLY: + return true; + default: + return false; + } } - } } Modified: ode/trunk/axis2/src/main/java/org/apache/ode/axis2/util/SoapMessageConverter.java URL: http://svn.apache.org/viewvc/ode/trunk/axis2/src/main/java/org/apache/ode/axis2/util/SoapMessageConverter.java?rev=583235&r1=583234&r2=583235&view=diff ============================================================================== --- ode/trunk/axis2/src/main/java/org/apache/ode/axis2/util/SoapMessageConverter.java (original) +++ ode/trunk/axis2/src/main/java/org/apache/ode/axis2/util/SoapMessageConverter.java Tue Oct 9 10:42:31 2007 @@ -22,10 +22,7 @@ import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMNode; -import org.apache.axiom.soap.SOAPEnvelope; -import org.apache.axiom.soap.SOAPFactory; -import org.apache.axiom.soap.SOAPFault; -import org.apache.axiom.soap.SOAPFaultDetail; +import org.apache.axiom.soap.*; import org.apache.axis2.AxisFault; import org.apache.axis2.context.MessageContext; import org.apache.axis2.namespace.Constants; @@ -258,7 +255,20 @@ } - public OMElement createSoapFault(Element message, QName faultName, Operation op) throws AxisFault { + public SOAPFault createSoapFault(Element message, QName faultName, Operation op) throws AxisFault { + OMElement detail = buildSoapDetail(message, faultName, op); + + SOAPFault fault = _soapFactory.createSOAPFault(); + SOAPFaultCode code = _soapFactory.createSOAPFaultCode(fault); + code.setText(new QName(Namespaces.SOAP_ENV_NS, "Server")); + SOAPFaultReason reason = _soapFactory.createSOAPFaultReason(fault); + reason.setText(faultName); + SOAPFaultDetail soapDetail = _soapFactory.createSOAPFaultDetail(fault); + soapDetail.addDetailEntry(detail.getFirstElement()); + return fault; + } + + private OMElement buildSoapDetail(Element message, QName faultName, Operation op) throws AxisFault { if (faultName.getNamespaceURI() == null || !faultName.getNamespaceURI().equals(_def.getTargetNamespace())) return toFaultDetail(faultName, message); Fault f = op.getFault(faultName.getLocalPart()); @@ -519,7 +529,8 @@ if (flt.getDetail() == null) return null; - QName elName = flt.getDetail().getQName(); + // The detail is a dummy node containing the interesting fault element + QName elName = flt.getDetail().getFirstElement().getQName(); for (Fault f : (Collection)operation.getFaults().values()) { if (f.getMessage() == null) continue; // should have checked in ctor @@ -533,7 +544,6 @@ if (p.getElementName().equals(elName)) return f; - } return null; Modified: ode/trunk/utils/src/main/java/org/apache/ode/utils/Namespaces.java URL: http://svn.apache.org/viewvc/ode/trunk/utils/src/main/java/org/apache/ode/utils/Namespaces.java?rev=583235&r1=583234&r2=583235&view=diff ============================================================================== --- ode/trunk/utils/src/main/java/org/apache/ode/utils/Namespaces.java (original) +++ ode/trunk/utils/src/main/java/org/apache/ode/utils/Namespaces.java Tue Oct 9 10:42:31 2007 @@ -44,6 +44,7 @@ public static final String WS_ADDRESSING_WSDL_NS = "http://www.w3.org/2006/05/addressing/wsdl"; public static final String WS_ADDRESSING_ANON_URI = "http://www.w3.org/2005/08/addressing/anonymous"; public static final String SOAP_NS = "http://schemas.xmlsoap.org/wsdl/soap/"; + public static final String SOAP_ENV_NS = "http://schemas.xmlsoap.org/soap/envelope/"; public static final String WSDL_11 = "http://schemas.xmlsoap.org/wsdl/"; public static final String WSDL_20 = "http://www.w3.org/2006/01/wsdl"; public static final String XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";