diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java index 15b28f174..862abb4f1 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java @@ -26,6 +26,7 @@ import edu.cornell.mannlib.vitro.webapp.controller.VitroHttpServlet; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.Route; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ExceptionResponseValues; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.FileResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ForwardResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.RdfResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.RedirectResponseValues; @@ -153,6 +154,8 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { doForward(vreq, response, values); } else if (values instanceof RdfResponseValues) { doRdf(vreq, response, values); + } else if (values instanceof FileResponseValues) { + doFile(vreq, response, values); } } catch (ServletException e) { log.error("ServletException in doResponse()", e); @@ -239,6 +242,26 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { values.getModel().write( response.getOutputStream(), format ); } + + protected void doFile(HttpServletRequest request, HttpServletResponse response, ResponseValues values) + throws IOException { + + String mediaType = values.getContentType().getMediaType(); + response.setContentType(mediaType); + + Map headerKeyToValue = values.getHeader(); + + for (Map.Entry currentHeaderPair : headerKeyToValue.entrySet()) { + response.setHeader(currentHeaderPair.getKey(), currentHeaderPair.getValue()); + } + + PrintWriter responseWriter = response.getWriter(); + + String rawFileContent = (String) values.getMap().get("fileContent"); + responseWriter.append(rawFileContent); + responseWriter.close(); + + } protected void doException(VitroRequest vreq, HttpServletResponse response, ResponseValues values) { // Log the error, and display an error message on the page. diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/responsevalues/BaseResponseValues.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/responsevalues/BaseResponseValues.java index 94f8fa275..229a0c5a8 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/responsevalues/BaseResponseValues.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/responsevalues/BaseResponseValues.java @@ -60,6 +60,12 @@ public abstract class BaseResponseValues implements ResponseValues { "This is not a redirect response."); } + @Override + public Map getHeader() { + throw new UnsupportedOperationException( + "This is not a header response."); + } + @Override public String getForwardUrl() { throw new UnsupportedOperationException( diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/responsevalues/FileResponseValues.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/responsevalues/FileResponseValues.java new file mode 100644 index 000000000..fb1ddbef7 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/responsevalues/FileResponseValues.java @@ -0,0 +1,37 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import edu.cornell.mannlib.vitro.webapp.web.ContentType; + +public class FileResponseValues extends BaseResponseValues { + + private String outputFileName; + private String DEFAULT_HEADER_KEY = "Content-Disposition"; + private String DEFAULT_HEADER_VALUE_PREFIX = "attachment;filename="; + private final Map map; + + + public FileResponseValues(ContentType contentType, String outputFileName, Map map) { + super(contentType); + this.outputFileName = outputFileName; + this.map = map; + } + + @Override + public Map getHeader() { + Map headerKeyToValue = new HashMap(); + headerKeyToValue.put(DEFAULT_HEADER_KEY, DEFAULT_HEADER_VALUE_PREFIX + outputFileName); + return headerKeyToValue; + } + + @Override + public Map getMap() { + return Collections.unmodifiableMap(this.map); + } + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/responsevalues/ResponseValues.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/responsevalues/ResponseValues.java index c0a28b4f2..d72d6e22d 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/responsevalues/ResponseValues.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/responsevalues/ResponseValues.java @@ -20,6 +20,8 @@ public interface ResponseValues { public String getRedirectUrl(); + public Map getHeader(); + public String getForwardUrl(); public Throwable getException();