package at.knowcenter.wag.egov.egiz.web.servlets; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import at.gv.egiz.pdfas.web.SignSessionInformation; import at.gv.egiz.pdfas.web.helper.SignServletHelper; import at.knowcenter.wag.egov.egiz.exceptions.PresentableException; import at.knowcenter.wag.egov.egiz.web.FormFields; import at.knowcenter.wag.egov.egiz.web.PDFContainer; import at.knowcenter.wag.egov.egiz.web.SessionAttributes; public class ProvidePDFServlet extends HttpServlet { /** * SVUID. */ private static final long serialVersionUID = 1L; /** * The log. */ private static Log log = LogFactory.getLog(ProvidePDFServlet.class); public static Set signedDocuments = Collections.synchronizedSet(new HashSet()); public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String pdfIdString = request.getParameter(FormFields.FIELD_PDF_ID); if (pdfIdString == null) { HttpSession session = request.getSession(true); log.debug("No " + FormFields.FIELD_PDF_ID + " provided. Trying to retrieve PDF from session (" + session.getId() + ")."); SignSessionInformation si = (SignSessionInformation) session.getAttribute(SessionAttributes.SIGNED_PDF_DOCUMENT); if (si == null) { log.warn("Unable to find signed pdf in session (" + session.getId() + ")."); SignServlet.prepareDispatchToErrorPage(new PresentableException(600, "Das signierte Dokument konnte nicht gefunden werden."), request); response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); RequestDispatcher disp = super.getServletContext().getRequestDispatcher("/jsp/error.jsp"); disp.forward(request, response); return; } else { log.debug("Signed pdf found."); session.removeAttribute(SessionAttributes.SIGNED_PDF_DOCUMENT); log.debug("Returning signed pdf to browser."); log.debug("Invalidating session."); session.invalidate(); SignServletHelper.returnSignResponse(si, response); return; } } else { long pdfId = Long.parseLong(pdfIdString); Iterator it = signedDocuments.iterator(); while (it.hasNext()) { PDFContainer current = (PDFContainer) it.next(); if (current.id == pdfId) { try { byte[] pdf = current.pdf; response.setContentType("application/pdf"); response.setContentLength(pdf.length); InputStream is = new ByteArrayInputStream(pdf); final int bufferSize = 1024; byte[] buffer = new byte[bufferSize]; int len = -1; while ((len = is.read(buffer)) != -1) { response.getOutputStream().write(buffer, 0, len); } response.getOutputStream().flush(); signedDocuments.remove(current); } catch (IOException e) { log.warn("IO excepton while providing pdf document: " + e.getMessage()); } } } } } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }