/* See LICENSE for licensing and NOTICE for copyright. */ package org.ldaptive.velocity; import java.io.StringWriter; import java.nio.charset.StandardCharsets; import java.util.UUID; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.exception.VelocityException; import org.apache.velocity.runtime.resource.loader.StringResourceLoader; import org.apache.velocity.runtime.resource.util.StringResourceRepository; /** * Class that encapsulates the details of merging a velocity template with a context. * * @author Middleware Services */ public class Template { /** VelocityEngine. */ private final VelocityEngine velocityEngine; /** Template name registered in the velocity repository. */ private final String templateName; /** * Creates a new template search DN resolver. * * @param engine velocity engine * @param template template text * * @throws VelocityException if velocity is not configured properly or the filter template is invalid */ public Template(final VelocityEngine engine, final String template) throws VelocityException { // generate a template name and register it final StringResourceRepository repository = StringResourceLoader.getRepository(); if (repository == null) { throw new VelocityException( "Velocity engine is not configured to load templates from the default StringResourceRepository"); } templateName = generateTemplateName(repository); repository.putStringResource(templateName, template, StandardCharsets.UTF_8.name()); // confirm velocity is configured if (!engine.resourceExists(templateName)) { throw new VelocityException( "Velocity engine is not configured to load templates from the default StringResourceRepository"); } else { try { engine.getTemplate(templateName); } catch (VelocityException e) { throw new VelocityException("Invalid template: " + template, e); } } velocityEngine = engine; } /** * Returns the template name. * * @return template name */ public String getTemplateName() { return templateName; } /** * Returns a template name to use in the supplied repository. The name is selected by generating a random string and * confirming that name is not in use. * * @param repository to store the template name * * @return template name */ protected String generateTemplateName(final StringResourceRepository repository) { String name; do { name = UUID.randomUUID().toString(); } while(repository.getStringResource(name) != null); return name; } /** * Merges {@link #templateName} with the supplied context. See {@link * VelocityEngine#mergeTemplate(String, String, Context, Writer)}. * * @param context to merge * * @return merged filter template */ public String merge(final VelocityContext context) { final StringWriter writer = new StringWriter(); velocityEngine.mergeTemplate(templateName, StandardCharsets.UTF_8.name(), context, writer); return writer.toString(); } }