SWS-521 - UnsupportedOperationException During Validation After Upgrade From 1.5.6 to 1.5.7

This commit is contained in:
Arjen Poutsma
2009-11-10 16:39:18 +00:00
parent 4736135783
commit 6cda1d5934
5 changed files with 66 additions and 31 deletions

View File

@@ -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);
}
}

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<r:GetAllRuleSetsRequest xmlns="http://springframework.org/spring-ws"
xmlns:r="http://springframework.org/spring-ws"/>
</soapenv:Body>
</soapenv:Envelope>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://springframework.org/spring-ws"
xmlns:tns="http://springframework.org/spring-ws" elementFormDefault="qualified">
<element name="GetAllRuleSetsRequest" />
</schema>

View File

@@ -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 <code>String</code> namespaceUri to a <code>List</code> 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);
}
}

View File

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