001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.servicemix.cxfbc.wsdl;
018
019 import java.util.Iterator;
020 import java.util.List;
021 import java.util.Map;
022
023 import javax.wsdl.Binding;
024 import javax.wsdl.BindingFault;
025 import javax.wsdl.BindingInput;
026 import javax.wsdl.BindingOperation;
027 import javax.wsdl.BindingOutput;
028 import javax.wsdl.Definition;
029 import javax.wsdl.Fault;
030 import javax.wsdl.Import;
031 import javax.wsdl.Operation;
032 import javax.wsdl.Port;
033 import javax.wsdl.PortType;
034 import javax.wsdl.Service;
035 import javax.wsdl.extensions.soap.SOAPAddress;
036 import javax.wsdl.extensions.soap.SOAPBinding;
037 import javax.wsdl.extensions.soap.SOAPBody;
038 import javax.wsdl.extensions.soap.SOAPFault;
039 import javax.wsdl.extensions.soap.SOAPOperation;
040 import javax.wsdl.extensions.soap12.SOAP12Address;
041 import javax.wsdl.extensions.soap12.SOAP12Binding;
042 import javax.wsdl.extensions.soap12.SOAP12Body;
043 import javax.wsdl.extensions.soap12.SOAP12Fault;
044 import javax.wsdl.extensions.soap12.SOAP12Operation;
045 import javax.wsdl.factory.WSDLFactory;
046 import javax.xml.namespace.QName;
047
048 import com.ibm.wsdl.extensions.soap.SOAPAddressImpl;
049 import com.ibm.wsdl.extensions.soap.SOAPBindingImpl;
050 import com.ibm.wsdl.extensions.soap.SOAPBodyImpl;
051 import com.ibm.wsdl.extensions.soap.SOAPFaultImpl;
052 import com.ibm.wsdl.extensions.soap.SOAPOperationImpl;
053 import com.ibm.wsdl.extensions.soap12.SOAP12AddressImpl;
054 import com.ibm.wsdl.extensions.soap12.SOAP12BindingImpl;
055 import com.ibm.wsdl.extensions.soap12.SOAP12BodyImpl;
056 import com.ibm.wsdl.extensions.soap12.SOAP12FaultImpl;
057 import com.ibm.wsdl.extensions.soap12.SOAP12OperationImpl;
058
059 public final class PortTypeDecorator {
060
061 private PortTypeDecorator() {
062
063 }
064 public static Definition createImportDef(Definition definition,
065 String targetNamespace, String importUri) throws Exception {
066 // Create definition
067 Definition def = WSDLFactory.newInstance().newDefinition();
068 def.setTargetNamespace(targetNamespace);
069
070 // Add namespaces
071 Map namespaces = definition.getNamespaces();
072 for (Iterator iter = namespaces.keySet().iterator(); iter.hasNext();) {
073 String prefix = (String) iter.next();
074 String uri = definition.getNamespace(prefix);
075 def.addNamespace(prefix, uri);
076 }
077 def.addNamespace("tns", targetNamespace);
078 def.addNamespace("tnspt", definition.getTargetNamespace());
079
080 // Create import
081 Import imp = def.createImport();
082 imp.setNamespaceURI(definition.getTargetNamespace());
083 imp.setLocationURI(importUri);
084 imp.setDefinition(definition);
085 def.addImport(imp);
086
087 return def;
088 }
089
090 public static void decorate(Definition def, PortType portType,
091 String locationUri) throws Exception {
092 decorate(def, portType, locationUri, portType.getQName().getLocalPart()
093 + "Binding", portType.getQName().getLocalPart() + "Service",
094 "JBI", "1.1");
095 }
096
097 public static void decorate(Definition def, PortType portType,
098 String locationUri, String bindingName, String serviceName,
099 String portName, String soapVersion) throws Exception {
100 boolean soap11 = "1.1".equals(soapVersion);
101 if (soap11) {
102 def.addNamespace("wsdlsoap",
103 "http://schemas.xmlsoap.org/wsdl/soap/");
104 } else {
105 def.addNamespace("wsdlsoap",
106 "http://schemas.xmlsoap.org/wsdl/soap12/");
107 }
108 // Create binding
109 Binding binding = createBinding(def, portType, bindingName);
110 // Create soap extension
111 createSoapExtension(soap11, binding);
112 // Create operations
113 createOperation(def, portType, soap11, binding);
114 // Create service
115 createService(def, locationUri, serviceName, portName, soap11, binding);
116 }
117 private static void createService(Definition def,
118 String locationUri,
119 String serviceName,
120 String portName,
121 boolean soap11,
122 Binding binding) {
123 Service service = def.createService();
124 service.setQName(new QName(def.getTargetNamespace(), serviceName));
125 Port port = def.createPort();
126 port.setName(portName);
127 port.setBinding(binding);
128 if (soap11) {
129 SOAPAddress address = new SOAPAddressImpl();
130 address.setLocationURI(locationUri);
131 port.addExtensibilityElement(address);
132 } else {
133 SOAP12Address address = new SOAP12AddressImpl();
134 address.setLocationURI(locationUri);
135 port.addExtensibilityElement(address);
136 }
137 service.addPort(port);
138 def.addService(service);
139 }
140 private static void createOperation(Definition def, PortType portType, boolean soap11, Binding binding) {
141 List operations = portType.getOperations();
142 for (Iterator iter = operations.iterator(); iter.hasNext();) {
143 Operation operation = (Operation) iter.next();
144 BindingOperation bindingOp = def.createBindingOperation();
145 bindingOp.setName(operation.getName());
146 if (soap11) {
147 SOAPOperation op = new SOAPOperationImpl();
148 op.setSoapActionURI("");
149 bindingOp.addExtensibilityElement(op);
150 } else {
151 SOAP12Operation op = new SOAP12OperationImpl();
152 op.setSoapActionURI("");
153 bindingOp.addExtensibilityElement(op);
154 }
155 if (operation.getInput() != null) {
156 BindingInput in = def.createBindingInput();
157 in.setName(operation.getInput().getName());
158 if (soap11) {
159 SOAPBody body = new SOAPBodyImpl();
160 body.setUse("literal");
161 in.addExtensibilityElement(body);
162 } else {
163 SOAP12Body body = new SOAP12BodyImpl();
164 body.setUse("literal");
165 in.addExtensibilityElement(body);
166 }
167 bindingOp.setBindingInput(in);
168 }
169 if (operation.getOutput() != null) {
170 BindingOutput out = def.createBindingOutput();
171 out.setName(operation.getOutput().getName());
172 if (soap11) {
173 SOAPBody body = new SOAPBodyImpl();
174 body.setUse("literal");
175 out.addExtensibilityElement(body);
176 } else {
177 SOAP12Body body = new SOAP12BodyImpl();
178 body.setUse("literal");
179 out.addExtensibilityElement(body);
180 }
181 bindingOp.setBindingOutput(out);
182 }
183 for (Iterator itf = operation.getFaults().values().iterator(); itf
184 .hasNext();) {
185 Fault fault = (Fault) itf.next();
186 BindingFault bindingFault = def.createBindingFault();
187 bindingFault.setName(fault.getName());
188 if (soap11) {
189 SOAPFault soapFault = new SOAPFaultImpl();
190 soapFault.setUse("literal");
191 soapFault.setName(fault.getName());
192 bindingFault.addExtensibilityElement(soapFault);
193 } else {
194 SOAP12Fault soapFault = new SOAP12FaultImpl();
195 soapFault.setUse("literal");
196 soapFault.setName(fault.getName());
197 bindingFault.addExtensibilityElement(soapFault);
198 }
199 bindingOp.addBindingFault(bindingFault);
200 }
201 binding.addBindingOperation(bindingOp);
202 }
203 def.addBinding(binding);
204 }
205 private static void createSoapExtension(boolean soap11, Binding binding) {
206 if (soap11) {
207 SOAPBinding soap = new SOAPBindingImpl();
208 soap.setTransportURI("http://schemas.xmlsoap.org/soap/http");
209 soap.setStyle("document");
210 binding.addExtensibilityElement(soap);
211 } else {
212 SOAP12Binding soap = new SOAP12BindingImpl();
213 soap.setTransportURI("http://schemas.xmlsoap.org/soap/http");
214 soap.setStyle("document");
215 binding.addExtensibilityElement(soap);
216 }
217 }
218 private static Binding createBinding(Definition def, PortType portType, String bindingName) {
219 Binding binding = def.createBinding();
220 binding.setQName(new QName(def.getTargetNamespace(), bindingName));
221 binding.setPortType(portType);
222 binding.setUndefined(false);
223 return binding;
224 }
225
226 public static Definition decorate(Definition definition, String importUri,
227 String targetNamespace, String locationUri) throws Exception {
228 // Create definition
229 Definition def = createImportDef(definition, targetNamespace, importUri);
230
231 // Iterator through port types
232 for (Iterator it = definition.getPortTypes().values().iterator(); it
233 .hasNext();) {
234 PortType portType = (PortType) it.next();
235 decorate(def, portType, locationUri);
236 }
237 return def;
238 }
239
240 }