/*
* 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.tuscany.tools.java2wsdl.generate;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Map;
import org.apache.ws.java2wsdl.Java2WSDLUtils;
import org.apache.ws.java2wsdl.utils.Java2WSDLCommandLineOption;
/**
* This class encapsulates the parameters that effect the generation of the WSDL. For example they contain all user settings such as source class,
* target location etc.
*
*/
public class GenerationParameters implements TuscanyJava2WSDLConstants {
public static final String WSDL_FILENAME_SUFFIX = ".wsdl";
public static final String XSD_IMPORT_DELIMITER = "[,]";
private Map cmdLineOptions = null;
private File outputFile = null;
private FileOutputStream outputFileStream = null;
private String sourceClassName = null;
private ArrayList extraClasses;
private ArrayList factoryClassNames;
private String attrFormDefault = null;
private String elementFormDefault = null;
private String targetNamespace = null;
private String targetNamespacePrefix = null;
private String schemaTargetNamespace = null;
private String schemaTargetNamespacePrefix = null;
private String outputFileName = null;
private ClassLoader classLoader = null;
private String serviceName = null;
private String style = DOCUMENT;
private String use = LITERAL;
private String locationUri = DEFAULT_LOCATION_URL;
private Map schemaLocationMap = null;
public GenerationParameters(Map cmdLineOptions) throws Exception {
this.cmdLineOptions = cmdLineOptions;
loadParameters();
}
protected void loadParameters() throws Exception {
initializeSourceClassName();
resolveFileOutputStream();
resolveClassLoader4InputClasspath();
loadSchemaLocationMap();
initializeOtherParams();
}
private Java2WSDLCommandLineOption loadOption(String shortOption, String longOption) {
// short option gets precedence
Java2WSDLCommandLineOption option = null;
if (longOption != null) {
option = (Java2WSDLCommandLineOption) cmdLineOptions.get(longOption);
if (option != null) {
return option;
}
}
if (shortOption != null) {
option = (Java2WSDLCommandLineOption) cmdLineOptions.get(shortOption);
}
return option;
}
protected void initializeSourceClassName() throws Exception {
Java2WSDLCommandLineOption option = loadOption(CLASSNAME_OPTION, CLASSNAME_OPTION_LONG);
sourceClassName = option == null ? null : option.getOptionValue();
if (sourceClassName == null || sourceClassName.equals("")) {
throw new Exception("class name must be present!");
}
}
/**
* @throws Exception
*/
protected void resolveFileOutputStream() throws Exception {
File outputFolder;
Java2WSDLCommandLineOption option = loadOption(OUTPUT_LOCATION_OPTION, OUTPUT_LOCATION_OPTION_LONG);
String outputFolderName = option == null ? System.getProperty("user.dir") : option.getOptionValue();
outputFolder = new File(outputFolderName);
if (!outputFolder.exists()) {
outputFolder.mkdirs();
} else if (!outputFolder.isDirectory()) {
throw new Exception("The specified location " + outputFolderName + "is not a folder");
}
option = loadOption(OUTPUT_FILENAME_OPTION, OUTPUT_FILENAME_OPTION_LONG);
String outputFileName = option == null ? null : option.getOptionValue();
// derive a file name from the class name if the filename is not specified
if (outputFileName == null) {
outputFileName = Java2WSDLUtils.getSimpleClassName(sourceClassName) + WSDL_FILENAME_SUFFIX;
}
// first create a file in the given location
File outputFile = new File(outputFolder, outputFileName);
try {
if (!outputFile.exists()) {
outputFile.createNewFile();
}
outputFileStream = new FileOutputStream(outputFile);
} catch (IOException e) {
throw new Exception(e);
}
}
protected void addToSchemaLocationMap(String optionValue) throws Exception {
// option value will be of the form [namespace, schemalocation]
// hence we take the two substrings starting after '[' and upto ',' and
// starting after ',' and upto ']'
getSchemaLocationMap().put(optionValue.substring(1, optionValue.indexOf(COMMA)),
optionValue.substring(optionValue.indexOf(COMMA) + 1, optionValue.length() - 1));
}
protected void loadSchemaLocationMap() throws Exception {
Java2WSDLCommandLineOption option = loadOption(IMPORT_XSD_OPTION, IMPORT_XSD_OPTION_LONG);
if (option != null) {
ArrayList optionValues = option.getOptionValues();
for (int count = 0; count < optionValues.size(); ++count) {
addToSchemaLocationMap(((String) optionValues.get(count)).trim());
}
}
}
protected void resolveClassLoader4InputClasspath() throws Exception {
URL[] urls = null;
Java2WSDLCommandLineOption option = loadOption(CLASSPATH_OPTION, CLASSPATH_OPTION_LONG);
if (option != null) {
ArrayList optionValues = option.getOptionValues();
urls = new URL[optionValues.size()];
String[] classPathEntries = (String[]) optionValues.toArray(new String[optionValues.size()]);
try {
for (int i = 0; i < classPathEntries.length; i++) {
String classPathEntry = classPathEntries[i];
// this should be a file(or a URL)
if (Java2WSDLUtils.isURL(classPathEntry)) {
urls[i] = new URL(classPathEntry);
} else {
urls[i] = new File(classPathEntry).toURL();
}
}
} catch (MalformedURLException e) {
throw new Exception(e);
}
} else {
//Default to pwd
urls = new URL[1];
File pwd = new File(".");
urls[0] = pwd.toURL();
}
classLoader = new URLClassLoader(urls, Thread.currentThread().getContextClassLoader());
}
protected void initializeOtherParams() {
// set the other parameters to the builder
Java2WSDLCommandLineOption option =
loadOption(SCHEMA_TARGET_NAMESPACE_OPTION, SCHEMA_TARGET_NAMESPACE_OPTION_LONG);
schemaTargetNamespace = (option == null) ? null : option.getOptionValue();
option = loadOption(SCHEMA_TARGET_NAMESPACE_PREFIX_OPTION, SCHEMA_TARGET_NAMESPACE_PREFIX_OPTION_LONG);
schemaTargetNamespacePrefix = (option == null) ? null : option.getOptionValue();
option = loadOption(TARGET_NAMESPACE_OPTION, TARGET_NAMESPACE_OPTION_LONG);
targetNamespace = (option == null) ? null : option.getOptionValue();
option = loadOption(TARGET_NAMESPACE_PREFIX_OPTION, TARGET_NAMESPACE_PREFIX_OPTION_LONG);
targetNamespacePrefix = (option == null) ? null : option.getOptionValue();
option = loadOption(SERVICE_NAME_OPTION, SERVICE_NAME_OPTION_LONG);
serviceName = (option == null) ? Java2WSDLUtils.getSimpleClassName(sourceClassName) : option.getOptionValue();
option = loadOption(STYLE_OPTION, STYLE_OPTION);
style = (option == null) ? null : option.getOptionValue();
option = loadOption(LOCATION_OPTION, LOCATION_OPTION);
locationUri = (option == null) ? null : option.getOptionValue();
option = loadOption(USE_OPTION, USE_OPTION);
use = (option == null) ? null : option.getOptionValue();
option = loadOption(ATTR_FORM_DEFAULT_OPTION, ATTR_FORM_DEFAULT_OPTION_LONG);
attrFormDefault = (option == null) ? null : option.getOptionValue();
option = loadOption(ELEMENT_FORM_DEFAULT_OPTION, ELEMENT_FORM_DEFAULT_OPTION_LONG);
elementFormDefault = option == null ? null : option.getOptionValue();
option = loadOption(TuscanyJava2WSDLConstants.EXTRA_CLASSES_DEFAULT_OPTION, TuscanyJava2WSDLConstants.EXTRA_CLASSES_DEFAULT_OPTION_LONG);
extraClasses = option == null ? new ArrayList() : option.getOptionValues();
option = loadOption(TuscanyJava2WSDLConstants.FACTORY_CLASSNAMES_OPTION, TuscanyJava2WSDLConstants.FACTORY_CLASSNAMES_OPTION_LONG);
factoryClassNames = option == null ? new ArrayList() : option.getOptionValues();
}
public ClassLoader getClassLoader() {
return classLoader;
}
public void setClassLoader(ClassLoader classLoader) {
this.classLoader = classLoader;
}
public String getLocationUri() {
if (locationUri == null) {
locationUri = DEFAULT_LOCATION_URL;
}
return locationUri;
}
public void setLocationUri(String locationUri) {
this.locationUri = locationUri;
}
public FileOutputStream getOutputFileStream() {
return outputFileStream;
}
public void setOutputFileStream(FileOutputStream outputFileStream) {
this.outputFileStream = outputFileStream;
}
public String getSchemaTargetNamespace() throws Exception {
if (schemaTargetNamespace == null || schemaTargetNamespace.trim().equals("")) {
// This amounts to assuming we want the wrapper elements in the same TNS
// as the WSDL definitions.
//
// If the user neither specifies a TNS nor a SchemaTNS then both of these two
// will continue to default to the same NS calculated from the input class' package name.
//
// The wrapper elements aren't really interesting outside the context of the WSDL types
// section, so it seems reasonable to think that a user who cares to select a non-default
// TNS for the WSDL definitions might want the wrapper elements defined in that same
// NS.
//
// The user can always override this default.
this.schemaTargetNamespace = this.getTargetNamespace();
}
return schemaTargetNamespace;
}
public void setSchemaTargetNamespace(String schemaTargetNamespace) {
this.schemaTargetNamespace = schemaTargetNamespace;
}
public String getSchemaTargetNamespacePrefix() {
if (schemaTargetNamespacePrefix == null || schemaTargetNamespacePrefix.trim().equals("")) {
this.schemaTargetNamespacePrefix = SCHEMA_NAMESPACE_PRFIX;
}
return schemaTargetNamespacePrefix;
}
public void setSchemaTargetNamespacePrefix(String schemaTargetNamespacePrefix) {
this.schemaTargetNamespacePrefix = schemaTargetNamespacePrefix;
}
public String getServiceName() {
if (serviceName == null) {
serviceName = Java2WSDLUtils.getSimpleClassName(getSourceClassName());
}
return serviceName;
}
public void setServiceName(String serviceName) {
this.serviceName = serviceName;
}
public String getSourceClassName() {
return sourceClassName;
}
public void setSourceClassName(String sourceClassName) {
this.sourceClassName = sourceClassName;
}
public String getStyle() {
if (style == null) {
style = DOCUMENT;
}
return style;
}
public void setStyle(String style) {
this.style = style;
}
public String getTargetNamespace() throws Exception {
if (targetNamespace == null) {
targetNamespace = Java2WSDLUtils.namespaceFromClassName(this.sourceClassName, this.classLoader).toString();
}
return targetNamespace;
}
public void setTargetNamespace(String targetNamespace) {
this.targetNamespace = targetNamespace;
}
public String getTargetNamespacePrefix() {
return targetNamespacePrefix;
}
public void setTargetNamespacePrefix(String targetNamespacePrefix) {
this.targetNamespacePrefix = targetNamespacePrefix;
}
public String getUse() {
if (use == null) {
use = LITERAL;
}
return use;
}
public void setUse(String use) {
this.use = use;
}
public Map getSchemaLocationMap() {
if (schemaLocationMap == null) {
schemaLocationMap = new Hashtable();
}
return schemaLocationMap;
}
public void setSchemaLocationMap(Map schemaLocationMap) {
this.schemaLocationMap = schemaLocationMap;
}
public String getAttrFormDefault() {
if (attrFormDefault == null) {
attrFormDefault = FORM_DEFAULT_UNQUALIFIED;
}
return attrFormDefault;
}
public void setAttrFormDefault(String attrFormDefault) {
this.attrFormDefault = attrFormDefault;
}
public String getElementFormDefault() {
if (elementFormDefault == null) {
elementFormDefault = FORM_DEFAULT_QUALIFIED;
}
return elementFormDefault;
}
public void setElementFormDefault(String elementFormDefault) {
this.elementFormDefault = elementFormDefault;
}
public ArrayList getExtraClasses() {
return extraClasses;
}
public void setExtraClasses(ArrayList extraClasses) {
this.extraClasses = extraClasses;
}
public ArrayList getFactoryClassNames() {
return factoryClassNames;
}
public void setFactoryClassNames(ArrayList factoryClassNames) {
this.factoryClassNames = factoryClassNames;
}
// Not a command-line parameter, but will be useful for printing status message
protected File getOutputFile() {
return outputFile;
}
}