Glen, Given what you've just mentioned about header order, can you take a look at org.apache.axis2.context.MessageContext.isHeaderPresent() [1] and it's associated comments. That and your changes here don't quite tally in my mind. Thanks, David
[1] http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/context/MessageContext.java?view=markup On 16/03/07, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:
Author: gdaniels Date: Thu Mar 15 18:29:03 2007 New Revision: 518824 URL: http://svn.apache.org/viewvc?view=rev&rev=518824 Log: * Fix DOOM bug in SOAPEnvelopeImpl where it would allow a SOAPHeader to come after a SOAPBody. This was being masked by getHeader(), which used to call getFirstChildWithName() - so of course the header would show up even though it was after the body. Once I fixed getHeader() to only check the first element, a SAAJ test started breaking because getHeader() was returning null. * Add a test to make sure we don't regress the above. * More work on versioning, move static QName constants up to SOAP*Constants interface, and provide a way to get MU faultcode QName from SOAPVersion. * Make sure a null RolePlayer means doing the default search (ultimate receiver and next, but nothing else) for targeted headers. Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAP11Constants.java webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAP11Version.java webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAP12Constants.java webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAP12Version.java webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAPVersion.java webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPEnvelopeImpl.java webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/SOAPHeaderImpl.java webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/soap/SOAPEnvelopeTest.java Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAP11Constants.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAP11Constants.java?view=diff&rev=518824&r1=518823&r2=518824 ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAP11Constants.java (original) +++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAP11Constants.java Thu Mar 15 18:29:03 2007 @@ -16,32 +16,38 @@ package org.apache.axiom.soap; +import javax.xml.namespace.QName; + public interface SOAP11Constants extends SOAPConstants { /** Eran Chinthaka ([EMAIL PROTECTED]) */ - public static final String SOAP_ENVELOPE_NAMESPACE_URI = + static final String SOAP_ENVELOPE_NAMESPACE_URI = "http://schemas.xmlsoap.org/soap/envelope/"; - public static final String SOAP_ENCODING_NAMESPACE_URI = + static final String SOAP_ENCODING_NAMESPACE_URI = "http://schemas.xmlsoap.org/soap/encoding/"; /** Field ATTR_ACTOR */ - public static final String ATTR_ACTOR = "actor"; + static final String ATTR_ACTOR = "actor"; /** Field SOAP_FAULT_CODE_LOCAL_NAME */ - public static final String SOAP_FAULT_CODE_LOCAL_NAME = "faultcode"; + static final String SOAP_FAULT_CODE_LOCAL_NAME = "faultcode"; /** Field SOAP_FAULT_STRING_LOCAL_NAME */ - public static final String SOAP_FAULT_STRING_LOCAL_NAME = "faultstring"; + static final String SOAP_FAULT_STRING_LOCAL_NAME = "faultstring"; /** Field SOAP_FAULT_ACTOR_LOCAL_NAME */ - public static final String SOAP_FAULT_ACTOR_LOCAL_NAME = "faultactor"; + static final String SOAP_FAULT_ACTOR_LOCAL_NAME = "faultactor"; - public static final String SOAP_FAULT_DETAIL_LOCAL_NAME = "detail"; + static final String SOAP_FAULT_DETAIL_LOCAL_NAME = "detail"; //SOAP 1.2 Content Type - public static final String SOAP_11_CONTENT_TYPE = "text/xml"; + static final String SOAP_11_CONTENT_TYPE = "text/xml"; + + static final QName QNAME_ACTOR = new QName(SOAP_ENVELOPE_NAMESPACE_URI, ATTR_ACTOR); + static final QName QNAME_MU_FAULTCODE = new QName(SOAP_ENVELOPE_NAMESPACE_URI, + FAULT_CODE_MUST_UNDERSTAND); // -------- SOAP Fault Codes ------------------------------ - public static final String FAULT_CODE_SENDER = "Client"; - public static final String FAULT_CODE_RECEIVER = "Server"; + static final String FAULT_CODE_SENDER = "Client"; + static final String FAULT_CODE_RECEIVER = "Server"; - public static final String SOAP_ACTOR_NEXT = "http://schemas.xmlsoap.org/soap/actor/next"; + static final String SOAP_ACTOR_NEXT = "http://schemas.xmlsoap.org/soap/actor/next"; } Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAP11Version.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAP11Version.java?view=diff&rev=518824&r1=518823&r2=518824 ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAP11Version.java (original) +++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAP11Version.java Thu Mar 15 18:29:03 2007 @@ -24,8 +24,6 @@ private static final SOAP11Version singleton = new SOAP11Version(); public static SOAP11Version getSingleton() { return singleton; } - QName actorQName = new QName(SOAP_ENVELOPE_NAMESPACE_URI, ATTR_ACTOR); - private SOAP11Version() { } @@ -41,11 +39,16 @@ /** Obtain the QName for the role attribute (actor/role) */ public QName getRoleAttributeQName() { - return actorQName; + return QNAME_ACTOR; } /** Obtain the "next" role/actor URI */ public String getNextRoleURI() { return SOAP_ACTOR_NEXT; + } + + /** Obtain the QName for the MustUnderstand fault code */ + public QName getMustUnderstandFaultCode() { + return QNAME_MU_FAULTCODE; } } Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAP12Constants.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAP12Constants.java?view=diff&rev=518824&r1=518823&r2=518824 ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAP12Constants.java (original) +++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAP12Constants.java Thu Mar 15 18:29:03 2007 @@ -16,6 +16,8 @@ package org.apache.axiom.soap; +import javax.xml.namespace.QName; + public interface SOAP12Constants extends SOAPConstants { /** Eran Chinthaka ([EMAIL PROTECTED]) */ @@ -59,6 +61,11 @@ //SOAP 1.2 Content Type public static final String SOAP_12_CONTENT_TYPE = "application/soap+xml"; + + // QNames + static final QName QNAME_ROLE = new QName(SOAP_ENVELOPE_NAMESPACE_URI, SOAP_ROLE); + static final QName QNAME_MU_FAULTCODE = new QName(SOAP_ENVELOPE_NAMESPACE_URI, + FAULT_CODE_MUST_UNDERSTAND); // -------- SOAP Fault Codes ------------------------------ public static final String FAULT_CODE_SENDER = "Sender"; Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAP12Version.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAP12Version.java?view=diff&rev=518824&r1=518823&r2=518824 ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAP12Version.java (original) +++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAP12Version.java Thu Mar 15 18:29:03 2007 @@ -24,8 +24,6 @@ private static final SOAP12Version singleton = new SOAP12Version(); public static SOAP12Version getSingleton() { return singleton; } - QName actorQName = new QName(SOAP_ENVELOPE_NAMESPACE_URI, SOAP_ROLE); - private SOAP12Version() { } @@ -41,11 +39,16 @@ /** Obtain the QName for the role attribute (actor/role) */ public QName getRoleAttributeQName() { - return actorQName; + return QNAME_ROLE; } /** Obtain the "next" role/actor URI */ public String getNextRoleURI() { return SOAP_ROLE_NEXT; + } + + /** Obtain the QName for the MustUnderstand fault code */ + public QName getMustUnderstandFaultCode() { + return QNAME_MU_FAULTCODE; } } Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAPVersion.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAPVersion.java?view=diff&rev=518824&r1=518823&r2=518824 ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAPVersion.java (original) +++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/soap/SOAPVersion.java Thu Mar 15 18:29:03 2007 @@ -41,4 +41,9 @@ * Obtain the "next" role/actor URI */ String getNextRoleURI(); + + /** + * Obtain the QName for the MustUnderstand fault code + */ + QName getMustUnderstandFaultCode(); } Modified: webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPEnvelopeImpl.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPEnvelopeImpl.java?view=diff&rev=518824&r1=518823&r2=518824 ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPEnvelopeImpl.java (original) +++ webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPEnvelopeImpl.java Thu Mar 15 18:29:03 2007 @@ -92,6 +92,13 @@ "SOAP Envelope can not have children other than SOAP Header and Body", SOAP12Constants.FAULT_CODE_SENDER); } else { + if (this.done && (child instanceof SOAPHeader)) { + SOAPBody body = getBody(); + if (body != null) { + body.insertSiblingBefore(child); + return; + } + } super.addChild(child); } } Modified: webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/SOAPHeaderImpl.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/SOAPHeaderImpl.java?view=diff&rev=518824&r1=518823&r2=518824 ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/SOAPHeaderImpl.java (original) +++ webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/SOAPHeaderImpl.java Thu Mar 15 18:29:03 2007 @@ -85,6 +85,12 @@ class RolePlayerChecker implements Checker { RolePlayer rolePlayer; + /** + * Constructor. + * + * @param rolePlayer the RolePlayer to check against. This can be null, in which + * case we assume we're the ultimate destination. + */ public RolePlayerChecker(RolePlayer rolePlayer) { this.rolePlayer = rolePlayer; } @@ -97,7 +103,7 @@ if (role == null || role.equals("") || (version instanceof SOAP12Version && role.equals(SOAP12Constants.SOAP_ROLE_ULTIMATE_RECEIVER))) { - return rolePlayer.isUltimateDestination(); + return (rolePlayer == null || rolePlayer.isUltimateDestination()); } // 2. If role is next, always return true @@ -110,7 +116,7 @@ } // 4. Return t/f depending on match - List roles = rolePlayer.getRoles(); + List roles = (rolePlayer == null) ? null : rolePlayer.getRoles(); if (roles != null) { for (Iterator i = roles.iterator(); i.hasNext();) { String thisRole = (String) i.next(); Modified: webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/soap/SOAPEnvelopeTest.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/soap/SOAPEnvelopeTest.java?view=diff&rev=518824&r1=518823&r2=518824 ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/soap/SOAPEnvelopeTest.java (original) +++ webservices/commons/trunk/modules/axiom/modules/axiom-tests/src/test/java/org/apache/axiom/soap/SOAPEnvelopeTest.java Thu Mar 15 18:29:03 2007 @@ -114,4 +114,14 @@ soapFac.createSOAPHeader(defaultEnvelope); } + + // Make sure order of header/body creation doesn't matter + public void testBodyHeaderOrder() throws Exception { +// SOAPFactory soapFac = new org.apache.axiom.soap.impl.llom.soap11.SOAP11Factory(); + SOAPFactory soapFac = new org.apache.axiom.soap.impl.dom.soap11.SOAP11Factory(); + SOAPEnvelope env = soapFac.createSOAPEnvelope(); + SOAPBody body = soapFac.createSOAPBody(env); + SOAPHeader header = soapFac.createSOAPHeader(env); + assertTrue("Header isn't the first child!", env.getFirstElement() instanceof SOAPHeader); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
-- David Illsley - IBM Web Services Development --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
