From be5f18784c6cc7cb1de92867fb6dff6754d6f0a0 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Sun, 27 Apr 2008 12:51:27 +0000 Subject: [PATCH] SWS-340 --- .../wsdl/wsdl11/DefaultWsdl11Definition.java | 6 +- .../provider/DefaultMessagesProvider.java | 14 ++- .../provider/SuffixBasedMessagesProvider.java | 111 ++++++++++++++++++ .../provider/DefaultMessagesProviderTest.java | 2 + .../SuffixBasedMessagesProviderTest.java | 86 ++++++++++++++ 5 files changed, 216 insertions(+), 3 deletions(-) create mode 100644 core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/SuffixBasedMessagesProvider.java create mode 100644 core/src/test/java/org/springframework/ws/wsdl/wsdl11/provider/SuffixBasedMessagesProviderTest.java diff --git a/core/src/main/java/org/springframework/ws/wsdl/wsdl11/DefaultWsdl11Definition.java b/core/src/main/java/org/springframework/ws/wsdl/wsdl11/DefaultWsdl11Definition.java index 80e62568..72d2c941 100644 --- a/core/src/main/java/org/springframework/ws/wsdl/wsdl11/DefaultWsdl11Definition.java +++ b/core/src/main/java/org/springframework/ws/wsdl/wsdl11/DefaultWsdl11Definition.java @@ -24,6 +24,7 @@ import org.springframework.util.StringUtils; import org.springframework.ws.wsdl.wsdl11.provider.DefaultMessagesProvider; import org.springframework.ws.wsdl.wsdl11.provider.InliningXsdSchemaTypesProvider; import org.springframework.ws.wsdl.wsdl11.provider.SoapProvider; +import org.springframework.ws.wsdl.wsdl11.provider.SuffixBasedMessagesProvider; import org.springframework.ws.wsdl.wsdl11.provider.SuffixBasedPortTypesProvider; import org.springframework.xml.xsd.XsdSchema; import org.springframework.xml.xsd.XsdSchemaCollection; @@ -54,7 +55,7 @@ public class DefaultWsdl11Definition implements Wsdl11Definition, InitializingBe private final InliningXsdSchemaTypesProvider typesProvider = new InliningXsdSchemaTypesProvider(); - private final DefaultMessagesProvider messagesProvider = new DefaultMessagesProvider(); + private final SuffixBasedMessagesProvider messagesProvider = new SuffixBasedMessagesProvider(); private final SuffixBasedPortTypesProvider portTypesProvider = new SuffixBasedPortTypesProvider(); @@ -106,16 +107,19 @@ public class DefaultWsdl11Definition implements Wsdl11Definition, InitializingBe /** Sets the suffix used to detect request elements in the schema. */ public void setRequestSuffix(String requestSuffix) { portTypesProvider.setRequestSuffix(requestSuffix); + messagesProvider.setRequestSuffix(requestSuffix); } /** Sets the suffix used to detect response elements in the schema. */ public void setResponseSuffix(String responseSuffix) { portTypesProvider.setResponseSuffix(responseSuffix); + messagesProvider.setResponseSuffix(responseSuffix); } /** Sets the suffix used to detect fault elements in the schema. */ public void setFaultSuffix(String faultSuffix) { portTypesProvider.setFaultSuffix(faultSuffix); + messagesProvider.setResponseSuffix(faultSuffix); } /** Indicates whether a SOAP 1.1 binding should be created. */ diff --git a/core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/DefaultMessagesProvider.java b/core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/DefaultMessagesProvider.java index 68ded2c6..7267e4c2 100644 --- a/core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/DefaultMessagesProvider.java +++ b/core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/DefaultMessagesProvider.java @@ -65,7 +65,7 @@ public class DefaultMessagesProvider implements MessagesProvider { private void createMessages(Definition definition, Element schemaElement) throws WSDLException { String schemaTargetNamespace = schemaElement.getAttribute("targetNamespace"); - Assert.hasText("No targetNamespace defined on schema"); + Assert.hasText(schemaTargetNamespace, "No targetNamespace defined on schema"); if (logger.isDebugEnabled()) { logger.debug("Looking for elements in schema with target namespace [" + schemaTargetNamespace + "]"); } @@ -75,7 +75,7 @@ public class DefaultMessagesProvider implements MessagesProvider { if (child.getNodeType() == Node.ELEMENT_NODE) { Element childElement = (Element) child; if (isMessageElement(childElement)) { - QName elementName = new QName(schemaTargetNamespace, childElement.getAttribute("name")); + QName elementName = new QName(schemaTargetNamespace, getElementName(childElement)); Message message = definition.createMessage(); populateMessage(definition, message, elementName); Part part = definition.createPart(); @@ -88,6 +88,16 @@ public class DefaultMessagesProvider implements MessagesProvider { } } + /** + * Returns the name attribute of the given element. + * + * @param element the element whose name to return + * @return the name of the element + */ + protected String getElementName(Element element) { + return element.getAttribute("name"); + } + /** * Indicates whether the given element should be includes as {@link Message} in the definition. *

diff --git a/core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/SuffixBasedMessagesProvider.java b/core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/SuffixBasedMessagesProvider.java new file mode 100644 index 00000000..6c021ada --- /dev/null +++ b/core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/SuffixBasedMessagesProvider.java @@ -0,0 +1,111 @@ +/* + * Copyright 2008 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.wsdl.wsdl11.provider; + +import org.w3c.dom.Element; + +import org.springframework.util.Assert; + +/** + * Implementation of the {@link MessagesProvider} interface that is based on suffixes. + * + * @author Arjen Poutsma + * @since 1.5.1 + */ +public class SuffixBasedMessagesProvider extends DefaultMessagesProvider { + + /** The default suffix used to detect request elements in the schema. */ + public static final String DEFAULT_REQUEST_SUFFIX = "Request"; + + /** The default suffix used to detect response elements in the schema. */ + public static final String DEFAULT_RESPONSE_SUFFIX = "Response"; + + /** The default suffix used to detect fault elements in the schema. */ + public static final String DEFAULT_FAULT_SUFFIX = "Fault"; + + private String requestSuffix = DEFAULT_REQUEST_SUFFIX; + + private String responseSuffix = DEFAULT_RESPONSE_SUFFIX; + + private String faultSuffix = DEFAULT_FAULT_SUFFIX; + + /** + * Returns the suffix used to detect request elements in the schema. + * + * @see #DEFAULT_REQUEST_SUFFIX + */ + public String getRequestSuffix() { + return requestSuffix; + } + + /** + * Sets the suffix used to detect request elements in the schema. + * + * @see #DEFAULT_REQUEST_SUFFIX + */ + public void setRequestSuffix(String requestSuffix) { + this.requestSuffix = requestSuffix; + } + + /** + * Returns the suffix used to detect response elements in the schema. + * + * @see #DEFAULT_RESPONSE_SUFFIX + */ + public String getResponseSuffix() { + return responseSuffix; + } + + /** + * Sets the suffix used to detect response elements in the schema. + * + * @see #DEFAULT_RESPONSE_SUFFIX + */ + public void setResponseSuffix(String responseSuffix) { + this.responseSuffix = responseSuffix; + } + + /** + * Returns the suffix used to detect fault elements in the schema. + * + * @see #DEFAULT_FAULT_SUFFIX + */ + public String getFaultSuffix() { + return faultSuffix; + } + + /** + * Sets the suffix used to detect fault elements in the schema. + * + * @see #DEFAULT_FAULT_SUFFIX + */ + public void setFaultSuffix(String faultSuffix) { + this.faultSuffix = faultSuffix; + } + + protected boolean isMessageElement(Element element) { + if (super.isMessageElement(element)) { + String elementName = getElementName(element); + Assert.hasText(elementName, "Element has no name"); + return elementName.endsWith(getRequestSuffix()) || elementName.endsWith(getResponseSuffix()) || + elementName.endsWith(getFaultSuffix()); + } + else { + return false; + } + } +} diff --git a/core/src/test/java/org/springframework/ws/wsdl/wsdl11/provider/DefaultMessagesProviderTest.java b/core/src/test/java/org/springframework/ws/wsdl/wsdl11/provider/DefaultMessagesProviderTest.java index dbc799bc..0b239ea4 100644 --- a/core/src/test/java/org/springframework/ws/wsdl/wsdl11/provider/DefaultMessagesProviderTest.java +++ b/core/src/test/java/org/springframework/ws/wsdl/wsdl11/provider/DefaultMessagesProviderTest.java @@ -68,6 +68,8 @@ public class DefaultMessagesProviderTest extends TestCase { provider.addMessages(definition); + assertEquals("Invalid amount of messages created", 3, definition.getMessages().size()); + Message message = definition.getMessage(new QName(definitionNamespace, "GetOrderRequest")); assertNotNull("Message not created", message); Part part = message.getPart("GetOrderRequest"); diff --git a/core/src/test/java/org/springframework/ws/wsdl/wsdl11/provider/SuffixBasedMessagesProviderTest.java b/core/src/test/java/org/springframework/ws/wsdl/wsdl11/provider/SuffixBasedMessagesProviderTest.java new file mode 100644 index 00000000..cc6a1c4a --- /dev/null +++ b/core/src/test/java/org/springframework/ws/wsdl/wsdl11/provider/SuffixBasedMessagesProviderTest.java @@ -0,0 +1,86 @@ +/* + * Copyright ${YEAR} the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.wsdl.wsdl11.provider; + +import javax.wsdl.Definition; +import javax.wsdl.Message; +import javax.wsdl.Part; +import javax.wsdl.Types; +import javax.wsdl.extensions.schema.Schema; +import javax.wsdl.factory.WSDLFactory; +import javax.xml.namespace.QName; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import junit.framework.TestCase; +import org.w3c.dom.Document; + +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.xml.sax.SaxUtils; + +public class SuffixBasedMessagesProviderTest extends TestCase { + + private SuffixBasedMessagesProvider provider; + + private Definition definition; + + private DocumentBuilder documentBuilder; + + protected void setUp() throws Exception { + provider = new SuffixBasedMessagesProvider(); + provider.setFaultSuffix("Foo"); + WSDLFactory factory = WSDLFactory.newInstance(); + definition = factory.newDefinition(); + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + documentBuilderFactory.setNamespaceAware(true); + documentBuilder = documentBuilderFactory.newDocumentBuilder(); + } + + public void testAddMessages() throws Exception { + String definitionNamespace = "http://springframework.org/spring-ws"; + definition.addNamespace("tns", definitionNamespace); + definition.setTargetNamespace(definitionNamespace); + String schemaNamespace = "http://www.springframework.org/spring-ws/schema"; + definition.addNamespace("schema", schemaNamespace); + + Resource resource = new ClassPathResource("schema.xsd", getClass()); + Document schemaDocument = documentBuilder.parse(SaxUtils.createInputSource(resource)); + Types types = definition.createTypes(); + definition.setTypes(types); + Schema schema = (Schema) definition.getExtensionRegistry() + .createExtension(Types.class, new QName("http://www.w3.org/2001/XMLSchema", "schema")); + types.addExtensibilityElement(schema); + schema.setElement(schemaDocument.getDocumentElement()); + + provider.addMessages(definition); + + assertEquals("Invalid amount of messages created", 2, definition.getMessages().size()); + + Message message = definition.getMessage(new QName(definitionNamespace, "GetOrderRequest")); + assertNotNull("Message not created", message); + Part part = message.getPart("GetOrderRequest"); + assertNotNull("Part not created", part); + assertEquals("Invalid element on part", new QName(schemaNamespace, "GetOrderRequest"), part.getElementName()); + + message = definition.getMessage(new QName(definitionNamespace, "GetOrderResponse")); + assertNotNull("Message not created", message); + part = message.getPart("GetOrderResponse"); + assertNotNull("Part not created", part); + assertEquals("Invalid element on part", new QName(schemaNamespace, "GetOrderResponse"), part.getElementName()); + } +} \ No newline at end of file