My attachement got removed so here it is:
beanshelldef.java
=======================================
import java.io.File;
import java.util.Set;
import java.util.HashSet;
import bsh.EvalError;
import bsh.Interpreter;
import org.apache.tools.ant.AntTypeDefinition;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.ComponentHelper;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.ProjectHelper;
import org.apache.tools.ant.taskdefs.AntlibDefinition;
/**
* Class to define an ant definition using a beanshell script.
* The beanshell interpreter must be 2.0 or higher.
* The beanshell script must contain the class specified
* by the "classname" attribute.
* <p>
* Note that if there is anything incorrect with the script
* the warning message is quite cryptic.
* </p>
*
* @author Peter Reilly
* @since Ant 1.7
* @see AntlibDefinition
*/
public class BeanShellDef extends AntlibDefinition {
private String name;
private String definitionString;
private File definitionFile;
private String classname;
/** Only define the types once so that we don't end up with
* duplicate class definition errors. */
static private Set definedTypes = new HashSet();
/**
* Name of the definition
* @param name the name of the definition
*/
public void setName(String name) {
this.name = name;
}
/**
* Name of the classname that the bean shell
* definition contains.
* @param classname the name of the class defined in the beanshell script
*/
public void setClassname(String classname) {
this.classname = classname;
}
/**
* Set the definition file.
* @param definitionFile a file containing beanshell script
*/
public void setFile(File definitionFile) {
this.definitionFile = definitionFile;
}
/**
* Set the definition string.
*
* @param text a bean shell 2.0 string containing the definition
* of the classname
*/
public void addText(String text) {
this.definitionString = getProject().replaceProperties(text);
}
/**
* define the beanshell definition.
* check the attributes, get the class been defined and
* set the definition.
*/
public void execute() {
if (classname == null) {
throw new BuildException("Missing attribute classname");
}
if (name == null) {
throw new BuildException("Missing attribute name");
}
if (definitionString == null && definitionFile == null) {
throw new BuildException("Missing beanshell script or file");
}
synchronized (definedTypes)
{
if (!definedTypes.contains(classname))
{
definedTypes.add(classname);
registerType();
}
else
{
log("Override ignored for type: " + classname,
Project.MSG_VERBOSE);
}
}
}
/**
* define the beanshell definition.
* check the attributes, get the class been defined and
* set the definition. This method should only be called,
* once otherwise we end up with a duplicate class
* definition error.
*/
protected void registerType() {
Interpreter i = new Interpreter(); // Construct an interpreter
if (definitionFile != null) {
try {
i.source(definitionFile.getAbsolutePath());
} catch (Throwable t) {
throw new BuildException(t);
}
}
try {
if (definitionString != null) {
i.eval(definitionString);
}
Object o = i.eval("new " + classname + "()");
Class cl = o.getClass();
AntTypeDefinition def = new AntTypeDefinition();
def.setName(ProjectHelper.genComponentName(getURI(), name));
def.setClassName(classname);
def.setClass(cl);
ComponentHelper.getComponentHelper(getProject())
.addDataTypeDefinition(def);
} catch (BuildException ex) {
throw ex;
} catch (Throwable t) {
throw new BuildException(t);
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]