package com.atlassian.labs.speakeasy.ui.mustache;
import com.atlassian.labs.speakeasy.util.JavascriptEscaper;
import com.atlassian.plugin.servlet.DownloadException;
import com.atlassian.plugin.servlet.DownloadableResource;
import org.apache.commons.lang.StringUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
/**
*
*/
public class TemplateDownloadableResource implements DownloadableResource
{
private final DownloadableResource originalResource;
private final String variableName;
public TemplateDownloadableResource(DownloadableResource originalResource, String variableName) {
this.originalResource = originalResource;
this.variableName = variableName;
}
public boolean isResourceModified(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
return originalResource.isResourceModified(httpServletRequest, httpServletResponse);
}
public void serveResource(HttpServletRequest httpServletRequest, HttpServletResponse response) throws DownloadException {
final String contentType = getContentType();
if (StringUtils.isNotBlank(contentType))
{
response.setContentType(contentType);
}
OutputStream out;
try
{
out = response.getOutputStream();
}
catch (final IOException e)
{
throw new DownloadException(e);
}
streamResource(out);
}
public void streamResource(OutputStream outputStream) throws DownloadException {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
originalResource.streamResource(buffer);
OutputStreamWriter out = new OutputStreamWriter(outputStream);
try {
out.write("speakeasyRequire.def('" + variableName + "', ['require', 'exports'], function(require, exports) {exports.render = function(data) {return require('speakeasy/mustache').to_html(\"");
InputStreamReader reader = new InputStreamReader(new ByteArrayInputStream(buffer.toByteArray()));
JavascriptEscaper.escape(reader, out);
out.write("\", data);};});");
out.flush();
} catch (IOException e) {
throw new DownloadException("Unable to read resource", e);
}
}
public String getContentType() {
return originalResource.getContentType();
}
}