1 package org.objectweb.celtix.tools.processors.wsdl2; 2 3 import java.io.File ; 4 import java.io.FileInputStream ; 5 import java.io.FileOutputStream ; 6 import java.io.IOException ; 7 import java.util.ArrayList ; 8 import java.util.HashSet ; 9 import java.util.Iterator ; 10 import java.util.List ; 11 import java.util.Map ; 12 import java.util.Set ; 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 dir = (String )env.get(ToolConstants.CFG_OUTPUTDIR); 81 FileCodeWriter fileCodeWriter = new FileCodeWriter(new File (dir)); 82 jcodeModel.build(fileCodeWriter); 83 } else { 84 return; 85 } 86 } catch (IOException 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 portTypes = definition.getPortTypes(); 100 101 for (Iterator 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 extElements = def.getExtensibilityElements(); 123 if (extElements.size() > 0) { 124 Iterator iterator = extElements.iterator(); 125 while (iterator.hasNext()) { 126 Object 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 <String > argList = new ArrayList <String >(); 142 143 String javaClasspath = System.getProperty("java.class.path"); 144 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 )env.get(ToolConstants.CFG_CLASSDIR)); 161 } 162 163 Set <String > dirSet = new HashSet <String >(); 164 Iterator ite = classCollector.getGeneratedFileInfo().iterator(); 165 while (ite.hasNext()) { 166 String fileName = (String )ite.next(); 167 fileName = fileName.replaceAll("\\.", "/"); 168 String dirName = fileName.substring(0, fileName.lastIndexOf("/") + 1); 169 String outPutDir = (String )env.get(ToolConstants.CFG_OUTPUTDIR); 170 if (!dirSet.contains(dirName)) { 171 String path = outPutDir + "/" + dirName; 172 dirSet.add(path); 173 File file = new File (path); 174 if (file.isDirectory()) { 175 for (String str : file.list()) { 176 if (str.endsWith("java")) { 177 argList.add(path + File.separator + str); 178 } else { 179 File otherFile = new File (path + File.separator + str); 182 if (otherFile.isFile() && str.toLowerCase().endsWith("xml") 183 && env.get(ToolConstants.CFG_CLASSDIR) != null) { 184 String targetDir = (String )env.get(ToolConstants.CFG_CLASSDIR); 185 186 File targetFile = new File (targetDir + File.separator + dirName 187 + File.separator + str); 188 copyXmlFile(otherFile, targetFile); 189 } 190 } 191 } 192 } 193 } 194 195 } 196 197 String [] args = new String [argList.size()]; 198 int i = 0; 199 for (Object obj : argList.toArray()) { 200 String arg = (String )obj; 201 args[i] = arg; 202 i++; 203 } 204 205 Compiler compiler = new Compiler (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 from, File to) throws ToolException { 215 216 try { 217 String dir = to.getCanonicalPath() 218 .substring(0, to.getCanonicalPath().lastIndexOf(File.separator)); 219 File dirFile = new File (dir); 220 dirFile.mkdirs(); 221 FileInputStream input = new FileInputStream (from); 222 FileOutputStream output = new FileOutputStream (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 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 namespace = ""; 242 for (Iterator ite = def.getNamespaces().values().iterator(); ite.hasNext();) { 243 namespace = (String )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 |