BAEL-2899: separating static and dynamic classes examples

This commit is contained in:
Gian Mario Contessa 2019-05-27 11:25:19 +01:00
parent 653717e25e
commit b9999c1af1

View File

@ -4,14 +4,14 @@ import groovy.lang.*;
import groovy.util.GroovyScriptEngine;
import groovy.util.ResourceException;
import groovy.util.ScriptException;
import org.codehaus.groovy.control.CompilerConfiguration;
import org.codehaus.groovy.jsr223.GroovyScriptEngineFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.script.Compilable;
import javax.script.ScriptEngine;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
@ -24,83 +24,76 @@ public class App {
private final GroovyClassLoader loader;
private final GroovyShell shell;
private final GroovyScriptEngine engine;
private final ScriptEngine engineFromFactory;
private App() throws IOException {
loader = new GroovyClassLoader(this.getClass().getClassLoader());
CompilerConfiguration config = new CompilerConfiguration();
config.setScriptBaseClass("com.baeldung.CalcScript");
shell = new GroovyShell(loader, new Binding(), config);
shell = new GroovyShell(loader, new Binding());
engine = new GroovyScriptEngine(new URL[] { new File("src/main/groovy/com/baeldung/").toURI().toURL() }, this.getClass().getClassLoader());
engineFromFactory = new GroovyScriptEngineFactory().getScriptEngine();
}
private void runCompiledClasses(int x, int y) {
LOG.info("Executing {} + {}", x, y);
Object result1 = new CalcScript().calcSum(x, y);
LOG.info("Result of calcSum() method is {}", result1);
LOG.info("Result of CalcScript.calcSum() method is {}", result1);
Object result2 = new CalcMath().calcSum(x, y);
LOG.info("Result of calcSum() method is {}", result2);
LOG.info("Result of CalcMath.calcSum() method is {}", result2);
}
private void runShellScript(int x, int y) {
Script script = shell.parse(String.format("calcSum(%d,%d)", x, y));
assert script instanceof CalcScript;
Object result = script.run();
LOG.info("Result of run() method is {}", result);
Object script2 = shell.parse("CalcScript");
assert script2 instanceof CalcScript;
Object result2 = ((CalcScript) script2).calcSum(x + 7, y + 7);
LOG.info("Result of calcSum() method is {}", result2);
Script script3 = shell.parse("");
assert script3 instanceof CalcScript;
Object result3 = script3.invokeMethod("calcSum", new Object[] { x + 14, y + 14 });
LOG.info("Result of run() method is {}", result3);
private void runDynamicShellScript(int x, int y) throws IOException {
Script script = shell.parse(new File("src/main/groovy/com/baeldung/", "CalcScript.groovy"));
LOG.info("Executing {} + {}", x, y);
Object result = script.invokeMethod("calcSum", new Object[] { x, y });
LOG.info("Result of CalcScript.calcSum() method is {}", result);
}
private void runClassWithLoader(int x, int y) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
Class calcClass = loader.loadClass("com.baeldung.CalcMath");
private void runDynamicClassWithLoader(int x, int y) throws IllegalAccessException, InstantiationException, IOException {
Class calcClass = loader.parseClass(new File("src/main/groovy/com/baeldung/", "CalcMath.groovy"));
Object calc = calcClass.newInstance();
assert calc instanceof CalcMath;
Object result = ((CalcMath) calc).calcSum(x, y);
LOG.info("Result is {}", result);
Object result2 = ((GroovyObject) calc).invokeMethod("calcSum", new Object[] { x + 14, y + 14 });
LOG.info("Result is {}", result2);
Object result = ((GroovyObject) calc).invokeMethod("calcSum", new Object[] { x + 14, y + 14 });
LOG.info("Result of CalcMath.calcSum() method is {}", result);
}
private void runClassWithEngine(int x, int y) throws ClassNotFoundException, IllegalAccessException, InstantiationException, ResourceException, ScriptException {
private void runDynamicClassWithEngine(int x, int y) throws IllegalAccessException, InstantiationException, ResourceException, ScriptException {
Class<GroovyObject> calcClass = engine.loadScriptByName("CalcMath.groovy");
GroovyObject calc = calcClass.newInstance();
Object result = calc.invokeMethod("calcSum", new Object[] { x, y });
//WARNING the following will throw a ClassCastException
//((CalcMath)calc).calcSum(1,2);
LOG.info("Result is {}", result);
Object result = calc.invokeMethod("calcSum", new Object[] { x, y });
LOG.info("Result of CalcMath.calcSum() method is {}", result);
}
private void runClassWithEngineFactory(int x, int y) throws ClassNotFoundException, IllegalAccessException, InstantiationException, ResourceException, ScriptException, javax.script.ScriptException {
ScriptEngine engine = new GroovyScriptEngineFactory().getScriptEngine();
Class calcClass = (Class) ((Compilable) engine).compile("com.baeldung.CalcMath").eval();
Object calc = calcClass.newInstance();
Object result = ((CalcMath) calc).calcSum(1, 20);
LOG.info("Result is {}", result);
private void runDynamicClassWithEngineFactory(int x, int y) throws IllegalAccessException, InstantiationException, javax.script.ScriptException, FileNotFoundException {
Class calcClas = (Class) engineFromFactory.eval(new FileReader(new File("src/main/groovy/com/baeldung/", "CalcMath.groovy")));
GroovyObject calc = (GroovyObject) calcClas.newInstance();
Object result = calc.invokeMethod("calcSum", new Object[] { x, y });
LOG.info("Result of CalcMath.calcSum() method is {}", result);
}
private void runStaticCompiledClasses() {
LOG.info("Running the Groovy classes compiled statically...");
runCompiledClasses(5, 10);
}
private void runDynamicCompiledClasses() throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException, ResourceException, ScriptException, javax.script.ScriptException {
LOG.info("Running a dynamic groovy script...");
runDynamicShellScript(5, 10);
LOG.info("Running a dynamic groovy class with GroovyClassLoader...");
runDynamicClassWithLoader(10, 30);
LOG.info("Running a dynamic groovy class with GroovyScriptEngine...");
runDynamicClassWithEngine(15, 0);
LOG.info("Running a dynamic groovy class with GroovyScriptEngine JSR223...");
runDynamicClassWithEngineFactory(5, 6);
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, ResourceException, ScriptException, IOException, javax.script.ScriptException {
App app = new App();
LOG.info("Running an already compiled groovy class instance...");
app.runCompiledClasses(5, 10);
LOG.info("Running a groovy script...");
app.runShellScript(5, 10);
LOG.info("Running a groovy class...");
app.runClassWithLoader(1, 3);
LOG.info("Running a groovy class using the engine...");
app.runClassWithEngine(10, 30);
LOG.info("Running a groovy class using the engine factory...");
app.runClassWithEngineFactory(10, 30);
app.runStaticCompiledClasses();
app.runDynamicCompiledClasses();
}
}