diff --git a/core/src/test/java/org/springframework/ws/soap/server/endpoint/interceptor/PayloadValidatingInterceptorTest.java b/core/src/test/java/org/springframework/ws/soap/server/endpoint/interceptor/PayloadValidatingInterceptorTest.java
index f96106bd..d8fe47a5 100644
--- a/core/src/test/java/org/springframework/ws/soap/server/endpoint/interceptor/PayloadValidatingInterceptorTest.java
+++ b/core/src/test/java/org/springframework/ws/soap/server/endpoint/interceptor/PayloadValidatingInterceptorTest.java
@@ -325,4 +325,22 @@ public class PayloadValidatingInterceptorTest extends XMLTestCase {
}
+ public void testMultipleNamespacesAxiom() throws Exception {
+ AxiomSoapMessageFactory messageFactory = new AxiomSoapMessageFactory();
+ messageFactory.setPayloadCaching(true);
+ messageFactory.afterPropertiesSet();
+
+ PayloadValidatingInterceptor interceptor = new PayloadValidatingInterceptor();
+ interceptor.setSchema(new ClassPathResource("multipleNamespaces.xsd", getClass()));
+ interceptor.afterPropertiesSet();
+
+ Resource resource = new ClassPathResource("multipleNamespaces.xml", getClass());
+ TransportInputStream tis = new MockTransportInputStream(resource.getInputStream());
+ WebServiceMessage message = messageFactory.createWebServiceMessage(tis);
+ MessageContext context = new DefaultMessageContext(message, messageFactory);
+ boolean result = interceptor.handleRequest(context, null);
+ assertTrue("Invalid response from interceptor", result);
+
+ }
+
}
\ No newline at end of file
diff --git a/core/src/test/resources/org/springframework/ws/soap/server/endpoint/interceptor/multipleNamespaces.xml b/core/src/test/resources/org/springframework/ws/soap/server/endpoint/interceptor/multipleNamespaces.xml
new file mode 100644
index 00000000..12031f22
--- /dev/null
+++ b/core/src/test/resources/org/springframework/ws/soap/server/endpoint/interceptor/multipleNamespaces.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core/src/test/resources/org/springframework/ws/soap/server/endpoint/interceptor/multipleNamespaces.xsd b/core/src/test/resources/org/springframework/ws/soap/server/endpoint/interceptor/multipleNamespaces.xsd
new file mode 100644
index 00000000..b81c1170
--- /dev/null
+++ b/core/src/test/resources/org/springframework/ws/soap/server/endpoint/interceptor/multipleNamespaces.xsd
@@ -0,0 +1,8 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/xml/src/main/java/org/springframework/xml/namespace/SimpleNamespaceContext.java b/xml/src/main/java/org/springframework/xml/namespace/SimpleNamespaceContext.java
index 5d381744..bedee538 100644
--- a/xml/src/main/java/org/springframework/xml/namespace/SimpleNamespaceContext.java
+++ b/xml/src/main/java/org/springframework/xml/namespace/SimpleNamespaceContext.java
@@ -22,6 +22,8 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Set;
+import java.util.HashSet;
import javax.xml.XMLConstants;
import javax.xml.namespace.NamespaceContext;
@@ -42,8 +44,6 @@ public class SimpleNamespaceContext implements NamespaceContext {
/** Maps a String namespaceUri to a List of prefixes */
private Map namespaceUriToPrefixes = new HashMap();
- private String defaultNamespaceUri = "";
-
public String getNamespaceURI(String prefix) {
Assert.notNull(prefix, "prefix is null");
if (XMLConstants.XML_NS_PREFIX.equals(prefix)) {
@@ -52,13 +52,10 @@ public class SimpleNamespaceContext implements NamespaceContext {
else if (XMLConstants.XMLNS_ATTRIBUTE.equals(prefix)) {
return XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
}
- else if (XMLConstants.DEFAULT_NS_PREFIX.equals(prefix)) {
- return defaultNamespaceUri;
- }
else if (prefixToNamespaceUri.containsKey(prefix)) {
return (String) prefixToNamespaceUri.get(prefix);
}
- return "";
+ return XMLConstants.NULL_NS_URI;
}
public String getPrefix(String namespaceUri) {
@@ -100,9 +97,7 @@ public class SimpleNamespaceContext implements NamespaceContext {
public void bindNamespaceUri(String prefix, String namespaceUri) {
Assert.notNull(prefix, "No prefix given");
Assert.notNull(namespaceUri, "No namespaceUri given");
- if (XMLConstants.DEFAULT_NS_PREFIX.equals(prefix)) {
- defaultNamespaceUri = namespaceUri;
- } else if (XMLConstants.XML_NS_PREFIX.equals(prefix)) {
+ if (XMLConstants.XML_NS_PREFIX.equals(prefix)) {
Assert.isTrue(XMLConstants.XML_NS_URI.equals(namespaceUri), "Prefix \"" + prefix +
"\" bound to namespace \"" + namespaceUri + "\" (should be \"" + XMLConstants.XML_NS_URI + "\")");
} else if (XMLConstants.XMLNS_ATTRIBUTE.equals(prefix)) {
@@ -118,7 +113,6 @@ public class SimpleNamespaceContext implements NamespaceContext {
/** Removes all declared prefixes. */
public void clear() {
- defaultNamespaceUri = "";
prefixToNamespaceUri.clear();
namespaceUriToPrefixes.clear();
}
@@ -129,14 +123,13 @@ public class SimpleNamespaceContext implements NamespaceContext {
* @return the declared prefixes
*/
public Iterator getBoundPrefixes() {
- return prefixToNamespaceUri.keySet().iterator();
+ Set prefixes = new HashSet(prefixToNamespaceUri.keySet());
+ prefixes.remove(XMLConstants.DEFAULT_NS_PREFIX);
+ return prefixes.iterator();
}
private List getPrefixesInternal(String namespaceUri) {
- if (defaultNamespaceUri.equals(namespaceUri)) {
- return Collections.singletonList(XMLConstants.DEFAULT_NS_PREFIX);
- }
- else if (XMLConstants.XML_NS_URI.equals(namespaceUri)) {
+ if (XMLConstants.XML_NS_URI.equals(namespaceUri)) {
return Collections.singletonList(XMLConstants.XML_NS_PREFIX);
}
else if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(namespaceUri)) {
@@ -158,22 +151,12 @@ public class SimpleNamespaceContext implements NamespaceContext {
* @param prefix the prefix to be removed
*/
public void removeBinding(String prefix) {
- if (XMLConstants.DEFAULT_NS_PREFIX.equals(prefix)) {
- defaultNamespaceUri = "";
- }
- else {
- String namespaceUri = (String) prefixToNamespaceUri.get(prefix);
- List prefixes = getPrefixesInternal(namespaceUri);
- prefixes.remove(prefix);
- }
+ String namespaceUri = (String) prefixToNamespaceUri.get(prefix);
+ List prefixes = getPrefixesInternal(namespaceUri);
+ prefixes.remove(prefix);
}
public boolean hasBinding(String prefix) {
- if (XMLConstants.DEFAULT_NS_PREFIX.equals(prefix)) {
- return !defaultNamespaceUri.equals("");
- }
- else {
- return prefixToNamespaceUri.containsKey(prefix);
- }
+ return prefixToNamespaceUri.containsKey(prefix);
}
}
diff --git a/xml/src/test/java/org/springframework/xml/namespace/SimpleNamespaceContextTest.java b/xml/src/test/java/org/springframework/xml/namespace/SimpleNamespaceContextTest.java
index 09d694a0..c6638e37 100644
--- a/xml/src/test/java/org/springframework/xml/namespace/SimpleNamespaceContextTest.java
+++ b/xml/src/test/java/org/springframework/xml/namespace/SimpleNamespaceContextTest.java
@@ -48,7 +48,8 @@ public class SimpleNamespaceContextTest extends TestCase {
}
public void testGetPrefix() {
- assertEquals("Invalid prefix for default namespace", XMLConstants.DEFAULT_NS_PREFIX, context.getPrefix(""));
+ context.bindDefaultNamespaceUri("defaultNamespaceURI");
+ assertEquals("Invalid prefix for default namespace", XMLConstants.DEFAULT_NS_PREFIX, context.getPrefix("defaultNamespaceURI"));
assertEquals("Invalid prefix for bound namespace", "prefix", context.getPrefix("namespaceURI"));
assertNull("Invalid prefix for unbound namespace", context.getPrefix("unbound"));
assertEquals("Invalid prefix for namespace", XMLConstants.XML_NS_PREFIX, context
@@ -58,7 +59,8 @@ public class SimpleNamespaceContextTest extends TestCase {
}
public void testGetPrefixes() {
- assertPrefixes("", XMLConstants.DEFAULT_NS_PREFIX);
+ context.bindDefaultNamespaceUri("defaultNamespaceURI");
+ assertPrefixes("defaultNamespaceURI", XMLConstants.DEFAULT_NS_PREFIX);
assertPrefixes("namespaceURI", "prefix");
assertFalse("Invalid prefix for unbound namespace", context.getPrefixes("unbound").hasNext());
assertPrefixes(XMLConstants.XML_NS_URI, XMLConstants.XML_NS_PREFIX);
@@ -137,4 +139,21 @@ public class SimpleNamespaceContextTest extends TestCase {
context.bindNamespaceUri(prefix, namespaceUri);
assertTrue("Context has no binding", context.hasBinding(prefix));
}
+
+ public void testDefaultNamespaceMultiplePrefixes() {
+ String defaultNamespace = "http://springframework.org/spring-ws";
+ context.bindDefaultNamespaceUri(defaultNamespace);
+ context.bindNamespaceUri("prefix", defaultNamespace);
+ assertEquals("Invalid prefix", XMLConstants.DEFAULT_NS_PREFIX, context.getPrefix(defaultNamespace));
+ Iterator iterator = context.getPrefixes(defaultNamespace);
+ assertNotNull("getPrefixes returns null", iterator);
+ assertTrue("iterator is empty", iterator.hasNext());
+ String result = (String) iterator.next();
+ assertTrue("Invalid prefix", result.equals(XMLConstants.DEFAULT_NS_PREFIX) || result.equals("prefix"));
+ assertTrue("iterator is empty", iterator.hasNext());
+ result = (String) iterator.next();
+ assertTrue("Invalid prefix", result.equals(XMLConstants.DEFAULT_NS_PREFIX) || result.equals("prefix"));
+ assertFalse("iterator contains more than two values", iterator.hasNext());
+ }
+
}