package org.juxtasoftware.util.ftl; import java.io.IOException; import java.io.Reader; import java.io.Writer; import java.util.Map; import org.juxtasoftware.dao.CacheDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import freemarker.core.Environment; import freemarker.template.TemplateBooleanModel; import freemarker.template.TemplateDirectiveBody; import freemarker.template.TemplateDirectiveModel; import freemarker.template.TemplateException; import freemarker.template.TemplateModel; import freemarker.template.TemplateModelException; /** * A custom freemarker directive used to stream content from the * web service heatmap database to the template * * @author loufoster * */ @Component @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class HeatmapStreamDirective implements TemplateDirectiveModel { @Autowired private CacheDao cacheDao; @SuppressWarnings("rawtypes") @Override public void execute(Environment env, Map params, TemplateModel[] model, TemplateDirectiveBody body) throws TemplateException, IOException { // REQUIRED set id TemplateModel val = env.getVariable("setId"); if ( val == null ) { throw new TemplateModelException("Missing required setId variable"); } Long setId = Long.parseLong( val.toString()); // REQUIRED visualization key val = env.getVariable("visualizationKey"); if ( val == null ) { throw new TemplateModelException("Missing required visualizationKey variable"); } Long key = Long.parseLong( val.toString()); // REQUIRED condensed flag val = env.getVariable("condensed"); if ( val == null ) { throw new TemplateModelException("Missing required condensed variable"); } TemplateBooleanModel boolModel = (TemplateBooleanModel)val; boolean condensed = boolModel.getAsBoolean(); // OPTIONAL starting line TemplateModel startVal = env.getVariable("startLine"); Integer start = null; if (startVal != null ) { start = Integer.parseInt(startVal.toString()); } // OPTIONAL end line TemplateModel endVal = env.getVariable("endLine"); Integer end = null; if (endVal != null ) { end = Integer.parseInt(endVal.toString()); } if ((start == null && end != null) || (start != null && end == null) ) { throw new TemplateModelException( "Incomplete range: Only one of startLine/endLine pair specified"); } Writer out = env.getOut(); Reader reader = this.cacheDao.getHeatmap(setId, key, condensed); int currLine = 0; while ( true ) { int data = reader.read(); if ( data == -1 ) { break; } else { if ( start != null ) { if ( currLine >= start && currLine <= end ) { out.write(data); } } else { out.write(data); } if ( data == '\n' ) { currLine++; } } } } }