From b9999c1af1ae2cce154d765ad74d5153cf274e07 Mon Sep 17 00:00:00 2001 From: Gian Mario Contessa Date: Mon, 27 May 2019 11:25:19 +0100 Subject: [PATCH] BAEL-2899: separating static and dynamic classes examples --- .../src/main/java/com/baeldung/App.java | 97 +++++++++---------- 1 file changed, 45 insertions(+), 52 deletions(-) diff --git a/java-groovy-joint/src/main/java/com/baeldung/App.java b/java-groovy-joint/src/main/java/com/baeldung/App.java index 7cfeba2024..7e24ec2c16 100644 --- a/java-groovy-joint/src/main/java/com/baeldung/App.java +++ b/java-groovy-joint/src/main/java/com/baeldung/App.java @@ -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 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(); } }