001    package com.khubla.pragmatach.plugin.velocity;
002    
003    import java.io.ByteArrayInputStream;
004    import java.io.Reader;
005    import java.io.StringReader;
006    import java.io.StringWriter;
007    import java.io.Writer;
008    import java.util.Map;
009    
010    import javax.servlet.http.HttpServletResponse;
011    
012    import org.apache.commons.io.IOUtils;
013    import org.apache.velocity.VelocityContext;
014    import org.apache.velocity.app.VelocityEngine;
015    
016    import com.khubla.pragmatach.framework.api.PragmatachException;
017    import com.khubla.pragmatach.framework.controller.impl.AbstractResponse;
018    
019    /**
020     * @author tome
021     */
022    public class VelocityResponse extends AbstractResponse {
023       /**
024        * template
025        */
026       private final String template;
027       /**
028        * templatename
029        */
030       private final String templateName;
031       /**
032        * context
033        */
034       private final Map<String, Object> context;
035       /**
036        * velocity
037        */
038       private final VelocityEngine velocityEngine = new VelocityEngine();
039    
040       public VelocityResponse(Map<String, String> cacheHeaders, String templateName, String template, Map<String, Object> context) {
041          super(cacheHeaders);
042          this.template = template;
043          this.context = context;
044          this.templateName = templateName;
045       }
046    
047       @Override
048       public String getContentType() throws PragmatachException {
049          return CONTENT_TYPE_HTML;
050       }
051    
052       @Override
053       public Map<String, String> getHeaders() throws PragmatachException {
054          return super.getCacheHeaders();
055       }
056    
057       @Override
058       public void render(HttpServletResponse httpServletResponse) throws PragmatachException {
059          try {
060             final VelocityContext velocityContext = new VelocityContext(context);
061             final Reader reader = new StringReader(template);
062             final Writer writer = new StringWriter();
063             velocityEngine.evaluate(velocityContext, writer, templateName, reader);
064             final ByteArrayInputStream bais = new ByteArrayInputStream(writer.toString().getBytes());
065             IOUtils.copy(bais, httpServletResponse.getOutputStream());
066          } catch (final Exception e) {
067             throw new PragmatachException("Exception in render", e);
068          }
069       }
070    }