Patch 50c798b76895787c41f67b56b2f44b65d9e49ddd
Commit message:
Groovy console implemented
diff --git a/code/groovy_console/pom.xml b/code/groovy_console/pom.xml
index d52393a..043109f 100644
--- a/code/groovy_console/pom.xml
+++ b/code/groovy_console/pom.xml
@@ -35,6 +35,11 @@
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.codehaus.groovy</groupId>
+ <artifactId>groovy</artifactId>
+ <version>3.0.22</version>
+ </dependency>
</dependencies>
<build>
diff --git a/code/groovy_console/src/main/java/groovyconsole/Controller.java b/code/groovy_console/src/main/java/groovyconsole/Controller.java
index cc15ab5..69d0320 100644
--- a/code/groovy_console/src/main/java/groovyconsole/Controller.java
+++ b/code/groovy_console/src/main/java/groovyconsole/Controller.java
@@ -1,26 +1,46 @@
package groovyconsole;
+import groovy.lang.Binding;
+import groovy.lang.GroovyShell;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.Objects;
+
@RestController
public class Controller {
@Autowired
private State state;
+ @Autowired
+ ApplicationContext ctx;
+
@PostMapping("/console")
public Result console(@RequestBody String script) {
state.incrementConsoleRequestCount();
- return script == null || script.isBlank() ?
- Result.builder().error("The script is empty!").build() :
- Result.builder()
- .result("The script is: " + script)
- .output("Fake output")
- .build();
+ Result.ResultBuilder resultBuilder = Result.builder();
+ StringWriter stringWriter = new StringWriter();
+ Binding binding = new SpringBinding(ctx);
+ binding.setVariable("out", new PrintWriter(stringWriter));
+ GroovyShell groovyShell = new GroovyShell(this.getClass().getClassLoader(), binding);
+ try {
+ Object result = groovyShell.evaluate(script);
+ resultBuilder.result(Objects.toString(result));
+ } catch (Throwable t) {
+ resultBuilder.error(t.getMessage());
+ }
+ String output = stringWriter.toString();
+ if (output != null && !output.isEmpty()) {
+ resultBuilder.output(output);
+ }
+ return resultBuilder.build();
}
@GetMapping("/state")
diff --git a/code/groovy_console/src/main/java/groovyconsole/Greeter.java b/code/groovy_console/src/main/java/groovyconsole/Greeter.java
new file mode 100644
index 0000000..d41c5bc
--- /dev/null
+++ b/code/groovy_console/src/main/java/groovyconsole/Greeter.java
@@ -0,0 +1,14 @@
+package groovyconsole;
+
+public class Greeter {
+
+ private String name;
+
+ public Greeter(String name) {
+ this.name = name;
+ }
+
+ public String greet() {
+ return "Hello, " + (name == null || name.isBlank() ? "stranger" : name) + "!";
+ }
+}
diff --git a/code/groovy_console/src/main/java/groovyconsole/SpringBinding.java b/code/groovy_console/src/main/java/groovyconsole/SpringBinding.java
new file mode 100644
index 0000000..2bbea41
--- /dev/null
+++ b/code/groovy_console/src/main/java/groovyconsole/SpringBinding.java
@@ -0,0 +1,32 @@
+package groovyconsole;
+
+import groovy.lang.Binding;
+import org.springframework.context.ApplicationContext;
+
+public class SpringBinding extends Binding {
+
+ private static final String APPLICATION_CONTEXT_NAME = "_ctx";
+
+ private final ApplicationContext ctx;
+
+ public SpringBinding(ApplicationContext ctx) {
+ this.ctx = ctx;
+ }
+
+ @Override
+ public Object getVariable(String name) {
+ if (getVariables().containsKey(name)) {
+ return getVariables().get(name);
+ }
+ if (ctx.containsBean(name)) {
+ Object variable = ctx.getBean(name);
+ setVariable(name, variable);
+ return variable;
+ }
+ if (APPLICATION_CONTEXT_NAME.equals(name)) {
+ setVariable(name, ctx.getBean(name));
+ return ctx;
+ }
+ return null;
+ }
+}
diff --git a/code/groovy_console/src/main/resources/application.properties b/code/groovy_console/src/main/resources/application.properties
index 2109a44..a6a67c2 100644
--- a/code/groovy_console/src/main/resources/application.properties
+++ b/code/groovy_console/src/main/resources/application.properties
@@ -1 +1,2 @@
-spring.application.name=demo
+spring.application.name=Groovy console
+some.property=This is ${spring.application.name}