package org.openswing.springframework.web.servlet.utils;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.openswing.swing.message.send.java.Command;
import org.openswing.springframework.web.servlet.handler.OpenSwingHandlerMapping;
import org.openswing.swing.message.send.java.Command;
import java.io.*;
import javax.servlet.ServletContext;
/**
* <p>Title: OpenSwing Framework</p>
* <p>Description: Spring Controller used to returna document previously stored in user session.</p>
* <p>Copyright: Copyright (C) 2006 Mauro Carniel</p>
* @version 1.0
*/
public class DocumentController implements Controller {
public ModelAndView handleRequest(final HttpServletRequest request, final HttpServletResponse response) {
ModelAndView mav = new ModelAndView();
final Command command = (Command)request.getAttribute(OpenSwingHandlerMapping.COMMAND_ATTRIBUTE_NAME);
String docId = command.getInputParam().toString();
byte[] bytes = (byte[])request.getSession().getServletContext().getAttribute(docId);
new TimeoutDocIdThread(request.getSession().getServletContext(),docId);
if (docId.endsWith(".xls")) {
response.setContentType("application/vnd.ms-excel");
}
else if (docId.endsWith(".xls") || docId.endsWith(".csv")) {
response.setContentType("application/vnd.ms-excel");
}
else if (docId.endsWith(".pdf")) {
response.setContentType("application/pdf");
}
else if (docId.endsWith(".rtf")) {
response.setContentType("application/rtf");
}
else if (docId.endsWith(".html")) {
response.setContentType("text/html");
}
else if (docId.endsWith(".xml")) {
response.setContentType("text/xml");
}
try {
OutputStream out = response.getOutputStream();
out.write(bytes);
out.close();
}
catch (IOException ex) {
return null;
}
return null;
}
/**
* <p>Title: OpenSwing Framework</p>
* <p>Description: Inner class< used to remove the document identifier from the context:
* this is done after 5 minutes because some browser will call twice the same document request.</p>
*/
class TimeoutDocIdThread extends Thread {
/** document identifier to remove */
private String docId;
private ServletContext context = null;
public TimeoutDocIdThread(ServletContext context,String docId) {
this.context = context;
this.docId = docId;
start();
}
public void run() {
try {
sleep(300000);
}
catch (InterruptedException ex) {
}
try {
context.removeAttribute(docId);
}
catch (Exception ex1) {
}
}
}
}