All Downloads are FREE. Search and download functionalities are using the official Maven repository.

mtons.freemarker.handler.DirectiveHandler Maven / Gradle / Ivy

/*
+--------------------------------------------------------------------------
|   Mtons [#RELEASE_VERSION#]
|   ========================================
|   Copyright (c) 2014, 2015 mtons. All Rights Reserved
|   http://www.mtons.com
+---------------------------------------------------------------------------
*/
package mtons.freemarker.handler;

import freemarker.core.Environment;
import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import org.springframework.util.Assert;
import mtons.freemarker.DirectiveConsts;
import mtons.freemarker.utils.TemplateModelUtils;

import java.io.IOException;
import java.io.StringWriter;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * Directive 执行包装
 * 
 * Created by langhsu on 2015/10/2.
 */
public class DirectiveHandler extends BaseHandler {
	private Environment env;
	private Map parameters;
	private TemplateModel[] loopVars;
	private TemplateDirectiveBody body;
	private Environment.Namespace namespace;
	
	/**
	 * 构建 DirectiveHandler
	 * 
	 * @param env Environment
	 * @param parameters parameters
	 * @param loopVars loopVars
	 * @param body body
	 */
	public DirectiveHandler(Environment env, Map parameters, TemplateModel[] loopVars,
                            TemplateDirectiveBody body) {
		this.env = env;
		this.loopVars = loopVars;
		this.parameters = parameters;
		this.body = body;
		this.namespace = env.getCurrentNamespace();
	}

	@Override
	public void render() throws IOException, TemplateException {
		Assert.notNull(body, "must have template directive body");
		// 备份变量防止冲突导致变量丢失
		Map reduceMap = reduce();
		doRender();
		// 还原
		reduce(reduceMap);
	}

	@Override
	public void renderString(String text) throws Exception {
		StringWriter writer = new StringWriter();
		writer.append(text);
		env.getOut().write(text);
	}

	/**
	 * 执行渲染
	 * 
	 * @throws TemplateException 模板异常
	 * @throws IOException IO异常
	 */
	public void doRender() throws TemplateException, IOException {
		body.render(env.getOut());
	}
	
//	public TemplateHashModel getMap(String name) throws TemplateModelException {
//		return TemplateModelUtils.converMap(getModel(name));
//	}

	@Override
	public String getString(String name) throws TemplateModelException {
		return TemplateModelUtils.converString(getModel(name));
	}

	@Override
	public Integer getInteger(String name) throws TemplateModelException {
		return TemplateModelUtils.converInteger(getModel(name));
	}

	@Override
	public Short getShort(String name) throws TemplateModelException {
		return TemplateModelUtils.converShort(getModel(name));
	}

	@Override
	public Long getLong(String name) throws TemplateModelException {
		return TemplateModelUtils.converLong(getModel(name));
	}

	@Override
	public Double getDouble(String name) throws TemplateModelException {
		return TemplateModelUtils.converDouble(getModel(name));
	}

	@Override
	public String[] getStringArray(String name) throws TemplateModelException {
		return TemplateModelUtils.converStringArray(getModel(name));
	}

	@Override
	public Boolean getBoolean(String name) throws TemplateModelException {
		return TemplateModelUtils.converBoolean(getModel(name));
	}

	@Override
	public Date getDate(String name) throws TemplateModelException {
		return TemplateModelUtils.converDate(getModel(name));
	}

	@Override
	public String getContextPath() {
		String ret = null;
		try {
			ret =  TemplateModelUtils.converString(getEnvModel(DirectiveConsts.CONTEXT_PATH));
		} catch (TemplateModelException e) {
		}
		return ret;
	}

	/**
	 * 包装对象
	 * @param object 目标对象
	 * @return TemplateModel
	 * @throws TemplateModelException 模板异常
	 */
	public TemplateModel wrap(Object object) throws TemplateModelException {
		return env.getObjectWrapper().wrap(object);
	}

	/**
	 * 设置循环变量
	 * @param index 下标
	 * @param object 对象值
	 * @return 是否成功
	 * @throws TemplateModelException 模板异常
	 */
	public boolean setLoopVar(int index, Object object) throws TemplateModelException {
		if (loopVars != null && loopVars.length > index) {
			loopVars[index] = wrap(object);
			return true;
		}
		return false;
	}

	/**
	 * 获取局部变量
	 * @param name 键
	 * @return TemplateModel
	 * @throws TemplateModelException 模板异常
	 */
	public TemplateModel getEnvModel(String name) throws TemplateModelException {
		return env.getVariable(name);
	}

	public void write(String text) throws IOException {
		env.getOut().write(text);
	}

	private TemplateModel getModel(String name) {
		return parameters.get(name);
	}
	
	/**
	 * 备份
	 * 
	 * @return 老的模板变量
	 * @throws TemplateModelException 模板异常
	 */
	private Map reduce() throws TemplateModelException {
		Map reduceMap = new HashMap<>();
		for (String key : map.keySet()) {
			if (namespace.containsKey(key))
				reduceMap.put(key, namespace.get(key));
			namespace.put(key, wrap(map.get(key)));
		}
		return reduceMap;
	}
	
	/**
	 * 还原
	 * 
	 * @param reduceMap 老的模板变量
	 * @throws TemplateModelException
	 */
	private void reduce(Map reduceMap) throws TemplateModelException {
		for (String key : map.keySet()) {
			namespace.remove(key);
		}
		namespace.putAll(reduceMap);
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy