blob: ac5319be7a88cbffd9a474b3cc5a4f27ea438abf [file]
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2001-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) 2000, 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.util.Properties;
/**
* Factory constructor for various qetest-related objects.
*
* Currently only supports finding an appropriate instance
* of a file-based CheckService.
*
* @author Shane_Curcuru@lotus.com
* @version $Id$
*/
public abstract class QetestFactory
{
/** Constant denoting a default CheckService for Files. */
public static final String TYPE_FILES = "QetestFactory.FILECHECK";
/** Default TYPE_FILES implementation class. */
public static final String DEFAULT_TYPE_FILES = "org.apache.qetest.xsl.XHTFileCheckService";
/**
* Get a new CheckService of a specified type.
*
* Currently only supports the TYPE_FILES or your own FQCN.
*
* @param type FQCN or constant type of CheckService needed
* @return CheckService of the appropriate type; or a fallback
* type if not found and a fallback is available.
*/
public static CheckService newCheckService(Logger logger, String type)
{
CheckService service = null;
if (null == type)
{
logger.logMsg(Logger.ERRORMSG, "Warning: no type specified for newCheckService!");
return null;
}
else if (TYPE_FILES.equals(type))
{
// Return our default impl
Class fClazz = QetestUtils.testClassForName(DEFAULT_TYPE_FILES, null, null);
if (null == fClazz)
{
logger.logMsg(Logger.ERRORMSG, "Warning: no default fileChecker is available: " + DEFAULT_TYPE_FILES);
return null; //@todo should we throw exception instead?
}
try
{
service = (CheckService)fClazz.newInstance();
//logger.logMsg(Logger.TRACEMSG, TYPE_FILES + " is " + service);
}
catch (Exception e)
{
logger.logThrowable(Logger.ERRORMSG, e, "newCheckService(" + TYPE_FILES + ") threw");
}
return service;
}
else // Assume a classname of your impl
{
// Return our default impl
Class fClazz = QetestUtils.testClassForName(type, QetestUtils.defaultPackages, null);
if (null == fClazz)
{
logger.logMsg(Logger.ERRORMSG, "Warning: no fileChecker is available of type: " + type);
return null; //@todo should we throw exception instead?
}
try
{
service = (CheckService)fClazz.newInstance();
logger.logMsg(Logger.TRACEMSG, TYPE_FILES + " is " + service);
}
catch (Exception e)
{
logger.logThrowable(Logger.ERRORMSG, e, "newCheckService(" + TYPE_FILES + ") threw");
}
return service;
}
}
/**
* Get a new Reporter with some defaults.
*
* Will attempt to initialize the appropriate Reporter
* depending on the options passed in; if all else fails, will
* return at least a ConsoleLogger.
*
* @param options to create Reporter from
* @return appropriate Reporter instance, or a default one.
*/
public static Reporter newReporter(Properties options)
{
Reporter reporter = null;
if (null == options)
{
// Return a default Reporter
reporter = new Reporter(null);
reporter.addDefaultLogger(); // add default logger automatically
return reporter;
}
// Setup appropriate defaults for the Reporter
// Ensure we have an XMLFileLogger if we have a logName
String logF = options.getProperty(Logger.OPT_LOGFILE);
if ((logF != null) && (!logF.equals("")))
{
// We should ensure there's an XMLFileReporter
String r = options.getProperty(Reporter.OPT_LOGGERS);
if (r == null)
{
// Create the property if needed...
options.put(Reporter.OPT_LOGGERS,
"org.apache.qetest.XMLFileLogger");
}
else if (r.indexOf("XMLFileLogger") <= 0)
{
// ...otherwise append to existing list
options.put(Reporter.OPT_LOGGERS,
r + Reporter.LOGGER_SEPARATOR
+ "org.apache.qetest.XMLFileLogger");
}
}
// Ensure we have a ConsoleLogger unless asked not to
// @todo improve and document this feature
String noDefault = options.getProperty("noDefaultReporter");
if (noDefault == null)
{
// We should ensure there's an XMLFileReporter
String r = options.getProperty(Reporter.OPT_LOGGERS);
if (r == null)
{
options.put(Reporter.OPT_LOGGERS,
"org.apache.qetest.ConsoleLogger");
}
else if (r.indexOf("ConsoleLogger") <= 0)
{
options.put(Reporter.OPT_LOGGERS,
r + Reporter.LOGGER_SEPARATOR
+ "org.apache.qetest.ConsoleLogger");
}
}
// Pass our options directly to the reporter
// so it can use the same values in initialization
// A Reporter will auto-initialize from the values
// in the properties block
reporter = new Reporter(options);
return reporter;
}
/**
* Get a new Logger with some defaults.
*
* Currently a redirect to call (Logger)newReporter(options).
*
* @param options to create Logger from
* @return appropriate Logger instance, or a default one.
*/
public static Logger newLogger(Properties options)
{
return (Logger)newReporter(options);
}
/** Prevent instantiation - private constructor. */
private QetestFactory() { /* no-op */ }
} // end of class CheckService