diff -r 8c0b6bccfe47 -r 0989ad8c0860 src/share/jaxws_classes/com/sun/tools/internal/ws/wscompile/WsgenTool.java --- a/src/share/jaxws_classes/com/sun/tools/internal/ws/wscompile/WsgenTool.java Thu Apr 04 19:05:24 2013 -0700 +++ b/src/share/jaxws_classes/com/sun/tools/internal/ws/wscompile/WsgenTool.java Tue Apr 09 14:51:13 2013 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. 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 @@ -25,6 +25,7 @@ package com.sun.tools.internal.ws.wscompile; +import com.oracle.webservices.internal.api.databinding.WSDLResolver; import com.sun.istack.internal.tools.ParallelWorldClassLoader; import com.sun.tools.internal.ws.ToolVersion; import com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceAp; @@ -43,9 +44,9 @@ import com.sun.xml.internal.ws.api.server.Container; import com.sun.xml.internal.ws.api.wsdl.writer.WSDLGeneratorExtension; import com.sun.xml.internal.ws.binding.WebServiceFeatureList; +import com.sun.xml.internal.ws.model.ExternalMetadataReader; import com.sun.xml.internal.ws.model.AbstractSEIModelImpl; import com.sun.xml.internal.ws.util.ServiceFinder; -import com.sun.xml.internal.ws.wsdl.writer.WSDLResolver; import org.xml.sax.SAXParseException; import javax.tools.DiagnosticCollector; @@ -71,6 +72,7 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -86,7 +88,7 @@ public WsgenTool(OutputStream out, Container container) { - this.out = (out instanceof PrintStream)?(PrintStream)out:new PrintStream(out); + this.out = (out instanceof PrintStream) ? (PrintStream) out : new PrintStream(out); this.container = container; } @@ -95,7 +97,7 @@ this(out, null); } - public boolean run(String[] args){ + public boolean run(String[] args) { final Listener listener = new Listener(); for (String arg : args) { if (arg.equals("-version")) { @@ -112,22 +114,22 @@ try { options.parseArguments(args); options.validate(); - if(!buildModel(options.endpoint.getName(), listener)){ + if (!buildModel(options.endpoint.getName(), listener)) { return false; } - }catch (Options.WeAreDone done){ - usage((WsgenOptions)done.getOptions()); - }catch (BadCommandLineException e) { - if(e.getMessage()!=null) { + } catch (Options.WeAreDone done) { + usage(done.getOptions()); + } catch (BadCommandLineException e) { + if (e.getMessage() != null) { System.out.println(e.getMessage()); System.out.println(); } - usage((WsgenOptions)e.getOptions()); + usage(e.getOptions()); return false; - }catch(AbortException e){ + } catch (AbortException e) { //error might have been reported - }finally{ - if(!options.keep){ + } finally { + if (!options.keep) { options.removeGeneratedFiles(); } } @@ -136,21 +138,25 @@ private final Container container; - private int round = 0; - /* * To take care of JDK6-JDK6u3, where 2.1 API classes are not there */ private static boolean useBootClasspath(Class clazz) { try { - ParallelWorldClassLoader.toJarUrl(clazz.getResource('/'+clazz.getName().replace('.','/')+".class")); + ParallelWorldClassLoader.toJarUrl(clazz.getResource('/' + clazz.getName().replace('.', '/') + ".class")); return true; - } catch(Exception e) { + } catch (Exception e) { return false; } } - + /** + * + * @param endpoint + * @param listener + * @return + * @throws BadCommandLineException + */ public boolean buildModel(String endpoint, Listener listener) throws BadCommandLineException { final ErrorReceiverFilter errReceiver = new ErrorReceiverFilter(listener); @@ -178,7 +184,7 @@ .append(JavaCompilerHelper.getJarFile(XmlSeeAlso.class)).toString()); } - JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();// compiler = JavacTool.create(); DiagnosticCollector diagnostics = new DiagnosticCollector(); StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null); JavaCompiler.CompilationTask task = compiler.getTask( @@ -196,8 +202,15 @@ return false; } if (options.genWsdl) { - DatabindingConfig config = new DatabindingConfig(); - String tmpPath = options.destDir.getAbsolutePath()+ File.pathSeparator+options.classpath; + DatabindingConfig config = new DatabindingConfig(); + + List externalMetadataFileNames = options.externalMetadataFiles; + boolean disableSecureXmlProcessing = options.disableSecureXmlProcessing; + if (externalMetadataFileNames != null && externalMetadataFileNames.size() > 0) { + config.setMetadataReader(new ExternalMetadataReader(getExternalFiles(externalMetadataFileNames), null, null, true, disableSecureXmlProcessing)); + } + + String tmpPath = options.destDir.getAbsolutePath() + File.pathSeparator + options.classpath; ClassLoader classLoader = new URLClassLoader(Options.pathToURLs(tmpPath), this.getClass().getClassLoader()); Class endpointClass; @@ -218,23 +231,26 @@ config.getMappingInfo().setPortName(options.portName);//rtModeler.setPortName(options.portName); // AbstractSEIModelImpl rtModel = rtModeler.buildRuntimeModel(); - DatabindingFactory fac = DatabindingFactory.newInstance(); - config.setEndpointClass(endpointClass); - config.getMappingInfo().setServiceName(options.serviceName); - config.setFeatures(wsfeatures.toArray()); - config.setClassLoader(classLoader); - config.getMappingInfo().setBindingID(bindingID); - com.sun.xml.internal.ws.db.DatabindingImpl rt = (com.sun.xml.internal.ws.db.DatabindingImpl)fac.createRuntime(config); + DatabindingFactory fac = DatabindingFactory.newInstance(); + config.setEndpointClass(endpointClass); + config.getMappingInfo().setServiceName(options.serviceName); + config.setFeatures(wsfeatures.toArray()); + config.setClassLoader(classLoader); + config.getMappingInfo().setBindingID(bindingID); + com.sun.xml.internal.ws.db.DatabindingImpl rt = (com.sun.xml.internal.ws.db.DatabindingImpl) fac.createRuntime(config); final File[] wsdlFileName = new File[1]; // used to capture the generated WSDL file. - final Map schemaFiles = new HashMap(); + final Map schemaFiles = new HashMap(); WSDLGenInfo wsdlGenInfo = new WSDLGenInfo(); + wsdlGenInfo.setSecureXmlProcessingDisabled(disableSecureXmlProcessing); + wsdlGenInfo.setWsdlResolver( new WSDLResolver() { private File toFile(String suggestedFilename) { return new File(options.nonclassDestDir, suggestedFilename); } + private Result toResult(File file) { Result result; try { @@ -247,21 +263,27 @@ return result; } + @Override public Result getWSDL(String suggestedFilename) { File f = toFile(suggestedFilename); wsdlFileName[0] = f; return toResult(f); } + public Result getSchemaOutput(String namespace, String suggestedFilename) { if (namespace == null) return null; File f = toFile(suggestedFilename); - schemaFiles.put(namespace,f); + schemaFiles.put(namespace, f); return toResult(f); } + + @Override public Result getAbstractWSDL(Holder filename) { return toResult(toFile(filename.value)); } + + @Override public Result getSchemaOutput(String namespace, Holder filename) { return getSchemaOutput(namespace, filename.value); } @@ -274,20 +296,34 @@ rt.generateWSDL(wsdlGenInfo); - if(options.wsgenReport!=null) - generateWsgenReport(endpointClass,(AbstractSEIModelImpl)rt.getModel(),wsdlFileName[0],schemaFiles); + if (options.wsgenReport != null) + generateWsgenReport(endpointClass, (AbstractSEIModelImpl) rt.getModel(), wsdlFileName[0], schemaFiles); } return true; } + private List getExternalFiles(List exts) { + List files = new ArrayList(); + for (String ext : exts) { + // first try absolute path ... + File file = new File(ext); + if (!file.exists()) { + // then relative path ... + file = new File(options.sourceDir.getAbsolutePath() + File.separator + ext); + } + files.add(file); + } + return files; + } + /** * Generates a small XML file that captures the key activity of wsgen, * so that test harness can pick up artifacts. */ - private void generateWsgenReport(Class endpointClass, AbstractSEIModelImpl rtModel, File wsdlFile, Map schemaFiles) { + private void generateWsgenReport(Class endpointClass, AbstractSEIModelImpl rtModel, File wsdlFile, Map schemaFiles) { try { ReportOutput.Report report = TXW.create(ReportOutput.Report.class, - new StreamSerializer(new BufferedOutputStream(new FileOutputStream(options.wsgenReport)))); + new StreamSerializer(new BufferedOutputStream(new FileOutputStream(options.wsgenReport)))); report.wsdl(wsdlFile.getAbsolutePath()); ReportOutput.writeQName(rtModel.getServiceQName(), report.service()); @@ -296,7 +332,7 @@ report.implClass(endpointClass.getName()); - for (Map.Entry e : schemaFiles.entrySet()) { + for (Map.Entry e : schemaFiles.entrySet()) { ReportOutput.Schema s = report.schema(); s.ns(e.getKey()); s.location(e.getValue().getAbsolutePath()); @@ -317,10 +353,13 @@ interface Report extends TypedXmlWriter { @XmlElement void wsdl(String file); // location of WSDL + @XmlElement QualifiedName portType(); + @XmlElement QualifiedName service(); + @XmlElement QualifiedName port(); @@ -337,6 +376,7 @@ interface QualifiedName extends TypedXmlWriter { @XmlAttribute void uri(String ns); + @XmlAttribute void localName(String localName); } @@ -344,23 +384,28 @@ interface Schema extends TypedXmlWriter { @XmlAttribute void ns(String ns); + @XmlAttribute void location(String filePath); } - private static void writeQName( QName n, QualifiedName w ) { + private static void writeQName(QName n, QualifiedName w) { w.uri(n.getNamespaceURI()); w.localName(n.getLocalPart()); } } - protected void usage(WsgenOptions options) { + protected void usage(Options options) { // Just don't see any point in passing WsgenOptions // BadCommandLineException also shouldn't have options if (options == null) options = this.options; - System.out.println(WscompileMessages.WSGEN_HELP("WSGEN", options.protocols, options.nonstdProtocols.keySet())); - System.out.println(WscompileMessages.WSGEN_USAGE_EXAMPLES()); + if (options instanceof WsgenOptions) { + System.out.println(WscompileMessages.WSGEN_HELP("WSGEN", + ((WsgenOptions)options).protocols, + ((WsgenOptions)options).nonstdProtocols.keySet())); + System.out.println(WscompileMessages.WSGEN_USAGE_EXAMPLES()); + } } class Listener extends WsimportListener {