Skip to content

Instantly share code, notes, and snippets.

@joyheron
Last active September 12, 2018 02:02
Show Gist options
  • Save joyheron/8a60e27b97626774a21009a159f4791e to your computer and use it in GitHub Desktop.
Save joyheron/8a60e27b97626774a21009a159f4791e to your computer and use it in GitHub Desktop.
Complate String Render in Spring Boot
public class StringRenderer {
private static final String RENDER_FUNCTION_NAME = "render";
private final Resource resourceBundle;
private final ScriptingEngine engine;
public StringRenderer(Resource resourceBundle, ScriptingEngine engine) {
this.resourceBundle = resourceBundle;
this.engine = engine;
}
public String renderView(String viewName, Map<String, Object> model) {
StringWriter writer = new StringWriter();
this.engine.invoke(
this.resourceBundle,
RENDER_FUNCTION_NAME,
new WriterStream(writer),
viewName,
model);
return writer.toString();
}
public String renderView(ModelAndView modelAndView) {
return renderView(modelAndView.getViewName(), modelAndView.getModel());
}
static class WriterStream implements ComplateStream {
private final BufferedWriter writer;
WriterStream(Writer writer) {
this.writer = new BufferedWriter(writer);
}
@Override
public void write(String s) {
writer.write(s);
}
@Override
public void writeln(String line) {
writer.write(line);
writer.newLine();
}
@Override
public void flush() throws IOException {
writer.flush();
}
}
}
@Configuration
@EnableScheduling
class WebConfig implements WebMvcConfigurer {
@Bean
public ViewResolver complateViewResolver(@Value("${complate.bundle.path}") Resource complateBundle) {
return new ComplateViewResolver(scriptingEngine(), complateBundle);
}
@Bean
public StringRenderer stringRenderer(@Value("${complate.bundle.path}") Resource complateBundle) {
return new StringRenderer(complateBundle, scriptingEngine());
}
@Bean
public ScriptingEngine scriptingEngine() {
// This showcases how java classes can also be used from complate views
// via Nashorn bindings. In this case "logger" will be available in our views
final Map<String, Object> bindings = singletonMap("logger", LoggerFactory.getLogger(ComplateView.class));
return new NashornScriptingBridge(bindings);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment