/*
 * Copyright 2013 gitblit.com.
 *
 * 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 com.gitblit.wicket.freemarker;

import java.io.IOException;
import java.io.Writer;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class Freemarker {

	private static final Configuration fm;

	static {
		fm = new Configuration();
		fm.setObjectWrapper(new DefaultObjectWrapper());
		fm.setOutputEncoding("UTF-8");
		fm.setClassForTemplateLoading(Freemarker.class, "templates");
	}

	public static Template getTemplate(String name) throws IOException {
		return fm.getTemplate(name);
	}

	public static void evaluate(Template template, Map<String, Object> values, Writer out) throws TemplateException, IOException {
		template.process(values, out);
	}

}
