/* * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Sun designates this * particular file as subject to the "Classpath" exception as provided * by Sun in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ package com.sun.tools.internal.ws.wscompile; import com.sun.codemodel.internal.CodeWriter; import com.sun.codemodel.internal.writer.ProgressCodeWriter; import com.sun.tools.internal.ws.ToolVersion; import com.sun.tools.internal.ws.api.TJavaGeneratorExtension; import com.sun.tools.internal.ws.processor.generator.CustomExceptionGenerator; import com.sun.tools.internal.ws.processor.generator.SeiGenerator; import com.sun.tools.internal.ws.processor.generator.ServiceGenerator; import com.sun.tools.internal.ws.processor.model.Model; import com.sun.tools.internal.ws.processor.modeler.wsdl.ConsoleErrorReporter; import com.sun.tools.internal.ws.processor.modeler.wsdl.WSDLModeler; import com.sun.tools.internal.ws.resources.WscompileMessages; import com.sun.tools.internal.ws.resources.WsdlMessages; import com.sun.tools.internal.xjc.util.NullStream; import com.sun.xml.internal.ws.api.server.Container; import com.sun.xml.internal.ws.util.ServiceFinder; import org.xml.sax.EntityResolver; import org.xml.sax.SAXParseException; import javax.xml.bind.annotation.XmlSeeAlso; import javax.xml.ws.EndpointReference; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import java.util.ArrayList; import java.util.List; /** * @author Vivek Pandey */ public class WsimportTool { private static final String WSIMPORT = "wsimport"; private final PrintStream out; private final Container container; /** * Wsimport specific options */ private final WsimportOptions options = new WsimportOptions(); public WsimportTool(OutputStream out) { this(out, null); } public WsimportTool(OutputStream logStream, Container container) { this.out = (logStream instanceof PrintStream)?(PrintStream)logStream:new PrintStream(logStream); this.container = container; } public boolean run(String[] args) { class Listener extends WsimportListener { ConsoleErrorReporter cer = new ConsoleErrorReporter(out == null ? new PrintStream(new NullStream()) : out); @Override public void generatedFile(String fileName) { message(fileName); } @Override public void message(String msg) { out.println(msg); } @Override public void error(SAXParseException exception) { cer.error(exception); } @Override public void fatalError(SAXParseException exception) { cer.fatalError(exception); } @Override public void warning(SAXParseException exception) { cer.warning(exception); } @Override public void info(SAXParseException exception) { cer.info(exception); } public void enableDebugging(){ cer.enableDebugging(); } } final Listener listener = new Listener(); ErrorReceiverFilter receiver = new ErrorReceiverFilter(listener) { public void info(SAXParseException exception) { if (options.verbose) super.info(exception); } public void warning(SAXParseException exception) { if (!options.quiet) super.warning(exception); } @Override public void pollAbort() throws AbortException { if (listener.isCanceled()) throw new AbortException(); } }; for (String arg : args) { if (arg.equals("-version")) { listener.message(ToolVersion.VERSION.BUILD_VERSION); return true; } } try { options.parseArguments(args); options.validate(); if(options.debugMode) listener.enableDebugging(); options.parseBindings(receiver); try { if( !options.quiet ) listener.message(WscompileMessages.WSIMPORT_PARSING_WSDL()); WSDLModeler wsdlModeler = new WSDLModeler(options, receiver); Model wsdlModel = wsdlModeler.buildModel(); if (wsdlModel == null) { listener.message(WsdlMessages.PARSING_PARSE_FAILED()); return false; } //generated code if( !options.quiet ) listener.message(WscompileMessages.WSIMPORT_GENERATING_CODE()); TJavaGeneratorExtension[] genExtn = ServiceFinder.find(TJavaGeneratorExtension.class).toArray(); CustomExceptionGenerator.generate(wsdlModel, options, receiver); SeiGenerator.generate(wsdlModel, options, receiver, genExtn); ServiceGenerator.generate(wsdlModel, options, receiver); CodeWriter cw = new WSCodeWriter(options.sourceDir, options); if (options.verbose) cw = new ProgressCodeWriter(cw, System.out); options.getCodeModel().build(cw); } catch(AbortException e){ //error might have been reported }catch (IOException e) { receiver.error(e); } if (!options.nocompile){ if(!compileGeneratedClasses(receiver)){ listener.message(WscompileMessages.WSCOMPILE_COMPILATION_FAILED()); return false; } } } catch (Options.WeAreDone done) { usage(done.getOptions()); } catch (BadCommandLineException e) { if (e.getMessage() != null) { System.out.println(e.getMessage()); System.out.println(); } usage(e.getOptions()); return false; } finally{ if(!options.keep){ options.removeGeneratedFiles(); } } return true; } public void setEntityResolver(EntityResolver resolver){ this.options.entityResolver = resolver; } protected boolean compileGeneratedClasses(ErrorReceiver receiver){ List<String> sourceFiles = new ArrayList<String>(); for (File f : options.getGeneratedFiles()) { if (f.exists() && f.getName().endsWith(".java")) { sourceFiles.add(f.getAbsolutePath()); } } if (sourceFiles.size() > 0) { String classDir = options.destDir.getAbsolutePath(); String classpathString = createClasspathString(); String[] args = new String[5 + (options.debug ? 1 : 0) + sourceFiles.size()]; args[0] = "-d"; args[1] = classDir; args[2] = "-classpath"; args[3] = classpathString; args[4] = "-Xbootclasspath/p:"+JavaCompilerHelper.getJarFile(EndpointReference.class)+File.pathSeparator+JavaCompilerHelper.getJarFile(XmlSeeAlso.class); int baseIndex = 5; if (options.debug) { args[baseIndex++] = "-g"; } for (int i = 0; i < sourceFiles.size(); ++i) { args[baseIndex + i] = sourceFiles.get(i); } return JavaCompilerHelper.compile(args, out, receiver); } //there are no files to compile, so return true? return true; } private String createClasspathString() { return System.getProperty("java.class.path"); } protected void usage(Options options) { System.out.println(WscompileMessages.WSIMPORT_HELP(WSIMPORT)); System.out.println(WscompileMessages.WSIMPORT_USAGE_EXAMPLES()); } }