/*******************************************************************************
* 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;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.regex.Pattern;
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
import junit.framework.Assert;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.custommonkey.xmlunit.DetailedDiff;
import org.custommonkey.xmlunit.Diff;
import org.custommonkey.xmlunit.Difference;
import org.custommonkey.xmlunit.ElementNameAndAttributeQualifier;
import org.custommonkey.xmlunit.XMLUnit;
import org.ebayopensource.turmeric.junit.utils.MavenTestingUtils;
import org.ebayopensource.turmeric.tools.AbstractCodegenTestCase;
import org.ebayopensource.turmeric.tools.TestResourceUtil;
import org.xml.sax.SAXException;
public abstract class AbstractServiceGeneratorTestCase extends AbstractCodegenTestCase {
/**
* Convenience method for {@link CodegenTestUtils#assertGeneratedContent(File, File, String, String, String)}
*
* @param generatedPath
* @param snippetId
* @param svcNameFromWSDL
* @param serviceNameFromCodegen
* @param operationName
* @throws IOException
*/
public void assertGeneratedContainsSnippet(String generatedPath,
String snippetId, String svcNameFromWSDL,
String serviceNameFromCodegen, String operationName)
throws IOException {
File generatedFile = getTestDestPath(generatedPath);
assertGeneratedContainsSnippet(generatedFile, snippetId, svcNameFromWSDL, serviceNameFromCodegen, operationName);
}
public void assertFileExists(String path){
File file = new File(path);
Assert.assertTrue(file.getAbsolutePath() + " dest not exist,check the path",file.exists());
}
protected void setURLsInClassLoader(URL [] urls){
URLClassLoader loader = new URLClassLoader(urls,Thread.currentThread().getContextClassLoader());
Thread.currentThread().setContextClassLoader(loader);
}
protected Class<?> loadClass(String fullyQualifiedName) throws ClassNotFoundException{
Class<?> cls = Thread.currentThread().getContextClassLoader().loadClass(fullyQualifiedName);
return cls;
}
/**
* Convenience method for {@link CodegenTestUtils#assertGeneratedContent(File, File, String, String, String)}
*
* @param generatedPath
* @param snippetId
* @param svcNameFromWSDL
* @param serviceNameFromCodegen
* @param operationName
* @throws IOException
*/
public void assertGeneratedContainsSnippet(File generatedFile,
String snippetId, String svcNameFromWSDL,
String serviceNameFromCodegen, String operationName)
throws IOException {
File targetArtifactFile = TestResourceUtil
.getResource("org/ebayopensource/turmeric/test/tools/codegen/data/"
+ snippetId);
CodegenTestUtils.assertGeneratedContent(generatedFile,
targetArtifactFile, svcNameFromWSDL, serviceNameFromCodegen,
operationName);
}
@SuppressWarnings("unused")
private void dumpClassLoaders() {
System.out.println("Current Thread - Context ClassLoader");
ClassLoader cl = Thread.currentThread().getContextClassLoader();
dumpClassLoader(" ", cl);
System.out.printf("%s - .getClass().getClassLoader()%n", this.getClass().getName());
cl = this.getClass().getClassLoader();
dumpClassLoader(" ", cl);
}
public static String readFileAsString(String filePath)
throws java.io.IOException {
StringBuffer fileData = new StringBuffer(1000);
BufferedReader reader = new BufferedReader(new FileReader(filePath));
char[] buf = new char[1024];
int numRead = 0;
while ((numRead = reader.read(buf)) != -1) {
String readData = String.valueOf(buf, 0, numRead);
fileData.append(readData);
buf = new char[1024];
}
reader.close();
return fileData.toString();
}
private void dumpClassLoader(String indent, ClassLoader cl) {
if(cl == null) {
return;
}
System.out.printf("%sClassLoader: %s: %s%n", indent, cl.getClass().getName(), cl.toString());
if(cl instanceof URLClassLoader) {
URLClassLoader ucl = (URLClassLoader) cl;
System.out.printf("%s(URLClassLoader)%n", indent);
URL urls[] = ucl.getURLs();
for(URL url: urls) {
System.out.printf("%s* %s%n", indent, url);
}
}
ClassLoader parent = cl.getParent();
dumpClassLoader(indent + " ", parent);
}
public File getCodegenDataFileInput(String name) {
return TestResourceUtil.getResource("org/ebayopensource/turmeric/test/tools/codegen/data/"
+ name);
}
public File getCodegenQEDataFileInput(String name) {
return TestResourceUtil.getResource("org/ebayopensource/turmeric/test/tools/codegen/qe/data/"
+ name);
}
public File getProtobufRelatedInput(String name) {
return TestResourceUtil.getResource("org/ebayopensource/turmeric/test/tools/codegen/data/protobuf/"
+ name);
}
protected File getTestDestDir() {
return testingdir.getFile("tmp");
}
protected File getTestDestPath(String path) {
String syspath = FilenameUtils.separatorsToSystem(path);
return new File(getTestDestDir(), syspath);
}
protected File getTestSrcDir() {
return MavenTestingUtils.getProjectDir("src/test/java");
}
protected File getTestResrcDir() {
return MavenTestingUtils.getProjectDir("src/test/resources");
}
protected File createPropertyFile(String dir,String propertyFileName) throws IOException{
File testDir = new File(dir);
if(!(testDir.exists())){
testDir.mkdirs();
}
File intfProps = new File(dir+File.separator+propertyFileName);
if(!intfProps.exists()){
intfProps.createNewFile();
}
return intfProps;
}
protected void compileJavaFile(String file) {
JavaCompiler compiler = (JavaCompiler) ToolProvider
.getSystemJavaCompiler();
compiler.run(null, null, null, file);
}
protected void createInterfacePropsFile(Properties pro,String path) throws Exception{
File file = new File(path +File.separator +"service_intf_project.properties");
FileOutputStream out =null;
File destDir = new File(path);
try{
if(!destDir.exists())
destDir.mkdir();
if(!file.exists())
file.createNewFile();
out = new FileOutputStream(file);
pro.store(out,null);
}catch(Exception e){
e.printStackTrace();
}finally{
out.close();
}
}
protected void fillProperties(Properties properties,File propertyFile ) throws Exception{
FileOutputStream fos = null;
if(propertyFile.exists()){
try{
fos = new FileOutputStream(propertyFile);
properties.store(fos, "properties added");
}catch(Exception e){
throw e;
}finally{
fos.close();
}
}
}
protected boolean compareTwoFiles(String file1,String file2) throws IOException{
return compareTwoFiles( new File(file1),new File(file2));
}
protected boolean compareTwoFiles(File file1, File file2) throws IOException {
@SuppressWarnings("unchecked")
List<String> firstFile = FileUtils.readLines(file1);
ArrayList<String> trimmedList1 = new ArrayList<String>();
ArrayList<String> trimmedList2 = new ArrayList<String>();
@SuppressWarnings("unchecked")
List<String> secondFile = FileUtils.readLines(file2);
while (firstFile.remove(""))
;
while (secondFile.remove(""))
;
for (String s : firstFile) {
trimmedList1.add(s.trim());
}
for (String s : secondFile) {
trimmedList2.add(s.trim());
}
if (trimmedList2.containsAll(trimmedList1)){
for(String ln:trimmedList1){
System.out.println(ln);
}
for(String ln1:trimmedList2){
System.out.println(ln1);
}
return true;
}
else {
for(String ln:trimmedList1){
System.out.println(ln);
}
for(String ln1:trimmedList2){
System.out.println(ln1);
}
Iterator<String> i = trimmedList2.iterator();
while(i.hasNext()){
String line = i.next();
if(!trimmedList1.contains(line)){
Assert.assertTrue(line + " is not found in " +file1.getAbsolutePath(),false);
}
}
}
return false;
}
protected boolean compareFiles(File file1, File file2) throws IOException {
@SuppressWarnings("unchecked")
List<String> firstFile = FileUtils.readLines(file1);
ArrayList<String> trimmedList1 = new ArrayList<String>();
ArrayList<String> trimmedList2 = new ArrayList<String>();
@SuppressWarnings("unchecked")
List<String> secondFile = FileUtils.readLines(file2);
while (firstFile.remove(""))
;
while (secondFile.remove(""))
;
for (String s : firstFile) {
trimmedList1.add(s.trim());
}
for (String s : secondFile) {
trimmedList2.add(s.trim());
}
ArrayList<String> commentRemoved1 = new ArrayList<String>();
ArrayList<String> commentRemoved2 = new ArrayList<String>();
commentRemoved1.addAll(trimmedList1);
Iterator<String> it = trimmedList1.iterator();
String s = null;
while (it.hasNext()) {
s = it.next();
if (Pattern.matches(CommentDetector.COMMENT_DETECTOR_REGEX, s))
commentRemoved1.remove(s);
}
commentRemoved2.addAll(trimmedList2);
it = trimmedList2.iterator();
while (it.hasNext()) {
s = it.next();
if (Pattern.matches(CommentDetector.COMMENT_DETECTOR_REGEX, s))
commentRemoved2.remove(s);
}
if (commentRemoved1.size() == commentRemoved2.size()) {
if (commentRemoved1.containsAll(commentRemoved2))
return true;
else
{
Iterator<String> i = trimmedList2.iterator();
while(i.hasNext()){
String line = i.next();
if(!trimmedList1.contains(line)){
Assert.assertTrue(line + " is not found in " +file1.getAbsolutePath(),false);
}
}
}
} else
return false;
return false;
}
protected boolean createTypeLibrary(String projectRoot,String libraryName,String namespace) {
boolean flag = false;
String[] pluginParameter = { "-gentype",
"genTypeCreateTypeLibrary",
"-pr",
projectRoot,
"-libname",
libraryName,
"-libVersion",
"1.0.0",
"-libNamespace",
namespace };
try {
NonInteractiveCodeGen gen = new NonInteractiveCodeGen();
gen.execute(pluginParameter);
flag = true;
} catch (Exception e) {
e.printStackTrace();
flag = false;
}
return flag;
}
protected void createType(String projectRoot,String libraryName,String xsdName) {
String[] pluginParameter = { "-gentype",
"genTypeAddType",
"-pr",
projectRoot,
"-libname",
libraryName,
"-type",
xsdName };
try {
NonInteractiveCodeGen gen = new NonInteractiveCodeGen();
gen.execute(pluginParameter);
}catch (Exception e){
e.printStackTrace();
}
}
protected void codegenAssertFileNotExists(String destDir,String path){
File file = new File(destDir+File.separator+path);
Assert.assertTrue("file " + path+ "does not exist in directory" + destDir, !file.exists());
}
protected void assertXML(String expectedPath,String actualPath,String [] attNames) {
XMLUnit.setIgnoreComments(true);
XMLUnit.setIgnoreWhitespace(true);
try {
Diff d = new Diff(readFileAsString(expectedPath),readFileAsString(actualPath));
if(attNames == null ){
d.overrideElementQualifier(new ElementNameAndAttributeQualifier());
} else
d.overrideElementQualifier(new ElementNameAndAttributeQualifier(attNames));
DetailedDiff dd = new DetailedDiff(d);
List l = dd.getAllDifferences();
for (Iterator i = l.iterator(); i.hasNext(); ) {
Difference di = (Difference) i.next();
System.err.println(di);
}
Assert.assertTrue(d.similar());
} catch (SAXException e) {
Assert.fail("XML assert failed because of" + e.getMessage() + " and cause " + e.getCause());
} catch (IOException e) {
Assert.fail("XML assert failed because of" + e.getMessage() + " and cause " + e.getCause());
}
}
}