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    }