![JAR search and dependency download from the Maven repository](/logo.png)
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