/**
* 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.uri;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.io.FilenameUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;
import com.ewcms.publication.PublishException;
import com.ewcms.publication.freemarker.GlobalVariable;
/**
* 实现统一资源地址规则实现
*
* @author wangwei
*/
public class UriRule implements UriRuleable{
private static final Logger logger = LoggerFactory.getLogger(UriRule.class);
private static final DateFormat DEFAULT_DATA_FORMAT =new SimpleDateFormat("yyyy-MM-dd");
private static final DecimalFormat DEFAULT_NUMBER_FORMAT = new DecimalFormat("#");
private static final Map<String,String> ALIAS_PARAMETERS = initAliasParameters();
private final RuleParseable ruleParse ;
private Map<String,Object> parameters = initParameters();
public UriRule(RuleParseable ruleParse){
this.ruleParse = ruleParse;
}
@Override
public void setParameters(Map<String,Object> ps){
parameters.putAll(ps);
}
@Override
public void putParameter(String parameter,Object value){
parameters.put(parameter, value);
}
@Override
public String getPatter(){
return ruleParse.getPatter();
}
@Override
public String getUri()throws PublishException {
Assert.notNull(parameters);
Map<String,String> variables = ruleParse.getVariables();
if(variables.isEmpty()){
return ruleParse.getPatter();
}
String uri = ruleParse.getPatter();
for(String name : variables.keySet()){
String format = variables.get(name);
String exp =
(format == null ?
String.format("${%s}", name):
String.format("${%s?%s}", name,format));
Object value = getVariableValue(name,parameters);
String formatValue = formatValue(value,format);
uri = StringUtils.replace(uri, exp, formatValue);
}
uri = uri.replace("\\", "/").replace("//", "/");
return FilenameUtils.normalize(uri);
}
/**
* 初始化参数列表
*/
private Map<String,Object> initParameters(){
Map<String,Object> map = new HashMap<String,Object>();
map.put("now", new Date());
return map;
}
/**
* 得到变量的值
*
* @param variable 变量名称
* @param parameters 参数集合
* @return 变量值
* @throws PublishException
*/
Object getVariableValue(String variable,Map<String,Object> parameters)throws PublishException {
logger.debug("Variable is {}",variable);
String p = StringUtils.splitPreserveAllTokens(variable,".")[0];
logger.debug("Parameter name is {}",p);
String parameter = ALIAS_PARAMETERS.get(p);
if(parameter == null){
logger.warn("\"{}\" parameter is not exist",p);
parameter = p;
}
Object object = parameters.get(parameter);
if(object == null){
logger.error("\"{}\" parameter is not exist",parameter);
throw new PublishException(variable + " is not exist");
}
try{
if(!p.equals(variable)){
String property = StringUtils.removeStart(variable, p + ".");
logger.debug("Property name is {}",property);
return PropertyUtils.getProperty(object, property);
}else{
return object;
}
}catch(Exception e){
logger.error("Get variable value is error:{}",e.toString());
throw new PublishException(e);
}
}
/**
* 格式化输出值
*
* @param value 值
* @param patter 格式模式
* @return 格式后字符串
*/
String formatValue(Object value,String patter){
logger.debug("Format type is {}",value.getClass().getName());
if(value instanceof Date){
if(patter == null || patter.length() == 0){
return DEFAULT_DATA_FORMAT.format(value);
}else{
DateFormat dateFormat = new SimpleDateFormat(patter);
return dateFormat.format(value);
}
}else if(value instanceof Number){
if(patter == null || patter.length() == 0){
return DEFAULT_NUMBER_FORMAT.format(value);
}else{
DecimalFormat numberFormat = new DecimalFormat(patter);
return numberFormat.format(value);
}
}else{
return value.toString();
}
}
private static Map<String,String> initAliasParameters(){
Map<String,String> map = new HashMap<String,String>();
map.put("a", GlobalVariable.ARTICLE.toString());
map.put("c", GlobalVariable.CHANNEL.toString());
map.put("s", GlobalVariable.SITE.toString());
map.put("p", GlobalVariable.PAGE_NUMBER.toString());
map.put("article", GlobalVariable.ARTICLE.toString());
map.put("channel", GlobalVariable.CHANNEL.toString());
map.put("site", GlobalVariable.SITE.toString());
map.put("page", GlobalVariable.PAGE_NUMBER.toString());
map.put("文章", GlobalVariable.ARTICLE.toString());
map.put("频道", GlobalVariable.CHANNEL.toString());
map.put("站点", GlobalVariable.SITE.toString());
map.put("页数", GlobalVariable.PAGE_NUMBER.toString());
map.put(GlobalVariable.ARTICLE.toString(), GlobalVariable.ARTICLE.toString());
map.put(GlobalVariable.CHANNEL.toString(), GlobalVariable.CHANNEL.toString());
map.put(GlobalVariable.SITE.toString(), GlobalVariable.SITE.toString());
map.put(GlobalVariable.PAGE_NUMBER.toString(), GlobalVariable.PAGE_NUMBER.toString());
map.put("now", "now");
map.put("today", "now");
return map;
}
}