package alien4cloud.tosca.serializer;
import java.io.IOException;
import java.io.Writer;
import java.util.Map;
import java.util.Map.Entry;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.runtime.RuntimeConstants;
import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
/**
* A velocity Util class
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class VelocityUtil {
private static final VelocityEngine VELOCITY_ENGINE;
static {
// ThreadSafe so can be shared
VELOCITY_ENGINE = new VelocityEngine();
VELOCITY_ENGINE.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
// here we use a classpath resource loader
VELOCITY_ENGINE.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
// we want template resources to be cached
VELOCITY_ENGINE.setProperty("classpath.resource.loader.cache", true);
VELOCITY_ENGINE.setProperty("runtime.log.logsystem.class", "org.apache.velocity.runtime.log.NullLogSystem");
VELOCITY_ENGINE.init();
}
public static void generate(String path, Writer outputWriter, Map<String, ?> properties) throws IOException {
Template template = VELOCITY_ENGINE.getTemplate(path, "UTF-8");
VelocityContext context = new VelocityContext();
for (Entry<String, ?> contextEntry : properties.entrySet()) {
context.put(contextEntry.getKey(), contextEntry.getValue());
}
context.put("utils", new ToscaSerializerUtils());
context.put("propertyUtils", new ToscaPropertySerializerUtils());
try {
template.merge(context, outputWriter);
} finally {
outputWriter.close();
}
}
}