/**
* 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.component;
import java.io.IOException;
import java.util.Map;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
import com.ewcms.content.document.model.Article;
import com.ewcms.publication.freemarker.FreemarkerUtil;
import com.ewcms.publication.freemarker.GlobalVariable;
import com.ewcms.publication.freemarker.directive.PropertyDirective;
import freemarker.core.Environment;
import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
/**
* 当使用callback参数时,elementId参数将失效。
*
* @author wangwei
*/
// TODO 是否可以通过统计分析替代
public class CountDirective extends PropertyDirective {
// private static final Logger logger = LoggerFactory.getLogger(CountDirective.class);
private static final String PARAM_ELEMENT_ID_VALUE = "elementId";
private static final String PARAM_CALLBACK_VALUE = "callback";
private static final String PARAM_URL_VALUE = "url";
private static final String DEFAULT_CALLBACK_NAME = "browse_count_callback";
private static final String DEFAULT_ELEMENT_ID = "browse_count_element_id";
private static final String DEFAULT_URL = "/component/counter";
private String elementId;
private String callback;
private String url;
@SuppressWarnings("rawtypes")
@Override
public void execute(final Environment env, final Map params, final TemplateModel[] loopVars, final TemplateDirectiveBody body)
throws TemplateException, IOException {
elementId = getParamValue(params, PARAM_ELEMENT_ID_VALUE);
callback = getParamValue(params, PARAM_CALLBACK_VALUE);
url = getParamValue(params, PARAM_URL_VALUE);
body.render(env.getOut());
}
@SuppressWarnings("rawtypes")
@Override
protected String constructOut(Object objectValue,String propertyName,Environment env, Map params)throws TemplateException, NoSuchMethodException{
StringBuilder builder = new StringBuilder();
if (elementId == null && callback == null) {
elementId = DEFAULT_ELEMENT_ID;
builder.append("<span id='").append(DEFAULT_ELEMENT_ID)
.append("'></span>");
}
if (callback == null) {
callback = DEFAULT_CALLBACK_NAME;
builder.append(createDefaultCallBackFunction(elementId));
}
Article article = (Article) FreemarkerUtil.getBean(env, defaultValueParamValue());
String src = getSrc(article, callback);
builder.append("<script type='text/javascript' src='").append(src)
.append("'>");
builder.append("</script>");
return builder.toString();
}
private String createDefaultCallBackFunction(final String elementId) {
StringBuilder builder = new StringBuilder();
builder.append("<script type=\"text/javascript\">\n");
builder.append("function ").append(DEFAULT_CALLBACK_NAME)
.append("(count){\n");
builder.append("document.getElementById('").append(elementId)
.append("').innerHTML = count;\n");
builder.append("}\n");
builder.append("</script>\n");
return builder.toString();
}
@SuppressWarnings("rawtypes")
private String getParamValue(final Map params, final String name) throws TemplateException {
return FreemarkerUtil.getString(params, name);
}
private String getSrc(Article articleRmc, final String callback) {
url = (url == null ? DEFAULT_URL : url);
int id = articleRmc.getId().intValue();
return String.format("%s?article_id=%d&callback=%s", url, id, callback);
}
@Override
protected String defaultValueParamValue(){
return GlobalVariable.ARTICLE.toString();
}
}