/*
* Copyright 2005-2014 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;
import javax.wsdl.Definition;
import javax.wsdl.WSDLException;
import javax.wsdl.factory.WSDLFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;
import org.springframework.ws.wsdl.wsdl11.provider.BindingsProvider;
import org.springframework.ws.wsdl.wsdl11.provider.ImportsProvider;
import org.springframework.ws.wsdl.wsdl11.provider.MessagesProvider;
import org.springframework.ws.wsdl.wsdl11.provider.PortTypesProvider;
import org.springframework.ws.wsdl.wsdl11.provider.ServicesProvider;
import org.springframework.ws.wsdl.wsdl11.provider.TypesProvider;
/**
* Implementation of the {@link Wsdl11Definition} that uses a provider-based mechanism to populate a WSDL4J {@link
* Definition}.
*
* <p>All providers are optional, indicating that a particular part of the WSDL will not be created. Providers can be set
* via various properties. The providers are {@link #afterPropertiesSet() invoked} in the following order: <ol>
* <li>{@link ImportsProvider}</li> <li>{@link TypesProvider}</li> <li>{@link MessagesProvider}</li> <li>{@link
* PortTypesProvider}</li> <li>{@link BindingsProvider}</li> <li>{@link ServicesProvider}</li> </ol>
*
* <p>This definition requires the target namespace to be set via {@link #setTargetNamespace(String)}
*
* @author Arjen Poutsma
* @see #setImportsProvider(ImportsProvider)
* @see #setTypesProvider(TypesProvider)
* @see #setMessagesProvider(MessagesProvider)
* @see #setPortTypesProvider(PortTypesProvider)
* @see #setBindingsProvider(BindingsProvider)
* @see #setServicesProvider(ServicesProvider)
* @since 1.5.0
*/
public class ProviderBasedWsdl4jDefinition extends Wsdl4jDefinition implements InitializingBean {
/** The prefix used to register the target namespace in the WSDL. */
public static final String TARGET_NAMESPACE_PREFIX = "tns";
private ImportsProvider importsProvider;
private TypesProvider typesProvider;
private MessagesProvider messagesProvider;
private PortTypesProvider portTypesProvider;
private BindingsProvider bindingsProvider;
private ServicesProvider servicesProvider;
private String targetNamespace;
/**
* Returns the {@link ImportsProvider} for this definition.
*
* <p>Default is {@code null}, indicating that no {@code <import>} will be created
*
* @return the import provider; or {@code null}
*/
public ImportsProvider getImportsProvider() {
return importsProvider;
}
/**
* Sets the {@link ImportsProvider} for this definition.
*
* <p>Default is {@code null}, indicating that no {@code <import>} will be created
*
* @param importsProvider the import provider
*/
public void setImportsProvider(ImportsProvider importsProvider) {
this.importsProvider = importsProvider;
}
/**
* Returns the {@link TypesProvider} for this definition.
*
* <p>Defaults to {@code null}, indicating that no {@code <types>} will be created
*
* @return the types provider; or {@code null}
*/
public TypesProvider getTypesProvider() {
return typesProvider;
}
/**
* Sets the {@link TypesProvider} for this definition.
*
* <p>Defaults to {@code null}, indicating that no {@code <types>} will be created
*
* @param typesProvider the types provider; or {@code null}
*/
public void setTypesProvider(TypesProvider typesProvider) {
this.typesProvider = typesProvider;
}
/**
* Returns the {@link MessagesProvider} for this definition.
*
* <p>Defaults to {@code null}, indicating that no {@code <message>} will be created
*
* @return the messages provider; or {@code null}
*/
public MessagesProvider getMessagesProvider() {
return messagesProvider;
}
/**
* Sets the {@link MessagesProvider} for this definition.
*
* <p>Defaults to {@code null}, indicating that no {@code <message>} will be created
*
* @param messagesProvider the messages provider; or {@code null}
*/
public void setMessagesProvider(MessagesProvider messagesProvider) {
this.messagesProvider = messagesProvider;
}
/**
* Returns the {@link PortTypesProvider} for this definition.
*
* <p>Defaults to {@code null}, indicating that no {@code <portType>} will be created
*
* @return the port types provider; or {@code null}
*/
public PortTypesProvider getPortTypesProvider() {
return portTypesProvider;
}
/**
* Sets the {@link PortTypesProvider} for this definition.
*
* <p>Defaults to {@code null}, indicating that no {@code <portType>} will be created
*
* @param portTypesProvider the port types provider; or {@code null}
*/
public void setPortTypesProvider(PortTypesProvider portTypesProvider) {
this.portTypesProvider = portTypesProvider;
}
/**
* Returns the {@link BindingsProvider} for this definition.
*
* <p>Defaults to {@code null}, indicating that no {@code <binding>} will be created
*
* @return the binding provider; or {@code null}
*/
public BindingsProvider getBindingsProvider() {
return bindingsProvider;
}
/**
* Sets the {@link BindingsProvider} for this definition.
*
* <p>Defaults to {@code null}, indicating that no {@code <binding>} will be created
*
* @param bindingsProvider the bindings provider; or {@code null}
*/
public void setBindingsProvider(BindingsProvider bindingsProvider) {
this.bindingsProvider = bindingsProvider;
}
/**
* Returns the {@link ServicesProvider} for this definition.
*
* <p>Defaults to {@code null}, indicating that no {@code <service>} will be created
*
* @return the services provider; or {@code null}
*/
public ServicesProvider getServicesProvider() {
return servicesProvider;
}
/**
* Sets the {@link ServicesProvider} for this definition.
*
* <p>Defaults to {@code null}, indicating that no {@code <service>} will be created
*
* @param servicesProvider the services provider; or {@code null}
*/
public void setServicesProvider(ServicesProvider servicesProvider) {
this.servicesProvider = servicesProvider;
}
/**
* Returns the target namespace for the WSDL definition.
*
* @return the target namespace
* @see javax.wsdl.Definition#getTargetNamespace()
*/
public String getTargetNamespace() {
return targetNamespace;
}
/**
* Sets the target namespace used for this definition. Required.
*
* @param targetNamespace the target namespace
* @see javax.wsdl.Definition#setTargetNamespace(String)
*/
public void setTargetNamespace(String targetNamespace) {
this.targetNamespace = targetNamespace;
}
@Override
public void afterPropertiesSet() throws WSDLException {
Assert.notNull(getTargetNamespace(), "'targetNamespace' is required");
WSDLFactory wsdlFactory = WSDLFactory.newInstance();
Definition definition = wsdlFactory.newDefinition();
definition.setTargetNamespace(getTargetNamespace());
definition.addNamespace(TARGET_NAMESPACE_PREFIX, getTargetNamespace());
if (importsProvider != null) {
importsProvider.addImports(definition);
}
if (typesProvider != null) {
typesProvider.addTypes(definition);
}
if (messagesProvider != null) {
messagesProvider.addMessages(definition);
}
if (portTypesProvider != null) {
portTypesProvider.addPortTypes(definition);
}
if (bindingsProvider != null) {
bindingsProvider.addBindings(definition);
}
if (servicesProvider != null) {
servicesProvider.addServices(definition);
}
setDefinition(definition);
}
}