diff --git a/pom.xml b/pom.xml index 2dad9db13dc..997c8c81771 100644 --- a/pom.xml +++ b/pom.xml @@ -405,6 +405,11 @@ groovy 2.1.3 + + org.codehaus.groovy + groovy-templates + 2.1.3 + org.eclipse.jetty jetty-webapp diff --git a/spring-bootstrap-cli/pom.xml b/spring-bootstrap-cli/pom.xml index 1ca7744ca6a..55dbe057f40 100644 --- a/spring-bootstrap-cli/pom.xml +++ b/spring-bootstrap-cli/pom.xml @@ -86,6 +86,11 @@ org.codehaus.groovy groovy + + org.codehaus.groovy + groovy-templates + true + org.apache.ivy ivy diff --git a/spring-bootstrap-cli/samples/template.groovy b/spring-bootstrap-cli/samples/template.groovy new file mode 100644 index 00000000000..eab92331121 --- /dev/null +++ b/spring-bootstrap-cli/samples/template.groovy @@ -0,0 +1,25 @@ +package org.test + +import static org.springframework.bootstrap.cli.template.GroovyTemplate.template; + +@Component +class Example implements CommandLineRunner { + + @Autowired + private MyService myService + + void run(String... args) { + print template("test.txt", ["message":myService.sayWorld()]) + } +} + + +@Service +class MyService { + + String sayWorld() { + return "World" + } +} + + diff --git a/spring-bootstrap-cli/src/main/java/org/springframework/bootstrap/cli/compiler/autoconfigure/SpringMvcCompilerAutoConfiguration.java b/spring-bootstrap-cli/src/main/java/org/springframework/bootstrap/cli/compiler/autoconfigure/SpringMvcCompilerAutoConfiguration.java index bd47ba51ce5..baca569a946 100644 --- a/spring-bootstrap-cli/src/main/java/org/springframework/bootstrap/cli/compiler/autoconfigure/SpringMvcCompilerAutoConfiguration.java +++ b/spring-bootstrap-cli/src/main/java/org/springframework/bootstrap/cli/compiler/autoconfigure/SpringMvcCompilerAutoConfiguration.java @@ -40,6 +40,7 @@ public class SpringMvcCompilerAutoConfiguration extends CompilerAutoConfiguratio "org.eclipse.jetty.server.Server").add("org.eclipse.jetty", "jetty-webapp", "8.1.10.v20130312"); + dependencies.add("org.codehaus.groovy", "groovy-templates", "2.1.3"); // FIXME restore Tomcat when we can get reload to work // dependencies.ifMissingClasses("org.apache.catalina.startup.Tomcat", // "org.eclipse.jetty.server.Server") @@ -56,6 +57,8 @@ public class SpringMvcCompilerAutoConfiguration extends CompilerAutoConfiguratio public void applyImports(ImportCustomizer imports) { imports.addStarImports("org.springframework.web.bind.annotation", "org.springframework.web.servlet.config.annotation"); + imports.addStaticImport( + "org.springframework.bootstrap.cli.template.GroovyTemplate", "template"); } } diff --git a/spring-bootstrap-cli/src/main/java/org/springframework/bootstrap/cli/template/GroovyTemplate.java b/spring-bootstrap-cli/src/main/java/org/springframework/bootstrap/cli/template/GroovyTemplate.java new file mode 100644 index 00000000000..db4aca5844a --- /dev/null +++ b/spring-bootstrap-cli/src/main/java/org/springframework/bootstrap/cli/template/GroovyTemplate.java @@ -0,0 +1,59 @@ +/* + * Copyright 2012-2013 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.bootstrap.cli.template; + +import groovy.text.GStringTemplateEngine; +import groovy.text.Template; + +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.Collections; +import java.util.Map; + +import org.codehaus.groovy.control.CompilationFailedException; + +/** + * @author Dave Syer + * + */ +public class GroovyTemplate { + + public static String template(String name) throws IOException, + CompilationFailedException, ClassNotFoundException { + return template(name, Collections. emptyMap()); + } + + public static String template(String name, Map model) throws IOException, + CompilationFailedException, ClassNotFoundException { + GStringTemplateEngine engine = new GStringTemplateEngine(); + File file = new File("templates", name); + URL resource = GroovyTemplate.class.getClassLoader().getResource( + "templates/" + name); + Template template; + if (file.exists()) { + template = engine.createTemplate(file); + } else { + if (resource != null) { + template = engine.createTemplate(resource); + } else { + template = engine.createTemplate(name); + } + } + return template.make(model).toString(); + } + +} diff --git a/spring-bootstrap-cli/src/test/java/org/springframework/bootstrap/cli/SampleIntegrationTests.java b/spring-bootstrap-cli/src/test/java/org/springframework/bootstrap/cli/SampleIntegrationTests.java index 0593265338c..d59a3b1807e 100644 --- a/spring-bootstrap-cli/src/test/java/org/springframework/bootstrap/cli/SampleIntegrationTests.java +++ b/spring-bootstrap-cli/src/test/java/org/springframework/bootstrap/cli/SampleIntegrationTests.java @@ -92,6 +92,13 @@ public class SampleIntegrationTests { assertTrue("Wrong output: " + output, output.contains("Hello World")); } + @Test + public void templateSample() throws Exception { + start("samples/template.groovy"); + String output = getOutput(); + assertTrue("Wrong output: " + output, output.contains("Hello World!")); + } + @Test public void jobSample() throws Exception { start("samples/job.groovy", "foo=bar"); diff --git a/spring-bootstrap-cli/src/test/resources/templates/test.txt b/spring-bootstrap-cli/src/test/resources/templates/test.txt new file mode 100644 index 00000000000..5120c58be3a --- /dev/null +++ b/spring-bootstrap-cli/src/test/resources/templates/test.txt @@ -0,0 +1 @@ +Hello ${message}! \ No newline at end of file