KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectweb > celtix > tools > generators > java2 > BindingGenerator


1 package org.objectweb.celtix.tools.generators.java2;
2
3 import java.util.ArrayList JavaDoc;
4 import java.util.List JavaDoc;
5 import java.util.logging.Logger JavaDoc;
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 JavaDoc;
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 JavaDoc 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 JavaDoc(WSDLConstants.NS_WSDL, wmodel.getPortTypeName() + "Binding"));
47         binding.setPortType(definition.getPortType(new QName JavaDoc(wmodel.getTargetNameSpace(), wmodel
48             .getPortTypeName())));
49
50         // genearte the soap binding
51

52         javax.wsdl.extensions.soap.SOAPBinding soapBinding;
53         try {
54             soapBinding = (javax.wsdl.extensions.soap.SOAPBinding)extensionRegistry
55                 .createExtension(Binding.class, new QName JavaDoc(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             // TODO Auto-generated catch block
61
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         // generate soap binding action
82
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 JavaDoc(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 JavaDoc(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 JavaDoc(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 JavaDoc<JavaParameter> bodyParams = new ArrayList JavaDoc<JavaParameter>();
152         List JavaDoc<JavaParameter> headerParams = new ArrayList JavaDoc<JavaParameter>();
153
154         splitSoapHeaderBodyParams(param, bodyParams, headerParams);
155         // if exists soap header,then generate soap body parts
156

157         if (headerParams.size() > 0) {
158             List JavaDoc<String JavaDoc> parts = new ArrayList JavaDoc<String JavaDoc>();
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 JavaDoc(WSDLConstants.SOAP11_NAMESPACE,
169                                                                         "header"));
170                     soapHeader.setMessage(new QName JavaDoc(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 JavaDoc(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 JavaDoc<JavaParameter> bodyParams = new ArrayList JavaDoc<JavaParameter>();
216         List JavaDoc<JavaParameter> headerParams = new ArrayList JavaDoc<JavaParameter>();
217
218         splitSoapHeaderBodyParams(param, bodyParams, headerParams);
219
220         // if exists soap header,then generate soap body parts
221

222         if (headerParams.size() > 0) {
223             List JavaDoc<String JavaDoc> parts = new ArrayList JavaDoc<String JavaDoc>();
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 JavaDoc(WSDLConstants.SOAP11_NAMESPACE,
234                                                                        "header"));
235
236                     soapHeader.setMessage(new QName JavaDoc(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 JavaDoc<JavaParameter> bodyList,
257                                            List JavaDoc<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