You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by wo...@apache.org on 2009/09/23 15:23:15 UTC
svn commit: r818096 - in /webservices/axis2/trunk/java/modules/kernel:
src/org/apache/axis2/util/MessageContextBuilder.java
test/org/apache/axis2/util/MessageContextBuilderTest.java
Author: woodroy
Date: Wed Sep 23 13:23:15 2009
New Revision: 818096
URL: http://svn.apache.org/viewvc?rev=818096&view=rev
Log:
Apply proper namespace qualification to SOAPFaultCode text field per SOAP specification
Modified:
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/util/MessageContextBuilder.java
webservices/axis2/trunk/java/modules/kernel/test/org/apache/axis2/util/MessageContextBuilderTest.java
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?rev=818096&r1=818095&r2=818096&view=diff
==============================================================================
--- 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 Wed Sep 23 13:23:15 2009
@@ -436,7 +436,10 @@
*/
private static SOAPEnvelope createFaultEnvelope(MessageContext context, Throwable e) {
SOAPEnvelope envelope;
-
+
+ if(log.isDebugEnabled()){
+ log.debug("start createFaultEnvelope()");
+ }
if (context.isSOAP11()) {
envelope = OMAbstractFactory.getSOAP11Factory().getDefaultFaultEnvelope();
} else {
@@ -444,7 +447,6 @@
envelope = OMAbstractFactory.getSOAP12Factory().getDefaultFaultEnvelope();
}
SOAPFault fault = envelope.getBody().getFault();
-
SOAPProcessingException soapException = null;
AxisFault axisFault = null;
@@ -479,17 +481,83 @@
String soapFaultCode = "";
if (faultCode != null) {
+ if(log.isDebugEnabled()){
+ log.debug("faultCode != null");
+ }
fault.setCode((SOAPFaultCode) faultCode);
} else if (soapException != null) {
+ if(log.isDebugEnabled()){
+ log.debug("soapException != null");
+ }
soapFaultCode = soapException.getFaultCode();
+ OMNamespace namespace = null;
+ if(envelope!=null){
+ if(log.isDebugEnabled()){
+ log.debug("envelope!=null");
+ }
+ namespace = envelope.getNamespace();
+ }
+
+ if (namespace != null){
+ String sfcLocalPart = soapFaultCode.substring(soapFaultCode.lastIndexOf(":")+1);
+
+ //If the fault code is one of the predefined ones that make sure the prefix
+ //matches that of the envelope NS
+ if (sfcLocalPart.equals(SOAPConstants.FAULT_CODE_VERSION_MISMATCH) ||
+ sfcLocalPart.equals(SOAPConstants.FAULT_CODE_MUST_UNDERSTAND) ||
+ sfcLocalPart.equals(SOAPConstants.FAULT_CODE_DATA_ENCODING_UNKNOWN) ||
+ sfcLocalPart.equals(SOAPConstants.FAULT_CODE_RECEIVER) ||
+ sfcLocalPart.equals(SOAPConstants.FAULT_CODE_SENDER)) {
+
+ if(log.isDebugEnabled()){
+ log.debug("SoapFaultCode local part= " +sfcLocalPart);
+ }
+
+ String prefix = namespace.getPrefix() + ":";
+
+ if (!soapFaultCode.contains(":")) {
+ soapFaultCode = prefix + soapFaultCode;
+ } else {
+ soapFaultCode = prefix + soapFaultCode.substring(soapFaultCode.indexOf(":")+1);
+ }
+
+ if(log.isDebugEnabled()){
+ log.debug("SoapFaultCode reset to " +soapFaultCode);
+ }
+
+ }
+ } else {
+ if(log.isDebugEnabled()){
+ log.debug("Namespace is null, cannot attach prefix to SOAPFaultCode");
+ }
+ }
+
+ if(log.isDebugEnabled()){
+ log.debug("SoapFaultCode ="+soapFaultCode);
+ }
+
} else if (axisFault != null) {
+ if(log.isDebugEnabled()){
+ log.debug("axisFault != null");
+ }
if (axisFault.getFaultCodeElement() != null) {
fault.setCode(axisFault.getFaultCodeElement());
} else {
QName faultCodeQName = axisFault.getFaultCode();
if (faultCodeQName != null) {
+ if(log.isDebugEnabled()){
+ log.debug("prefix ="+faultCodeQName.getPrefix());
+ log.debug("Fault Code namespace ="+faultCodeQName.getNamespaceURI());
+ log.debug("Fault Code ="+faultCodeQName.getLocalPart());
+ }
if (faultCodeQName.getLocalPart().indexOf(":") == -1) {
+ if(log.isDebugEnabled()){
+ log.debug("faultCodeQName.getLocalPart().indexOf(\":\") == -1");
+ }
String prefix = faultCodeQName.getPrefix();
+ if(log.isDebugEnabled()){
+ log.debug("prefix = "+prefix);
+ }
String uri = faultCodeQName.getNamespaceURI();
// Get the specified prefix and uri
prefix = prefix == null ? "" : prefix;
@@ -499,6 +567,9 @@
// get the resulting prefix.
prefix = fault.declareNamespace(uri, prefix).getPrefix();
soapFaultCode = prefix + ":" + faultCodeQName.getLocalPart();
+ if(log.isDebugEnabled()){
+ log.debug("Altered soapFaultCode ="+soapFaultCode);
+ }
} else {
soapFaultCode = faultCodeQName.getLocalPart();
}
@@ -515,9 +586,35 @@
}
if (faultCode == null) {
+ if(log.isDebugEnabled()){
+ log.debug("faultCode == null");
+ }
if (context.isSOAP11()) {
+ if(log.isDebugEnabled()){
+ log.debug("context.isSOAP11() = true");
+ SOAPFaultCode code = (fault!=null)?fault.getCode():null;
+ SOAPFaultValue value = (code!=null)?code.getValue():null;
+ if(value !=null){
+ QName name = value.getQName();
+ log.debug("prefix ="+name.getPrefix());
+ log.debug("Fault Code namespace ="+name.getNamespaceURI());
+ log.debug("Fault Code ="+name.getLocalPart());
+ }
+ }
+
fault.getCode().setText(soapFaultCode);
} else {
+ if(log.isDebugEnabled()){
+ log.debug("context.isSOAP11() = false");
+ SOAPFaultCode code = (fault!=null)?fault.getCode():null;
+ SOAPFaultValue value = (code!=null)?code.getValue():null;
+ if(value !=null){
+ QName name = value.getQName();
+ log.debug("prefix ="+name.getPrefix());
+ log.debug("Fault Code namespace ="+name.getNamespaceURI());
+ log.debug("Fault Code ="+name.getLocalPart());
+ }
+ }
SOAPFaultValue value = fault.getCode().getValue();
if(log.isDebugEnabled()){
log.debug("soapFaultCode originally was set to : " + soapFaultCode);
@@ -642,7 +739,9 @@
fault.setException(new Exception(e));
}
}
-
+
+ if(log.isDebugEnabled())
+ log.debug("End createFaultEnvelope()");
return envelope;
}
@@ -687,7 +786,6 @@
-
/**
* By the time the exception comes here it can be wrapped by so many levels. This will crip down
* to the root cause and get the initial error depending on the property
Modified: webservices/axis2/trunk/java/modules/kernel/test/org/apache/axis2/util/MessageContextBuilderTest.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/test/org/apache/axis2/util/MessageContextBuilderTest.java?rev=818096&r1=818095&r2=818096&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/test/org/apache/axis2/util/MessageContextBuilderTest.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/test/org/apache/axis2/util/MessageContextBuilderTest.java Wed Sep 23 13:23:15 2009
@@ -1,13 +1,39 @@
package org.apache.axis2.util;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+import javax.xml.stream.XMLStreamException;
+
import junit.framework.TestCase;
+
+import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.impl.OMNamespaceImpl;
+import org.apache.axiom.soap.SOAP11Constants;
+import org.apache.axiom.soap.SOAP12Constants;
import org.apache.axiom.soap.SOAPConstants;
+import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.axiom.soap.SOAPFault;
+import org.apache.axiom.soap.SOAPProcessingException;
+import org.apache.axis2.builder.SOAPBuilder;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.engine.AxisConfiguration;
+
import org.apache.axis2.namespace.Constants;
+import org.apache.axis2.AbstractTestCase;
+import org.apache.axis2.AxisFault;
+
-public class MessageContextBuilderTest extends TestCase {
+public class MessageContextBuilderTest extends AbstractTestCase {
private OMNamespaceImpl nsp = new OMNamespaceImpl(Constants.URI_SOAP11_ENV, "soapenv");
+ public MessageContextBuilderTest(String testName) {
+ super(testName);
+ }
+
+
public void testSwitchNamespacePrefixes()
throws Exception {
@@ -23,4 +49,35 @@
assertEquals("soapenv:" + SOAPConstants.FAULT_CODE_VERSION_MISMATCH,
MessageContextBuilder.switchNamespacePrefix(":" + SOAPConstants.FAULT_CODE_VERSION_MISMATCH, nsp));
}
+
+ public void testElementNamespaces() throws Exception {
+ File file = getTestResourceFile("soapmessage.xml");
+ SOAPBuilder soapBuilder = new SOAPBuilder();
+ FileInputStream fis = new FileInputStream(file);
+ MessageContext mc = new MessageContext();
+
+ //Set up a mock envelope
+ try {
+ OMElement envelope = soapBuilder.processDocument(fis, SOAP11Constants.SOAP_11_CONTENT_TYPE, mc);
+ } catch (Exception e) {
+ }
+
+ SOAPProcessingException e = new SOAPProcessingException(
+ "Transport level information does not match with SOAP" +
+ " Message namespace URI", "S:" + ":" +
+ SOAPConstants.FAULT_CODE_VERSION_MISMATCH);
+
+ AxisFault axisFault = AxisFault.makeFault(e);
+ ConfigurationContext configContext = new ConfigurationContext(new AxisConfiguration());
+ mc.setConfigurationContext(configContext);
+ MessageContext faultContext = MessageContextBuilder.createFaultMessageContext(mc, axisFault);
+
+ SOAPFault fault = faultContext.getEnvelope().getBody().getFault();
+ String se = faultContext.getEnvelope().getNamespace().getPrefix();
+
+ assertEquals (fault.getCode().getTextAsQName().getPrefix(), se);
+ }
+
+
+
}
\ No newline at end of file