/*******************************************************************************
* Copyright (c) 2006-2010 eBay Inc. All Rights Reserved.
* Licensed 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
*******************************************************************************/
package org.ebayopensource.turmeric.tools.codegen.external;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import org.apache.axis2.wsdl.WSDL2Java;
import org.apache.ws.java2wsdl.Java2WSDLCodegenEngine;
import org.apache.ws.java2wsdl.utils.Java2WSDLCommandLineOption;
import org.apache.ws.java2wsdl.utils.Java2WSDLCommandLineOptionParser;
import org.ebayopensource.turmeric.common.config.TypeInformationType;
import org.ebayopensource.turmeric.common.config.TypeLibraryType;
import org.ebayopensource.turmeric.runtime.codegen.common.NSPkgMappingType;
import org.ebayopensource.turmeric.runtime.codegen.common.NSToPkgMappingList;
import org.ebayopensource.turmeric.runtime.codegen.common.OpNameCemcMappingType;
import org.ebayopensource.turmeric.runtime.codegen.common.OpNameToCemcMappingList;
import org.ebayopensource.turmeric.runtime.codegen.common.PkgToNSMappingList;
import org.ebayopensource.turmeric.runtime.common.impl.utils.CallTrackingLogger;
import org.ebayopensource.turmeric.runtime.common.impl.utils.LogManager;
import org.ebayopensource.turmeric.runtime.common.types.SOAConstants;
import org.ebayopensource.turmeric.tools.codegen.CodeGenContext;
import org.ebayopensource.turmeric.tools.codegen.InputOptions;
import org.ebayopensource.turmeric.tools.codegen.exception.CodeGenFailedException;
import org.ebayopensource.turmeric.tools.codegen.exception.PreProcessFailedException;
import org.ebayopensource.turmeric.tools.codegen.external.wsdl.parser.WsdlParserUtil;
import org.ebayopensource.turmeric.tools.codegen.util.CodeGenConstants;
import org.ebayopensource.turmeric.tools.codegen.util.CodeGenUtil;
import org.ebayopensource.turmeric.tools.codegen.util.TypeLibraryClassDetails;
import org.ebayopensource.turmeric.tools.library.SOAGlobalRegistryFactory;
import org.ebayopensource.turmeric.tools.library.SOATypeRegistry;
import org.ebayopensource.turmeric.tools.library.TypeLibraryInputOptions;
import org.ebayopensource.turmeric.tools.library.builders.TypeLibraryParser;
import org.ebayopensource.turmeric.tools.library.codegen.TypeLibraryCodeGenContext;
public class AxisJavaWSDLGeneratorImpl implements JavaWSDLGenerator {
private static final String PKG_PARAM = "@pkg@";
private static final String NAMESPACE_PARAM = "@ns@";
private static final String JAVA_2_WSDL_PKG_TO_NS_PATTERN = "[" + PKG_PARAM + "," + NAMESPACE_PARAM + "]";
private static final String XML_TRANSFORMER_FACTORY = "javax.xml.transform.TransformerFactory";
private static CallTrackingLogger s_logger = LogManager.getInstance(AxisJavaWSDLGeneratorImpl.class);
private FileHandler m_fileHandlerForWSDL2Java;
private CallTrackingLogger getLogger() {
return s_logger;
}
public AxisJavaWSDLGeneratorImpl() {
String codegenConfigProp = "/org/ebayopensource/turmeric/tools/codegen/external/codegen-config.properties";
System.setProperty("org.apache.axis2.codegen.config", codegenConfigProp);
/* Perform a quick check on the ClassLoader to see if the axis2 config
* file can be found.
* Axis2 will trigger a NPE if this file is not found via the classloader.
* This makes this issue more meaningful in the logs.
*/
URL url = this.getClass().getResource(codegenConfigProp);
if(url == null) {
getLogger().severe("Axis2 Configuration File not present in ClassLoader: " + codegenConfigProp);
}
}
public void java2WSDL(
CodeGenContext codeGenCtx,
String qualifiedIntfName,
String destLocation) throws CodeGenFailedException {
System.setProperty("soa.service.default.ns", codeGenCtx.getNamespace());
OpNameToCemcMappingList opNameToCemcMappings =
codeGenCtx.getInputOptions().getOpNameToCemcMappings();
String opNameToCemcMapString = getOpNameToCemcMapString(opNameToCemcMappings);
if (opNameToCemcMapString != null) {
System.setProperty("soa.service.opname.to.cemc.map", opNameToCemcMapString);
}
String[] args = getJava2WSDLToolArgs(codeGenCtx, qualifiedIntfName, destLocation);
if(LogManager.isTracingEnabled()){
String strMsg = Arrays.toString(args);
getLogger().debug("Arguments passed to AXIS2's Java2WSDL : \n"+ strMsg);
}
try {
Java2WSDLCommandLineOptionParser cmdArgsParser =
new Java2WSDLCommandLineOptionParser(args);
Map<String,Java2WSDLCommandLineOption> allOptions = cmdArgsParser.getAllOptions();
Java2WSDLCodegenEngine java2WSDLEngine = new Java2WSDLCodegenEngine(allOptions);
// generate WSDL
java2WSDLEngine.generate();
// Pretty format generated WSDL
// this is quick fix until Axis2 stops pretty formatting all
// XML and WSDL files under output directories.
String wsdlFilePath = CodeGenUtil.toOSFilePath(destLocation) +
getWSDLFileName(codeGenCtx.getServiceAdminName());
prettyFormatWSDL(wsdlFilePath);
} catch (Exception ex) {
throw new CodeGenFailedException(
"Failed to generate WSDL for : " + qualifiedIntfName, ex);
} finally {
System.setProperty("soa.service.default.ns", "");
System.setProperty("soa.service.opname.to.cemc.map", "");
}
}
public void wsdl2Java(CodeGenContext codeGenCtx, String destLocation)
throws CodeGenFailedException {
String oldFactoryName = System.getProperty(XML_TRANSFORMER_FACTORY, "");
// set to new value
try {
Class.forName("org.apache.xalan.processor.TransformerFactoryImpl");//Transformer facotry impl available with IBM JRE
System.setProperty(XML_TRANSFORMER_FACTORY, "org.apache.xalan.processor.TransformerFactoryImpl");
} catch (ClassNotFoundException e1) {
try {
Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");//Transformer facotry impl available with SUN JDK 6
System.setProperty(XML_TRANSFORMER_FACTORY, "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");
} catch (ClassNotFoundException e) {
System.setProperty(XML_TRANSFORMER_FACTORY, ""); // use the availble Transformer factory if the preferred ones are not available
}
}
getLogger().log(Level.INFO, "The XML Transformer factory used is : " + System.getProperty(XML_TRANSFORMER_FACTORY) );
String[] args = getWSDL2JavaToolArgs(codeGenCtx, destLocation);
getLogger().log(Level.INFO,"Arguments passed to AXIS2's WSDL2Java : \n"+ Arrays.toString(args));
File wsdl2javaLogFile = getLogFileOfWSDL2JavaCall();
try {
WSDL2Java.main(args);
} catch (Exception ex) {
String wsdl2JavaWarningAndError = getWarningErorFromLog(wsdl2javaLogFile);
CodeGenFailedException codeGenFailedException = new CodeGenFailedException(
"Failed to generate Java code for : " + codeGenCtx.getInputOptions().getInputFile() + "\n" + wsdl2JavaWarningAndError, ex);
codeGenFailedException.setMessageFormatted(true);
throw codeGenFailedException;
} finally {
removeFileHandlerForWSDL2JavaLog();
//remove the unneccessary ObjectFactory.java and package-info.java SOAPLATFORM-609
deleteDuplicateFilesFromDefaultPackage(codeGenCtx);
if(codeGenCtx.getInputOptions().isObjectFactoryTobeDeleted())
deleteObjectFactoryfile(codeGenCtx);
// reset to old factory name
if (null != oldFactoryName && oldFactoryName.length() != 0) {
System.setProperty(XML_TRANSFORMER_FACTORY, oldFactoryName);
} else {
System.setProperties(null);
}
}
try {
//need to delete the wsdl2javalog file now.
s_logger.log(Level.FINE,"Deleting wsdl2javaLog file");
CodeGenUtil.closeQuietly(m_fileHandlerForWSDL2Java);
CodeGenUtil.deleteFile(wsdl2javaLogFile);
deleteAdditionalJavaTypeFiles(codeGenCtx,destLocation);
} catch (Exception e) {
getLogger().log(Level.WARNING, "Exception while trying to delete extra types. " + e.getMessage(), e);
}
// Calls to WSDL2Java are nulling out some of the set System properties like http.ProxyHost and http.ProxyPort
String proxyHost = codeGenCtx.getInputOptions().getHttpProxyHost();
String proxyPort = codeGenCtx.getInputOptions().getHttpProxyPort();
if( !CodeGenUtil.isEmptyString(proxyHost) && !CodeGenUtil.isEmptyString(proxyPort)){
System.setProperty("http.proxyHost", proxyHost);
System.setProperty("http.proxyPort", proxyPort);
}
//Library support : deletion of files mentioned in the XML file of the -tlx option
List<TypeLibraryClassDetails> typeLibraryClassDetailsList = codeGenCtx.getInputOptions().getTypeLibraryClassDetails();
for(TypeLibraryClassDetails typeLibraryClassDetail : typeLibraryClassDetailsList){
String filePath = CodeGenUtil.toJavaSrcFilePath(destLocation + File.separatorChar + "src",typeLibraryClassDetail.getPackageName() + "." + typeLibraryClassDetail.getClassName());
File javaTypeFile = new File(filePath);
if(javaTypeFile.exists()){
boolean isFileDeleted = javaTypeFile.delete();
if(!isFileDeleted){
getLogger().log(Level.WARNING, " File " + javaTypeFile.getAbsolutePath() + " could not be deleted. This file is mentioned thru the option " + InputOptions.OPT_TYPE_LIBRARY_XML_FILE );
}
}
}
}
/**
* Deletes the Java files ObjectFactory.java and package-info.java from name space SOAConstants.SOA_TYPES_NAMESPACE.
* @param ctx
* @throws CodeGenFailedException
*/
@SuppressWarnings("deprecation")
private void deleteDuplicateFilesFromDefaultPackage(CodeGenContext ctx)throws CodeGenFailedException {
NSToPkgMappingList ns2PkgList = ctx.getInputOptions().getNSToPkgMappingList();
String packageName = getpackageForNamespace(SOAConstants.SOA_TYPES_NAMESPACE,ns2PkgList);
deleteEachObjectFactoryClass(ctx, packageName);
deleteEachPackageInfoClass(ctx, packageName);
}
private String[] getWSDL2JavaToolArgsForTypeLib(TypeLibraryCodeGenContext typeLibraryCodeGenContext, String outputDirectory)
throws CodeGenFailedException{
List<String> argsList = new ArrayList<String>();
TypeLibraryInputOptions inputOptions = typeLibraryCodeGenContext.getTypeLibraryInputOptions();
argsList.add("-o"); // all generated files location (parent dir)
argsList.add(outputDirectory);
argsList.add("-s"); // sync style
argsList.add("-l"); // language
argsList.add("java");
argsList.add("-d"); // data binding
argsList.add("jaxbri");
argsList.add("-ss"); // server side
argsList.add("-ssi"); // Service skeleton interface
argsList.add("-noWSDL");
argsList.add("-noBuildXML");
argsList.add("-noMessageReceiver");
argsList.add("-p"); // package name for interface
argsList.add(getTypePackageForTypeLib(typeLibraryCodeGenContext));
argsList.add("-ebc");
argsList.add("org.ebayopensource.turmeric.runtime.common.exceptions.ServiceException");
argsList.add("-uri"); // wsdl file uri
argsList.add(inputOptions.getV4WsdlLocation());
argsList.add("-sin"); //name for the generated interface
argsList.add(typeLibraryCodeGenContext.getServiceName());
String[] args = argsList.toArray(new String[0]);
return args;
}
private String getTypePackageForTypeLib(TypeLibraryCodeGenContext typeLibraryCodeGenContext){
String typePackage = null;
TypeLibraryInputOptions inputOptions = typeLibraryCodeGenContext.getTypeLibraryInputOptions();
if(inputOptions.getV4Pkg() != null)
typePackage = inputOptions.getV4Pkg();
else
typePackage = typeLibraryCodeGenContext.getInterfacePkg();
return typePackage;
}
private void deleteObjectFactoryfile(CodeGenContext ctx)throws CodeGenFailedException {
Set<String> allNamespaces = null;
try {
allNamespaces = WsdlParserUtil.getAllTargetNamespces(ctx.getInputOptions().getInputFile());
} catch (Exception e) {
s_logger.log(Level.SEVERE,"could not find namespaces present in the wsdl");
throw new CodeGenFailedException("TargetNamespace details for schema section of wsdl could not be found ");
}
@SuppressWarnings("deprecation")
NSToPkgMappingList ns2PkgList = ctx.getInputOptions().getNSToPkgMappingList();
//One objectFactory per namespace hence needs to be deleted.
for(String currentnamespace : allNamespaces)
{
String packageName = getpackageForNamespace(currentnamespace,ns2PkgList);
s_logger.log(Level.INFO,"Namespace mapped for ObjectFactory is " +currentnamespace);
s_logger.log(Level.INFO,"package found for ObjectFactory to be deleted is "+ packageName);
deleteEachObjectFactoryClass(ctx, packageName);
}
}
private String getpackageForNamespace(String currentnamespace,NSToPkgMappingList mappingList) {
if(mappingList==null)
return WSDLUtil.getPackageFromNamespace(currentnamespace);
else
{
Iterator<NSPkgMappingType> itr = mappingList.getPkgNsMap().iterator();
while(itr.hasNext())
{
NSPkgMappingType currentMappingType = itr.next();
String currentNamespaceInMappings = currentMappingType.getNamespace();
if(currentNamespaceInMappings.equals(currentnamespace))
return currentMappingType.getPackage();
}
}
return WSDLUtil.getPackageFromNamespace(currentnamespace);
}
/**This would delete each objectfactory class generated for the wsdl
* @param ctx
* @param packageForObjectFact
*/
private void deleteEachObjectFactoryClass(CodeGenContext ctx,
String packageForObjectFact) {
deleteClassFromGivenPackage(ctx, packageForObjectFact, "ObjectFactory.java");
}
/**This would delete each package-info.java generated for the wsdl
* @param ctx
* @param packageForObjectFact
*/
private void deleteEachPackageInfoClass(CodeGenContext ctx,
String packageForObjectFact) {
deleteClassFromGivenPackage(ctx, packageForObjectFact, "package-info.java");
}
/**
* This deletes the java source file for the class name specified in the given package.
* @param ctx
* @param packageForObjectFact
* @param className
*/
private void deleteClassFromGivenPackage(CodeGenContext ctx,
String packageForObjectFact, String className) {
String projectRoot = ctx.getProjectRoot()==null?ctx.getDestLocation():ctx.getProjectRoot();
String folderName = CodeGenUtil.getFolderPathFrompackageName(packageForObjectFact);
String fileName = CodeGenUtil.toOSFilePath(projectRoot) + CodeGenConstants.GEN_SRC_FOLDER + File.separatorChar +
"src" + File.separatorChar + folderName + className;
File fileToBeDeleted = new File(fileName);
s_logger.log(Level.INFO,"Class '"+className+"' is at " +fileName);
try {
CodeGenUtil.deleteFile(fileToBeDeleted );
s_logger.log(Level.INFO,"Deleted '"+className+"' under package "+ packageForObjectFact);
} catch (Exception exception) {
fileName = CodeGenUtil.toOSFilePath(ctx.getJavaSrcDestLocation(true)) +
"src" + File.separatorChar + folderName + className;
fileToBeDeleted = new File(fileName);
s_logger.log(Level.INFO,"Class '"+className+"' is at " +fileName);
try {
CodeGenUtil.deleteFile(fileToBeDeleted );
s_logger.log(Level.INFO,"Deleted "+className+" under package "+ packageForObjectFact);
} catch (Exception ex) {
s_logger.log(Level.INFO,"Could not delete "+className+" under the package "
+ packageForObjectFact
+ " due to " + ex.getMessage());
}
}
}
private String getWarningErorFromLog(File wsdl2javaLogFile) {
StringBuffer stringBuffer = new StringBuffer();
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(wsdl2javaLogFile));
String lineStr = null;
while((lineStr = br.readLine()) != null){
if( lineStr.startsWith("WARNING:") || lineStr.startsWith("SEVERE:"))
stringBuffer.append(lineStr).append("\n");
}
} catch (FileNotFoundException e) {
getLogger().log(Level.INFO, e.getMessage(), e);
} catch (IOException e) {
getLogger().log(Level.INFO, e.getMessage(), e);
} finally{
CodeGenUtil.closeQuietly(br);
}
return stringBuffer.toString();
}
private void removeFileHandlerForWSDL2JavaLog() {
LogManager.getGeneralLogger().removeHandler(m_fileHandlerForWSDL2Java);
}
private File getLogFileOfWSDL2JavaCall() {
File tempFile = null;
try {
tempFile = File.createTempFile("wsdl2java", ".log");
getLogger().log(Level.INFO,"Location of wsdl2java log file : " + tempFile.getPath());
m_fileHandlerForWSDL2Java = new FileHandler(tempFile.getPath());
m_fileHandlerForWSDL2Java.setFormatter(new java.util.logging.SimpleFormatter());
LogManager.getGeneralLogger().addHandler(m_fileHandlerForWSDL2Java);
} catch (IOException e) {
getLogger().log(Level.INFO, "Exception while trying to create a temporary file for storing wsdl2java log : \n " + e);
}
return tempFile;
}
private void deleteAdditionalJavaTypeFiles(CodeGenContext codeGenCtx, String destLocation) throws Exception {
getLogger().entering();
InputOptions inputOptions = codeGenCtx.getInputOptions();
String serviceName = inputOptions.getServiceAdminName();
SOATypeRegistry typeRegistry = SOAGlobalRegistryFactory.getSOATypeRegistryInstance();
Set<String> dependentLibraries = getAllDependentLibraryNames(codeGenCtx,serviceName);
if(dependentLibraries.size() == 0) {
getLogger().log(Level.SEVERE,
"No Dependent libraries found, duplicate types might be generated! (Check your META-INF/"
+ serviceName + "/TypeDependencies.xml)");
return;
}
getLogger().log(Level.INFO, "Dependent libraries are : " + detail(dependentLibraries));
// for(String libraryName : dependentLibraries){
// try{
// typeRegistry.addTypeLibraryToRegistry(libraryName);
// }catch(Exception e){
// getLogger().log(Level.WARNING, "Exception while trying to populate the registry for library : "+ libraryName +"\n" +
// "Exception is : " + e.getMessage());
// }
// }
/*
* Instead of populating registry library by library, populate at one go for entire list of libraries.
* What difference it makes is, TypeInformation.xml is parsed for all libraries first and
* then TypeDependecies.xml is parsed for all libraries.
*/
List<String> dependentLibrariesList = new ArrayList<String>(dependentLibraries);
try {
typeRegistry.populateRegistryWithTypeLibraries(dependentLibrariesList);
} catch (Exception e) {
getLogger().log(Level.WARNING, "Exception while trying to populate the registry for dependent libaries : " +
"Exception is : " + e.getMessage(), e);
}
// identify the possible java types to be deleted.
// Map of <fully qualified java type name> to <type library name>
Map<String,String> javaTypesToDelete = new HashMap<String,String>();
for(TypeLibraryType typeLibraryType : typeRegistry.getAllTypeLibraries()) {
for(TypeInformationType typeInformationType : typeLibraryType.getType()){
javaTypesToDelete.put(typeInformationType.getJavaTypeName(), typeLibraryType.getLibraryName());
}
}
if(getLogger().isInfoEnabled()) {
StringBuilder d = new StringBuilder();
d.append("Dependendant Library Java Types (to be deleted): ");
d.append("(count: ").append(javaTypesToDelete.size()).append(")");
int maxTypeLength = 0;
for(String typeclassname: javaTypesToDelete.keySet()) {
int len = typeclassname.length();
if(len > maxTypeLength) {
maxTypeLength = len;
}
}
int idx=0;
for(Map.Entry<String,String> entry : javaTypesToDelete.entrySet()) {
d.append(String.format("%n %3d) %-" + maxTypeLength + "s - [%s]", idx++, entry.getKey(),
entry.getValue()));
}
getLogger().log(Level.INFO, d.toString());
}
String osDestDir = CodeGenUtil.toOSFilePath(destLocation);
Set<String> searchPaths = new LinkedHashSet<String>();
searchPaths.add(osDestDir); // Standard Mode
searchPaths.add(CodeGenUtil.toOSFilePath(codeGenCtx.getJavaSrcDestLocation())); // Standard Mode
searchPaths.add(CodeGenUtil.toOSFilePath(osDestDir + "src")); // Legacy Mode
String projectRoot = CodeGenUtil.toOSFilePath(inputOptions.getProjectRoot());
if(!CodeGenUtil.isEmptyString(projectRoot)) {
searchPaths.add(CodeGenUtil.toOSFilePath(projectRoot + "src")); // Legacy Mode
searchPaths.add(CodeGenUtil.toOSFilePath(projectRoot + "gen-src")); // Legacy Mode
}
getLogger().log(Level.INFO, "Search Paths: " + detail(searchPaths));
for(Map.Entry<String,String> entry : javaTypesToDelete.entrySet()) {
String className = entry.getKey();
for(String searchPath: searchPaths) {
File javaFile = new File(CodeGenUtil.toJavaSrcFilePath(searchPath,className));
getLogger().log(Level.FINE, "Java Type Path : " + javaFile);
if(javaFile.exists()) {
if(javaFile.delete()) {
getLogger().log(Level.INFO, String.format("Deleted Generated Type [%s] (declared in dependent lib [%s]): %s",
className, entry.getValue(), javaFile));
} else {
getLogger().log(Level.WARNING, String.format("Unable to Delete Generated Type [%s] (declared in dependent lib [%s]): %s",
className, entry.getValue(), javaFile));
}
}
}
}
getLogger().exiting();
}
private String detail(Collection<String> coll) {
if(coll == null) {
return "<null>";
}
StringBuilder d = new StringBuilder();
d.append(coll.getClass().getSimpleName()).append(" of size [");
d.append(coll.size()).append("]");
int idx=0;
for(String s: coll) {
d.append(String.format("%n %3d) %s", idx++, s));
}
return d.toString();
}
private Set<String> getAllDependentLibraryNames(CodeGenContext context,
String libraryName) throws Exception {
TypeLibraryParser parser = TypeLibraryParser.getInstance();
try {
TypeLibraryInputOptions typelibInputOptions = new TypeLibraryInputOptions();
typelibInputOptions.setProjectRoot(context.getProjectRoot());
typelibInputOptions.setMetaSrcLocation(context.getInputOptions().getMetaSrcLocation());
TypeLibraryCodeGenContext tempTypeLibContext = new TypeLibraryCodeGenContext(typelibInputOptions, null);
parser.processTypeDepXMLFileForGen(tempTypeLibContext, libraryName);
// for (String libName : parser.getReferredTypeLibraries()) {
// parser.processTypeDepXMLFile(libName);
// }
/*
* Instead of parsing just second level, parse till nth level deep.
*/
Set<String> orgReferedTypeLibraries = new HashSet<String>( parser.getReferredTypeLibraries() );
doRecursiveSearchForReferredLibs(parser, orgReferedTypeLibraries);
} catch (Exception e) {
getLogger().log(Level.SEVERE, e.getMessage(), e);
}
return parser.getReferredTypeLibraries();
}
/**
* This method parses all the TypeDependcies.xml in the tree and finds out all the libraries referred till nth level.
* @param parser
* @param typeLibrariesToBeParsed
* @throws Exception
*/
private void doRecursiveSearchForReferredLibs(TypeLibraryParser parser, Set<String> typeLibrariesToBeParsed) throws Exception{
Set<String> orgReferedTypeLibraries = new HashSet<String>( parser.getReferredTypeLibraries() );
Set<String> currentReferedTypeLibraries = processTypeDepXMLForAllLibaries(parser, typeLibrariesToBeParsed);
if(currentReferedTypeLibraries.size() != orgReferedTypeLibraries.size() ){
Set<String> deeplyReferedTypeLibraries = getDeeplyAddedLibraries( orgReferedTypeLibraries, currentReferedTypeLibraries );
doRecursiveSearchForReferredLibs(parser, deeplyReferedTypeLibraries);
}
}
/**
* This method compares two sets and finds out the extra ones added in the second set.
* @param orgReferedTypeLibraries
* @param curReferedTypeLibraries
* @return
*/
private Set<String> getDeeplyAddedLibraries(Set<String> orgReferedTypeLibraries, Set<String> curReferedTypeLibraries){
Set<String> deeplyReferedTypeLibraries = new HashSet<String>();
for(String library : curReferedTypeLibraries){
if( !(orgReferedTypeLibraries.contains(library)) ){
deeplyReferedTypeLibraries.add(library);
}
}
return deeplyReferedTypeLibraries;
}
/**
* This method parses the TypeDependcies.xml for the given set of libraries
* @param parser
* @param referedTypeLibraries
* @return
* @throws Exception
*/
private Set<String> processTypeDepXMLForAllLibaries(TypeLibraryParser parser, Set<String> referedTypeLibraries) throws Exception{
Iterator it = referedTypeLibraries.iterator();
while (it.hasNext()) {
String libName = (String) it.next();
parser.processTypeDepXMLFile(libName);
}
return new HashSet<String>( parser.getReferredTypeLibraries() );
}
public String wsdl2JavaGenSrcLoc(String srcLocPrefix) {
return CodeGenUtil.toOSFilePath(srcLocPrefix) + "src";
}
private String getWSDLFileName(String svcName) {
return svcName + ".wsdl";
}
private String[] getJava2WSDLToolArgs(
CodeGenContext codeGenCtx,
String qualifiedIntfName,
String destLocation) {
List<String> argsList = new ArrayList<String>();
InputOptions inputOptions = codeGenCtx.getInputOptions();
PkgToNSMappingList pkgNsMapList = getPkgToNSMapList(inputOptions);
List<String> pkgNSMapList = WSDLUtil.buildPkgNSMapList(pkgNsMapList, JAVA_2_WSDL_PKG_TO_NS_PATTERN);
argsList.add("-o"); //output location
argsList.add(destLocation);
argsList.add("-tn"); // target namespace
argsList.add(codeGenCtx.getNamespace());
argsList.add("-tp"); // target namespace prefix
argsList.add("svc");
argsList.add("-stn"); // schema target namespace
argsList.add(codeGenCtx.getNamespace());
argsList.add("-sn"); // service name
argsList.add(codeGenCtx.getServiceAdminName());
argsList.add("-of"); // output file name
argsList.add(getWSDLFileName(codeGenCtx.getServiceAdminName()));
argsList.add("-efd"); // element form default
argsList.add("qualified");
argsList.add("-afd"); // attribute form default
argsList.add("unqualified");
argsList.add("-st"); // style of binding for the WSDL
argsList.add("document");
argsList.add("-u"); // Binding use for the WSDL
argsList.add("literal");
argsList.add("-l"); // location URL
if (CodeGenUtil.isEmptyString( inputOptions.getServiceLocation())) {
argsList.add(CodeGenConstants.DEFAULT_SERVICE_URL + codeGenCtx.getServiceAdminName());
} else {
argsList.add(inputOptions.getServiceLocation());
}
argsList.add("-cn"); // Class name
argsList.add(qualifiedIntfName);
if (codeGenCtx.isBinLocAddedToClasspath() == true) {
argsList.add("-cp"); // Classpath Entries
argsList.add(codeGenCtx.getBinLocation());
}
if (!pkgNSMapList.isEmpty()) {
for (String pkgNsMapEntry : pkgNSMapList) {
argsList.add("-p2n");
argsList.add(pkgNsMapEntry);
}
}
String[] args = argsList.toArray(new String[0]);
return args;
}
private String[] getWSDL2JavaToolArgs(
CodeGenContext codeGenCtx,
String destLocation)
throws CodeGenFailedException{
InputOptions inputOptions = codeGenCtx.getInputOptions();
String wsdlFileLoc = inputOptions.getInputFile();
List<String> argsList = new ArrayList<String>();
argsList.add("-o"); // all generated files location (paretn dir)
argsList.add(destLocation);
argsList.add("-s"); // sync style
argsList.add("-l"); // language
argsList.add("java");
argsList.add("-d"); // data binding
argsList.add("jaxbri");
argsList.add("-ss"); // server side
argsList.add("-ssi"); // Service skelton interface
argsList.add("-noWSDL");
argsList.add("-noBuildXML");
argsList.add("-noMessageReceiver");
String interfacePkgName = inputOptions.getGenInterfacePackage();
if (CodeGenUtil.isEmptyString(interfacePkgName)) {
Map<String, String> ns2PkgMap = WSDLUtil.getNS2PkgMappings(inputOptions);
try {
String className = WSDLUtil.getInterfaceName(wsdlFileLoc, null, ns2PkgMap,codeGenCtx);
interfacePkgName = CodeGenUtil.getPackageName(className);
inputOptions.setGenInterfacePackage(interfacePkgName);
} catch (PreProcessFailedException ex) {
throw new CodeGenFailedException(
"Failed to derive interface package name. ", ex);
}
}
argsList.add("-p"); // package name for interface
argsList.add(interfacePkgName);
String interfaceClassName = inputOptions.getGenInterfaceName();
if(CodeGenUtil.isEmptyString(interfaceClassName)){
Map<String, String> ns2PkgMap = WSDLUtil.getNS2PkgMappings(inputOptions);
try {
String className = WSDLUtil.getInterfaceName(wsdlFileLoc, interfacePkgName, ns2PkgMap,codeGenCtx);
int indexOfLastDot = className.lastIndexOf(".");
interfaceClassName = className.substring(indexOfLastDot+1);
inputOptions.setGenInterfaceName(interfaceClassName);
} catch (PreProcessFailedException ex) {
throw new CodeGenFailedException(
"Failed to derive interface class name. ", ex);
}
}
argsList.add("-sin"); //name for the generated interface
argsList.add(interfaceClassName);
//argsList.add("-ep");//exclude package, deletes the packages mentioned thru this option.
//argsList.add("org.ebayopensource.turmeric.runtime.types");
String derivedNS2PkgStr = getNS2PkgMappings(inputOptions);
if(!CodeGenUtil.isEmptyString(derivedNS2PkgStr)) {
argsList.add("-ns2p");
argsList.add(derivedNS2PkgStr);
}
for(String bindingFileName : inputOptions.getBindingFileNames()){
if(!CodeGenUtil.isEmptyString(bindingFileName)){
argsList.add("-EbindingFileName");
argsList.add(bindingFileName);
}
}
String proxyHost = codeGenCtx.getInputOptions().getHttpProxyHost();
String proxyPort = codeGenCtx.getInputOptions().getHttpProxyPort();
if( !CodeGenUtil.isEmptyString(proxyHost) && !CodeGenUtil.isEmptyString(proxyPort)){
argsList.add("-http-proxy-host");
argsList.add(proxyHost);
argsList.add("-http-proxy-port");
argsList.add(proxyPort);
}
argsList.add("-ebc");
argsList.add("org.ebayopensource.turmeric.runtime.common.exceptions.ServiceException");
argsList.add("-uri"); // wsdl file uri
argsList.add(wsdlFileLoc);
String[] args = argsList.toArray(new String[0]);
return args;
}
private String getNS2PkgMappings(InputOptions inputOptions){
String derivedNS2PkgStr="";
Map<String,String> ns2PkgMap = WSDLUtil.getNS2PkgMappings(inputOptions);
for(Map.Entry<String, String> keyValuePair : ns2PkgMap.entrySet()){
derivedNS2PkgStr += keyValuePair.getKey() + "=" + keyValuePair.getValue() + ",";
}
if(derivedNS2PkgStr.endsWith(","))
derivedNS2PkgStr = derivedNS2PkgStr.substring(0, derivedNS2PkgStr.length() - 1 );
return derivedNS2PkgStr;
}
private PkgToNSMappingList getPkgToNSMapList(InputOptions inputOptions) {
return inputOptions.getPkgNSMappings();
}
private void prettyFormatWSDL(String wsdlFilePath) {
File wsdlFile = new File(wsdlFilePath);
if (wsdlFile.exists()) {
WSDLPrettyFormatter wsdlPrettyFormatter = new WSDLPrettyFormatter();
wsdlPrettyFormatter.prettyFormat(wsdlFile);
}
}
private String getOpNameToCemcMapString(OpNameToCemcMappingList opNameToCemcMappings) {
if (opNameToCemcMappings == null ||
opNameToCemcMappings.getOpNameCemcMap().size() == 0) {
return null;
}
else {
StringBuilder strBuilder = new StringBuilder();
for (OpNameCemcMappingType opNameCemcMapEntry : opNameToCemcMappings.getOpNameCemcMap()) {
strBuilder.append(opNameCemcMapEntry.getOperationName())
.append("=")
.append(opNameCemcMapEntry.getCustomErrMsgClass())
.append(",");
}
strBuilder.setLength(strBuilder.length()-1);
return strBuilder.toString();
}
}
}