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()); + } + }