| /* |
| * 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()); |
| } |
| } |