1 package org.objectweb.celtix.tools.generators.java2; 2 3 import java.util.ArrayList ; 4 import java.util.List ; 5 import java.util.logging.Logger ; 6 7 import javax.jws.soap.SOAPBinding; 8 import javax.wsdl.Binding; 9 import javax.wsdl.BindingFault; 10 import javax.wsdl.BindingInput; 11 import javax.wsdl.BindingOperation; 12 import javax.wsdl.BindingOutput; 13 import javax.wsdl.Definition; 14 import javax.wsdl.WSDLException; 15 import javax.wsdl.extensions.ExtensionRegistry; 16 import javax.wsdl.extensions.soap.SOAPBody; 17 import javax.wsdl.extensions.soap.SOAPHeader; 18 import javax.wsdl.extensions.soap.SOAPOperation; 19 import javax.xml.namespace.QName ; 20 21 import org.objectweb.celtix.common.i18n.Message; 22 import org.objectweb.celtix.common.logging.LogUtils; 23 import org.objectweb.celtix.tools.common.ToolException; 24 import org.objectweb.celtix.tools.common.WSDLConstants; 25 import org.objectweb.celtix.tools.common.model.JavaMethod; 26 import org.objectweb.celtix.tools.common.model.JavaParameter; 27 import org.objectweb.celtix.tools.common.model.WSDLModel; 28 import org.objectweb.celtix.tools.common.model.WSDLParameter; 29 import org.objectweb.celtix.tools.processors.java2.JavaToWSDLProcessor; 30 31 public class BindingGenerator { 32 private static final Logger LOG = LogUtils.getL7dLogger(JavaToWSDLProcessor.class); 33 private WSDLModel wmodel; 34 private Definition definition; 35 private ExtensionRegistry extensionRegistry; 36 37 public BindingGenerator(WSDLModel model) { 38 this.wmodel = model; 39 definition = model.getDefinition(); 40 extensionRegistry = definition.getExtensionRegistry(); 41 } 42 43 public void generate() { 44 Binding binding = definition.createBinding(); 45 46 binding.setQName(new QName (WSDLConstants.NS_WSDL, wmodel.getPortTypeName() + "Binding")); 47 binding.setPortType(definition.getPortType(new QName (wmodel.getTargetNameSpace(), wmodel 48 .getPortTypeName()))); 49 50 52 javax.wsdl.extensions.soap.SOAPBinding soapBinding; 53 try { 54 soapBinding = (javax.wsdl.extensions.soap.SOAPBinding)extensionRegistry 55 .createExtension(Binding.class, new QName (WSDLConstants.SOAP11_NAMESPACE, "binding")); 56 soapBinding.setTransportURI("http://schemas.xmlsoap.org/soap/http"); 57 soapBinding.setStyle(wmodel.getStyle().toString().toLowerCase()); 58 binding.addExtensibilityElement(soapBinding); 59 } catch (WSDLException e) { 60 e.printStackTrace(); 62 } 63 64 generateBindingOperation(binding); 65 binding.setUndefined(false); 66 definition.addBinding(binding); 67 68 } 69 70 private void generateBindingOperation(Binding binding) { 71 for (JavaMethod jmethod : wmodel.getJavaMethods()) { 72 BindingOperation bindOperation = definition.createBindingOperation(); 73 bindOperation.setName(jmethod.getName()); 74 generateBindingOperationInputOutPut(bindOperation, jmethod); 75 binding.addBindingOperation(bindOperation); 76 } 77 78 } 79 80 private void generateBindingOperationInputOutPut(BindingOperation operation, JavaMethod jmethod) { 81 SOAPOperation soapOperation = generateSoapAction(); 83 soapOperation.setStyle(jmethod.getSoapStyle().name().toLowerCase()); 84 soapOperation.setSoapActionURI(jmethod.getSoapAction()); 85 operation.addExtensibilityElement(soapOperation); 86 87 generateInputSoapBody(jmethod, operation, jmethod.getRequest()); 88 89 generateOutputSoapBody(jmethod, operation, jmethod.getResponse()); 90 91 for (org.objectweb.celtix.tools.common.model.WSDLException ex : jmethod.getWSDLExceptions()) { 92 93 BindingFault bindingFault = definition.createBindingFault(); 94 bindingFault.setName(ex.getExcpetionClass().getSimpleName()); 95 operation.addBindingFault(bindingFault); 96 javax.wsdl.extensions.soap.SOAPFault soapFault = null; 97 try { 98 soapFault = (javax.wsdl.extensions.soap.SOAPFault)extensionRegistry 99 .createExtension(BindingFault.class, new QName (WSDLConstants.SOAP11_NAMESPACE, "fault")); 100 soapFault.setUse("literal"); 101 soapFault.setName(ex.getExcpetionClass().getSimpleName()); 102 } catch (WSDLException e) { 103 throw new ToolException(e.getMessage(), e); 104 } 105 bindingFault.addExtensibilityElement(soapFault); 106 107 } 108 109 } 110 111 private SOAPOperation generateSoapAction() { 112 SOAPOperation soapOperation = null; 113 try { 114 soapOperation = (SOAPOperation)extensionRegistry 115 .createExtension(BindingOperation.class, new QName (WSDLConstants.SOAP11_NAMESPACE, 116 "operation")); 117 } catch (WSDLException e) { 118 throw new ToolException(e.getMessage(), e); 119 } 120 121 return soapOperation; 122 } 123 124 private void generateOutputSoapBody(JavaMethod jmethod, BindingOperation operation, WSDLParameter param) { 125 if (param == null) { 126 return; 127 } 128 129 SOAPBody body = null; 130 131 BindingOutput bindingOutput = definition.createBindingOutput(); 132 bindingOutput.setName(param.getName()); 133 134 operation.setBindingOutput(bindingOutput); 135 136 try { 137 body = (SOAPBody)extensionRegistry.createExtension(BindingOutput.class, 138 new QName (WSDLConstants.SOAP11_NAMESPACE, 139 "body")); 140 } catch (WSDLException e1) { 141 throw new ToolException(e1.getMessage(), e1); 142 } 143 144 if (jmethod.getSoapUse() == SOAPBinding.Use.LITERAL) { 145 body.setUse("literal"); 146 } else { 147 Message msg = new Message("ENCODED_USE_NOT_SUPPORTED", LOG); 148 throw new ToolException(msg); 149 } 150 151 List <JavaParameter> bodyParams = new ArrayList <JavaParameter>(); 152 List <JavaParameter> headerParams = new ArrayList <JavaParameter>(); 153 154 splitSoapHeaderBodyParams(param, bodyParams, headerParams); 155 157 if (headerParams.size() > 0) { 158 List <String > parts = new ArrayList <String >(); 159 for (JavaParameter parameter : bodyParams) { 160 parts.add(parameter.getPartName()); 161 } 162 body.setParts(parts); 163 SOAPHeader soapHeader = null; 164 for (JavaParameter jp : headerParams) { 165 166 try { 167 soapHeader = (SOAPHeader)extensionRegistry 168 .createExtension(BindingOutput.class, new QName (WSDLConstants.SOAP11_NAMESPACE, 169 "header")); 170 soapHeader.setMessage(new QName (param.getTargetNamespace(), param.getName())); 171 soapHeader.setPart(jp.getPartName()); 172 soapHeader.setUse("literal"); 173 174 } catch (WSDLException e) { 175 throw new ToolException(e.getMessage(), e); 176 } 177 } 178 179 if (jmethod.getSoapStyle() == SOAPBinding.Style.RPC) { 180 body.setNamespaceURI(param.getTargetNamespace()); 181 } 182 bindingOutput.addExtensibilityElement(soapHeader); 183 184 } 185 bindingOutput.addExtensibilityElement(body); 186 187 } 188 189 private void generateInputSoapBody(JavaMethod jmethod, BindingOperation operation, WSDLParameter param) { 190 if (param == null) { 191 return; 192 } 193 SOAPBody body = null; 194 195 BindingInput bindingInput = definition.createBindingInput(); 196 bindingInput.setName(param.getName()); 197 198 operation.setBindingInput(bindingInput); 199 200 try { 201 body = (SOAPBody)extensionRegistry.createExtension(BindingInput.class, 202 new QName (WSDLConstants.SOAP11_NAMESPACE, 203 "body")); 204 } catch (WSDLException e1) { 205 throw new ToolException(e1.getMessage(), e1); 206 } 207 208 if (jmethod.getSoapUse() == SOAPBinding.Use.LITERAL) { 209 body.setUse("literal"); 210 } else { 211 Message msg = new Message("ENCODED_USE_NOT_SUPPORTED", LOG); 212 throw new ToolException(msg); 213 } 214 215 List <JavaParameter> bodyParams = new ArrayList <JavaParameter>(); 216 List <JavaParameter> headerParams = new ArrayList <JavaParameter>(); 217 218 splitSoapHeaderBodyParams(param, bodyParams, headerParams); 219 220 222 if (headerParams.size() > 0) { 223 List <String > parts = new ArrayList <String >(); 224 for (JavaParameter parameter : bodyParams) { 225 parts.add(parameter.getPartName()); 226 } 227 body.setParts(parts); 228 SOAPHeader soapHeader = null; 229 for (JavaParameter jp : headerParams) { 230 231 try { 232 soapHeader = (SOAPHeader)extensionRegistry 233 .createExtension(BindingInput.class, new QName (WSDLConstants.SOAP11_NAMESPACE, 234 "header")); 235 236 soapHeader.setMessage(new QName (param.getTargetNamespace(), param.getName())); 237 soapHeader.setPart(jp.getPartName()); 238 soapHeader.setUse("literal"); 239 240 } catch (WSDLException e) { 241 throw new ToolException(e.getMessage(), e); 242 } 243 } 244 245 if (jmethod.getSoapStyle() == SOAPBinding.Style.RPC) { 246 body.setNamespaceURI(param.getTargetNamespace()); 247 } 248 bindingInput.addExtensibilityElement(soapHeader); 249 250 } 251 bindingInput.addExtensibilityElement(body); 252 253 } 254 255 256 private void splitSoapHeaderBodyParams(WSDLParameter param, List <JavaParameter> bodyList, 257 List <JavaParameter> headerList) { 258 for (JavaParameter jpara : param.getChildren()) { 259 if (jpara.isHeader()) { 260 headerList.add(jpara); 261 } else { 262 bodyList.add(jpara); 263 } 264 } 265 266 } 267 268 } 269 | Popular Tags |