001 package com.khubla.pragmatach.framework.controller.impl.template;
002
003 import java.io.ByteArrayInputStream;
004 import java.io.ByteArrayOutputStream;
005 import java.io.InputStream;
006 import java.io.OutputStream;
007 import java.util.Map;
008 import java.util.Map.Entry;
009
010 import javax.servlet.http.HttpServletResponse;
011
012 import org.apache.commons.io.IOUtils;
013 import org.apache.commons.lang.StringUtils;
014
015 import com.khubla.pragmatach.framework.api.PragmatachException;
016 import com.khubla.pragmatach.framework.controller.impl.AbstractResponse;
017
018 /**
019 * @author tome
020 */
021 public class SimpleTemplateResponse extends AbstractResponse {
022 /**
023 * InputStream
024 */
025 private final InputStream resourceInputStream;
026 /**
027 * parameters
028 */
029 private final Map<String, String> parameters;
030 private static final String ESCAPE = "$";
031
032 public static void template(InputStream templateInputStream,
033 OutputStream outputStream, Map<String, String> substitutions)
034 throws PragmatachException {
035 try {
036 /*
037 * read the entire InputStream
038 */
039 final ByteArrayOutputStream baos = new ByteArrayOutputStream();
040 IOUtils.copy(templateInputStream, baos);
041 /*
042 * do substitutions
043 */
044 String renderedTemplate = baos.toString("UTF-8");
045 if (null != substitutions) {
046 for (final Entry<String, String> entry : substitutions
047 .entrySet()) {
048 renderedTemplate = StringUtils.replace(renderedTemplate,
049 ESCAPE + entry.getKey(), entry.getValue());
050 }
051 }
052 /*
053 * write out
054 */
055 final ByteArrayInputStream bais = new ByteArrayInputStream(
056 renderedTemplate.getBytes("UTF-8"));
057 IOUtils.copy(bais, outputStream);
058 } catch (final Exception e) {
059 throw new PragmatachException("Exception in template", e);
060 }
061 }
062
063 /**
064 * ctor
065 */
066 public SimpleTemplateResponse(Map<String, String> cacheHeaders,
067 String template, Map<String, String> parameters) {
068 super(cacheHeaders);
069 this.parameters = parameters;
070 if (null != template) {
071 /*
072 * ok, go for it
073 */
074 resourceInputStream = getClass()
075 .getResourceAsStream("/" + template);
076 } else {
077 resourceInputStream = null;
078 }
079 }
080
081 @Override
082 public String getContentType() throws PragmatachException {
083 return CONTENT_TYPE_HTML;
084 }
085
086 @Override
087 public Map<String, String> getHeaders() throws PragmatachException {
088 return getCacheHeaders();
089 }
090
091 @Override
092 public void render(HttpServletResponse httpServletResponse)
093 throws PragmatachException {
094 try {
095 template(resourceInputStream,
096 httpServletResponse.getOutputStream(), parameters);
097 } catch (final Exception e) {
098 throw new PragmatachException("Exception in render", e);
099 }
100 }
101 }