package com.jspxcms.core.web.directive;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import com.jspxcms.common.freemarker.Freemarkers;
import com.jspxcms.common.orm.Limitable;
import com.jspxcms.core.domain.Node;
import com.jspxcms.core.service.NodeQueryService;
import com.jspxcms.core.support.ForeContext;
import freemarker.core.Environment;
import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
/**
* 节点列表标签、节点分页标签公共父类
*
* @author liufang
*
*/
public abstract class AbstractNodeListPageDirective {
/**
* 站点ID。整型。
*/
public static final String SITE_ID = "siteId";
/**
* 父节点ID。整型。
*/
public static final String PARENT_ID = "parentId";
/**
* 父节点编码。字符串。
*/
public static final String PARENT = "parent";
/**
* 是否前台隐藏。布尔型。
*/
public static final String IS_HIDDEN = "isHidden";
/**
* 是否真实节点(是否有信息的节点)。布尔型。
*/
public static final String IS_REAL_NODE = "isRealNode";
/**
* 是否包含子节点。布尔型。
*/
public static final String IS_INCLUDE_CHILDREN = "isIncludeChildren";
@SuppressWarnings({ "unchecked", "rawtypes" })
public void doExecute(Environment env, Map params,
TemplateModel[] loopVars, TemplateDirectiveBody body, boolean isPage)
throws TemplateException, IOException {
if (loopVars.length < 1) {
throw new TemplateModelException("Loop variable is required.");
}
if (body == null) {
throw new RuntimeException("missing body");
}
Integer parentId = Freemarkers.getInteger(params, PARENT_ID);
String parent = Freemarkers.getString(params, PARENT);
if (parentId == null) {
Integer sid = ForeContext.getSiteId(env);
if (StringUtils.isNotBlank(parent)) {
Node pnode = service.findByNumber(sid, parent);
if (pnode != null) {
parentId = pnode.getId();
}
} else {
Node root = service.findRoot(sid);
if (root != null) {
parentId = root.getId();
}
}
}
Boolean isHidden = Freemarkers.getBoolean(params, IS_HIDDEN);
if (isHidden == null && params.get(IS_HIDDEN) == null) {
isHidden = false;
}
Boolean isRealNode = Freemarkers.getBoolean(params, IS_REAL_NODE);
boolean isIncludeChildren = Freemarkers.getBoolean(params,
IS_INCLUDE_CHILDREN, false);
String treeNumber = null;
if (isIncludeChildren && parentId != null) {
Node pnode = service.get(parentId);
if (pnode != null) {
treeNumber = pnode.getTreeNumber();
}
parentId = null;
}
Integer[] siteId = Freemarkers.getIntegers(params, SITE_ID);
if (siteId == null && parentId == null
&& StringUtils.isBlank(treeNumber)) {
siteId = new Integer[] { ForeContext.getSiteId(env) };
}
Sort defSort = new Sort("treeNumber");
if (isPage) {
Pageable pageable = Freemarkers.getPageable(params, env, defSort);
Page<Node> pagedList = service.findPage(siteId, parentId,
treeNumber, isRealNode, isHidden, pageable);
ForeContext.setTotalPages(pagedList.getTotalPages());
loopVars[0] = env.getObjectWrapper().wrap(pagedList);
} else {
Limitable limitable = Freemarkers.getLimitable(params, defSort);
List<Node> list = service.findList(siteId, parentId, treeNumber,
isRealNode, isHidden, limitable);
loopVars[0] = env.getObjectWrapper().wrap(list);
body.render(env.getOut());
}
}
@Autowired
private NodeQueryService service;
}