Browse Source

Cleaning, proper classpath in JavaxScriptRunner

master
pyxide Stefan Bodewig 8 years ago
parent
commit
49896d3369
4 changed files with 68 additions and 65 deletions
  1. +8
    -3
      src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java
  2. +16
    -15
      src/main/org/apache/tools/ant/util/ScriptRunnerBase.java
  3. +22
    -4
      src/main/org/apache/tools/ant/util/ScriptRunnerHelper.java
  4. +22
    -43
      src/main/org/apache/tools/ant/util/optional/JavaxScriptRunner.java

+ 8
- 3
src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java View File

@@ -188,10 +188,15 @@ public class ScriptDef extends DefBase {
}

if (helper.getLanguage() == null) {
throw new BuildException("<scriptdef> requires a language attribute "
throw new BuildException("scriptdef requires a language attribute "
+ "to specify the script language");
}

if (helper.getSrc() == null && helper.getEncoding() != null) {
throw new BuildException("scriptdef requires a src attribute "
+ "if the encoding is set");
}

// Check if need to set the loader
if (getAntlibClassLoader() != null || hasCpDelegate()) {
helper.setClassLoader(createLoader());
@@ -367,9 +372,9 @@ public class ScriptDef extends DefBase {
}

/**
* Defines the language (required).
* Defines the compilation feature (optional).
*
* @param language the scripting language name for the script.
* @param compiled enables the script compilation if available.
*/
public void setCompiled(boolean compiled) {
helper.setCompiled(compiled);


+ 16
- 15
src/main/org/apache/tools/ant/util/ScriptRunnerBase.java View File

@@ -25,7 +25,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@@ -223,7 +223,6 @@ public abstract class ScriptRunnerBase {

/**
* Load the script from an external file; optional.
* @since Ant 1.10.1
* @param file the file containing the script source.
*/
public void setSrc(File file) {
@@ -231,6 +230,7 @@ public abstract class ScriptRunnerBase {
if (!file.exists()) {
throw new BuildException("file " + filename + " not found.");
}

InputStream in = null;
try {
in = new FileInputStream(file);
@@ -239,8 +239,15 @@ public abstract class ScriptRunnerBase {
throw new BuildException("file " + filename + " not found.");
}

final Charset charset;
if (null == encoding) {
charset = null;
} else {
charset = Charset.forName(encoding);
}

try {
readSource(in, filename);
readSource(in, filename, charset);
} finally {
FileUtils.close(in);
}
@@ -250,19 +257,18 @@ public abstract class ScriptRunnerBase {
* Read some source in from the given reader
* @param reader the reader; this is closed afterwards.
* @param name the name to use in error messages
* @param charset the encoding for the reader, may be null.
*/
private void readSource(InputStream in, String name) {
private void readSource(InputStream in, String name, Charset charset) {
Reader reader = null;
try {
if (null == encoding) {
if (null == charset) {
reader = new InputStreamReader(in);
} else {
reader = new InputStreamReader(in, encoding);
reader = new InputStreamReader(in, charset);
}
reader = new BufferedReader(reader);
script += FileUtils.safeReadFully(reader);
} catch(UnsupportedEncodingException e) {
throw new BuildException("Failed to decode " + name + " with encoding " + encoding, e);
} catch (IOException ex) {
throw new BuildException("Failed to read " + name, ex);
} finally {
@@ -278,7 +284,6 @@ public abstract class ScriptRunnerBase {
*/
public void loadResource(Resource sourceResource) {
if(sourceResource instanceof StringResource) {
// Note: StringResource uses UTF-8 by default to encode/decode, not the default platform encoding
script += ((StringResource) sourceResource).getValue();
return;
}
@@ -287,10 +292,6 @@ public abstract class ScriptRunnerBase {
return;
}

// Concat resource
// FileResource : OK for default encoding

String name = sourceResource.toLongString();
InputStream in = null;
try {
@@ -299,11 +300,11 @@ public abstract class ScriptRunnerBase {
throw new BuildException("Failed to open " + name, e);
} catch (UnsupportedOperationException e) {
throw new BuildException(
"Failed to open " + name + " -it is not readable", e);
"Failed to open " + name + " - it is not readable", e);
}

try {
readSource(in, name);
readSource(in, name, (Charset) null);
} finally {
FileUtils.close(in);
}


+ 22
- 4
src/main/org/apache/tools/ant/util/ScriptRunnerHelper.java View File

@@ -58,7 +58,7 @@ public class ScriptRunnerHelper {
runner.setCompiled(compiled);

if (encoding != null) {
// set it first, because runner.setSrc() loads immediately the file
// set it first, because runner.setSrc() loads immediately the file
runner.setEncoding(encoding);
}
if (srcFile != null) {
@@ -115,15 +115,33 @@ public class ScriptRunnerHelper {
this.srcFile = file;
}

/**
* Get the external script file ; optional.
* @return the file containing the script source.
* @since Ant 1.10.1
*/
public File getSrc() {
return srcFile;
}

/**
* Set the encoding of the script from an external file ; optional.
*
* @param encoding the encoding of the file containing the script source.
* @since Ant 1.10.1
*/
public void setEncoding(String encoding) {
this.encoding = encoding;
}
public void setEncoding(String encoding) {
this.encoding = encoding;
}

/**
* Get the external file encoding.
* @return the encoding of the file containing the script source.
* @since Ant 1.10.1
*/
public String getEncoding() {
return encoding;
}

/**
* Add script text.


+ 22
- 43
src/main/org/apache/tools/ant/util/optional/JavaxScriptRunner.java View File

@@ -31,11 +31,7 @@ import org.apache.tools.ant.util.ScriptRunnerBase;
*/
public class JavaxScriptRunner extends ScriptRunnerBase {
private ReflectWrapper engine;

/** Debug constant */
private static final boolean DEBUG = Boolean.getBoolean("JavaxScriptRunner.DEBUG");

private String compiledScriptRefName;
private ReflectWrapper compiledScript;

/**
* Get the name of the manager prefix.
@@ -86,16 +82,14 @@ public class JavaxScriptRunner extends ScriptRunnerBase {
ClassLoader origLoader = replaceContextLoader();
try {

if(DEBUG) System.out.println("-- JavaxScriptRunner.evaluateScript : compile enabled [" + getCompiled() + "]");

if (getCompiled()) {

if (null == compiledScriptRefName) {
compiledScriptRefName = execName + ".compiledScript.0123456789";
}
ReflectWrapper scriptRefObj = getProject().getReference(compiledScriptRefName);
final String compiledScriptRefName = execName + ".compiledScript.0123456789";
if (null == compiledScript) {
compiledScript = getProject().getReference(compiledScriptRefName);
}

if (null == scriptRefObj) {
if (null == compiledScript) {

ReflectWrapper engine = createEngine();
if (engine == null) {
@@ -104,51 +98,36 @@ public class JavaxScriptRunner extends ScriptRunnerBase {
+ getLanguage());
}

final Class engineClass = Class.forName("javax.script.ScriptEngine");
final Class compilableClass = Class.forName("javax.script.Compilable");
final Class engineClass = Class.forName("javax.script.ScriptEngine", true, getClass().getClassLoader());
final Class compilableClass = Class.forName("javax.script.Compilable", true, getClass().getClassLoader());
final Object wrappedObject = engine.getObject();

if (DEBUG) System.out.println("-- JavaxScriptRunner.evaluateScript : wrappedObject [" + wrappedObject.getClass().getName() + "]");
if (engineClass.isAssignableFrom(wrappedObject.getClass()) && compilableClass.isAssignableFrom(wrappedObject.getClass())) {

if(DEBUG) System.out.println("-- JavaxScriptRunner.evaluateScript : compilable [" + wrappedObject.getClass().getName() + "]");
if (engineClass.isAssignableFrom(wrappedObject.getClass()) &&
compilableClass.isAssignableFrom(wrappedObject.getClass())) {

{
getProject().log("compile script" + compiledScriptRefName, Project.MSG_VERBOSE);
getProject().log("compile script " + execName, Project.MSG_VERBOSE);

// compilable engine
final Object compiledScript = engine.invoke("compile", String.class, getScript());
scriptRefObj = new ReflectWrapper(compiledScript);
}

getProject().log("store compiled script, ref " + compiledScriptRefName, Project.MSG_DEBUG);
final Object compiled = engine.invoke("compile", String.class, getScript());
compiledScript = new ReflectWrapper(compiled);

} else {
getProject().log("script compilation not available", Project.MSG_DEBUG);
scriptRefObj = new ReflectWrapper(null);
getProject().log("script compilation not available", Project.MSG_VERBOSE);
compiledScript = new ReflectWrapper(null);
}

getProject().addReference(compiledScriptRefName, scriptRefObj);
getProject().addReference(compiledScriptRefName, compiledScript);
}

if (null != scriptRefObj.getObject()) {
if (null != compiledScript.getObject()) {

if (DEBUG) System.out.println("-- JavaxScriptRunner.evaluateScript : execute compiled script");

final Object simpleBindings;
{
final Class simpleBindingsClass = Class.forName("javax.script.SimpleBindings");
simpleBindings = simpleBindingsClass.newInstance();
}
final ReflectWrapper simpleBindings = new ReflectWrapper(getClass().getClassLoader(), "javax.script.SimpleBindings");

applyBindings(new ReflectWrapper(simpleBindings));
if (DEBUG) System.out.println("-- JavaxScriptRunner.evaluateScript : bindings applied");
applyBindings(simpleBindings);

getProject().log("run compiled script, ref " + compiledScriptRefName, Project.MSG_DEBUG);
getProject().log("run compiled script " + execName, Project.MSG_DEBUG);

final Class bindingsClass = Class.forName("javax.script.Bindings");
final Class bindingsClass = Class.forName("javax.script.Bindings", true, getClass().getClassLoader());

return scriptRefObj.invoke("eval", bindingsClass, simpleBindings);
return compiledScript.invoke("eval", bindingsClass, simpleBindings.getObject());
}
}



Loading…
Cancel
Save