1import groovy.lang.GroovyShell
2import groovy.lang.Binding
3import java.util.Map
4import java.util.HashMap
5
6class DynamicScriptExecutor {
7
8private GroovyShell shell
9private Binding binding
10
11
12
13
14
15DynamicScriptExecutor(Map<String, Object> globalVariables = [:]) {
16binding = new Binding()
17globalVariables.each {
18key, value -> binding.setVariable(key, value)
19}
20shell = new GroovyShell(binding)
21}
22
23
24
25
26
27
28
29Map<String, Object> executeScript(String script) {
30if (script == null || script.trim().isEmpty()) {
31println "Warning: Script is null or empty."
32return null
33}
34
35
36ByteArrayOutputStream baos = new ByteArrayOutputStream()
37PrintStream ps = new PrintStream(baos)
38PrintStream originalOut = System.out
39System.setOut(ps)
40
41Object result = null
42try {
43result = shell.evaluate(script)
44} catch (Exception e) {
45println "Error executing script: ${e.getMessage()}"
46e.printStackTrace(ps)
47} finally {
48
49System.out = originalOut
50ps.close()
51}
52
53String output = baos.toString()
54Map<String, Object> executionResult = new HashMap<>()
55executionResult.put("output", output)
56executionResult.put("result", result)
57
58return executionResult
59}
60
61
62
63
64
65
66void setVariable(String name, Object value) {
67binding.setVariable(name, value)
68}
69
70
71
72
73
74
75Object getVariable(String name) {
76return binding.getVariable(name)
77}
78
79
80
81
82static void main(String[] args) {
83
84Map<String, Object> initialGlobals = [
85"appName": "MyDynamicApp",
86"version": 1.5
87]
88DynamicScriptExecutor executor = new DynamicScriptExecutor(initialGlobals)
89
90
91String script1 = """
92println "Running script 1 for app: ${appName}"
93def message = "Hello from dynamic script!"
94println message
95message
96"""
97Map<String, Object> result1 = executor.executeScript(script1)
98println "--- Script 1 Results ---"
99println "Output:\n${result1.output}"
100println "Result: ${result1.result}"
101println "------------------------\n"
102
103
104String script2 = """
105println "Running script 2 with an error..."
106def x = 10 / 0
107x
108"""
109Map<String, Object> result2 = executor.executeScript(script2)
110println "--- Script 2 Results ---"
111println "Output:\n${result2.output}"
112println "Result: ${result2.result}"
113println "------------------------\n"
114
115
116executor.setVariable("dynamicVar", "This is dynamic!")
117String script3 = """
118println "Script 3 using dynamicVar: ${dynamicVar}"
119dynamicVar.length()
120"""
121Map<String, Object> result3 = executor.executeScript(script3)
122println "--- Script 3 Results ---"
123println "Output:\n${result3.output}"
124println "Result: ${result3.result}"
125println "------------------------\n"
126
127
128String script4 = ""
129Map<String, Object> result4 = executor.executeScript(script4)
130println "--- Script 4 Results ---"
131println "Output:\n${result4?.output ?: 'N/A'}"
132println "Result: ${result4?.result ?: 'N/A'}"
133println "------------------------\n"
134}
135}