blob: 900bde157ee4c10b54cd5ef90e42401c82e4f104 [file]
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2000-2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Xalan" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation and was
* originally based on software copyright (c) 2001, Lotus
* Development Corporation., http://www.lotus.com. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.qetest;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
import java.util.Vector;
/**
* Simple services for getting lists of FileDatalets.
*
* <p>Provides static worker methods for reading
* {@link FileTestletDriver#OPT_FILELIST -fileList} lists
* of input/output/gold files and creating lists of
* corresponding FileDatalets from them. We provide the logic
* for reading the actual fileList line-by-line; the
* {@link FileDatalet} class provides the logic for initializing
* itself from a line of text.</p>
*
* @see FileTestletDriver
* @see FileDatalet
* @author shane_curcuru@us.ibm.com
* @version $Id$
*/
public abstract class FileDataletManager // provide static services only
{
/** '#' character, comment char in qetest fileList. */
public static final String QETEST_COMMENT_CHAR = "#";
/**
* Read in a file specifying a list of files to test.
*
* <p>File format is fixed to be a qetest-style fileList;
* optional worker methods may allow other formats.
* Essentially we simply read the file line-by-line and
* create a FileDatalet from each line.</p>
*
* @param logger to report problems to
* @param fileName String; name of the file
* @param desc description; caller's copy changed
* @param defaults default properties to potentially add to each datalet
* @return Vector of FileDatalets; null if error
*/
public static Vector readFileList(Logger logger, String fileName,
String desc, Properties defaults)
{
// Verify the file is there
File f = new File(fileName);
if (!f.exists())
{
logger.logMsg(Logger.ERRORMSG, "readFileList: " + fileName
+ " does not exist!");
return null;
}
BufferedReader br = null;
String line = null;
try
{
br = new BufferedReader(new FileReader(f));
line = br.readLine(); // read just first line
}
catch (IOException ioe)
{
logger.logMsg(Logger.ERRORMSG, "readFileList: " + fileName
+ " threw: " + ioe.toString());
return null;
}
// Verify the first line
if (line == null)
{
logger.logMsg(Logger.ERRORMSG, "readFileList: " + fileName
+ " appears to be blank!");
return null;
}
// Determine which kind of fileList this is
Vector vec = null;
if (line.startsWith(QETEST_COMMENT_CHAR))
{
// This is a native qetest style file
vec = readQetestFileList(logger, br, line, fileName, desc, defaults);
}
else
{
//@todo: add a worker method that allows users to plug
// in their own fileList reader that creates Datalets
logger.logMsg(Logger.WARNINGMSG, "readFileList: " + fileName
+ " could not determine file type; assuming qetest!");
vec = readQetestFileList(logger, br, line, fileName, desc, defaults);
}
if ((null == vec)
|| (vec.size() == 0))
{
logger.logMsg(Logger.ERRORMSG, "readFileList: " + fileName
+ " did not have any non-comment lines!");
// Explicitly return null so caller knows we had error
return null;
}
return vec;
}
/**
* Read in a qetest fileList specifying a list of files to test.
*
* <p>File format is pretty simple:</p>
* <ul>
* <li># first line of comments is copied into desc</li>
* <li># beginning a line is a comment</li>
* <li># rest of lines are whitespace delimited filenames and options</li>
* <li>inputName outName goldName [options...]</li>
* <li><b>Note:</b> see {@link FileDatalet} for
* details on how the file lines are parsed!</li>
* </ul>
*
* @param logger to report problems to
* @param br BufferedReader to read from
* @param firstLine already read from br
* @param fileName String; name of the file
* @param desc to use of this file
* @param defaults default properties to potentially add to each datalet
* @return Vector of FileDatalets, or null if error
*/
protected static Vector readQetestFileList(Logger logger, BufferedReader br,
String firstLine, String fileName,
String desc, Properties defaults)
{
final String ABSOLUTE = "absolute";
final String RELATIVE = "relative";
Vector vec = new Vector();
String line = firstLine;
// Check if the first line is a comment
if (line.startsWith(QETEST_COMMENT_CHAR))
{
// Save it as the description
desc = line;
// Parse the next line
try
{
line = br.readLine();
}
catch (IOException ioe)
{
logger.logMsg(Logger.ERRORMSG, "readQetestFileList-desc: "
+ fileName + " threw: " + ioe.toString());
return null;
}
}
// Load each line into a FileDatalet
for (;;)
{
// Skip any lines beginning with # comment char or that are blank
if ((!line.startsWith(QETEST_COMMENT_CHAR)) && (line.length() > 0))
{
// Create a Datalet and initialize with the line's
// contents and default properties
FileDatalet d = new FileDatalet(line, defaults);
// Also pass over the global runId, if set
//@todo this should be standardized and removed;
// or at least have global constants for it
d.getOptions().put("runId", defaults.getProperty("runId"));
// Add it to our vector
vec.addElement(d);
}
// Read next line and loop
try
{
line = br.readLine();
}
catch (IOException ioe2)
{
// Just force us out of the loop; if we've already
// read part of the file, fine
logger.logMsg(Logger.WARNINGMSG, "readQetestFileList-body: "
+ fileName + " threw: " + ioe2.toString());
break;
}
if (line == null)
break;
} // end of for (;;)
// Return our Vector of created datalets
return vec;
}
}