/**
* Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved.
* EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
* http://www.ewcms.com
*/
package com.ewcms.publication.freemarker.directive;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ewcms.common.lang.EmptyUtil;
import com.ewcms.core.site.model.Channel;
import com.ewcms.publication.freemarker.FreemarkerUtil;
import com.ewcms.publication.freemarker.GlobalVariable;
import freemarker.core.Environment;
import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
/**
* 生成页面所在位置标签
*
* @author wangwei
*/
public class PositionDirective implements TemplateDirectiveModel {
private final static Logger logger = LoggerFactory.getLogger(PositionDirective.class);
private static final String VALUE_PARAM_NAME = "value";
private static final String NAME_PARAM_NAME = "name";
private static final String MARK_PARAM_NAME = "mark";
private static final String DEFAULT_MARK = ">";
private String valueParam = VALUE_PARAM_NAME;
private String nameParam = NAME_PARAM_NAME;
private String markParam = MARK_PARAM_NAME;
@SuppressWarnings("rawtypes")
@Override
public void execute(Environment env, Map params, TemplateModel[] loopVars,
TemplateDirectiveBody body) throws TemplateException, IOException {
List<Channel> levels = getChannelLevels(getChannel(env,params));
if (EmptyUtil.isArrayNotEmpty(loopVars)) {
loopVars[0] = env.getObjectWrapper().wrap(levels);
if (EmptyUtil.isNull(body)) {
logger.warn("Position body is null");
} else {
body.render(env.getOut());
}
} else if (EmptyUtil.isNotNull(body)) {
Writer writer = env.getOut();
String name = getNameValue(params);
String mark = getMarkValue(params);
for (Iterator<Channel> iterator = levels.iterator(); iterator.hasNext();) {
Channel channel = iterator.next();
FreemarkerUtil.setVariable(env, name, channel);
body.render(writer);
if (iterator.hasNext()) {
writer.write(mark);
}
writer.flush();
FreemarkerUtil.removeVariable(env, name);
}
} else {
StringBuilder builder = new StringBuilder();
String mark = getMarkValue(params);
for (Iterator<Channel> iterator = levels.iterator(); iterator.hasNext();) {
Channel channel = iterator.next();
if (channel.getAbsUrl() == null || channel.getAbsUrl().trim().length() == 0){
builder.append("<a href=\"/").append("\">");
}else{
builder.append("<a href=\"").append(channel.getAbsUrl()).append("\">");
}
builder.append(channel.getName());
builder.append("</a>");
if (iterator.hasNext()) {
builder.append(mark);
}
}
Writer writer = env.getOut();
writer.write(builder.toString());
writer.flush();
}
}
/**
* 得到当前频道
*
* @param env
* Freemarker 环境对象
* @param params
* 标签参数集合
* @return
* @throws TemplateException
*/
@SuppressWarnings("rawtypes")
private Channel getChannel(Environment env,Map params) throws TemplateException {
Channel channel = (Channel)FreemarkerUtil.getBean(params, valueParam);
if (EmptyUtil.isNotNull(channel)) {
logger.debug("Get channel is {}",channel);
return channel;
}
String name = FreemarkerUtil.getString(params, valueParam);
logger.debug("Get variable is {} in params",name);
if(EmptyUtil.isNull(name)){
name = FreemarkerUtil.getString(env, valueParam);
logger.debug("Get variable is {} in env",name);
}
if(EmptyUtil.isNull(name)){
name = GlobalVariable.CHANNEL.toString();
}
logger.debug("Get value param is {}", name);
channel = (Channel)FreemarkerUtil.getBean(env, name);
if (EmptyUtil.isNull(channel)) {
logger.error("Channel is null in freemarker variable");
throw new TemplateModelException("Channel is null in freemarker variable");
}
return channel;
}
/**
* 得到各级频道
*
* @param channel
* 当前频道
* @return
*/
private List<Channel> getChannelLevels(final Channel channel) {
List<Channel> levels = new ArrayList<Channel>();
for (Channel c = channel; EmptyUtil.isNotNull(c); c = c.getParent()) {
if (c.getAbsUrl() == null || c.getAbsUrl().trim().length() == 0){
c.setAbsUrl("/");
}
levels.add(0, c);
}
return levels;
}
/**
* 得到变量名参数值
*
* @param params
* 标签参数
* @return
* @throws TemplateModelException
*/
@SuppressWarnings("rawtypes")
private String getNameValue(Map params) throws TemplateException {
String value = FreemarkerUtil.getString(params, nameParam);
logger.debug("Get name is {}",value);
if (EmptyUtil.isNull(value)) {
return GlobalVariable.CHANNEL.toString();
}
return value;
}
/**
* 得到分割符
*
* @param params
* 标签参数
* @return 分割符
* @throws TemplateException
*/
@SuppressWarnings("rawtypes")
private String getMarkValue(Map params) throws TemplateException {
String value = FreemarkerUtil.getString(params, markParam);
logger.debug("Get mark is {}",value);
if (EmptyUtil.isNull(value)) {
return DEFAULT_MARK;
}
return value;
}
/**
* 设置设置频道值参数名
*
* @param valueParam
*/
public void setValueParam(String valueParam){
this.valueParam = valueParam;
}
/**
* 设置频道变量名的参数名
*
* @param nameParam
* 参数名
*/
public void setNameParam(String nameParam) {
this.nameParam = nameParam;
}
/**
* 设置频道间分割符参数名
*
* @param markParam
* 参数名
*/
public void setMarkParam(String markParam) {
this.markParam = markParam;
}
}