package cn.org.rapid_framework.pipeline; import java.io.StringWriter; import java.io.Writer; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.StringUtils; import cn.org.rapid_framework.util.StringTokenizerUtils; import freemarker.core.Environment; import freemarker.template.Configuration; import freemarker.template.Template; /** * @see Pipeline * @author badqiu */ public class FreemarkerPipeline implements Pipeline{ private Configuration conf; private int bufferSize = DEFAULT_PIPELINE_BUFFER_SIZE; public FreemarkerPipeline(){} public FreemarkerPipeline(Configuration conf) { setConfiguration(conf); } public Configuration getConfiguration() { return conf; } public void setConfiguration(Configuration conf) { this.conf = conf; } public int getBufferSize() { return bufferSize; } public void setBufferSize(int bufferSize) { this.bufferSize = bufferSize; } public Writer pipeline(String pipeTemplates[],Object rootMap,Writer writer) throws PipeException { try { Map globalContext = new HashMap(); for(int i = 0; i < pipeTemplates.length; i++) { String templateName = pipeTemplates[i]; boolean isLastTemplate = i == pipeTemplates.length - 1; try { Template template = conf.getTemplate(templateName); if(isLastTemplate) { Environment env = template.createProcessingEnvironment(rootMap, writer); env.getCurrentNamespace().putAll(globalContext); env.process(); }else { Writer tempOutput = new StringWriter(bufferSize); Environment env = template.createProcessingEnvironment(rootMap, tempOutput); env.getCurrentNamespace().putAll(globalContext); env.process(); globalContext.putAll(env.getCurrentNamespace().toMap()); globalContext.put(Pipeline.PIPELINE_CONTENT_VAR_NAME, tempOutput.toString()); } }catch(Exception e){ handleException(e,templateName,isLastTemplate); } } return writer; }catch(Exception e) { throw new PipeException("process FreeMarker template occer exception,pipeTemplates:"+StringUtils.join(pipeTemplates," | "),e); } } public void handleException(Exception e, String templateName,boolean isLastTemplate) throws Exception { throw e; } public Writer pipeline(String[] pipeTemplates, Map model, Writer writer) throws PipeException { return pipeline(pipeTemplates, (Object)model, writer); } public Writer pipeline(String pipeTemplates,Object rootMap,Writer writer) { return pipeline(StringTokenizerUtils.split(pipeTemplates,Pipeline.PIPELINE_TEMPLATE_SEPERATORS), rootMap, writer); } public Writer pipeline(String pipeTemplates, Map model, Writer writer)throws PipeException { return pipeline(pipeTemplates, (Object)model, writer); } }