diff --git a/spring-ws-core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/AbstractPortTypesProvider.java b/spring-ws-core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/AbstractPortTypesProvider.java index 7077568d..edf10c26 100644 --- a/spring-ws-core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/AbstractPortTypesProvider.java +++ b/spring-ws-core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/AbstractPortTypesProvider.java @@ -16,7 +16,6 @@ package org.springframework.ws.wsdl.wsdl11.provider; -import java.util.Iterator; import java.util.List; import javax.wsdl.Definition; @@ -68,7 +67,9 @@ public abstract class AbstractPortTypesProvider implements PortTypesProvider { */ @Override public void addPortTypes(Definition definition) throws WSDLException { + Assert.notNull(getPortTypeName(), "'portTypeName' is required"); + PortType portType = definition.createPortType(); populatePortType(definition, portType); createOperations(definition, portType); @@ -86,6 +87,7 @@ public abstract class AbstractPortTypesProvider implements PortTypesProvider { * @see #setPortTypeName(String) */ protected void populatePortType(Definition definition, PortType portType) throws WSDLException { + QName portTypeName = new QName(definition.getTargetNamespace(), getPortTypeName()); if (logger.isDebugEnabled()) { logger.debug("Creating port type [" + portTypeName + "]"); @@ -94,7 +96,9 @@ public abstract class AbstractPortTypesProvider implements PortTypesProvider { } private void createOperations(Definition definition, PortType portType) throws WSDLException { - MultiValueMap operations = new LinkedMultiValueMap(); + + MultiValueMap operations = new LinkedMultiValueMap<>(); + for (Object messageValue : definition.getMessages().values()) { Message message = (Message) messageValue; String operationName = getOperationName(message); @@ -102,10 +106,13 @@ public abstract class AbstractPortTypesProvider implements PortTypesProvider { operations.add(operationName, message); } } + if (operations.isEmpty() && logger.isWarnEnabled()) { logger.warn("No operations were created, make sure the WSDL contains messages"); } + for (String operationName : operations.keySet()) { + Operation operation = definition.createOperation(); operation.setName(operationName); List messages = operations.get(operationName); @@ -218,6 +225,7 @@ public abstract class AbstractPortTypesProvider implements PortTypesProvider { * @return the operation type for the operation */ protected OperationType getOperationType(Operation operation) { + if (operation.getInput() != null && operation.getOutput() != null) { return OperationType.REQUEST_RESPONSE; } else if (operation.getInput() != null && operation.getOutput() == null) { diff --git a/spring-ws-core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/DefaultConcretePartProvider.java b/spring-ws-core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/DefaultConcretePartProvider.java index 570919ed..7cc3a207 100644 --- a/spring-ws-core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/DefaultConcretePartProvider.java +++ b/spring-ws-core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/DefaultConcretePartProvider.java @@ -16,23 +16,7 @@ package org.springframework.ws.wsdl.wsdl11.provider; -import java.util.Iterator; - -import javax.wsdl.Binding; -import javax.wsdl.BindingFault; -import javax.wsdl.BindingInput; -import javax.wsdl.BindingOperation; -import javax.wsdl.BindingOutput; -import javax.wsdl.Definition; -import javax.wsdl.Fault; -import javax.wsdl.Input; -import javax.wsdl.Operation; -import javax.wsdl.OperationType; -import javax.wsdl.Output; -import javax.wsdl.Port; -import javax.wsdl.PortType; -import javax.wsdl.Service; -import javax.wsdl.WSDLException; +import javax.wsdl.*; import javax.xml.namespace.QName; import org.apache.commons.logging.Log; @@ -65,6 +49,7 @@ public class DefaultConcretePartProvider implements BindingsProvider, ServicesPr /** Sets the service name. */ public void setServiceName(String serviceName) { + Assert.hasText(serviceName, "'serviceName' must not be null"); this.serviceName = serviceName; } @@ -76,6 +61,7 @@ public class DefaultConcretePartProvider implements BindingsProvider, ServicesPr /** Sets the suffix to append to the port type name to obtain the binding name. */ public void setBindingSuffix(String bindingSuffix) { + Assert.notNull(bindingSuffix, "'bindingSuffix' must not be null"); this.bindingSuffix = bindingSuffix; } @@ -97,17 +83,21 @@ public class DefaultConcretePartProvider implements BindingsProvider, ServicesPr */ @Override public void addBindings(Definition definition) throws WSDLException { + for (Object portValue : definition.getPortTypes().values()) { + PortType portType = (PortType) portValue; Binding binding = definition.createBinding(); binding.setPortType(portType); populateBinding(definition, binding); createBindingOperations(definition, binding); binding.setUndefined(false); + if (binding.getQName() != null) { definition.addBinding(binding); } } + if (definition.getBindings().isEmpty() && logger.isWarnEnabled()) { logger.warn("No bindings were created, make sure the WSDL contains port types"); } @@ -124,8 +114,11 @@ public class DefaultConcretePartProvider implements BindingsProvider, ServicesPr * @param binding the WSDL4J {@code Binding} */ protected void populateBinding(Definition definition, Binding binding) throws WSDLException { + QName portTypeName = binding.getPortType().getQName(); + if (portTypeName != null) { + QName bindingName = new QName(portTypeName.getNamespaceURI(), portTypeName.getLocalPart() + getBindingSuffix()); if (logger.isDebugEnabled()) { logger.debug("Creating binding [" + bindingName + "]"); @@ -135,12 +128,16 @@ public class DefaultConcretePartProvider implements BindingsProvider, ServicesPr } private void createBindingOperations(Definition definition, Binding binding) throws WSDLException { + PortType portType = binding.getPortType(); + for (Object operationValue : portType.getOperations()) { + Operation operation = (Operation) operationValue; BindingOperation bindingOperation = definition.createBindingOperation(); bindingOperation.setOperation(operation); populateBindingOperation(definition, bindingOperation); + if (OperationType.REQUEST_RESPONSE.equals(operation.getStyle())) { createBindingInput(definition, operation, bindingOperation); createBindingOutput(definition, operation, bindingOperation); @@ -152,6 +149,7 @@ public class DefaultConcretePartProvider implements BindingsProvider, ServicesPr createBindingOutput(definition, operation, bindingOperation); createBindingInput(definition, operation, bindingOperation); } + for (Object faultValue : operation.getFaults().values()) { Fault fault = (Fault) faultValue; BindingFault bindingFault = definition.createBindingFault(); @@ -160,6 +158,7 @@ public class DefaultConcretePartProvider implements BindingsProvider, ServicesPr bindingOperation.addBindingFault(bindingFault); } } + binding.addBindingOperation(bindingOperation); } } @@ -181,6 +180,7 @@ public class DefaultConcretePartProvider implements BindingsProvider, ServicesPr private void createBindingInput(Definition definition, Operation operation, BindingOperation bindingOperation) throws WSDLException { + BindingInput bindingInput = definition.createBindingInput(); populateBindingInput(definition, bindingInput, operation.getInput()); bindingOperation.setBindingInput(bindingInput); @@ -188,6 +188,7 @@ public class DefaultConcretePartProvider implements BindingsProvider, ServicesPr private void createBindingOutput(Definition definition, Operation operation, BindingOperation bindingOperation) throws WSDLException { + BindingOutput bindingOutput = definition.createBindingOutput(); populateBindingOutput(definition, bindingOutput, operation.getOutput()); bindingOperation.setBindingOutput(bindingOutput); @@ -247,15 +248,19 @@ public class DefaultConcretePartProvider implements BindingsProvider, ServicesPr */ @Override public void addServices(Definition definition) throws WSDLException { + Assert.notNull(getServiceName(), "'serviceName' is required"); + Service service; if (definition.getServices().isEmpty()) { service = definition.createService(); } else { service = (Service) definition.getServices().values().iterator().next(); } + populateService(definition, service); createPorts(definition, service); + if (service.getQName() != null) { definition.addService(service); } @@ -271,6 +276,7 @@ public class DefaultConcretePartProvider implements BindingsProvider, ServicesPr * @throws WSDLException in case of errors */ protected void populateService(Definition definition, Service service) throws WSDLException { + if (StringUtils.hasText(definition.getTargetNamespace()) && StringUtils.hasText(getServiceName())) { QName serviceName = new QName(definition.getTargetNamespace(), getServiceName()); if (logger.isDebugEnabled()) { @@ -281,6 +287,7 @@ public class DefaultConcretePartProvider implements BindingsProvider, ServicesPr } private void createPorts(Definition definition, Service service) throws WSDLException { + for (Object bindingValue : definition.getBindings().values()) { Binding binding = (Binding) bindingValue; Port port = null; @@ -302,6 +309,7 @@ public class DefaultConcretePartProvider implements BindingsProvider, ServicesPr service.addPort(port); } } + if (service.getPorts().isEmpty() && logger.isWarnEnabled()) { logger.warn("No ports were created, make sure the WSDL contains bindings"); } @@ -318,8 +326,8 @@ public class DefaultConcretePartProvider implements BindingsProvider, ServicesPr * @throws WSDLException in case of errors */ protected void populatePort(Definition definition, Port port) throws WSDLException { + String portName = port.getBinding().getQName().getLocalPart(); port.setName(portName); } - } diff --git a/spring-ws-core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/DefaultMessagesProvider.java b/spring-ws-core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/DefaultMessagesProvider.java index 1b7aef1c..3dc7b6f4 100644 --- a/spring-ws-core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/DefaultMessagesProvider.java +++ b/spring-ws-core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/DefaultMessagesProvider.java @@ -16,8 +16,6 @@ package org.springframework.ws.wsdl.wsdl11.provider; -import java.util.Iterator; - import javax.wsdl.Definition; import javax.wsdl.Message; import javax.wsdl.Part; @@ -48,6 +46,7 @@ public class DefaultMessagesProvider implements MessagesProvider { @Override public void addMessages(Definition definition) throws WSDLException { + Types types = definition.getTypes(); Assert.notNull(types, "No types element present in definition"); for (Object element : types.getExtensibilityElements()) { @@ -59,20 +58,27 @@ public class DefaultMessagesProvider implements MessagesProvider { } } } + if (definition.getMessages().isEmpty() && logger.isWarnEnabled()) { logger.warn("No messages were created, make sure the referenced schema(s) contain elements"); } } private void createMessages(Definition definition, Element schemaElement) throws WSDLException { + String schemaTargetNamespace = schemaElement.getAttribute("targetNamespace"); Assert.hasText(schemaTargetNamespace, "No targetNamespace defined on schema"); + if (logger.isDebugEnabled()) { logger.debug("Looking for elements in schema with target namespace [" + schemaTargetNamespace + "]"); } + NodeList children = schemaElement.getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + Node child = children.item(i); + if (child.getNodeType() == Node.ELEMENT_NODE) { Element childElement = (Element) child; if (isMessageElement(childElement)) { @@ -109,6 +115,7 @@ public class DefaultMessagesProvider implements MessagesProvider { * @return {@code true} if to be included as message; {@code false} otherwise */ protected boolean isMessageElement(Element element) { + return "element".equals(element.getLocalName()) && "http://www.w3.org/2001/XMLSchema".equals(element.getNamespaceURI()); } @@ -124,6 +131,7 @@ public class DefaultMessagesProvider implements MessagesProvider { * @throws WSDLException in case of errors */ protected void populateMessage(Definition definition, Message message, QName elementName) throws WSDLException { + QName messageName = new QName(definition.getTargetNamespace(), elementName.getLocalPart()); if (logger.isDebugEnabled()) { logger.debug("Creating message [" + messageName + "]"); @@ -142,8 +150,8 @@ public class DefaultMessagesProvider implements MessagesProvider { * @see Part#setElementName(javax.xml.namespace.QName) */ protected void populatePart(Definition definition, Part part, QName elementName) throws WSDLException { + part.setElementName(elementName); part.setName(elementName.getLocalPart()); } - } diff --git a/spring-ws-core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/Soap11Provider.java b/spring-ws-core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/Soap11Provider.java index 783e9996..c615fdb1 100644 --- a/spring-ws-core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/Soap11Provider.java +++ b/spring-ws-core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/Soap11Provider.java @@ -16,20 +16,9 @@ package org.springframework.ws.wsdl.wsdl11.provider; -import java.util.Iterator; import java.util.Properties; -import javax.wsdl.Binding; -import javax.wsdl.BindingFault; -import javax.wsdl.BindingInput; -import javax.wsdl.BindingOperation; -import javax.wsdl.BindingOutput; -import javax.wsdl.Definition; -import javax.wsdl.Fault; -import javax.wsdl.Input; -import javax.wsdl.Output; -import javax.wsdl.Port; -import javax.wsdl.WSDLException; +import javax.wsdl.*; import javax.wsdl.extensions.ExtensibilityElement; import javax.wsdl.extensions.ExtensionRegistry; import javax.wsdl.extensions.soap.SOAPAddress; @@ -94,6 +83,7 @@ public class Soap11Provider extends DefaultConcretePartProvider { * @param soapActions the soap */ public void setSoapActions(Properties soapActions) { + Assert.notNull(soapActions, "'soapActions' must not be null"); this.soapActions = soapActions; } @@ -113,6 +103,7 @@ public class Soap11Provider extends DefaultConcretePartProvider { * @param transportUri the binding transport value */ public void setTransportUri(String transportUri) { + Assert.notNull(transportUri, "'transportUri' must not be null"); this.transportUri = transportUri; } @@ -140,6 +131,7 @@ public class Soap11Provider extends DefaultConcretePartProvider { */ @Override protected void populateBinding(Definition definition, Binding binding) throws WSDLException { + definition.addNamespace(SOAP_11_NAMESPACE_PREFIX, SOAP_11_NAMESPACE_URI); super.populateBinding(definition, binding); SOAPBinding soapBinding = (SOAPBinding) createSoapExtension(definition, Binding.class, "binding"); @@ -161,6 +153,7 @@ public class Soap11Provider extends DefaultConcretePartProvider { * @see #DEFAULT_TRANSPORT_URI */ protected void populateSoapBinding(SOAPBinding soapBinding, Binding binding) throws WSDLException { + soapBinding.setStyle("document"); soapBinding.setTransportURI(getTransportUri()); } @@ -180,6 +173,7 @@ public class Soap11Provider extends DefaultConcretePartProvider { @Override protected void populateBindingFault(Definition definition, BindingFault bindingFault, Fault fault) throws WSDLException { + super.populateBindingFault(definition, bindingFault, fault); SOAPFault soapFault = (SOAPFault) createSoapExtension(definition, BindingFault.class, "fault"); populateSoapFault(bindingFault, soapFault); @@ -198,6 +192,7 @@ public class Soap11Provider extends DefaultConcretePartProvider { * @see SOAPFault#setUse(String) */ protected void populateSoapFault(BindingFault bindingFault, SOAPFault soapFault) throws WSDLException { + soapFault.setName(bindingFault.getName()); soapFault.setUse("literal"); } @@ -217,6 +212,7 @@ public class Soap11Provider extends DefaultConcretePartProvider { @Override protected void populateBindingInput(Definition definition, BindingInput bindingInput, Input input) throws WSDLException { + super.populateBindingInput(definition, bindingInput, input); SOAPBody soapBody = (SOAPBody) createSoapExtension(definition, BindingInput.class, "body"); populateSoapBody(soapBody); @@ -252,6 +248,7 @@ public class Soap11Provider extends DefaultConcretePartProvider { @Override protected void populateBindingOperation(Definition definition, BindingOperation bindingOperation) throws WSDLException { + super.populateBindingOperation(definition, bindingOperation); SOAPOperation soapOperation = (SOAPOperation) createSoapExtension(definition, BindingOperation.class, "operation"); populateSoapOperation(soapOperation, bindingOperation); @@ -272,6 +269,7 @@ public class Soap11Provider extends DefaultConcretePartProvider { */ protected void populateSoapOperation(SOAPOperation soapOperation, BindingOperation bindingOperation) throws WSDLException { + String bindingOperationName = bindingOperation.getName(); String soapAction = getSoapActions().getProperty(bindingOperationName, ""); soapOperation.setSoapActionURI(soapAction); @@ -292,6 +290,7 @@ public class Soap11Provider extends DefaultConcretePartProvider { @Override protected void populateBindingOutput(Definition definition, BindingOutput bindingOutput, Output output) throws WSDLException { + super.populateBindingOutput(definition, bindingOutput, output); SOAPBody soapBody = (SOAPBody) createSoapExtension(definition, BindingOutput.class, "body"); populateSoapBody(soapBody); @@ -311,7 +310,9 @@ public class Soap11Provider extends DefaultConcretePartProvider { */ @Override protected void populatePort(Definition definition, Port port) throws WSDLException { + for (Object extensibilityElement : port.getBinding().getExtensibilityElements()) { + if (extensibilityElement instanceof SOAPBinding) { // this is a SOAP 1.1 binding, create a SOAP Address for it super.populatePort(definition, port); diff --git a/spring-ws-core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/Soap12Provider.java b/spring-ws-core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/Soap12Provider.java index 899f403b..0614e63f 100644 --- a/spring-ws-core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/Soap12Provider.java +++ b/spring-ws-core/src/main/java/org/springframework/ws/wsdl/wsdl11/provider/Soap12Provider.java @@ -16,20 +16,9 @@ package org.springframework.ws.wsdl.wsdl11.provider; -import java.util.Iterator; import java.util.Properties; -import javax.wsdl.Binding; -import javax.wsdl.BindingFault; -import javax.wsdl.BindingInput; -import javax.wsdl.BindingOperation; -import javax.wsdl.BindingOutput; -import javax.wsdl.Definition; -import javax.wsdl.Fault; -import javax.wsdl.Input; -import javax.wsdl.Output; -import javax.wsdl.Port; -import javax.wsdl.WSDLException; +import javax.wsdl.*; import javax.wsdl.extensions.ExtensibilityElement; import javax.wsdl.extensions.soap12.SOAP12Address; import javax.wsdl.extensions.soap12.SOAP12Binding; @@ -93,6 +82,7 @@ public class Soap12Provider extends DefaultConcretePartProvider { * @param soapActions the soap */ public void setSoapActions(Properties soapActions) { + Assert.notNull(soapActions, "'soapActions' must not be null"); this.soapActions = soapActions; } @@ -112,6 +102,7 @@ public class Soap12Provider extends DefaultConcretePartProvider { * @param transportUri the binding transport value */ public void setTransportUri(String transportUri) { + Assert.notNull(transportUri, "'transportUri' must not be null"); this.transportUri = transportUri; } @@ -141,6 +132,7 @@ public class Soap12Provider extends DefaultConcretePartProvider { */ @Override protected void populateBinding(Definition definition, Binding binding) throws WSDLException { + definition.addNamespace(SOAP_12_NAMESPACE_PREFIX, SOAP_12_NAMESPACE_URI); super.populateBinding(definition, binding); SOAP12Binding soapBinding = (SOAP12Binding) createSoapExtension(definition, Binding.class, "binding"); @@ -162,6 +154,7 @@ public class Soap12Provider extends DefaultConcretePartProvider { * @see #DEFAULT_TRANSPORT_URI */ protected void populateSoapBinding(SOAP12Binding soapBinding, Binding binding) throws WSDLException { + soapBinding.setStyle("document"); soapBinding.setTransportURI(getTransportUri()); } @@ -182,6 +175,7 @@ public class Soap12Provider extends DefaultConcretePartProvider { @Override protected void populateBindingFault(Definition definition, BindingFault bindingFault, Fault fault) throws WSDLException { + super.populateBindingFault(definition, bindingFault, fault); SOAP12Fault soapFault = (SOAP12Fault) createSoapExtension(definition, BindingFault.class, "fault"); populateSoapFault(bindingFault, soapFault); @@ -200,6 +194,7 @@ public class Soap12Provider extends DefaultConcretePartProvider { * @see javax.wsdl.extensions.soap.SOAPFault#setUse(String) */ protected void populateSoapFault(BindingFault bindingFault, SOAP12Fault soapFault) throws WSDLException { + soapFault.setName(bindingFault.getName()); soapFault.setUse("literal"); } @@ -220,6 +215,7 @@ public class Soap12Provider extends DefaultConcretePartProvider { @Override protected void populateBindingInput(Definition definition, BindingInput bindingInput, Input input) throws WSDLException { + super.populateBindingInput(definition, bindingInput, input); SOAP12Body soapBody = (SOAP12Body) createSoapExtension(definition, BindingInput.class, "body"); populateSoapBody(soapBody); @@ -255,6 +251,7 @@ public class Soap12Provider extends DefaultConcretePartProvider { @Override protected void populateBindingOperation(Definition definition, BindingOperation bindingOperation) throws WSDLException { + super.populateBindingOperation(definition, bindingOperation); SOAP12Operation soapOperation = (SOAP12Operation) createSoapExtension(definition, BindingOperation.class, "operation"); @@ -276,6 +273,7 @@ public class Soap12Provider extends DefaultConcretePartProvider { */ protected void populateSoapOperation(SOAP12Operation soapOperation, BindingOperation bindingOperation) throws WSDLException { + String bindingOperationName = bindingOperation.getName(); String soapAction = getSoapActions().getProperty(bindingOperationName, ""); soapOperation.setSoapActionURI(soapAction); @@ -297,6 +295,7 @@ public class Soap12Provider extends DefaultConcretePartProvider { @Override protected void populateBindingOutput(Definition definition, BindingOutput bindingOutput, Output output) throws WSDLException { + super.populateBindingOutput(definition, bindingOutput, output); SOAP12Body soapBody = (SOAP12Body) createSoapExtension(definition, BindingOutput.class, "body"); populateSoapBody(soapBody); @@ -316,7 +315,9 @@ public class Soap12Provider extends DefaultConcretePartProvider { */ @Override protected void populatePort(Definition definition, Port port) throws WSDLException { + for (Object extensibilityElement : port.getBinding().getExtensibilityElements()) { + if (extensibilityElement instanceof SOAP12Binding) { // this is a SOAP 1.2 binding, create a SOAP Address for it super.populatePort(definition, port);