/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.test.client.ctc;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import org.jdom.Attribute;
import org.jdom.CDATA;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.output.XMLOutputter;
import org.junit.Assert;
import org.teiid.core.util.FileUtils;
import org.teiid.core.util.StringUtil;
import org.teiid.internal.core.xml.JdomHelper;
import org.teiid.test.client.ResultsGenerator;
import org.teiid.test.client.TestProperties;
import org.teiid.test.framework.exception.QueryTestFailedException;
import org.teiid.test.util.TestResultSetUtil;
public class XMLGenerateResults implements ResultsGenerator {
private static final SimpleDateFormat FILE_NAME_DATE_FORMATER = new SimpleDateFormat(
"yyyyMMdd_HHmmss"); //$NON-NLS-1$
private static final int MAX_COL_WIDTH = 65;
private String outputDir = "";
private String generateDir = "";
public XMLGenerateResults( String testname, Properties props) {
outputDir = props.getProperty(TestProperties.PROP_OUTPUT_DIR, ".");
Assert.assertNotNull("Property " + TestProperties.PROP_OUTPUT_DIR
+ " was not specified", outputDir);
outputDir = outputDir + "/" + testname;
File d = new File(this.outputDir);
this.outputDir = d.getAbsolutePath();
d = new File(this.outputDir);
if (d.exists()) {
FileUtils.removeDirectoryAndChildren(d);
}
if (!d.exists()) {
d.mkdirs();
}
generateDir = props.getProperty(PROP_GENERATE_DIR, ".");
Assert.assertNotNull("Property " + PROP_GENERATE_DIR
+ " was not specified", this.generateDir);
d = new File(generateDir, testname);
generateDir = d.getAbsolutePath();
d = new File(generateDir);
if (d.exists()) {
FileUtils.removeDirectoryAndChildren(d);
}
if (!d.exists()) {
d.mkdirs();
}
}
@Override
public String getGenerateDir() {
// TODO Auto-generated method stub
return this.generateDir;
}
@Override
public String getOutputDir() {
// TODO Auto-generated method stub
return outputDir;
}
/**
* Generate query results. These are actual results from the server and may
* be used for comparing to results from a later test run.
*
* @param queryID
* @param resultsFile
* @param result
* @param ex
* @throws QueryTestFailedException
*/
public void generateQueryResultFile(String querySetID, String queryID,
String query, ResultSet result, Throwable ex, int testStatus)
throws QueryTestFailedException {
try {
if (result != null ) result.isClosed();
} catch (SQLException e1) {
e1.printStackTrace();
}
File resultsFile = createNewResultsFile(queryID, querySetID,
getGenerateDir());
OutputStream outputStream;
try {
FileOutputStream fos = new FileOutputStream(resultsFile);
outputStream = new BufferedOutputStream(fos);
} catch (IOException e) {
throw new QueryTestFailedException(
"Failed to open new results file: " + resultsFile.getPath() + ": " + e.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
}
try {
XMLQueryVisitationStrategy jstrat = new XMLQueryVisitationStrategy();
// Create root JDOM element
Element rootElement = new Element(TagNames.Elements.ROOT_ELEMENT);
// Create Query element
Element queryElement = new Element(TagNames.Elements.QUERY);
queryElement.addContent(new CDATA(query));
rootElement.addContent(queryElement);
// create a result attribute for the queryID
Attribute resultsIDAttribute = new Attribute(
TagNames.Attributes.NAME, queryID);
if (result != null) {
// produce a JDOM element from the results object
Element resultsElement = jstrat.produceResults(result);
// set the resultsIDAttribute on the results element
resultsElement.setAttribute(resultsIDAttribute);
// add the results elements to the root element
rootElement.addContent(resultsElement);
// debug:
// System.out.println("\n Result: " + printResultSet(result));
} else {
// create a JDOM element from the exception object with the
// results tag
Element exceptionElement = new Element(
TagNames.Elements.QUERY_RESULTS);
// produce xml for the actualException and this to the
// exceptionElement
if (ex != null) {
exceptionElement.addContent(jstrat.produceMsg(ex, null));
}
// set the resultsIDAttribute on the exception element
exceptionElement.setAttribute(resultsIDAttribute);
// add the results elements to the root element
rootElement.addContent(exceptionElement);
}
// Output xml
XMLOutputter outputter = new XMLOutputter(JdomHelper.getFormat(
" ", true)); //$NON-NLS-1$
outputter.output(new Document(rootElement), outputStream);
} catch (SQLException e) {
throw new QueryTestFailedException(
"Failed to convert results to JDOM: " + e.getMessage()); //$NON-NLS-1$
} catch (JDOMException e) {
throw new QueryTestFailedException(
"Failed to convert results to JDOM: " + e.getMessage()); //$NON-NLS-1$
} catch (IOException e) {
throw new QueryTestFailedException(
"Failed to output new results to " + resultsFile.getPath() + ": " + e.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
} catch (Throwable e) {
throw new QueryTestFailedException(
"Failed to convert results to JDOM: " + StringUtil.getStackTrace(e)); //$NON-NLS-1$
} finally {
try {
outputStream.close();
} catch (IOException e) {
}
}
}
// Begin New from Impl
public String generateErrorFile_keep(final String querySetID,
final String queryID, final String sql, final ResultSet resultSet,
final Throwable queryError, final Object results)
throws QueryTestFailedException {
String errorFileName = null;
try {
// write actual results to error file
errorFileName = generateErrorFileName(queryID, querySetID);
// configID, queryID, Integer.toString(clientID));
// CombinedTestClient.log("\t" + this.clientID + ": Writing error file with actual results: " + errorFileName); //$NON-NLS-1$ //$NON-NLS-2$
File errorFile = new File(getOutputDir(), errorFileName);
// the resultset will be passed in as null when
// the error was due to a thrown exception, and not based comparison issues
if (resultSet == null) {
FileOutputStream actualOut = null;
try {
actualOut = new FileOutputStream(errorFile);
PrintStream filePrintStream = new PrintStream(actualOut);
TestResultSetUtil.printThrowable(queryError, sql, filePrintStream);
filePrintStream.flush();
} catch (Exception e) {
e.printStackTrace();
throw new QueryTestFailedException(e);
} finally {
if (actualOut != null) {
try {
actualOut.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return errorFileName;
}
// rewind resultset
resultSet.beforeFirst();
generateErrorResults(querySetID, queryID, sql, errorFile,
resultSet, (File) results);
} catch (Throwable e) {
throw new QueryTestFailedException(e.getMessage());
// CombinedTestClient.logError("Error writing error file \"" + outputDir + "\"/" + errorFileName + ": " + e); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
return errorFileName;
}
/**
* Generate an error file for a query that failed comparison. File should
* have the SQL, the actual results returned from the server and the results
* that were expected.
*
* @param queryID
* @param sql
* @param resultsFile
* @param actualResult
* @param expectedResultFile
* @param ex
* @throws QueryTestFailedException
*/
private void generateErrorResults(String querySetID, String queryID,
String sql, File resultsFile, ResultSet actualResult,
File results)
throws QueryTestFailedException {
FileOutputStream actualOut = null;
try {
actualOut = new FileOutputStream(resultsFile);
PrintStream filePrintStream = new PrintStream(actualOut);
TestResultSetUtil.printResultSet(actualResult, sql, MAX_COL_WIDTH, true, filePrintStream);
} catch (Exception e) {
e.printStackTrace();
throw new QueryTestFailedException(e);
} finally {
if (actualOut != null) {
try {
actualOut.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
// End of copy from impl
public String generateErrorFile(final String querySetID,
final String queryID, final String sql, final ResultSet resultSet,
final Throwable queryError, final Object expectedResultsFile)
throws QueryTestFailedException {
String errorFileName = null;
try {
// write actual results to error file
errorFileName = generateErrorFileName(queryID, querySetID);
// configID, queryID, Integer.toString(clientID));
// CombinedTestClient.log("\t" + this.clientID + ": Writing error file with actual results: " + errorFileName); //$NON-NLS-1$ //$NON-NLS-2$
File errorFile = new File(getOutputDir(), errorFileName);
// rewind resultset
if (resultSet != null) {
resultSet.beforeFirst();
}
generateErrorResults(querySetID, queryID, sql, errorFile,
resultSet, (File) expectedResultsFile, queryError);
} catch (Throwable e) {
throw new QueryTestFailedException(e.getMessage());
// CombinedTestClient.logError("Error writing error file \"" + outputDir + "\"/" + errorFileName + ": " + e); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
return errorFileName;
}
private File createNewResultsFile(String queryID, String querySetID,
String genDir) {
String resultFileName = queryID + ".xml"; //$NON-NLS-1$
String targetDirname = genDir + File.separator + querySetID; //$NON-NLS-1$
File targetDir = new File(targetDirname);
targetDir.mkdirs();
return new File(targetDir, resultFileName);
}
//
// private String generateErrorFileName(String queryID,
// String querySetID,
// String outputdir) {
//
// File resultsFile = createNewResultsFile(queryID, querySetID,
// this.outputDir);
//
// // String queryFileName = queryFile.getName();
// String name =
// FileUtils.getFilenameWithoutExtension(resultsFile.getName());
// String errorFileName = "ERROR_"
// + name + "_" //$NON-NLS-1$
// + FILE_NAME_DATE_FORMATER.format(new Date(System.currentTimeMillis())) + ".xml"; //$NON-NLS-1$
// return errorFileName;
//
// }
private String generateErrorFileName(String queryID, String querySetID) {
// String errorFileName = "ERROR_"
// configID + "_" //$NON-NLS-1$ //$NON-NLS-2$
// + querySetID + "_" //$NON-NLS-1$
// String errorFileName = queryID +
// + "_" //$NON-NLS-1$
// + FILE_NAME_DATE_FORMATER.format(new Date(System
// .currentTimeMillis())) + ".xml"; //$NON-NLS-1$
// return errorFileName;
return queryID + ".err";
}
/**
* Generate an error file for a query that failed comparison. File should
* have the SQL, the actual results returned from the server and the results
* that were expected.
*
* @param queryID
* @param sql
* @param resultsFile
* @param actualResult
* @param expectedResultFile
* @param ex
* @throws QueryTestFailedException
*/
private void generateErrorResults(String querySetID, String queryID,
String sql, File resultsFile, ResultSet actualResult,
File expectedResultFile, Throwable ex)
throws QueryTestFailedException {
OutputStream outputStream;
try {
FileOutputStream fos = new FileOutputStream(resultsFile);
outputStream = new BufferedOutputStream(fos);
} catch (IOException e) {
throw new QueryTestFailedException(
"Failed to open error results file: " + resultsFile.getPath() + ": " + e.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
}
try {
XMLQueryVisitationStrategy jstrat = new XMLQueryVisitationStrategy();
// Create root JDOM element
Element rootElement = new Element(TagNames.Elements.ROOT_ELEMENT);
// create a JDOM element for the results
Element resultElement = new Element(TagNames.Elements.QUERY_RESULTS);
// set the queryIDAttr on the exception element
resultElement.setAttribute(new Attribute(TagNames.Attributes.NAME,
queryID));
// set the querySQLAttr on the exception element
resultElement.setAttribute(new Attribute(TagNames.Attributes.VALUE,
sql));
// ---------------------
// Actual Exception
// ---------------------
// create a JDOM element from the actual exception object
// produce xml for the actualException and this to the
// exceptionElement
if (ex != null) {
Element actualExceptionElement = new Element(
TagNames.Elements.ACTUAL_EXCEPTION);
actualExceptionElement = XMLQueryVisitationStrategy
.jdomException(ex, actualExceptionElement);
resultElement.addContent(actualExceptionElement);
}
if (actualResult != null) {
// ------------------------------
// Got a ResultSet from server
// error was in comparing results
// ------------------------------
// --------------------------
// Actual Result - ResultSet
// --------------------------
// produce a JDOM element from the actual results object
Element actualResultsElement = new Element(
TagNames.Elements.ACTUAL_QUERY_RESULTS);
actualResultsElement = jstrat.produceMsg(actualResult,
actualResultsElement);
// add the results elements to the root element
resultElement.addContent(actualResultsElement);
// ---------------------
// Expected Results - ...
// ---------------------
// produce xml for the expected results
// Get expected results
Element expectedResult = new Element("bogus"); //$NON-NLS-1$
expectedResult = jstrat.parseXMLResultsFile(expectedResultFile,
expectedResult);
if (expectedResult.getChild(TagNames.Elements.SELECT) != null) {
//----------------------------------------------------------
// -
// Expected result was a ResultSet set element name to
// reflect
//----------------------------------------------------------
// -
expectedResult
.setName(TagNames.Elements.EXPECTED_QUERY_RESULTS);
} else {
//----------------------------------------------------------
// --
// Expected result was an exception set element name to
// reflect
//----------------------------------------------------------
// --
expectedResult
.setName(TagNames.Elements.EXPECTED_EXCEPTION);
}
resultElement.addContent(expectedResult);
} else {
// ---------------------
// Expected Results - ...
// ---------------------
// produce xml for the expected results
// Get expected results
Element expectedResult = new Element("bogus"); //$NON-NLS-1$
expectedResult = jstrat.parseXMLResultsFile(expectedResultFile,
expectedResult);
if (expectedResult.getChild(TagNames.Elements.SELECT) != null) {
//----------------------------------------------------------
// -
// Expected result was a ResultSet set element name to
// reflect
//----------------------------------------------------------
// -
expectedResult
.setName(TagNames.Elements.EXPECTED_QUERY_RESULTS);
} else {
//----------------------------------------------------------
// --
// Expected result was an exception set element name to
// reflect
//----------------------------------------------------------
// --
expectedResult
.setName(TagNames.Elements.EXPECTED_EXCEPTION);
}
resultElement.addContent(expectedResult);
}
// ------------------------------
// Got an exeption from the server
// error was in comparing exceptions
// ------------------------------
// add the results elements to the root element
rootElement.addContent(resultElement);
// Output xml
XMLOutputter outputter = new XMLOutputter(JdomHelper.getFormat(
" ", true)); //$NON-NLS-1$
outputter.output(new Document(rootElement), outputStream);
} catch (SQLException e) {
throw new QueryTestFailedException(
"Failed to convert error results to JDOM: " + e.getMessage()); //$NON-NLS-1$
} catch (JDOMException e) {
throw new QueryTestFailedException(
"Failed to convert error results to JDOM: " + e.getMessage()); //$NON-NLS-1$
} catch (IOException e) {
throw new QueryTestFailedException(
"Failed to output error results to " + resultsFile.getPath() + ": " + e.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
} catch (Throwable e) {
throw new QueryTestFailedException(
"Failed to convert error results to JDOM: " + StringUtil.getStackTrace(e)); //$NON-NLS-1$
} finally {
try {
outputStream.close();
} catch (IOException e) {
}
}
}
}