Velocity is a feature rich template engine for Java applications. This engine is mainly designed to have template files which then will be rendered into OutputStreams using a context. But you can also extend velocity to use in memory or database stored templates.
First you have to register your own ResourceLoader at the VelocityEngine:
final VelocityEngine ve = new VelocityEngine(); ve.setProperty("yamltemplates.resource.loader.class", YamlTemplateResourceLoader.class.getName()); ve.setProperty("yamltemplates.resource.loader.templatefile", templateFile); ve.setProperty(VelocityEngine.RESOURCE_LOADER, "yamltemplates"); ve.setProperty(VelocityEngine.INPUT_ENCODING, "UTF-8"); ve.init();
Then you can implement your ResourceLoader:
public class YamlTemplateResourceLoader extends ResourceLoader { private Map<String, Object> templateData; @Override public void init(final ExtProperties configuration) { try { try (InputStream data = (InputStream) configuration.get("templatefile")) { Yaml yaml = new Yaml(); templateData = yaml.load(data); } } catch (IOException e) { throw new RuntimeException(e); } } @Override public Reader getResourceReader(final String source, final String encoding) throws ResourceNotFoundException { try { if ("velocimacros.vtl".equals(source)) { return buildReader(new ByteArrayInputStream(new byte[0]), encoding); } Object template = templateData.get(source); if (template == null) { throw new ResourceNotFoundException(source); } if (template instanceof String) { return new StringReader((String) template); } throw new RuntimeException("cannot handle " + template); } catch (IOException e) { throw new RuntimeException(e); } } @Override public boolean isSourceModified(final Resource resource) { return false; } @Override public long getLastModified(final Resource resource) { return 0; } }
Last but not least you can render your templates like any other templates with Velocity:
StringWriter stringWriter = new StringWriter(); VelocityContext context = new VelocityContext(); context.put("myparam", "Hello World!"); contextSetup.setupContext(context); ve.getTemplate(templateName).merge(context, stringWriter); String result = stringWriter.toString();
}