package pl.touk.tola.spring.mvc;
import org.springframework.web.servlet.mvc.AbstractController;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
/**
* An <code>AbstractController</code> implementation that serves files obtained from a file repository.
* The file repository should be set through <code>setFileRepository</code> method before first request is handled in <code>handleRequestInternal</code> method.
*/
public class FileRepositoryController extends AbstractController {
private static String errorPrefix = "Request to file repository controller is invalid. ";
private FileRepository fileRepository;
private static final String CONTENT_TYPE_PARAMETER = "contentType";
private static final String ID_PARAMETER = "id";
/**
* Handles http request. Http request, <code>httpServletRequest</code>, should contain parameter named "id". Its value is
* used to retrieve byte array from file repository set in method <code>setFileRepository</code>.
* If <code>httpServletRequest</code> also contains parameter named "contentType" then its value is used
* as value of "Content-Type" http header of the generated response.
* This method returns null.
* @param httpServletRequest request to handle
* @param httpServletResponse generated response
* @return null
* @throws Exception
*/
protected ModelAndView handleRequestInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
String s = httpServletRequest.getParameter(ID_PARAMETER);
if (s == null) {
throw new IllegalArgumentException(errorPrefix + "It should contain a parameter \"" + ID_PARAMETER + "\".");
}
Long id;
try {
id = Long.parseLong(s);
} catch (NumberFormatException e) {
throw new IllegalArgumentException(errorPrefix + "The value of parameter \"" + ID_PARAMETER + "\" is illegal: \"" + s + "\". Long value was expected.", e);
}
byte[] file = fileRepository.getFile(id);
httpServletResponse.setHeader("Pragma", "no-cache");
httpServletResponse.setHeader("Expires", "0");
httpServletResponse.setHeader("Cache-Control", "no-cache");
String contentType = httpServletRequest.getParameter(CONTENT_TYPE_PARAMETER);
if (contentType != null) {
httpServletResponse.setHeader("Content-Type", contentType);
}
OutputStream os = httpServletResponse.getOutputStream();
os.write(file);
os.close();
return null;
}
/**
* Sets file repository used in <code>handleRequestInternal</code> method to retrieve files from.
* @param fileRepository
*/
public void setFileRepository(FileRepository fileRepository) {
this.fileRepository = fileRepository;
}
}