Introducing new ResponseValues subclass for serving File downloads, mainly for Visualizations. Also modified FreemarkerHttpServlet & BaseResponseValues to handle the new methods pertaining to file download response.

This commit is contained in:
cdtank 2010-12-13 19:56:36 +00:00
parent 838713d669
commit efc48a3054
4 changed files with 68 additions and 0 deletions

View file

@ -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.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.Route; 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.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.ForwardResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.RdfResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.RdfResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.RedirectResponseValues; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.RedirectResponseValues;
@ -153,6 +154,8 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
doForward(vreq, response, values); doForward(vreq, response, values);
} else if (values instanceof RdfResponseValues) { } else if (values instanceof RdfResponseValues) {
doRdf(vreq, response, values); doRdf(vreq, response, values);
} else if (values instanceof FileResponseValues) {
doFile(vreq, response, values);
} }
} catch (ServletException e) { } catch (ServletException e) {
log.error("ServletException in doResponse()", e); log.error("ServletException in doResponse()", e);
@ -239,6 +242,26 @@ public class FreemarkerHttpServlet extends VitroHttpServlet {
values.getModel().write( response.getOutputStream(), format ); 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<String, String> headerKeyToValue = values.getHeader();
for (Map.Entry<String, String> 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) { protected void doException(VitroRequest vreq, HttpServletResponse response, ResponseValues values) {
// Log the error, and display an error message on the page. // Log the error, and display an error message on the page.

View file

@ -60,6 +60,12 @@ public abstract class BaseResponseValues implements ResponseValues {
"This is not a redirect response."); "This is not a redirect response.");
} }
@Override
public Map<String, String> getHeader() {
throw new UnsupportedOperationException(
"This is not a header response.");
}
@Override @Override
public String getForwardUrl() { public String getForwardUrl() {
throw new UnsupportedOperationException( throw new UnsupportedOperationException(

View file

@ -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<String, Object> map;
public FileResponseValues(ContentType contentType, String outputFileName, Map<String, Object> map) {
super(contentType);
this.outputFileName = outputFileName;
this.map = map;
}
@Override
public Map<String, String> getHeader() {
Map<String, String> headerKeyToValue = new HashMap<String, String>();
headerKeyToValue.put(DEFAULT_HEADER_KEY, DEFAULT_HEADER_VALUE_PREFIX + outputFileName);
return headerKeyToValue;
}
@Override
public Map<String, Object> getMap() {
return Collections.unmodifiableMap(this.map);
}
}

View file

@ -20,6 +20,8 @@ public interface ResponseValues {
public String getRedirectUrl(); public String getRedirectUrl();
public Map<String, String> getHeader();
public String getForwardUrl(); public String getForwardUrl();
public Throwable getException(); public Throwable getException();