Author: gdaniels Date: Fri Jun 8 09:22:17 2007 New Revision: 545548 URL: http://svn.apache.org/viewvc?view=rev&rev=545548 Log: ** NOTE ** This commit goes along with http://svn.apache.org/viewvc?view=rev&rev=545542, so we will require a new Axiom SNAPSHOT for the new test to pass.
* Rejigger the local transport so it serializes, rather than rethrows, AxisFaults that come from the receiving AxisEngine. Transports, IMO, should not have to do this job - will comment on this on axis-dev. * Add robust-in-only as a supported default MEP for LocalTestCase * Fix AXIS2-2752, improve AxisFault JavaDoc, check in test. Added: webservices/axis2/trunk/java/modules/kernel/test/org/apache/axis2/faults/ webservices/axis2/trunk/java/modules/kernel/test/org/apache/axis2/faults/FaultSerializationTest.java Modified: webservices/axis2/trunk/java/modules/integration/test/org/apache/axis2/integration/LocalTestCase.java webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/AxisFault.java webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/addressing/AddressingHelper.java webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/local/LocalTransportReceiver.java webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/util/MessageContextBuilder.java Modified: webservices/axis2/trunk/java/modules/integration/test/org/apache/axis2/integration/LocalTestCase.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/integration/test/org/apache/axis2/integration/LocalTestCase.java?view=diff&rev=545548&r1=545547&r2=545548 ============================================================================== --- webservices/axis2/trunk/java/modules/integration/test/org/apache/axis2/integration/LocalTestCase.java (original) +++ webservices/axis2/trunk/java/modules/integration/test/org/apache/axis2/integration/LocalTestCase.java Fri Jun 8 09:22:17 2007 @@ -37,6 +37,7 @@ import org.apache.axis2.rpc.client.RPCServiceClient; import org.apache.axis2.transport.local.LocalTransportReceiver; import org.apache.axis2.transport.local.LocalTransportSender; +import org.apache.axiom.soap.SOAP12Constants; /** * LocalTestCase is an extendable base class which provides common functionality @@ -79,6 +80,8 @@ new RawXMLINOnlyMessageReceiver()); serverConfig.addMessageReceiver(WSDL2Constants.MEP_URI_IN_OUT, new RawXMLINOutMessageReceiver()); + serverConfig.addMessageReceiver(WSDL2Constants.MEP_URI_ROBUST_IN_ONLY, + new RawXMLINOutMessageReceiver()); /////////////////////////////////////////////////////////////////////// // And client side @@ -133,12 +136,7 @@ * @throws AxisFault if there's a problem */ protected ServiceClient getClient() throws AxisFault { - TransportOutDescription td = new TransportOutDescription("local"); - td.setSender(sender); - - Options opts = new Options(); - opts.setTransportOut(td); - + Options opts = getOptions(); ServiceClient client = new ServiceClient(clientCtx, null); client.setOptions(opts); return client; @@ -153,12 +151,7 @@ * @throws AxisFault if there's a problem */ protected RPCServiceClient getRPCClient() throws AxisFault { - TransportOutDescription td = new TransportOutDescription("local"); - td.setSender(sender); - - Options opts = new Options(); - opts.setTransportOut(td); - + Options opts = getOptions(); RPCServiceClient client = new RPCServiceClient(clientCtx, null); client.setOptions(opts); return client; @@ -174,18 +167,28 @@ * @throws AxisFault if there's a problem */ protected ServiceClient getClient(String serviceName, String operationName) throws AxisFault { - TransportOutDescription td = new TransportOutDescription("local"); - td.setSender(sender); - - Options opts = new Options(); - opts.setTransportOut(td); - String url = LocalTransportReceiver.CONFIG_CONTEXT.getServiceContextPath()+"/"+serviceName; + Options opts = getOptions(); opts.setTo(new EndpointReference(url)); opts.setAction(operationName); ServiceClient client = new ServiceClient(clientCtx, null); client.setOptions(opts); return client; + } + + /** + * Get an Options object initialized with the right transport info, defaulting to SOAP 1.2 + * + * @return pre-initialized Options object + */ + protected Options getOptions() { + TransportOutDescription td = new TransportOutDescription("local"); + td.setSender(sender); + + Options opts = new Options(); + opts.setTransportOut(td); + opts.setSoapVersionURI(SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI); + return opts; } } Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/AxisFault.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/AxisFault.java?view=diff&rev=545548&r1=545547&r2=545548 ============================================================================== --- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/AxisFault.java (original) +++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/AxisFault.java Fri Jun 8 09:22:17 2007 @@ -26,7 +26,6 @@ import org.apache.axiom.soap.SOAPFaultRole; import org.apache.axiom.soap.SOAPHeaderBlock; import org.apache.axiom.soap.SOAPFaultSubCode; -import org.apache.axiom.soap.SOAP12Constants; import org.apache.axis2.context.MessageContext; import javax.xml.namespace.QName; @@ -91,7 +90,7 @@ private SOAPFaultDetail soapFaultDetail; /** - * If not null, the messageContext represents the fault as it + * If not null, this MessageContext represents the fault as it * should be returned. This is used by higher-level layers * that want to generate the message themselves so that * processing may take place before they return control (e.g. JAX-WS.) @@ -114,7 +113,9 @@ /** - * @param message + * Constructor. + * + * @param message the human-readable text describing the fault */ public AxisFault(String message) { this.message = message; @@ -122,17 +123,26 @@ } /** - * These are the absolute minimum to construct a meaningful SOAPFault from user's information + * Constructor * * @param faultCode - fault code of the message as a QName * @param faultReason - the reason for the fault. The language will be defaulted to 'en' - * @param cause + * @param cause embedded fault which caused this one */ public AxisFault(QName faultCode, String faultReason, Throwable cause) { this(faultReason, cause); setFaultCode(faultCode); } + /** + * Constructor + * + * @param faultCode a QName for the fault code + * @param faultReason the reason for the fault. The language will be defaulted to 'en' + * @param faultNode a URL identifying the SOAP node generating this fault, or null + * @param faultRole a URL identifying the SOAP role active when generating this fault, or null + * @param faultDetail arbitrary XML containing application-specific fault data + */ public AxisFault(QName faultCode, String faultReason, String faultNode, String faultRole, OMElement faultDetail) { this(faultReason, faultCode); @@ -146,10 +156,11 @@ * in this class to get and set things. * Any of the parameters can be null * - * @param soapFaultCode - * @param soapFaultReason - * @param soapFaultNode - * @param soapFaultRole + * @param soapFaultCode the fault code + * @param soapFaultReason the fault reason + * @param soapFaultNode the SOAPFaultNode representing the source node for this fault + * @param soapFaultRole the SOAPFaultRole representing the source role for this fault + * @param soapFaultDetail the SOAPFaultDetail containing any application-specific info */ public AxisFault(SOAPFaultCode soapFaultCode, SOAPFaultReason soapFaultReason, SOAPFaultNode soapFaultNode, SOAPFaultRole soapFaultRole, @@ -192,6 +203,8 @@ // cause = new Exception(exceptionElement.getText()); // } + // TODO - Wha? Details can have multiple elements, why take the first child here? + // TODO - Review the API for details // setting the first child element of the fault detail as this.detail this.detail = soapFaultDetail.getFirstElement(); @@ -230,6 +243,8 @@ } /** + * Constructor. + * * @param messageText - this will appear as the Text in the Reason information item of SOAP Fault * @param faultCode - this will appear as the Value in the Code information item of SOAP Fault */ @@ -239,8 +254,10 @@ } /** - * @param messageText - this will appear as the Text in the Reason information item of SOAP Fault - * @param faultCode - this will appear as the Value in the Code information item of SOAP Fault + * Constructor + * + * @param messageText this will appear as the Text in the Reason information item of SOAP Fault + * @param faultCode this will appear as the Value in the Code information item of SOAP Fault */ public AxisFault(String messageText, QName faultCode) { this(messageText); @@ -248,8 +265,10 @@ } /** - * @param message - * @param cause + * Constructor + * + * @param message this will appear as the Text in the Reason information item of SOAP Fault + * @param cause the embedded Throwable that caused this fault */ public AxisFault(String message, Throwable cause) { super(message, cause); @@ -285,7 +304,7 @@ * that contains the actual fault representation. * * @param message A string that's really only useful for logging. - * @param faultMessageContext + * @param faultMessageContext A MessageContext which must contain SOAP fault info */ public AxisFault(String message, MessageContext faultMessageContext) { this(message); @@ -443,7 +462,7 @@ /** * Set the entire detail element of the fault * - * @param detail + * @param detail an OMElement which MUST be */ public void setDetail(OMElement detail) { this.detail = detail; @@ -460,7 +479,9 @@ } /** - * Set the faulting node uri. SOAP1.2 + * Set the faulting node uri. (SOAP1.2) + * + * @param nodeURI a String containing a URI indicating which SOAP Node faulted */ public void setNodeURI(String nodeURI) { this.nodeURI = nodeURI; @@ -540,8 +561,9 @@ } /** - * Set the (OPTIONAL) action value for the fault message - * @param faultAction + * Set the (OPTIONAL) action value for the fault message + * + * @param faultAction a String containing an action URI for the fault */ public void setFaultAction(String faultAction) { this.faultAction = faultAction; Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/addressing/AddressingHelper.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/addressing/AddressingHelper.java?view=diff&rev=545548&r1=545547&r2=545548 ============================================================================== --- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/addressing/AddressingHelper.java (original) +++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/addressing/AddressingHelper.java Fri Jun 8 09:22:17 2007 @@ -58,7 +58,7 @@ * spec. * * @param messageContext - * @see isReplyRedirected + * @see #isReplyRedirected(org.apache.axis2.context.MessageContext) */ public static boolean isFaultRedirected(MessageContext messageContext) { EndpointReference faultTo = messageContext.getFaultTo(); Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/local/LocalTransportReceiver.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/local/LocalTransportReceiver.java?view=diff&rev=545548&r1=545547&r2=545548 ============================================================================== --- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/local/LocalTransportReceiver.java (original) +++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/transport/local/LocalTransportReceiver.java Fri Jun 8 09:22:17 2007 @@ -21,6 +21,8 @@ import org.apache.axiom.soap.SOAPEnvelope; import org.apache.axis2.AxisFault; import org.apache.axis2.Constants; +import org.apache.axis2.util.Utils; +import org.apache.axis2.util.MessageContextBuilder; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.builder.BuilderUtil; import org.apache.axis2.context.ConfigurationContext; @@ -48,37 +50,51 @@ this.sender = sender; } - public void processMessage(InputStream in, EndpointReference to, String action) throws AxisFault { + public void processMessage(InputStream in, EndpointReference to, String action) + throws AxisFault { + MessageContext msgCtx = confContext.createMessageContext(); + TransportInDescription tIn = confContext.getAxisConfiguration().getTransportIn( + Constants.TRANSPORT_LOCAL); + TransportOutDescription tOut = confContext.getAxisConfiguration().getTransportOut( + Constants.TRANSPORT_LOCAL); try { - TransportInDescription tIn = confContext.getAxisConfiguration().getTransportIn( - Constants.TRANSPORT_LOCAL); - TransportOutDescription tOut = confContext.getAxisConfiguration().getTransportOut( - Constants.TRANSPORT_LOCAL); tOut.setSender(new LocalResponder(sender)); - MessageContext msgCtx = confContext.createMessageContext(); msgCtx.setTransportIn(tIn); msgCtx.setTransportOut(tOut); + msgCtx.setProperty(MessageContext.TRANSPORT_OUT, sender.getResponse()); msgCtx.setTo(to); msgCtx.setWSAAction(action); msgCtx.setServerSide(true); - msgCtx.setProperty(MessageContext.TRANSPORT_OUT, sender.getResponse()); InputStreamReader streamReader = new InputStreamReader(in); - OMXMLParserWrapper builder = BuilderUtil.getBuilder(streamReader); + OMXMLParserWrapper builder; + try { + builder = BuilderUtil.getBuilder(streamReader); + } catch (XMLStreamException e) { + throw AxisFault.makeFault(e); + } SOAPEnvelope envelope = (SOAPEnvelope) builder.getDocumentElement(); msgCtx.setEnvelope(envelope); - AxisEngine engine = new AxisEngine(confContext); - - engine.receive(msgCtx); - } catch (XMLStreamException e) { - throw AxisFault.makeFault(e); - } catch (FactoryConfigurationError e) { - throw AxisFault.makeFault(e); + AxisEngine.receive(msgCtx); + } catch (AxisFault e) { + // write the fault back. + try { + MessageContext faultContext = + MessageContextBuilder.createFaultMessageContext(msgCtx, e); + + faultContext.setTransportOut(tOut); + faultContext.setProperty(MessageContext.TRANSPORT_OUT, sender.getResponse()); + + AxisEngine.sendFault(faultContext); + } catch (AxisFault axisFault) { + // can't handle this, so just throw it + throw axisFault; + } } } } Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/util/MessageContextBuilder.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/util/MessageContextBuilder.java?view=diff&rev=545548&r1=545547&r2=545548 ============================================================================== --- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/util/MessageContextBuilder.java (original) +++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/util/MessageContextBuilder.java Fri Jun 8 09:22:17 2007 @@ -428,12 +428,12 @@ SOAPProcessingException soapException = null; AxisFault axisFault = null; - if (e != null) { - if (e instanceof AxisFault) { - axisFault = (AxisFault) e; - } else if (e.getCause() instanceof AxisFault) { - axisFault = (AxisFault) e.getCause(); - } + if (e == null) return envelope; + + if (e instanceof AxisFault) { + axisFault = (AxisFault) e; + } else if (e.getCause() instanceof AxisFault) { + axisFault = (AxisFault) e.getCause(); } if (axisFault != null) { @@ -450,8 +450,6 @@ if (axisFault.getCause() instanceof SOAPProcessingException) { soapException = (SOAPProcessingException) axisFault.getCause(); } - } else { - // we have recd an instance of just the Exception class } // user can set the fault information to the message context or to the AxisFault itself. @@ -460,7 +458,6 @@ Object faultCode = context.getProperty(SOAP12Constants.SOAP_FAULT_CODE_LOCAL_NAME); String soapFaultCode = ""; - if (faultCode != null) { fault.setCode((SOAPFaultCode) faultCode); } else if (soapException != null) { @@ -502,46 +499,36 @@ if(faultCode == null && !context.isSOAP11()){ fault.getCode().getValue().setText(soapFaultCode); } - Object faultReason = context.getProperty(SOAP12Constants.SOAP_FAULT_REASON_LOCAL_NAME); - String message = ""; + SOAPFaultReason faultReason = (SOAPFaultReason)context.getProperty( + SOAP12Constants.SOAP_FAULT_REASON_LOCAL_NAME); + if (faultReason == null && axisFault != null) { + faultReason = axisFault.getFaultReasonElement(); + } if (faultReason != null) { - fault.setReason((SOAPFaultReason) faultReason); - if(context.isSOAP11()) { - message = fault.getReason().getText(); - } else { - message = fault.getReason().getFirstSOAPText().getText(); - } - } else if (soapException != null) { - message = soapException.getMessage(); - } else if (axisFault != null) { - if (axisFault.getFaultReasonElement() != null) { - fault.setReason(axisFault.getFaultReasonElement()); - } else { + fault.setReason(faultReason); + } else { + String message = ""; + if (soapException != null) { + message = soapException.getMessage(); + } else if (axisFault != null) { + // Couldn't find FaultReasonElement, try reason string message = axisFault.getReason(); - if (message == null || "".equals(message)) { - message = getFaultReasonFromException(e, context); - } } - } else { - if (e != null && (message == null || "".equals(message))) { + + if (message == null || "".equals(message)) { message = getFaultReasonFromException(e, context); } - } - // defaulting to reason, unknown, if no reason is available - if (faultReason == null) { - message = ("".equals(message) || (message == null)) - ? "unknown" - : message; - if(context.isSOAP11()) { + if (message == null || "".equals(message)) message = "unknown"; + + if (context.isSOAP11()) { fault.getReason().setText(message); } else { fault.getReason().getFirstSOAPText().setLang("en-US"); fault.getReason().getFirstSOAPText().setText(message); } } - Object faultRole = context.getProperty(SOAP12Constants.SOAP_FAULT_ROLE_LOCAL_NAME); if (faultRole != null) { Added: webservices/axis2/trunk/java/modules/kernel/test/org/apache/axis2/faults/FaultSerializationTest.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/test/org/apache/axis2/faults/FaultSerializationTest.java?view=auto&rev=545548 ============================================================================== --- webservices/axis2/trunk/java/modules/kernel/test/org/apache/axis2/faults/FaultSerializationTest.java (added) +++ webservices/axis2/trunk/java/modules/kernel/test/org/apache/axis2/faults/FaultSerializationTest.java Fri Jun 8 09:22:17 2007 @@ -0,0 +1,73 @@ +/* + * Copyright 2007 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.axis2.faults; + +import junit.framework.TestCase; +import org.apache.axiom.soap.SOAPFactory; +import org.apache.axiom.soap.SOAPFaultCode; +import org.apache.axiom.soap.SOAPFaultValue; +import org.apache.axiom.soap.SOAP12Constants; +import org.apache.axiom.soap.SOAPFaultReason; +import org.apache.axiom.soap.SOAPFaultText; +import org.apache.axiom.soap.SOAPFaultDetail; +import org.apache.axiom.om.OMAbstractFactory; +import org.apache.axiom.om.OMElement; +import org.apache.axis2.AxisFault; +import org.apache.axis2.transport.TransportUtils; +import org.apache.axis2.context.MessageContext; +import org.apache.axis2.context.ConfigurationContextFactory; +import org.apache.axis2.context.ConfigurationContext; +import org.apache.axis2.util.MessageContextBuilder; + +import javax.xml.namespace.QName; +import java.io.ByteArrayOutputStream; + +public class FaultSerializationTest extends TestCase { + public void testFaultSerialization() throws Exception { + final String REASON = "ReasonValue"; + + SOAPFactory soapFactory = OMAbstractFactory.getSOAP12Factory(); + SOAPFaultCode soapFaultCode = soapFactory.createSOAPFaultCode(); + SOAPFaultValue soapFaultValue = soapFactory.createSOAPFaultValue(soapFaultCode); + soapFaultValue.setText(new QName(SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI, "Sender")); + + SOAPFaultReason soapFaultReason = soapFactory.createSOAPFaultReason(); + SOAPFaultText soapFaultText = soapFactory.createSOAPFaultText(soapFaultReason); + soapFaultText.setText(REASON); + + SOAPFaultDetail soapFaultDetail = soapFactory.createSOAPFaultDetail(); + QName qName = new QName("http://mycompany.com", "FaultException", "ex"); + OMElement exception = soapFactory.createOMElement(qName, soapFaultDetail); + exception.setText("Detail text"); + AxisFault fault = new AxisFault(soapFaultCode, soapFaultReason, null, null, + soapFaultDetail); + + ConfigurationContext cc = ConfigurationContextFactory.createDefaultConfigurationContext(); + MessageContext ctx = cc.createMessageContext(); + SOAPFactory fac = OMAbstractFactory.getSOAP12Factory(); + ctx.setEnvelope(fac.getDefaultEnvelope()); + MessageContext faultCtx = MessageContextBuilder.createFaultMessageContext(ctx, fault); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + TransportUtils.writeMessage(faultCtx, bos); + + String result = new String(bos.toByteArray()); + + // For right now, just making sure we have a test for AXIS2-2752 + // Confirm reason was correctly processed + assertTrue("Incorrect or missing reason!", result.indexOf(REASON) > -1); + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]