1 /*
2 * Copyright 2008 the original author or authors.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 package org.springframework.ws.wsdl.wsdl11;
18
19 import javax.wsdl.Definition;
20 import javax.wsdl.WSDLException;
21 import javax.wsdl.factory.WSDLFactory;
22
23 import org.springframework.beans.factory.InitializingBean;
24 import org.springframework.util.Assert;
25 import org.springframework.ws.wsdl.wsdl11.provider.BindingsProvider;
26 import org.springframework.ws.wsdl.wsdl11.provider.ImportsProvider;
27 import org.springframework.ws.wsdl.wsdl11.provider.MessagesProvider;
28 import org.springframework.ws.wsdl.wsdl11.provider.PortTypesProvider;
29 import org.springframework.ws.wsdl.wsdl11.provider.ServicesProvider;
30 import org.springframework.ws.wsdl.wsdl11.provider.TypesProvider;
31
32 /**
33 * Implementation of the {@link Wsdl11Definition} that uses a provider-based mechanism to populate a WSDL4J {@link
34 * Definition}.
35 * <p/>
36 * All providers are optional, indicating that a particular part of the WSDL will not be created. Providers can be set
37 * via various properties. The providers are {@link #afterPropertiesSet() invoked} in the following order: <ol>
38 * <li>{@link ImportsProvider}</li> <li>{@link TypesProvider}</li> <li>{@link MessagesProvider}</li> <li>{@link
39 * PortTypesProvider}</li> <li>{@link BindingsProvider}</li> <li>{@link ServicesProvider}</li> </ol>
40 * <p/>
41 * This definition requires the target namespace to be set via {@link #setTargetNamespace(String)}
42 *
43 * @author Arjen Poutsma
44 * @see #setImportsProvider(ImportsProvider)
45 * @see #setTypesProvider(TypesProvider)
46 * @see #setMessagesProvider(MessagesProvider)
47 * @see #setPortTypesProvider(PortTypesProvider)
48 * @see #setBindingsProvider(BindingsProvider)
49 * @see #setServicesProvider(ServicesProvider)
50 * @since 1.5.0
51 */
52 public class ProviderBasedWsdl4jDefinition extends Wsdl4jDefinition implements InitializingBean {
53
54 /** The prefix used to register the target namespace in the WSDL. */
55 public static final String TARGET_NAMESPACE_PREFIX = "tns";
56
57 private ImportsProvider importsProvider;
58
59 private TypesProvider typesProvider;
60
61 private MessagesProvider messagesProvider;
62
63 private PortTypesProvider portTypesProvider;
64
65 private BindingsProvider bindingsProvider;
66
67 private ServicesProvider servicesProvider;
68
69 private String targetNamespace;
70
71 /**
72 * Returns the {@link ImportsProvider} for this definition.
73 * <p/>
74 * Default is <code>null</code>, indicating that no <code><import></code> will be created
75 *
76 * @return the import provider; or <code>null</code>
77 */
78 public ImportsProvider getImportsProvider() {
79 return importsProvider;
80 }
81
82 /**
83 * Sets the {@link ImportsProvider} for this definition.
84 * <p/>
85 * Default is <code>null</code>, indicating that no <code><import></code> will be created
86 *
87 * @param importsProvider the import provider
88 */
89 public void setImportsProvider(ImportsProvider importsProvider) {
90 this.importsProvider = importsProvider;
91 }
92
93 /**
94 * Returns the {@link TypesProvider} for this definition.
95 * <p/>
96 * Defaults to <code>null</code>, indicating that no <code><types></code> will be created
97 *
98 * @return the types provider; or <code>null</code>
99 */
100 public TypesProvider getTypesProvider() {
101 return typesProvider;
102 }
103
104 /**
105 * Sets the {@link TypesProvider} for this definition.
106 * <p/>
107 * Defaults to <code>null</code>, indicating that no <code><types></code> will be created
108 *
109 * @param typesProvider the types provider; or <code>null</code>
110 */
111 public void setTypesProvider(TypesProvider typesProvider) {
112 this.typesProvider = typesProvider;
113 }
114
115 /**
116 * Returns the {@link MessagesProvider} for this definition.
117 * <p/>
118 * Defaults to <code>null</code>, indicating that no <code><message></code> will be created
119 *
120 * @return the messages provider; or <code>null</code>
121 */
122 public MessagesProvider getMessagesProvider() {
123 return messagesProvider;
124 }
125
126 /**
127 * Sets the {@link MessagesProvider} for this definition.
128 * <p/>
129 * Defaults to <code>null</code>, indicating that no <code><message></code> will be created
130 *
131 * @param messagesProvider the messages provider; or <code>null</code>
132 */
133 public void setMessagesProvider(MessagesProvider messagesProvider) {
134 this.messagesProvider = messagesProvider;
135 }
136
137 /**
138 * Returns the {@link PortTypesProvider} for this definition.
139 * <p/>
140 * Defaults to <code>null</code>, indicating that no <code><portType></code> will be created
141 *
142 * @return the port types provider; or <code>null</code>
143 */
144 public PortTypesProvider getPortTypesProvider() {
145 return portTypesProvider;
146 }
147
148 /**
149 * Sets the {@link PortTypesProvider} for this definition.
150 * <p/>
151 * Defaults to <code>null</code>, indicating that no <code><portType></code> will be created
152 *
153 * @param portTypesProvider the port types provider; or <code>null</code>
154 */
155 public void setPortTypesProvider(PortTypesProvider portTypesProvider) {
156 this.portTypesProvider = portTypesProvider;
157 }
158
159 /**
160 * Returns the {@link BindingsProvider} for this definition.
161 * <p/>
162 * Defaults to <code>null</code>, indicating that no <code><binding></code> will be created
163 *
164 * @return the binding provider; or <code>null</code>
165 */
166 public BindingsProvider getBindingsProvider() {
167 return bindingsProvider;
168 }
169
170 /**
171 * Sets the {@link BindingsProvider} for this definition.
172 * <p/>
173 * Defaults to <code>null</code>, indicating that no <code><binding></code> will be created
174 *
175 * @param bindingsProvider the bindings provider; or <code>null</code>
176 */
177 public void setBindingsProvider(BindingsProvider bindingsProvider) {
178 this.bindingsProvider = bindingsProvider;
179 }
180
181 /**
182 * Returns the {@link ServicesProvider} for this definition.
183 * <p/>
184 * Defaults to <code>null</code>, indicating that no <code><service></code> will be created
185 *
186 * @return the services provider; or <code>null</code>
187 */
188 public ServicesProvider getServicesProvider() {
189 return servicesProvider;
190 }
191
192 /**
193 * Sets the {@link ServicesProvider} for this definition.
194 * <p/>
195 * Defaults to <code>null</code>, indicating that no <code><service></code> will be created
196 *
197 * @param servicesProvider the services provider; or <code>null</code>
198 */
199 public void setServicesProvider(ServicesProvider servicesProvider) {
200 this.servicesProvider = servicesProvider;
201 }
202
203 /**
204 * Returns the target namespace for the WSDL definition.
205 *
206 * @return the target namespace
207 * @see javax.wsdl.Definition#getTargetNamespace()
208 */
209 public String getTargetNamespace() {
210 return targetNamespace;
211 }
212
213 /**
214 * Sets the target namespace used for this definition. Required.
215 *
216 * @param targetNamespace the target namespace
217 * @see javax.wsdl.Definition#setTargetNamespace(String)
218 */
219 public void setTargetNamespace(String targetNamespace) {
220 this.targetNamespace = targetNamespace;
221 }
222
223 public void afterPropertiesSet() throws WSDLException {
224 Assert.notNull(getTargetNamespace(), "'targetNamespace' is required");
225 WSDLFactory wsdlFactory = WSDLFactory.newInstance();
226 Definition definition = wsdlFactory.newDefinition();
227 definition.setTargetNamespace(getTargetNamespace());
228 definition.addNamespace(TARGET_NAMESPACE_PREFIX, getTargetNamespace());
229 if (importsProvider != null) {
230 importsProvider.addImports(definition);
231 }
232 if (typesProvider != null) {
233 typesProvider.addTypes(definition);
234 }
235 if (messagesProvider != null) {
236 messagesProvider.addMessages(definition);
237 }
238 if (portTypesProvider != null) {
239 portTypesProvider.addPortTypes(definition);
240 }
241 if (bindingsProvider != null) {
242 bindingsProvider.addBindings(definition);
243 }
244 if (servicesProvider != null) {
245 servicesProvider.addServices(definition);
246 }
247 setDefinition(definition);
248 }
249 }