Jeff Thomas created AXIS2-5786:
----------------------------------

             Summary: MessageContextBuilder - createFaultEnvelope - FaultCode 
with "soapenv" prefix and different namespace from envelope causes error
                 Key: AXIS2-5786
                 URL: https://issues.apache.org/jira/browse/AXIS2-5786
             Project: Axis2
          Issue Type: Bug
          Components: kernel
    Affects Versions: 1.7.3
            Reporter: Jeff Thomas
             Fix For: 1.7.4, 1.8.0


I have encountered a problem in 
MessageContextBuilder.createFaultEnvelope(MessageContext, Throwable) where the 
throwable is an AxisFault with the default SOAP namespace prefix but a 
*different* namespace-URI than the envelope itself.  For example, including a 
fault-code with a SOAP 1.2 namespace in a SOAP 1.1 envelope or a fault-code 
SOAP 1.1 namespace in a SOAP 1.2 envelope.

The result in at least the first case is the following error:
"A Soap envelope with fault action 
-http://www.w3.org/2005/08/addressing/soap/fault has been received without a 
fault element in the soap body"

The precondition is that the fault code content has the same namespace prefix 
as the SOAP element being created.

{code:xml}
<faultcode>soapenv:Receiver</faultcode>
{code}

The cause of the error is that the prefix within the fault code is used to 
declare a namespace on the "soapenv:Fault" element.  This results in two 
different namespace URIs being declared with the same prefix:
{code:xml}
<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";>
  <soapenv:Header/>
  <soapenv:Body>
    <soapenv:Fault xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope";>
      <faultcode>soapenv:Receiver</faultcode>
      <faultstring>Hello World!</faultstring>
    </soapenv:Fault>
  </soapenv:Body>
</soapenv:Envelope>
{code}

During debugging you can clearly see the problem with the double prefix:
{code:xml}
<soapenv:Fault xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"; 
xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope";>
  <faultcode>soapenv:Receiver</faultcode>
  <faultstring>General error in function getStructure.</faultstring>
</soapenv:Fault>
{code}

*The real problem is most-likely in Axiom OMElement implementation.*(???).  The 
OMElement declareNamespace method does not check if the given prefix is 
identical to that of the OMElement itself (with a different namespace URI).  In 
this case, it should probably discard the provided prefix and generate a new 
one.  I created a simple example of this problem which creates an element with 
prefix "foo" and a given namespace URI and then declares a second namespace on 
this element with the same prefix and a different URI.  The result is an 
OMElement with a double-prefix:

{code:java}
import javax.xml.stream.XMLStreamException;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;

public class NamespaceTest {

  final static String NS_URI_1 = "http://www.foobar.org/2005";;
  final static String NS_URI_2 = "http://www.foobar.org/2009";;
  final static String NS_PFX = "foo";

  public static void main (String[] args) {
    final OMFactory omFactory = OMAbstractFactory.getOMFactory();
    OMElement testElement = omFactory.createOMElement("testElement", NS_URI_1, 
NS_PFX);
    testElement.declareNamespace(NS_URI_2, NS_PFX);
    try {
      testElement.serialize(System.out);
    } catch (XMLStreamException ex) {
      System.err.println("Unable to serialize the OMElement. Reason: " + 
ex.getMessage());
    }
  }
}
{code}

This method generates the following output:
{code:xml}
<foo:testElement xmlns:foo="http://www.foobar.org/2005"; 
xmlns:foo="http://www.foobar.org/2009"/>
{code}

Our workaround at the moment is that we no longer use the default 
*SOAPConstants.SOAP_DEFAULT_NAMESPACE_PREFIX* (== 'soapenv'*) constant for our 
custom Axis-Fault.  For example "foo":
{code:xml}
<soapenv:Fault xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"; 
xmlns:foo="http://www.w3.org/2003/05/soap-envelope";>
  <faultcode>foo:Receiver</faultcode>
  <faultstring>General error in function getStructure.</faultstring>
</soapenv:Fault>
{code}

Nonetheless, I wanted to file the issue here because the double-prefix problem 
can occur on any OMElement.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to