/** * 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.page; import java.io.IOException; import java.io.Writer; import java.util.ArrayList; import java.util.HashMap; 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.publication.freemarker.FreemarkerUtil; import com.ewcms.publication.freemarker.GlobalVariable; import com.ewcms.publication.uri.UriRuleable; import freemarker.core.Environment; import freemarker.template.TemplateDirectiveBody; import freemarker.template.TemplateException; import freemarker.template.TemplateModel; import freemarker.template.TemplateModelException; /** * 页面跳转标签 * * @author wangwei */ public class SkipDirective extends SkipBaseDirective{ private static final Logger logger = LoggerFactory.getLogger(SkipDirective.class); private static final Map<String,SkipPageable> mapSkips = initTypeMapSkips(); private static final String TYPE_PARAM_NAME = "type"; private static final String LABEL_PARAM_NAME = "label"; private String typeParam = TYPE_PARAM_NAME; private String labelParam = LABEL_PARAM_NAME; @SuppressWarnings("rawtypes") @Override public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { Integer pageNumber = getPageNumberValue(env); logger.debug("Page number is {}",pageNumber); Integer pageCount = getPageCountValue(env); logger.debug("Page count is {}",pageCount); String label = getLabelValue(params); logger.debug("Label is {}",label); if (pageCount == 1) { return; } String type = getTypeValue(params); SkipPageable skip = getSkipPage(type); UriRuleable rule = getUriRule(env); PageOut pageOut = skip.skip(pageCount, pageNumber, label, rule); if (EmptyUtil.isArrayNotEmpty(loopVars)) { loopVars[0] = env.getObjectWrapper().wrap(pageOut); if(EmptyUtil.isNull(body)){ logger.warn("Body is null"); }else{ body.render(env.getOut()); env.getOut().flush(); } } else if(EmptyUtil.isNotNull(body)){ Writer writer = env.getOut(); FreemarkerUtil.setVariable(env, GlobalVariable.PAGE_OUT.toString(),pageOut); body.render(writer); FreemarkerUtil.removeVariable(env, GlobalVariable.PAGE_OUT.toString()); }else{ List<PageOut> pages = new ArrayList<PageOut>(); pages.add(pageOut); String outValue = constructOut(pages); if(EmptyUtil.isNotNull(outValue)){ Writer out = env.getOut(); out.write(outValue.toString()); out.flush(); } } } @SuppressWarnings("rawtypes") private String getTypeValue(Map params) throws TemplateException { String value = FreemarkerUtil.getString(params, typeParam); if (EmptyUtil.isNull(value)) { throw new TemplateModelException("Type must setting."); } return value; } @SuppressWarnings("rawtypes") private String getLabelValue(Map params) throws TemplateException { return FreemarkerUtil.getString(params, labelParam); } SkipPageable getSkipPage(String type)throws TemplateException{ SkipPageable skipPage = mapSkips.get(type); if(EmptyUtil.isNull(skipPage)){ logger.error("Skip page has not {} of types",type); throw new TemplateModelException("Skip page has not " + type + "of types."); } return skipPage; } static Map<String,SkipPageable> initTypeMapSkips(){ Map<String,SkipPageable> map = new HashMap<String,SkipPageable>(); map.put("f",new SkipPageFirst()); map.put("first", new SkipPageFirst()); map.put("首", new SkipPageFirst()); map.put("首页", new SkipPageFirst()); map.put("p", new SkipPagePrevious()); map.put("prev", new SkipPagePrevious()); map.put("上", new SkipPagePrevious()); map.put("上一页", new SkipPagePrevious()); map.put("n", new SkipPageNext()); map.put("next", new SkipPageNext()); map.put("下", new SkipPageNext()); map.put("下一页", new SkipPageNext()); map.put("l", new SkipPageLast()); map.put("last", new SkipPageLast()); map.put("末", new SkipPageLast()); map.put("末页", new SkipPageLast()); return map; } }