package com.jeecms.cms.web;
import static com.jeecms.cms.Constants.RES_PATH;
import static com.jeecms.cms.Constants.TPLDIR_COMMON;
import static com.jeecms.cms.Constants.TPLDIR_STYLE_LIST;
import static com.jeecms.cms.Constants.TPLDIR_TAG;
import static com.jeecms.cms.Constants.TPL_STYLE_PAGE_CHANNEL;
import static com.jeecms.cms.Constants.TPL_SUFFIX;
import static com.jeecms.common.web.Constants.MESSAGE;
import static com.jeecms.common.web.Constants.UTF8;
import static com.jeecms.common.web.ProcessTimeFilter.START_TIME;
import static com.jeecms.common.web.freemarker.DirectiveUtils.PARAM_TPL_SUB;
import static com.jeecms.core.action.front.LoginAct.PROCESS_URL;
import java.io.IOException;
import java.util.Locale;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.propertyeditors.LocaleEditor;
import org.springframework.context.MessageSource;
import com.jeecms.cms.entity.main.CmsSite;
import com.jeecms.cms.entity.main.CmsUser;
import com.jeecms.common.web.RequestUtils;
import com.jeecms.common.web.freemarker.DirectiveUtils;
import com.jeecms.common.web.springmvc.MessageResolver;
import com.jeecms.core.web.front.URLHelper;
import com.jeecms.core.web.front.URLHelper.PageInfo;
import freemarker.core.Environment;
import freemarker.template.AdapterTemplateModel;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import freemarker.template.TemplateNumberModel;
/**
* 前台工具类
*
* @author liufang
*
*/
public class FrontUtils {
/**
* 页面没有找到
*/
public static final String PAGE_NOT_FOUND = "tpl.pageNotFound";
/**
* 操作成功页面
*/
public static final String SUCCESS_PAGE = "tpl.successPage";
/**
* 操作失败页面
*/
public static final String ERROR_PAGE = "tpl.errorPage";
/**
* 信息提示页面
*/
public static final String MESSAGE_PAGE = "tpl.messagePage";
/**
* 系统资源路径
*/
public static final String RES_SYS = "resSys";
/**
* 模板资源路径
*/
public static final String RES_TPL = "res";
/**
* 模板资源表达式
*/
public static final String RES_EXP = "${res}";
/**
* 部署路径
*/
public static final String BASE = "base";
/**
* 站点
*/
public static final String SITE = "site";
/**
* 用户
*/
public static final String USER = "user";
/**
* 页码
*/
public static final String PAGE_NO = "pageNo";
/**
* 总条数
*/
public static final String COUNT = "count";
/**
* 起始条数
*/
public static final String FIRST = "first";
/**
* 页面完整地址
*/
public static final String LOCATION = "location";
/**
* 页面翻页地址
*/
public static final String HREF = "href";
/**
* href前半部(相对于分页)
*/
public static final String HREF_FORMER = "hrefFormer";
/**
* href后半部(相对于分页)
*/
public static final String HREF_LATTER = "hrefLatter";
/**
* 传入参数,列表样式。
*/
public static final String PARAM_STYLE_LIST = "styleList";
/**
* 传入参数,系统预定义翻页。
*/
public static final String PARAM_SYS_PAGE = "sysPage";
/**
* 传入参数,用户自定义翻页。
*/
public static final String PARAM_USER_PAGE = "userPage";
/**
* 返回页面
*/
public static final String RETURN_URL = "returnUrl";
/**
* 国际化参数
*/
public static final String ARGS = "args";
/**
* 获得模板路径。将对模板文件名称进行本地化处理。
*
* @param request
* @param solution
* 方案路径
* @param dir
* 模板目录。不本地化处理。
* @param name
* 模板名称。本地化处理。
* @return
*/
public static String getTplPath(HttpServletRequest request,
String solution, String dir, String name) {
return solution + "/" + dir + "/"
+ MessageResolver.getMessage(request, name) + TPL_SUFFIX;
}
/**
* 获得模板路径。将对模板文件名称进行本地化处理。
*
* @param messageSource
* @param lang
* 本地化语言
* @param solution
* 方案路径
* @param dir
* 模板目录。不本地化处理。
* @param name
* 模板名称。本地化处理。
* @return
*/
public static String getTplPath(MessageSource messageSource, String lang,
String solution, String dir, String name) {
LocaleEditor localeEditor = new LocaleEditor();
localeEditor.setAsText(lang);
Locale locale = (Locale) localeEditor.getValue();
return solution + "/" + dir + "/"
+ messageSource.getMessage(name, null, locale) + TPL_SUFFIX;
}
/**
* 获得模板路径。不对模板文件进行本地化处理。
*
* @param solution
* 方案路径
* @param dir
* 模板目录。不本地化处理。
* @param name
* 模板名称。不本地化处理。
* @return
*/
public static String getTplPath(String solution, String dir, String name) {
return solution + "/" + dir + "/" + name + TPL_SUFFIX;
}
/**
* 页面没有找到
*
* @param request
* @param response
* @return 返回“页面没有找到”的模板
*/
public static String pageNotFound(HttpServletRequest request,
HttpServletResponse response, Map<String, Object> model) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
CmsSite site = CmsUtils.getSite(request);
frontData(request, model, site);
return getTplPath(request, site.getSolutionPath(), TPLDIR_COMMON,
PAGE_NOT_FOUND);
}
/**
* 成功提示页面
*
* @param request
* @param model
* @return
*/
public static String showSuccess(HttpServletRequest request,
Map<String, Object> model, String nextUrl) {
CmsSite site = CmsUtils.getSite(request);
frontData(request, model, site);
if (!StringUtils.isBlank(nextUrl)) {
model.put("nextUrl", nextUrl);
}
return getTplPath(request, site.getSolutionPath(), TPLDIR_COMMON,
SUCCESS_PAGE);
}
/**
* 错误提示页面
*
* @param request
* @param response
* @param model
* @return
*/
public static String showError(HttpServletRequest request,
HttpServletResponse response, Map<String, Object> model,
WebErrors errors) {
CmsSite site = CmsUtils.getSite(request);
frontData(request, model, site);
errors.toModel(model);
return getTplPath(request, site.getSolutionPath(), TPLDIR_COMMON,
ERROR_PAGE);
}
/**
* 信息提示页面
*
* @param request
* @param model
* @param message
* 进行国际化处理
* @return
*/
public static String showMessage(HttpServletRequest request,
Map<String, Object> model, String message, String... args) {
CmsSite site = CmsUtils.getSite(request);
frontData(request, model, site);
model.put(MESSAGE, message);
if (args != null) {
model.put(ARGS, args);
}
return getTplPath(request, site.getSolutionPath(), TPLDIR_COMMON,
MESSAGE_PAGE);
}
/**
* 显示登录页面
*
* @param request
* @param model
* @param site
* @param message
* @return
*/
public static String showLogin(HttpServletRequest request,
Map<String, Object> model, CmsSite site, String message) {
if (!StringUtils.isBlank(message)) {
model.put(MESSAGE, message);
}
StringBuilder buff = new StringBuilder("redirect:");
buff.append(site.getLoginUrl()).append("?");
buff.append(RETURN_URL).append("=");
buff.append(RequestUtils.getLocation(request));
if (!StringUtils.isBlank(site.getProcessUrl())) {
buff.append("&").append(PROCESS_URL).append(site.getProcessUrl());
}
return buff.toString();
}
/**
* 显示登录页面
*
* @param request
* @param model
* @param site
* @return
*/
public static String showLogin(HttpServletRequest request,
Map<String, Object> model, CmsSite site) {
return showLogin(request, model, site, "true");
}
/**
* 为前台模板设置公用数据
*
* @param request
* @param model
*/
public static void frontData(HttpServletRequest request,
Map<String, Object> map, CmsSite site) {
CmsUser user = CmsUtils.getUser(request);
String location = RequestUtils.getLocation(request);
Long startTime = (Long) request.getAttribute(START_TIME);
frontData(map, site, user, location, startTime);
}
public static void frontData(Map<String, Object> map, CmsSite site,
CmsUser user, String location, Long startTime) {
if (startTime != null) {
map.put(START_TIME, startTime);
}
if (user != null) {
map.put(USER, user);
}
map.put(SITE, site);
String ctx = site.getContextPath() == null ? "" : site.getContextPath();
map.put(BASE, ctx);
map.put(RES_SYS, ctx + RES_PATH);
String res = ctx + RES_PATH + "/" + site.getPath() + "/"
+ site.getTplSolution();
// res路径需要去除第一个字符'/'
map.put(RES_TPL, res.substring(1));
map.put(LOCATION, location);
}
public static void putLocation(Map<String, Object> map, String location) {
map.put(LOCATION, location);
}
/**
* 为前台模板设置分页相关数据
*
* @param request
* @param map
*/
public static void frontPageData(HttpServletRequest request,
Map<String, Object> map) {
int pageNo = URLHelper.getPageNo(request);
PageInfo info = URLHelper.getPageInfo(request);
String href = info.getHref();
String hrefFormer = info.getHrefFormer();
String hrefLatter = info.getHrefLatter();
frontPageData(pageNo, href, hrefFormer, hrefLatter, map);
}
/**
* 为前台模板设置分页相关数据
*
* @param pageNo
* @param href
* @param urlFormer
* @param urlLatter
* @param map
*/
public static void frontPageData(int pageNo, String href,
String hrefFormer, String hrefLatter, Map<String, Object> map) {
map.put(PAGE_NO, pageNo);
map.put(HREF, href);
map.put(HREF_FORMER, hrefFormer);
map.put(HREF_LATTER, hrefLatter);
}
/**
* 标签中获得站点
*
* @param env
* @return
* @throws TemplateModelException
*/
public static CmsSite getSite(Environment env)
throws TemplateModelException {
TemplateModel model = env.getGlobalVariable(SITE);
if (model instanceof AdapterTemplateModel) {
return (CmsSite) ((AdapterTemplateModel) model)
.getAdaptedObject(CmsSite.class);
} else {
throw new TemplateModelException("'" + SITE
+ "' not found in DataModel");
}
}
/**
* 标签中获得页码
*
* @param env
* @return
* @throws TemplateException
*/
public static int getPageNo(Environment env) throws TemplateException {
TemplateModel pageNo = env.getGlobalVariable(PAGE_NO);
if (pageNo instanceof TemplateNumberModel) {
return ((TemplateNumberModel) pageNo).getAsNumber().intValue();
} else {
throw new TemplateModelException("'" + PAGE_NO
+ "' not found in DataModel.");
}
}
public static int getFirst(Map<String, TemplateModel> params)
throws TemplateException {
Integer first = DirectiveUtils.getInt(FIRST, params);
if (first == null || first <= 0) {
return 0;
} else {
return first - 1;
}
}
/**
* 标签参数中获得条数。
*
* @param params
* @return 如果不存在,或者小于等于0,或者大于5000则返回5000;否则返回条数。
* @throws TemplateException
*/
public static int getCount(Map<String, TemplateModel> params)
throws TemplateException {
Integer count = DirectiveUtils.getInt(COUNT, params);
if (count == null || count <= 0 || count >= 5000) {
return 5000;
} else {
return count;
}
}
public static void includePagination(CmsSite site,
Map<String, TemplateModel> params, Environment env)
throws TemplateException, IOException {
String sysPage = DirectiveUtils.getString(PARAM_SYS_PAGE, params);
String userPage = DirectiveUtils.getString(PARAM_USER_PAGE, params);
if (!StringUtils.isBlank(sysPage)) {
String tpl = TPL_STYLE_PAGE_CHANNEL + sysPage + TPL_SUFFIX;
env.include(tpl, UTF8, true);
} else if (!StringUtils.isBlank(userPage)) {
String tpl = getTplPath(site.getSolutionPath(), TPLDIR_STYLE_LIST,
userPage);
env.include(tpl, UTF8, true);
} else {
// 没有包含分页
}
}
/**
* 标签中包含页面
*
* @param tplName
* @param site
* @param params
* @param env
* @throws IOException
* @throws TemplateException
*/
public static void includeTpl(String tplName, CmsSite site,
Map<String, TemplateModel> params, Environment env)
throws IOException, TemplateException {
String subTpl = DirectiveUtils.getString(PARAM_TPL_SUB, params);
String tpl;
if (StringUtils.isBlank(subTpl)) {
tpl = getTplPath(site.getSolutionPath(), TPLDIR_TAG, tplName);
} else {
tpl = getTplPath(site.getSolutionPath(), TPLDIR_TAG, tplName + "_"
+ subTpl);
}
env.include(tpl, UTF8, true);
}
/**
* 标签中包含用户预定义列表样式模板
*
* @param listStyle
* @param site
* @param env
* @throws IOException
* @throws TemplateException
*/
public static void includeTpl(String listStyle, CmsSite site,
Environment env) throws IOException, TemplateException {
String tpl = getTplPath(site.getSolutionPath(), TPLDIR_STYLE_LIST,
listStyle);
env.include(tpl, UTF8, true);
}
}