
org.openqa.selenium.XlatorTask Maven / Gradle / Ivy
The newest version!
/*
* Created on Jun 12, 2006
*
*/
package org.openqa.selenium;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Properties;
import java.util.Vector;
import java.util.logging.Logger;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.taskdefs.Property;
import org.apache.tools.ant.types.EnumeratedAttribute;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.ant.types.Mapper;
import org.apache.tools.ant.util.FileNameMapper;
import org.apache.tools.ant.util.SourceFileScanner;
/**
* Provides an Ant task to run the Selenium Translator, which translates HTML Selenese into
* other programming languages.
*
* Parameters
*
*
* Attribute Description Required
* destDir Location to write the translated files Yes
* baseUrl The baseUrl to use for testing Yes
* formatter Formatter to use; currently supported formatters are "java-rc", "cs-rc", "perl-rc", "python-rc", and "ruby-rc". Yes
*
* Parameters as Nested Elements
* fileset
*
* A fileset of HTML Selenese files to translate
*
* option
*
* An option to pass to the translator, in the form <option name="foo" value="bar" />
*
* mapper
*
* A mapper of files to output files. The default mapper is a glob mapper from *.html to the appropriate extension for the specified formatter (.java, .cs, .pl, etc.).
* @author danielf
*
*/
public class XlatorTask extends Task {
private Vector _filesets = new Vector();
private HashMap options = new HashMap();
private Mapper mapperElement;
private File destDir;
private FormatterType formatter;
private URL baseUrl;
public XlatorTask() {
super();
}
/** Specifies a destination directory for translated output */
public void setDestDir(File destDir) {
this.destDir = destDir;
}
public void setFormatter(FormatterType formatter) {
this.formatter = formatter;
}
public void setBaseUrl(URL baseUrl) {
this.baseUrl = baseUrl;
}
public void addFileSet(FileSet fs) {
_filesets.addElement(fs);
}
public void addConfiguredOption(Property p) {
options.put(p.getName(), p.getValue());
}
/**
* Defines the mapper to map source to destination files.
* @return a mapper to be configured
* @exception BuildException if more than one mapper is defined
*/
public Mapper createMapper() throws BuildException {
if (mapperElement != null) {
throw new BuildException("Cannot define more than one mapper",
getLocation());
}
mapperElement = new Mapper(getProject());
return mapperElement;
}
// The default mapper maps *.html -> *.java, or *.cs, etc.
private void createDefaultMapper() {
if (mapperElement != null) return;
assert formatter != null;
String extension = formatter.getExtension();
createMapper();
assert mapperElement != null;
Mapper.MapperType t = new Mapper.MapperType();
t.setValue("glob");
mapperElement.setType(t);
mapperElement.setFrom("*.html");
mapperElement.setTo("*." + extension);
}
public void execute() throws BuildException {
checkPreconditions();
FileNameMapper mapper = mapperElement.getImplementation();
Logger log = Logger.getAnonymousLogger();
log.setUseParentHandlers(false);
log.addHandler(new AntLogHandler(getProject(), this));
// Loop through all nested filesets, looking for files to translate
for (int i = 0; i < _filesets.size(); i++) {
FileSet fs = _filesets.elementAt(i);
DirectoryScanner ds = fs.getDirectoryScanner(getProject());
String[] files = ds.getIncludedFiles();
File d = fs.getDir(getProject());
SourceFileScanner scanner = new SourceFileScanner(this);
files = scanner.restrict(files, d, destDir, mapper);
if (files.length > 0) {
log("Handling " + files.length + " files from "
+ d.getAbsolutePath());
for (String fileName : files) {
translateFile(mapper, d, fileName, log);
}
}
}
}
private void checkPreconditions() throws BuildException {
if (_filesets.size() == 0) {
throw new BuildException("You must specify at least one fileset!");
}
if (formatter == null) {
throw new BuildException("You must specify a formatter!");
}
if (destDir == null) {
throw new BuildException("You must specify a destDir!");
}
if (!destDir.exists()) {
throw new BuildException("destDir doesn't exist: " + destDir.getAbsolutePath());
}
createDefaultMapper();
}
private void translateFile(FileNameMapper mapper, File srcDir, String fileName, Logger log) {
File input = new File(srcDir, fileName);
String htmlSource;
String output;
try {
log("Reading " + input.getAbsolutePath(), Project.MSG_DEBUG);
htmlSource = Xlator.loadFile(input);
log("Translating " + input, Project.MSG_INFO);
output = Xlator.xlateTestCase(Xlator.extractTestName(input), baseUrl.toString(), formatter.getValue(), htmlSource, options, log);
} catch (Exception e) {
throw new BuildException(e);
}
String[] outputFileNames = mapper.mapFileName(fileName);
for (String outputFileName : outputFileNames) {
File outputFile = new File(destDir, outputFileName);
try {
log("Writing " + outputFile.getAbsolutePath(), Project.MSG_DEBUG);
writeFile(outputFile, output);
} catch (IOException e) {
throw new BuildException(e);
}
}
}
static void writeFile(File outputFile, String text) throws IOException {
outputFile.getParentFile().mkdirs();
final FileWriter out = new FileWriter(outputFile);
try {
out.write(text);
} finally {
out.close();
}
}
/*
* By creating this enumerated attribute, Ant will make sure the user defines
* a valid formatter name. Plus, we get to specify a default extension for
* the output files.
*/
public static class FormatterType extends EnumeratedAttribute {
private static Properties formatters;
private static String[] values;
static {
formatters = new Properties();
formatters.put("java-rc",
"java");
formatters.put("java-rc-testng",
"java");
formatters.put("cs-rc",
"cs");
formatters.put("perl-rc",
"pl");
formatters.put("python-rc",
"py");
formatters.put("ruby-rc",
"rb");
Vector keys = new Vector();
for (Object o : formatters.keySet()) {
keys.add((String) o);
}
values = keys.toArray(new String[keys.size()]);
}
public FormatterType() {}
public String[] getValues() {
return values;
}
public String getExtension() {
return formatters.getProperty(getValue());
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy