org.apache.cxf.tools.wsdlto.WSDLToJavaContainer Maven / Gradle / Ivy
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.cxf.tools.wsdlto;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Writer;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.wsdl.Definition;
import javax.wsdl.factory.WSDLFactory;
import javax.wsdl.xml.WSDLWriter;
import javax.xml.namespace.QName;
import org.w3c.dom.Element;
import org.apache.cxf.Bus;
import org.apache.cxf.common.WSDLConstants;
import org.apache.cxf.common.i18n.Message;
import org.apache.cxf.common.logging.LogUtils;
import org.apache.cxf.common.util.PropertiesLoaderUtils;
import org.apache.cxf.common.util.StringUtils;
import org.apache.cxf.common.util.URIParserUtil;
import org.apache.cxf.common.xmlschema.SchemaCollection;
import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.helpers.FileUtils;
import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.helpers.XMLUtils;
import org.apache.cxf.service.model.InterfaceInfo;
import org.apache.cxf.service.model.ServiceInfo;
import org.apache.cxf.tools.common.AbstractCXFToolContainer;
import org.apache.cxf.tools.common.ClassNameProcessor;
import org.apache.cxf.tools.common.ClassUtils;
import org.apache.cxf.tools.common.FrontEndGenerator;
import org.apache.cxf.tools.common.Processor;
import org.apache.cxf.tools.common.ToolConstants;
import org.apache.cxf.tools.common.ToolContext;
import org.apache.cxf.tools.common.ToolException;
import org.apache.cxf.tools.common.toolspec.ToolSpec;
import org.apache.cxf.tools.common.toolspec.parser.BadUsageException;
import org.apache.cxf.tools.common.toolspec.parser.CommandDocument;
import org.apache.cxf.tools.common.toolspec.parser.ErrorVisitor;
import org.apache.cxf.tools.util.ClassCollector;
import org.apache.cxf.tools.util.FileWriterUtil;
import org.apache.cxf.tools.util.OutputStreamCreator;
import org.apache.cxf.tools.validator.ServiceValidator;
import org.apache.cxf.tools.wsdlto.core.AbstractWSDLBuilder;
import org.apache.cxf.tools.wsdlto.core.DataBindingProfile;
import org.apache.cxf.tools.wsdlto.core.FrontEndProfile;
import org.apache.cxf.wsdl.WSDLManager;
import org.apache.cxf.wsdl11.WSDLServiceBuilder;
import org.apache.ws.commons.schema.XmlSchema;
public class WSDLToJavaContainer extends AbstractCXFToolContainer {
protected static final Logger LOG = LogUtils.getL7dLogger(WSDLToJavaContainer.class);
private static final String DEFAULT_NS2PACKAGE = "http://www.w3.org/2005/08/addressing";
private static final String SERVICE_VALIDATOR = "META-INF/tools.service.validator.xml";
String toolName;
public WSDLToJavaContainer(String name, ToolSpec toolspec) throws Exception {
super(name, toolspec);
this.toolName = name;
}
public Set getArrayKeys() {
Set set = new HashSet();
set.add(ToolConstants.CFG_PACKAGENAME);
set.add(ToolConstants.CFG_NEXCLUDE);
set.add(ToolConstants.CFG_XJC_ARGS);
return set;
}
public WSDLConstants.WSDLVersion getWSDLVersion() {
String version = (String)context.get(ToolConstants.CFG_WSDL_VERSION);
return WSDLConstants.getVersion(version);
}
public void execute() throws ToolException {
if (hasInfoOption()) {
return;
}
buildToolContext();
boolean isWsdlList = context.optionSet(ToolConstants.CFG_WSDLLIST);
if (isWsdlList) {
BufferedReader reader = null;
try {
ToolContext initialContextState = context.makeCopy();
String wsdlURL = (String)context.get(ToolConstants.CFG_WSDLURL);
wsdlURL = URIParserUtil.getAbsoluteURI(wsdlURL);
URL url = new URL(wsdlURL);
InputStream is = (InputStream)url.getContent();
reader = new BufferedReader(new InputStreamReader(is));
String tempLine = null;
while ((tempLine = reader.readLine()) != null) {
ToolContext freshContext = initialContextState.makeCopy();
freshContext.put(ToolConstants.CFG_WSDLURL, tempLine);
setContext(freshContext);
buildToolContext();
processWsdl();
}
if (context.getErrorListener().getErrorCount() > 0) {
context.getErrorListener().throwToolException();
}
} catch (IOException e) {
throw new ToolException(e);
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
throw new ToolException(e);
}
}
} else {
processWsdl();
if (context.getErrorListener().getErrorCount() > 0) {
context.getErrorListener().throwToolException();
}
}
}
private void processWsdl() {
// TODO: After runtime support w3c EPR mapping ,this will be removed
//context.put(ToolConstants.CFG_NO_ADDRESS_BINDING,
// ToolConstants.CFG_NO_ADDRESS_BINDING);
validate(context);
FrontEndProfile frontend = context.get(FrontEndProfile.class);
if (frontend == null) {
throw new ToolException(new Message("FOUND_NO_FRONTEND", LOG));
}
WSDLConstants.WSDLVersion version = getWSDLVersion();
String wsdlURL = (String)context.get(ToolConstants.CFG_WSDLURL);
@SuppressWarnings("unchecked")
List serviceList = (List)context.get(ToolConstants.SERVICE_LIST);
if (serviceList == null) {
serviceList = new ArrayList();
// Build the ServiceModel from the WSDLModel
if (version == WSDLConstants.WSDLVersion.WSDL11) {
AbstractWSDLBuilder builder = frontend.getWSDLBuilder();
builder.setContext(context);
builder.setBus(getBus());
context.put(Bus.class, getBus());
wsdlURL = URIParserUtil.getAbsoluteURI(wsdlURL);
builder.build(wsdlURL);
builder.customize();
Definition definition = builder.getWSDLModel();
context.put(Definition.class, definition);
builder.validate(definition);
WSDLServiceBuilder serviceBuilder = new WSDLServiceBuilder(getBus());
if (context.isVerbose()) {
serviceBuilder.setUnwrapLogLevel(Level.INFO);
}
serviceBuilder.setIgnoreUnknownBindings(true);
String allowRefs = (String)context.get(ToolConstants.CFG_ALLOW_ELEMENT_REFS);
if (!StringUtils.isEmpty(allowRefs)
|| context.optionSet(ToolConstants.CFG_ALLOW_ELEMENT_REFS)) {
if (allowRefs.length() > 0 && allowRefs.charAt(0) == '=') {
allowRefs = allowRefs.substring(1);
}
if (StringUtils.isEmpty(allowRefs)) {
allowRefs = "true";
}
serviceBuilder.setAllowElementRefs(Boolean.valueOf(allowRefs));
}
String serviceName = (String)context.get(ToolConstants.CFG_SERVICENAME);
if (serviceName != null) {
List services = serviceBuilder
.buildServices(definition, getServiceQName(definition));
serviceList.addAll(services);
} else if (definition.getServices().size() > 0) {
serviceList = serviceBuilder.buildServices(definition);
} else {
serviceList = serviceBuilder.buildMockServices(definition);
}
//remove definition from cache so that won't fail when encounter same wsdl file
//name but different wsdl content(CXF-3340)
getBus().getExtension(WSDLManager.class).removeDefinition(definition);
} else {
// TODO: wsdl2.0 support
}
}
context.put(ToolConstants.SERVICE_LIST, serviceList);
Map interfaces = new LinkedHashMap();
ServiceInfo service0 = serviceList.get(0);
SchemaCollection schemaCollection = service0.getXmlSchemaCollection();
context.put(ToolConstants.XML_SCHEMA_COLLECTION, schemaCollection);
context.put(ToolConstants.PORTTYPE_MAP, interfaces);
context.put(ClassCollector.class, createClassCollector());
Processor processor = frontend.getProcessor();
if (processor instanceof ClassNameProcessor) {
processor.setEnvironment(context);
for (ServiceInfo service : serviceList) {
context.put(ServiceInfo.class, service);
((ClassNameProcessor)processor).processClassNames();
context.put(ServiceInfo.class, null);
}
}
if (context.optionSet(ToolConstants.CFG_NO_TYPES)) {
context.remove(ToolConstants.CFG_TYPES);
context.remove(ToolConstants.CFG_ALL);
context.remove(ToolConstants.CFG_COMPILE);
}
generateTypes();
if (context.getErrorListener().getErrorCount() > 0) {
return;
}
for (ServiceInfo service : serviceList) {
context.put(ServiceInfo.class, service);
if (context.basicValidateWSDL()) {
validate(service);
}
if (context.getErrorListener().getErrorCount() == 0) {
// Build the JavaModel from the ServiceModel
processor.setEnvironment(context);
processor.process();
}
}
if (context.getErrorListener().getErrorCount() > 0) {
return;
}
if (context.optionSet(ToolConstants.CFG_CLIENT_JAR)) {
enforceWSDLLocation(context);
}
if (!isSuppressCodeGen()) {
// Generate artifacts
for (FrontEndGenerator generator : frontend.getGenerators()) {
generator.generate(context);
}
}
context.remove(ToolConstants.SERVICE_LIST);
// Build projects: compile classes and copy resources etc.
if (context.optionSet(ToolConstants.CFG_COMPILE)) {
new ClassUtils().compile(context);
}
if (context.isExcludeNamespaceEnabled()) {
try {
removeExcludeFiles();
} catch (IOException e) {
throw new ToolException(e);
}
}
if (context.optionSet(ToolConstants.CFG_CLIENT_JAR)) {
processClientJar(context);
}
}
private void enforceWSDLLocation(ToolContext context) {
String wsdlURL = (String)context.get(ToolConstants.CFG_WSDLURL);
@SuppressWarnings("unchecked")
List serviceList = (List)context.get(ToolConstants.SERVICE_LIST);
int slashIndex = wsdlURL.lastIndexOf("/");
int dotIndex = wsdlURL.indexOf(".", slashIndex);
String wsdlLocation = null;
if (slashIndex > -1 && dotIndex > -1) {
wsdlLocation = wsdlURL.substring(slashIndex + 1, dotIndex) + ".wsdl";
}
if (wsdlLocation == null) {
wsdlLocation = serviceList.get(0).getName().getLocalPart() + ".wsdl";
}
context.put(ToolConstants.CFG_WSDLLOCATION, wsdlLocation);
}
private void processClientJar(ToolContext context) {
ClassCollector oldCollector = context.get(ClassCollector.class);
ClassCollector newCollector = new ClassCollector();
String oldClassDir = (String)context.get(ToolConstants.CFG_CLASSDIR);
File tmpDir = FileUtils.createTmpDir();
context.put(ToolConstants.CFG_CLASSDIR, tmpDir.getAbsolutePath());
newCollector.setTypesClassNames(oldCollector.getTypesClassNames());
newCollector.setSeiClassNames(oldCollector.getSeiClassNames());
newCollector.setExceptionClassNames(oldCollector.getExceptionClassNames());
newCollector.setServiceClassNames(oldCollector.getServiceClassNames());
context.put(ClassCollector.class, newCollector);
new ClassUtils().compile(context);
generateLocalWSDL(context);
File clientJarFile = new File((String)context.get(ToolConstants.CFG_OUTPUTDIR),
(String)context.get(ToolConstants.CFG_CLIENT_JAR));
JarOutputStream jarout = null;
try {
jarout = new JarOutputStream(new FileOutputStream(clientJarFile), new Manifest());
createClientJar(tmpDir, jarout);
jarout.close();
} catch (Exception e) {
LOG.log(Level.SEVERE, "FAILED_TO_CREAT_CLIENTJAR", e);
Message msg = new Message("FAILED_TO_CREAT_CLIENTJAR", LOG);
throw new ToolException(msg, e);
}
context.put(ToolConstants.CFG_CLASSDIR, oldClassDir);
context.put(ClassCollector.class, oldCollector);
}
private void createClientJar(File tmpDirectory, JarOutputStream jarout) {
try {
URI parentFile = new File((String)context.get(ToolConstants.CFG_CLASSDIR)).toURI();
for (File file : tmpDirectory.listFiles()) {
URI relativePath = parentFile.relativize(file.toURI());
String name = relativePath.toString();
if (file.isDirectory()) {
if (!StringUtils.isEmpty(name)) {
if (!name.endsWith("/")) {
name += "/";
}
JarEntry entry = new JarEntry(name);
entry.setTime(file.lastModified());
jarout.putNextEntry(entry);
jarout.closeEntry();
}
createClientJar(file, jarout);
continue;
}
JarEntry entry = new JarEntry(name);
entry.setTime(file.lastModified());
jarout.putNextEntry(entry);
InputStream input = new BufferedInputStream(new FileInputStream(file));
IOUtils.copy(input, jarout);
input.close();
jarout.closeEntry();
}
} catch (Exception e) {
Message msg = new Message("FAILED_ADD_JARENTRY", LOG);
throw new ToolException(msg, e);
}
}
private boolean isSuppressCodeGen() {
return context.optionSet(ToolConstants.CFG_SUPPRESS_GEN);
}
public void execute(boolean exitOnFinish) throws ToolException {
try {
if (getArgument() != null) {
super.execute(exitOnFinish);
}
execute();
} catch (ToolException ex) {
if (ex.getCause() instanceof BadUsageException) {
printUsageException(toolName, (BadUsageException)ex.getCause());
}
throw ex;
} catch (Exception ex) {
throw new ToolException(ex);
} finally {
tearDown();
}
}
@SuppressWarnings("unchecked")
public QName getServiceQName(Definition def) {
List defs = new ArrayList();
defs.add(def);
Iterator> ite1 = def.getImports().values().iterator();
while (ite1.hasNext()) {
List defList = CastUtils.cast((List>)ite1.next());
for (javax.wsdl.Import importDef : defList) {
defs.add(importDef.getDefinition());
}
}
String serviceName = (String)context.get(ToolConstants.CFG_SERVICENAME);
for (Definition definition : defs) {
if (serviceName != null) {
for (Iterator ite = definition.getServices().keySet().iterator(); ite.hasNext();) {
QName qn = ite.next();
if (qn.getLocalPart().equalsIgnoreCase(serviceName.toLowerCase())) {
return qn;
}
}
}
}
Message msg = new Message("SERVICE_NOT_FOUND", LOG, new Object[] {serviceName});
throw new ToolException(msg);
}
public void loadDefaultNSPackageMapping(ToolContext env) {
if (!env.hasExcludeNamespace(DEFAULT_NS2PACKAGE)
&& env.getBooleanValue(ToolConstants.CFG_DEFAULT_NS, "true")
&& env.get(ToolConstants.CFG_NO_ADDRESS_BINDING) != null) {
// currently namespace2pacakge.cfg only contains wsadressing mapping
env.loadDefaultNS2Pck(getResourceAsStream("namespace2package.cfg"));
}
if (env.getBooleanValue(ToolConstants.CFG_DEFAULT_EX, "true")) {
env.loadDefaultExcludes(getResourceAsStream("wsdltojavaexclude.cfg"));
}
}
public void setExcludePackageAndNamespaces(ToolContext env) {
if (env.get(ToolConstants.CFG_NEXCLUDE) != null) {
String[] pns = null;
try {
pns = (String[])env.get(ToolConstants.CFG_NEXCLUDE);
} catch (ClassCastException e) {
pns = new String[1];
pns[0] = (String)env.get(ToolConstants.CFG_NEXCLUDE);
}
for (int j = 0; j < pns.length; j++) {
int pos = pns[j].indexOf("=");
String excludePackagename = pns[j];
if (pos != -1) {
String ns = pns[j].substring(0, pos);
if (ns.equals(ToolConstants.WSA_NAMESPACE_URI)) {
env.put(ToolConstants.CFG_NO_ADDRESS_BINDING, ToolConstants.CFG_NO_ADDRESS_BINDING);
}
excludePackagename = pns[j].substring(pos + 1);
env.addExcludeNamespacePackageMap(ns, excludePackagename);
env.addNamespacePackageMap(ns, excludePackagename);
} else {
env.addExcludeNamespacePackageMap(pns[j], env.mapPackageName(pns[j]));
}
}
}
}
public void setPackageAndNamespaces(ToolContext env) {
if (env.get(ToolConstants.CFG_PACKAGENAME) != null) {
String[] pns = null;
try {
pns = (String[])env.get(ToolConstants.CFG_PACKAGENAME);
} catch (ClassCastException e) {
pns = new String[1];
pns[0] = (String)env.get(ToolConstants.CFG_PACKAGENAME);
}
for (int j = 0; j < pns.length; j++) {
int pos = pns[j].indexOf("=");
String packagename = pns[j];
if (pos != -1) {
String ns = pns[j].substring(0, pos);
if (ns.equals(ToolConstants.WSA_NAMESPACE_URI)) {
env.put(ToolConstants.CFG_NO_ADDRESS_BINDING, ToolConstants.CFG_NO_ADDRESS_BINDING);
}
packagename = pns[j].substring(pos + 1);
env.addNamespacePackageMap(ns, packagename);
} else {
env.setPackageName(packagename);
}
}
}
}
public void validate(ToolContext env) throws ToolException {
String outdir = (String)env.get(ToolConstants.CFG_OUTPUTDIR);
if (!isSuppressCodeGen()) {
if (outdir != null) {
File dir = new File(outdir);
if (!dir.exists() && !dir.mkdirs()) {
Message msg = new Message("DIRECTORY_COULD_NOT_BE_CREATED", LOG, outdir);
throw new ToolException(msg);
}
if (!dir.isDirectory()) {
Message msg = new Message("NOT_A_DIRECTORY", LOG, outdir);
throw new ToolException(msg);
}
}
if (env.optionSet(ToolConstants.CFG_COMPILE)) {
String clsdir = (String)env.get(ToolConstants.CFG_CLASSDIR);
if (clsdir != null) {
File dir = new File(clsdir);
if (!dir.exists() && !dir.mkdirs()) {
Message msg = new Message("DIRECTORY_COULD_NOT_BE_CREATED", LOG, clsdir);
throw new ToolException(msg);
}
}
}
}
String wsdl = (String)env.get(ToolConstants.CFG_WSDLURL);
if (StringUtils.isEmpty(wsdl)) {
Message msg = new Message("NO_WSDL_URL", LOG);
throw new ToolException(msg);
}
env.put(ToolConstants.CFG_WSDLURL, URIParserUtil.getAbsoluteURI(wsdl));
if (!env.containsKey(ToolConstants.CFG_WSDLLOCATION)) {
//make sure the "raw" form is used for the wsdlLocation
//instead of the absolute URI that normalize may return
try {
URI uri = new URI(wsdl);
wsdl = uri.toString();
} catch (Exception e) {
//not a URL, assume file
if (wsdl.indexOf(":") != -1 && !wsdl.startsWith("/")) {
wsdl = "file:/" + wsdl;
} else {
wsdl = "file:" + wsdl;
}
try {
URI uri = new URI(wsdl);
wsdl = uri.toString();
} catch (Exception e1) {
//ignore...
}
}
wsdl = wsdl.replace("\\", "/");
env.put(ToolConstants.CFG_WSDLLOCATION, wsdl);
}
String[] bindingFiles;
try {
bindingFiles = (String[])env.get(ToolConstants.CFG_BINDING);
if (bindingFiles == null) {
return;
}
} catch (ClassCastException e) {
bindingFiles = new String[1];
bindingFiles[0] = (String)env.get(ToolConstants.CFG_BINDING);
}
for (int i = 0; i < bindingFiles.length; i++) {
bindingFiles[i] = URIParserUtil.getAbsoluteURI(bindingFiles[i]);
}
env.put(ToolConstants.CFG_BINDING, bindingFiles);
}
public void setAntProperties(ToolContext env) {
String installDir = System.getProperty("install.dir");
if (installDir != null) {
env.put(ToolConstants.CFG_INSTALL_DIR, installDir);
} else {
env.put(ToolConstants.CFG_INSTALL_DIR, ".");
}
}
protected void setLibraryReferences(ToolContext env) {
Properties props = loadProperties(getResourceAsStream("wsdltojavalib.properties"));
if (props != null) {
for (Iterator> keys = props.keySet().iterator(); keys.hasNext();) {
String key = (String)keys.next();
env.put(key, props.get(key));
}
}
env.put(ToolConstants.CFG_ANT_PROP, props);
}
public void buildToolContext() {
context = getContext();
context.addParameters(getParametersMap(getArrayKeys()));
if (context.get(ToolConstants.CFG_OUTPUTDIR) == null) {
context.put(ToolConstants.CFG_OUTPUTDIR, ".");
}
if (context.containsKey(ToolConstants.CFG_ANT)) {
setAntProperties(context);
setLibraryReferences(context);
}
if (!context.containsKey(ToolConstants.CFG_WSDL_VERSION)) {
context.put(ToolConstants.CFG_WSDL_VERSION, WSDLConstants.WSDL11);
}
context.put(ToolConstants.CFG_SUPPRESS_WARNINGS, true);
loadDefaultNSPackageMapping(context);
setPackageAndNamespaces(context);
setExcludePackageAndNamespaces(context);
}
protected static InputStream getResourceAsStream(String file) {
return WSDLToJavaContainer.class.getResourceAsStream(file);
}
public void checkParams(ErrorVisitor errors) throws ToolException {
CommandDocument doc = super.getCommandDocument();
if (!doc.hasParameter("wsdlurl")) {
errors.add(new ErrorVisitor.UserError("WSDL/SCHEMA URL has to be specified"));
}
if (errors.getErrors().size() > 0) {
Message msg = new Message("PARAMETER_MISSING", LOG);
throw new ToolException(msg, new BadUsageException(getUsage(), errors));
}
}
public void removeExcludeFiles() throws IOException {
List excludeGenFiles = context.getExcludeFileList();
if (excludeGenFiles == null) {
return;
}
String outPutDir = (String)context.get(ToolConstants.CFG_OUTPUTDIR);
for (int i = 0; i < excludeGenFiles.size(); i++) {
String excludeFile = excludeGenFiles.get(i);
File file = new File(outPutDir, excludeFile);
file.delete();
File tmpFile = file.getParentFile();
while (tmpFile != null && !tmpFile.getCanonicalPath().equalsIgnoreCase(outPutDir)) {
if (tmpFile.isDirectory() && tmpFile.list().length == 0) {
tmpFile.delete();
}
tmpFile = tmpFile.getParentFile();
}
if (context.get(ToolConstants.CFG_COMPILE) != null) {
String classDir = context.get(ToolConstants.CFG_CLASSDIR) == null
? outPutDir : (String)context.get(ToolConstants.CFG_CLASSDIR);
File classFile = new File(classDir, excludeFile.substring(0, excludeFile.indexOf(".java"))
+ ".class");
classFile.delete();
File tmpClzFile = classFile.getParentFile();
while (tmpClzFile != null && !tmpClzFile.getCanonicalPath().equalsIgnoreCase(outPutDir)) {
if (tmpClzFile.isDirectory() && tmpClzFile.list().length == 0) {
tmpClzFile.delete();
}
tmpClzFile = tmpClzFile.getParentFile();
}
}
}
}
public boolean passthrough() {
if (context.optionSet(ToolConstants.CFG_GEN_TYPES) || context.optionSet(ToolConstants.CFG_ALL)) {
return false;
}
if (context.optionSet(ToolConstants.CFG_GEN_ANT) || context.optionSet(ToolConstants.CFG_GEN_CLIENT)
|| context.optionSet(ToolConstants.CFG_GEN_IMPL) || context.optionSet(ToolConstants.CFG_GEN_SEI)
|| context.optionSet(ToolConstants.CFG_GEN_SERVER)
|| context.optionSet(ToolConstants.CFG_GEN_SERVICE)
|| context.optionSet(ToolConstants.CFG_GEN_FAULT)) {
return true;
}
if (context.optionSet(ToolConstants.CFG_NO_TYPES)) {
return true;
}
return false;
}
public void generateTypes() throws ToolException {
DataBindingProfile dataBindingProfile = context.get(DataBindingProfile.class);
if (dataBindingProfile == null) {
Message msg = new Message("FOUND_NO_DATABINDING", LOG);
throw new ToolException(msg);
}
dataBindingProfile.initialize(context);
if (passthrough()) {
return;
}
dataBindingProfile.generate(context);
}
public void validate(final ServiceInfo service) throws ToolException {
for (ServiceValidator validator : getServiceValidators()) {
service.setProperty(ToolContext.class.getName(), context);
validator.setService(service);
if (!validator.isValid()) {
throw new ToolException(validator.getErrorMessage());
}
}
}
public List getServiceValidators() {
List validators = new ArrayList();
Properties initialExtensions = null;
try {
initialExtensions = PropertiesLoaderUtils.loadAllProperties(SERVICE_VALIDATOR, Thread
.currentThread().getContextClassLoader());
} catch (IOException ex) {
throw new RuntimeException(ex);
}
for (Iterator> it = initialExtensions.values().iterator(); it.hasNext();) {
String validatorClass = (String)it.next();
try {
if (LOG.isLoggable(Level.FINE)) {
LOG.fine("Found service validator : " + validatorClass);
}
ServiceValidator validator = (ServiceValidator)Class.forName(
validatorClass,
true,
Thread.currentThread()
.getContextClassLoader())
.newInstance();
validators.add(validator);
} catch (Exception ex) {
LOG.log(Level.WARNING, "EXTENSION_ADD_FAILED_MSG", ex);
}
}
return validators;
}
@SuppressWarnings("unchecked")
private void generateLocalWSDL(ToolContext context) {
String outputdir = (String)context.get(ToolConstants.CFG_CLASSDIR);
File wsdlFile = new File(outputdir, (String)context.get(ToolConstants.CFG_WSDLLOCATION));
Definition def = context.get(Definition.class);
try {
//get imported schemas
int xsdCount = 0;
SchemaCollection schemas = (SchemaCollection) context.get(ToolConstants.XML_SCHEMA_COLLECTION);
Map sourceMap = new HashMap();
for (XmlSchema imp : schemas.getXmlSchemas()) {
if (imp.getSourceURI() != null && !imp.getSourceURI().contains(".wsdl#")) {
String schemaFileName = "schema" + (++xsdCount) + ".xsd";
sourceMap.put(imp.getTargetNamespace(), schemaFileName);
}
}
//get imported wsdls
List defs = (List)context.get(ToolConstants.IMPORTED_DEFINITION);
Map importWSDLMap = new HashMap();
for (Definition importDef : defs) {
File importedWsdlFile = null;
if (!StringUtils.isEmpty(importDef.getDocumentBaseURI())) {
importedWsdlFile = new File(importDef.getDocumentBaseURI());
} else {
importedWsdlFile = new File(importDef.getQName().getLocalPart() + ".wsdl");
}
importWSDLMap.put(importDef.getTargetNamespace(), importedWsdlFile.getName());
}
OutputStreamCreator outputStreamCreator = null;
if (context.get(OutputStreamCreator.class) != null) {
outputStreamCreator = context.get(OutputStreamCreator.class);
} else {
outputStreamCreator = new OutputStreamCreator();
context.put(OutputStreamCreator.class, outputStreamCreator);
}
Writer os = null;
for (XmlSchema imp : schemas.getXmlSchemas()) {
if (imp.getSourceURI() != null && !imp.getSourceURI().contains(".wsdl#")) {
String schemaFileName = sourceMap.get(imp.getTargetNamespace());
File impfile = new File(wsdlFile.getParentFile(), schemaFileName);
Element el = imp.getSchemaDocument().getDocumentElement();
updateImports(el, sourceMap);
os = new FileWriterUtil(impfile.getParent(), context.get(OutputStreamCreator.class))
.getWriter(impfile, "UTF-8");
XMLUtils.writeTo(el, os, 2);
os.close();
}
}
//change the import location in wsdl file
OutputStream wsdloutput = new BufferedOutputStream(new FileOutputStream(wsdlFile));
WSDLWriter wsdlWriter = WSDLFactory.newInstance().newWSDLWriter();
ByteArrayOutputStream bout = new ByteArrayOutputStream();
wsdlWriter.writeWSDL(def, bout);
Element defEle = XMLUtils.parse(bout.toByteArray()).getDocumentElement();
List xsdElements = DOMUtils.findAllElementsByTagNameNS(defEle,
WSDLConstants.NS_SCHEMA_XSD,
"schema");
for (Element xsdEle : xsdElements) {
updateImports(xsdEle, sourceMap);
}
updateWSDLImports(defEle, importWSDLMap);
DOMUtils.writeXml(defEle, wsdloutput);
wsdloutput.close();
for (Definition importDef : defs) {
File importWsdlFile = new File(outputdir, importWSDLMap.get(importDef.getTargetNamespace()));
OutputStream wsdlOs = new BufferedOutputStream(new FileOutputStream(importWsdlFile));
bout = new ByteArrayOutputStream();
wsdlWriter.writeWSDL(importDef, bout);
Element importEle = XMLUtils.parse(bout.toByteArray()).getDocumentElement();
xsdElements = DOMUtils.findAllElementsByTagNameNS(importEle, WSDLConstants.NS_SCHEMA_XSD,
"schema");
for (Element xsdEle : xsdElements) {
updateImports(xsdEle, sourceMap);
}
updateWSDLImports(importEle, importWSDLMap);
DOMUtils.writeXml(importEle, wsdlOs);
wsdlOs.close();
}
} catch (Exception ex) {
LOG.log(Level.SEVERE, "FAILED_TO_GEN_LOCAL_WSDL", ex);
Message msg = new Message("FAILED_TO_GEN_LOCAL_WSDL", LOG);
throw new ToolException(msg, ex);
}
}
private void updateImports(Element el, Map sourceMap) {
List imps = DOMUtils.getChildrenWithName(el,
WSDLConstants.NS_SCHEMA_XSD,
"import");
for (Element e : imps) {
String ns = e.getAttribute("namespace");
e.setAttribute("schemaLocation", sourceMap.get(ns));
}
}
private void updateWSDLImports(Element el, Map wsdlSourceMap) {
List imps = DOMUtils.getChildrenWithName(el,
WSDLConstants.QNAME_IMPORT.getNamespaceURI(),
"import");
for (Element e : imps) {
String ns = e.getAttribute("namespace");
e.setAttribute("location", wsdlSourceMap.get(ns));
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy