KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectweb > celtix > tools > processors > wsdl2 > WSDLToJavaProcessor


1 package org.objectweb.celtix.tools.processors.wsdl2;
2
3 import java.io.File JavaDoc;
4 import java.io.FileInputStream JavaDoc;
5 import java.io.FileOutputStream JavaDoc;
6 import java.io.IOException JavaDoc;
7 import java.util.ArrayList JavaDoc;
8 import java.util.HashSet JavaDoc;
9 import java.util.Iterator JavaDoc;
10 import java.util.List JavaDoc;
11 import java.util.Map JavaDoc;
12 import java.util.Set JavaDoc;
13
14 import javax.wsdl.Definition;
15 import javax.wsdl.PortType;
16
17 import com.sun.codemodel.JCodeModel;
18 import com.sun.codemodel.writer.FileCodeWriter;
19 import com.sun.tools.xjc.api.S2JJAXBModel;
20
21 import org.objectweb.celtix.common.i18n.Message;
22 import org.objectweb.celtix.tools.common.ToolConstants;
23 import org.objectweb.celtix.tools.common.ToolException;
24 import org.objectweb.celtix.tools.common.model.JavaModel;
25 import org.objectweb.celtix.tools.extensions.jaxws.CustomizationParser;
26 import org.objectweb.celtix.tools.extensions.jaxws.JAXWSBinding;
27 import org.objectweb.celtix.tools.generators.wsdl2.AntGenerator;
28 import org.objectweb.celtix.tools.generators.wsdl2.ClientGenerator;
29 import org.objectweb.celtix.tools.generators.wsdl2.FaultGenerator;
30 import org.objectweb.celtix.tools.generators.wsdl2.ImplGenerator;
31 import org.objectweb.celtix.tools.generators.wsdl2.SEIGenerator;
32 import org.objectweb.celtix.tools.generators.wsdl2.ServerGenerator;
33 import org.objectweb.celtix.tools.generators.wsdl2.ServiceGenerator;
34 import org.objectweb.celtix.tools.processors.wsdl2.compiler.Compiler;
35 import org.objectweb.celtix.tools.processors.wsdl2.internal.ClassCollector;
36 import org.objectweb.celtix.tools.processors.wsdl2.internal.PortTypeProcessor;
37 import org.objectweb.celtix.tools.processors.wsdl2.internal.SEIAnnotationProcessor;
38 import org.objectweb.celtix.tools.processors.wsdl2.internal.ServiceProcessor;
39
40 public class WSDLToJavaProcessor extends WSDLToProcessor {
41
42     protected void registerGenerators(JavaModel jmodel) {
43         addGenerator(ToolConstants.SEI_GENERATOR, new SEIGenerator(jmodel, getEnvironment()));
44         addGenerator(ToolConstants.FAULT_GENERATOR, new FaultGenerator(jmodel, getEnvironment()));
45         addGenerator(ToolConstants.SVR_GENERATOR, new ServerGenerator(jmodel, getEnvironment()));
46         addGenerator(ToolConstants.IMPL_GENERATOR, new ImplGenerator(jmodel, getEnvironment()));
47         addGenerator(ToolConstants.CLT_GENERATOR, new ClientGenerator(jmodel, getEnvironment()));
48         addGenerator(ToolConstants.SERVICE_GENERATOR, new ServiceGenerator(jmodel, getEnvironment()));
49         addGenerator(ToolConstants.ANT_GENERATOR, new AntGenerator(jmodel, getEnvironment()));
50     }
51
52     public void process() throws ToolException {
53         validateWSDL();
54         init();
55         if (isSOAP12Binding(wsdlDefinition)) {
56             Message msg = new Message("SOAP12_UNSUPPORTED", LOG);
57             throw new ToolException(msg);
58         }
59         generateTypes();
60         JavaModel jmodel = wsdlDefinitionToJavaModel(getWSDLDefinition());
61         if (jmodel == null) {
62             Message msg = new Message("FAIL_TO_CREATE_JAVA_MODEL", LOG);
63             throw new ToolException(msg);
64         }
65         registerGenerators(jmodel);
66         doGeneration();
67         if (env.get(ToolConstants.CFG_COMPILE) != null) {
68             compile();
69         }
70     }
71
72     private void generateTypes() throws ToolException {
73         if (rawJaxbModelGenCode == null) {
74             return;
75         }
76         try {
77             if (rawJaxbModelGenCode instanceof S2JJAXBModel) {
78                 S2JJAXBModel schem2JavaJaxbModel = (S2JJAXBModel)rawJaxbModelGenCode;
79                 JCodeModel jcodeModel = schem2JavaJaxbModel.generateCode(null, null);
80                 String JavaDoc dir = (String JavaDoc)env.get(ToolConstants.CFG_OUTPUTDIR);
81                 FileCodeWriter fileCodeWriter = new FileCodeWriter(new File JavaDoc(dir));
82                 jcodeModel.build(fileCodeWriter);
83             } else {
84                 return;
85             }
86         } catch (IOException JavaDoc e) {
87             Message msg = new Message("FAIL_TO_GENERATE_TYPES", LOG);
88             throw new ToolException(msg);
89
90         }
91     }
92
93     private JavaModel wsdlDefinitionToJavaModel(Definition definition) throws ToolException {
94         JavaModel javaModel = new JavaModel();
95         getEnvironment().put(ToolConstants.RAW_JAXB_MODEL, getRawJaxbModel());
96
97         javaModel.setJAXWSBinding(customizing(definition));
98
99         Map JavaDoc portTypes = definition.getPortTypes();
100
101         for (Iterator JavaDoc iter = portTypes.keySet().iterator(); iter.hasNext();) {
102             PortType portType = (PortType)portTypes.get(iter.next());
103             PortTypeProcessor portTypeProcessor = new PortTypeProcessor(getEnvironment());
104             portTypeProcessor.process(javaModel, portType);
105         }
106
107         ServiceProcessor serviceProcessor = new ServiceProcessor(env, getWSDLDefinition());
108         serviceProcessor.process(javaModel);
109
110         SEIAnnotationProcessor seiAnnotationProcessor = new SEIAnnotationProcessor(env);
111         seiAnnotationProcessor.process(javaModel, definition);
112
113         return javaModel;
114     }
115
116     private JAXWSBinding customizing(Definition def) {
117         JAXWSBinding binding = CustomizationParser.getInstance().getDefinitionExtension();
118         if (binding != null) {
119             return binding;
120         }
121
122         List JavaDoc extElements = def.getExtensibilityElements();
123         if (extElements.size() > 0) {
124             Iterator JavaDoc iterator = extElements.iterator();
125             while (iterator.hasNext()) {
126                 Object JavaDoc obj = iterator.next();
127                 if (obj instanceof JAXWSBinding) {
128                     binding = (JAXWSBinding)obj;
129                 }
130             }
131         }
132
133         if (binding == null) {
134             binding = new JAXWSBinding();
135         }
136         return binding;
137     }
138
139     private void compile() throws ToolException {
140         ClassCollector classCollector = (ClassCollector)env.get(ToolConstants.GENERATED_CLASS_COLLECTOR);
141         List JavaDoc<String JavaDoc> argList = new ArrayList JavaDoc<String JavaDoc>();
142
143         String JavaDoc javaClasspath = System.getProperty("java.class.path");
144         // hard code celtix.jar
145
boolean classpathSetted = javaClasspath != null && (javaClasspath.indexOf("celtix.jar") >= 0);
146         if (env.isVerbose()) {
147             argList.add("-verbose");
148         }
149
150         if (!classpathSetted) {
151             System.setProperty("java.ext.dirs", this.getClass().getClassLoader().getResource(".").getFile()
152                                                 + "../lib/");
153         } else {
154             argList.add("-classpath");
155             argList.add(javaClasspath);
156         }
157
158         if (env.get(ToolConstants.CFG_CLASSDIR) != null) {
159             argList.add("-d");
160             argList.add((String JavaDoc)env.get(ToolConstants.CFG_CLASSDIR));
161         }
162
163         Set JavaDoc<String JavaDoc> dirSet = new HashSet JavaDoc<String JavaDoc>();
164         Iterator JavaDoc ite = classCollector.getGeneratedFileInfo().iterator();
165         while (ite.hasNext()) {
166             String JavaDoc fileName = (String JavaDoc)ite.next();
167             fileName = fileName.replaceAll("\\.", "/");
168             String JavaDoc dirName = fileName.substring(0, fileName.lastIndexOf("/") + 1);
169             String JavaDoc outPutDir = (String JavaDoc)env.get(ToolConstants.CFG_OUTPUTDIR);
170             if (!dirSet.contains(dirName)) {
171                 String JavaDoc path = outPutDir + "/" + dirName;
172                 dirSet.add(path);
173                 File JavaDoc file = new File JavaDoc(path);
174                 if (file.isDirectory()) {
175                     for (String JavaDoc str : file.list()) {
176                         if (str.endsWith("java")) {
177                             argList.add(path + File.separator + str);
178                         } else {
179                             // copy generated xml file or others to class
180
// directory
181
File JavaDoc otherFile = new File JavaDoc(path + File.separator + str);
182                             if (otherFile.isFile() && str.toLowerCase().endsWith("xml")
183                                 && env.get(ToolConstants.CFG_CLASSDIR) != null) {
184                                 String JavaDoc targetDir = (String JavaDoc)env.get(ToolConstants.CFG_CLASSDIR);
185
186                                 File JavaDoc targetFile = new File JavaDoc(targetDir + File.separator + dirName
187                                                            + File.separator + str);
188                                 copyXmlFile(otherFile, targetFile);
189                             }
190                         }
191                     }
192                 }
193             }
194
195         }
196
197         String JavaDoc[] args = new String JavaDoc[argList.size()];
198         int i = 0;
199         for (Object JavaDoc obj : argList.toArray()) {
200             String JavaDoc arg = (String JavaDoc)obj;
201             args[i] = arg;
202             i++;
203         }
204
205         Compiler JavaDoc compiler = new Compiler JavaDoc(System.out);
206
207         if (!compiler.internalCompile(args)) {
208             Message msg = new Message("FAIL_TO_COMPILE_GENERATE_CODES", LOG);
209             throw new ToolException(msg);
210         }
211
212     }
213
214     private void copyXmlFile(File JavaDoc from, File JavaDoc to) throws ToolException {
215
216         try {
217             String JavaDoc dir = to.getCanonicalPath()
218                 .substring(0, to.getCanonicalPath().lastIndexOf(File.separator));
219             File JavaDoc dirFile = new File JavaDoc(dir);
220             dirFile.mkdirs();
221             FileInputStream JavaDoc input = new FileInputStream JavaDoc(from);
222             FileOutputStream JavaDoc output = new FileOutputStream JavaDoc(to);
223             byte[] b = new byte[1024 * 3];
224             int len = 0;
225             while (len != -1) {
226                 len = input.read(b);
227                 if (len != -1) {
228                     output.write(b, 0, len);
229                 }
230             }
231             output.flush();
232             output.close();
233             input.close();
234         } catch (Exception JavaDoc e) {
235             Message msg = new Message("FAIL_TO_COPY_GENERATED_RESOURCE_FILE", LOG);
236             throw new ToolException(msg, e);
237         }
238     }
239
240     private boolean isSOAP12Binding(Definition def) {
241         String JavaDoc namespace = "";
242         for (Iterator JavaDoc ite = def.getNamespaces().values().iterator(); ite.hasNext();) {
243             namespace = (String JavaDoc)ite.next();
244             if (namespace != null
245                 && namespace.toLowerCase().indexOf("http://schemas.xmlsoap.org/wsdl/soap12") >= 0) {
246                 return true;
247             }
248         }
249         return false;
250     }
251
252 }
253
Popular Tags