blob: b3ac6717d9c49f40f3720dea75ab04369f60f89d [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/>.
*/
/*
*
* StylesheetDatalet.java
*
*/
package org.apache.qetest.xsl;
import java.util.Hashtable;
import java.util.Properties;
import java.util.StringTokenizer;
import org.apache.qetest.Datalet;
/**
* Datalet for conformance testing of xsl stylesheet files.
* Should serve as a base class for other XSLT related Datalets.
* @author Shane_Curcuru@lotus.com
* @version $Id$
*/
public class StylesheetDatalet implements Datalet
{
/** URL of the stylesheet; default:.../identity.xsl. */
public String inputName = "tests/api/trax/identity.xsl";
/** URL of the xml document; default:.../identity.xml. */
public String xmlName = "tests/api/trax/identity.xml";
/** URL to put output into; default:StylesheetDatalet.out. */
public String outputName = "StylesheetDatalet.out";
/** URL of the a gold file or data; default:.../identity.out. */
public String goldName = "tests/api-gold/trax/identity.out";
/** Flavor of a ProcessorWrapper to use; default:trax. */
public String flavor = "trax"; //@todo should be ProcessorWrapper.DEFAULT_FLAVOR
/**
* Generic placeholder for any additional options.
* I'm still undecided if I like this idea or not.
* This allows StylesheetDatalets to support additional kinds
* of tests, like performance tests, without having to change
* this data model. These options can serve as a catch-all
* for any new properties or options or what-not that new
* tests need, without having to change how the most basic
* member variables here work.
* Note that while this needs to be a Properties object to
* take advantage of the parent/default behavior in
* getProperty(), this doesn't necessarily mean they can only
* store Strings.
*/
public Properties options = new Properties();
/** Description of what this Datalet tests. */
protected String description = "StylesheetDatalet: String inputName, String xmlName, String outputName, String goldName, String flavor";
/**
* No argument constructor is a no-op.
*/
public StylesheetDatalet() { /* no-op */ }
/**
* Initialize this datalet from a string, perhaps from
* a command line.
* We will parse the command line with whitespace and fill
* in our member variables in order:
* <pre>inputName, xmlName, outputName, goldName, flavor</pre>,
* if there are too few tokens, remaining variables will default.
*/
public StylesheetDatalet(String args)
{
load(args);
setDescription("inputName=" + inputName
+ " xmlName=" + xmlName
+ " outputName=" + outputName
+ " goldName=" + goldName
+ " flavor=" + flavor);
}
/**
* Initialize this datalet from a string, plus a Properties
* block to use as our default options.
* We will parse the command line with whitespace and fill
* in our member variables in order:
* <pre>inputName, xmlName, outputName, goldName, flavor</pre>,
* if there are too few tokens, remaining variables will default.
*/
public StylesheetDatalet(String args, Properties defaults)
{
// First set our defaults and our flavor member
options = new Properties(defaults);
flavor = options.getProperty("flavor", flavor);
// Then set all other items from the string, potentially
// overriding the flavor set above
load(args);
setDescription("inputName=" + inputName
+ " xmlName=" + xmlName
+ " outputName=" + outputName
+ " goldName=" + goldName
+ " flavor=" + flavor);
}
/**
* Accesor method for a brief description of this Datalet.
*
* @return String describing the specific set of data
* this Datalet contains (can often be used as the description
* of any check() calls made from the Testlet).
*/
public String getDescription()
{
return description;
}
/**
* Accesor method for a brief description of this Datalet.
*
* @param s description to use for this Datalet.
*/
public void setDescription(String s)
{
description = s;
}
/**
* Load fields of this Datalet from a Hashtable.
* Caller must provide data for all of our fields.
* //@todo design decision: only have load(Hashtable)
* or load(Properties), not both.
*
* @param Hashtable to load
*/
public void load(Hashtable h)
{
if (null == h)
return; //@todo should this have a return val or exception?
inputName = (String)h.get("inputName");
xmlName = (String)h.get("xmlName");
outputName = (String)h.get("outputName");
goldName = (String)h.get("goldName");
flavor = (String)h.get("flavor");
}
/**
* Load fields of this Datalet from a Properties.
* Caller must provide data for all of our fields.
* //@todo design decision: only have load(Hashtable)
* or load(Properties), not both.
*
* @param Hashtable to load
*/
public void load(Properties p)
{
if (null == p)
return; //@todo should this have a return val or exception?
inputName = (String)p.getProperty("inputName");
xmlName = (String)p.getProperty("xmlName");
outputName = (String)p.getProperty("outputName");
goldName = (String)p.getProperty("goldName");
flavor = (String)p.getProperty("flavor");
// Also set our internal options to default to this Properties
options = new Properties(p);
}
/**
* Load fields of this Datalet from an array.
* Order: inputName, xmlName, outputName, goldName, flavor
* If too few args, then fields at end of list are left at default value.
* @param args array of Strings
*/
public void load(String[] args)
{
if (null == args)
return; //@todo should this have a return val or exception?
try
{
inputName = args[0];
xmlName = args[1];
outputName = args[2];
goldName = args[3];
flavor = args[4];
}
catch (ArrayIndexOutOfBoundsException aioobe)
{
// No-op, leave remaining items as default
}
}
/**
* Load fields of this Datalet from a whitespace-delimited String.
* Order: inputName, xmlName, outputName, goldName, flavor
* If too few args, then fields at end of list are left at default value.
* EXPERIMENTAL: takes any extra args as name value pairs and
* attempts to add them to our options
* @param args array of Strings
*/
public void load(String str)
{
if (null == str)
return; //@todo should this have a return val or exception?
StringTokenizer st = new StringTokenizer(str);
// Fill in as many items as we can; leave as default otherwise
// Note that order is important!
if (st.hasMoreTokens())
{
inputName = st.nextToken();
if (st.hasMoreTokens())
{
xmlName = st.nextToken();
if (st.hasMoreTokens())
{
outputName = st.nextToken();
if (st.hasMoreTokens())
{
goldName = st.nextToken();
if (st.hasMoreTokens())
{
flavor = st.nextToken();
}
}
}
}
}
// EXPERIMENTAL add extra name value pairs to our options
while (st.hasMoreTokens())
{
String name = st.nextToken();
if (st.hasMoreTokens())
{
options.put(name, st.nextToken());
}
else
{
// Just put it as 'true' for boolean options
options.put(name, "true");
}
}
}
} // end of class StylesheetDatalet