From 8662870179eed5ca6e2b7b10fd1912f922fce67b Mon Sep 17 00:00:00 2001 From: pdanner Date: Mon, 6 Dec 2010 16:59:57 +0000 Subject: Moved to pdf-as-web project git-svn-id: https://joinup.ec.europa.eu/svn/pdf-as/trunk@678 7b5415b0-85f9-ee4d-85bd-d5d0c3b42d1c --- .../at/gv/egiz/pdfas/web/helper/SessionHelper.java | 47 --- .../egiz/pdfas/web/helper/SignServletHelper.java | 309 ------------------ .../egiz/pdfas/web/helper/SigningTimeHelper.java | 83 ----- .../at/gv/egiz/pdfas/web/helper/TempDirHelper.java | 362 --------------------- 4 files changed, 801 deletions(-) delete mode 100644 src/main/java/at/gv/egiz/pdfas/web/helper/SessionHelper.java delete mode 100644 src/main/java/at/gv/egiz/pdfas/web/helper/SignServletHelper.java delete mode 100644 src/main/java/at/gv/egiz/pdfas/web/helper/SigningTimeHelper.java delete mode 100644 src/main/java/at/gv/egiz/pdfas/web/helper/TempDirHelper.java (limited to 'src/main/java/at/gv/egiz/pdfas/web/helper') diff --git a/src/main/java/at/gv/egiz/pdfas/web/helper/SessionHelper.java b/src/main/java/at/gv/egiz/pdfas/web/helper/SessionHelper.java deleted file mode 100644 index ca09871..0000000 --- a/src/main/java/at/gv/egiz/pdfas/web/helper/SessionHelper.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * - */ -package at.gv.egiz.pdfas.web.helper; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import at.gv.egiz.pdfas.exceptions.web.SessionExpiredException; -import at.knowcenter.wag.egov.egiz.web.SessionAttributes; - -/** - * @author wprinz - * - */ -public class SessionHelper -{ - /** - * The log. - */ - private static Log log = LogFactory.getLog(SessionHelper.class); - - public static Object getSession(HttpServletRequest request) throws SessionExpiredException - { - - HttpSession session = request.getSession(false); - if (session == null) - { - String msg = "There is no session associated with this request."; //$NON-NLS-1$ - log.error(msg); - throw new SessionExpiredException(msg); - } - - Object sessionObject = session.getAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION); - if (sessionObject == null) - { - String msg = "Unable to find session data in session " + session.getId(); - log.error(msg); - throw new SessionExpiredException(msg); - } - - return sessionObject; - } -} diff --git a/src/main/java/at/gv/egiz/pdfas/web/helper/SignServletHelper.java b/src/main/java/at/gv/egiz/pdfas/web/helper/SignServletHelper.java deleted file mode 100644 index 7e121b9..0000000 --- a/src/main/java/at/gv/egiz/pdfas/web/helper/SignServletHelper.java +++ /dev/null @@ -1,309 +0,0 @@ -/** - * - */ -package at.gv.egiz.pdfas.web.helper; - -import java.io.FileInputStream; -import java.io.IOException; -import java.net.URL; - -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -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.api.commons.Constants; -import at.gv.egiz.pdfas.framework.SignatorFactory; -import at.gv.egiz.pdfas.framework.signator.Signator; -import at.gv.egiz.pdfas.impl.output.ByteArrayDataSink; -import at.gv.egiz.pdfas.impl.output.FileBasedDataSink; -import at.gv.egiz.pdfas.utils.WebUtils; -import at.gv.egiz.pdfas.web.SignSessionInformation; -import at.knowcenter.wag.egov.egiz.PdfASID; -import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException; -import at.knowcenter.wag.egov.egiz.exceptions.PresentableException; -import at.knowcenter.wag.egov.egiz.framework.signators.DetachedSignator_1_0_0; -import at.knowcenter.wag.egov.egiz.sig.ConnectorFactory; -import at.knowcenter.wag.egov.egiz.sig.connectors.Connector; -import at.knowcenter.wag.egov.egiz.sig.connectors.ConnectorChooser; -import at.knowcenter.wag.egov.egiz.sig.connectors.bku.SignSignatureObject; -import at.knowcenter.wag.egov.egiz.web.FormFields; -import at.knowcenter.wag.egov.egiz.web.LocalRequestHelper; -import at.knowcenter.wag.egov.egiz.web.PDFContainer; -import at.knowcenter.wag.egov.egiz.web.SessionAttributes; -import at.knowcenter.wag.egov.egiz.web.servlets.ProvidePDFServlet; - -/** - * @author wprinz - * - */ -public class SignServletHelper -{ - /** - * The log. - */ - private static Log log = LogFactory.getLog(SignServletHelper.class); - - public static void dispatch(HttpServletRequest request, HttpServletResponse response, String resource, ServletContext context) throws ServletException, IOException - { - response.setContentType("text/html"); - response.setCharacterEncoding("UTF-8"); - - RequestDispatcher disp = context.getRequestDispatcher(resource); - disp.forward(request, response); - } - - - /** - * Prepares the sign. - * - *

- * This prepares the data for both being signed or being previewed. - *

- * - * @param si - * The SessionInformation to be prepared. - * @throws PresentableException - * f.e. - */ - public static void prepareSign(SignSessionInformation si) throws PresentableException - { - log.debug("prepareSign:"); //$NON-NLS-1$ - - PdfASID algorithm = FormFields.translateSignatureModeToPdfASID(si.mode); - Signator signator = SignatorFactory.createSignator(algorithm); - - // tzefferer: modified - // si.iui = signator.prepareSign(si.pdf, si.type, null, - // ConnectorFactory.needsSIG_ID(si.connector)); - si.si = signator.prepareSign(si.pdfDataSource, si.type, si.pos, null); - // end modify - log.debug("prepareSign finished."); //$NON-NLS-1$ - } - - /** - * Finishes the sign. - * - *

- * For non local connectors this concludes the sign process, signs the - * document and returns the result. For local connectors this initializes the - * local sign process and redirects to following servlets. - *

- * - * @param si - * The SessionInformation. - * @param request - * The servlet request for dispatching. - * @param response - * The servlet response for dispatching. - * @param context - * The servlet context for dispatching. - * @throws PresentableException - * f.e. - * @throws IOException - * f. e. - * @throws ServletException - * f. e. - */ - public static void finishSign(SignSessionInformation si, HttpServletRequest request, HttpServletResponse response, ServletContext context) throws PresentableException, IOException, ServletException - { - log.debug("finishSign:"); //$NON-NLS-1$ - - // check if document is empty - if (si.si.getSignatureData() == null || si.si.getSignatureData().getDataSource().getLength() == 0) { - throw new PDFDocumentException(251, "Unable to extract and textual content."); - } - - log.debug("connector = " + si.connector); //$NON-NLS-1$ - if (ConnectorFactory.isConnectorLocal(si.connector)) - { - log.debug("Connector is local -> dispatching to local processing."); //$NON-NLS-1$ - - String dispatch_to = LocalRequestHelper.processLocalSign(si, request, response); - dispatch(request, response, dispatch_to, context); - return; - } - log.debug("Connector is not local -> finishing the sign."); //$NON-NLS-1$ - - PdfASID algorithm = FormFields.translateSignatureModeToPdfASID(si.mode); - Signator signator = SignatorFactory.createSignator(algorithm); - - log.debug("RequestURL = " + request.getRequestURL()); - log.debug("ContextPath = " + request.getContextPath()); - String host = request.getServerName(); - - // TODO TR: Web-Applikation verwendet in Loc-Ref-Variante ext. Referenz, um performanter zu sein; - // nachfolend auskommentieren, wenn anstatt SwA-Connector LocRef-Connector verwendet wird -// URL signature_data_URL = new URL(WebUtils.addJSessionID(LocalRequestHelper.getLocalContextAddress(request, response) + "/RetrieveSignatureData", request)); - URL signature_data_URL = new URL(WebUtils.buildRetrieveSignatureDataURL(request, response)); - String signature_data_url = response.encodeURL(signature_data_URL.toString()); - - Connector c = ConnectorChooser.chooseWebConnectorForSign(si.connector, si.type, signature_data_url); - SignSignatureObject signSignatureObject = c.doSign(si.si.getSignatureData()); - - si.si.setSignSignatureObject(signSignatureObject); - - si.output = TempDirHelper.createTempDataSink(si.filename + "_signed.pdf"); - signator.finishSign(si.si, si.output); - - returnSignResponse(si, request, response); - log.debug("finishSign finished."); //$NON-NLS-1$ - - } - - /** - * Returns the data in the SignResult with proper content disposition. - * - * @param si - * SessionInformation. - * @parem request The servlet request. - * @param response - * The servlet response. - * @throws IOException - * The IO Exception. - */ - public static void returnSignResponse(SignSessionInformation si, HttpServletRequest request, HttpServletResponse response) throws IOException - { -// SignResult sign_result = si.sign_result; - - String file_name = formatFileNameForSignResult(si.filename, si.output.getMimeType()); - - // tzefferer: added condition - if (si.exappinf == null) - { - - // The name parameter is actually deprecated in favour of - // Content-Disposition filename - // Unfortunately Acrobat reader does recognize neither of these parameters - // with its inline save-as. It always takes the page name. - response.setContentType(si.output.getMimeType() + "; name=\"" + file_name + "\""); - if (si.download_inline) - { - response.addHeader("Content-Disposition", "inline; filename=\"" + file_name + "\""); - } - else - { - response.addHeader("Content-Disposition", "attachment; filename=\"" + file_name + "\""); - } - - TempDirHelper.writeDataSinkToHttpResponse(si.output, response); - //response.getOutputStream().write(sign_result.getData()); - - // tzefferer: added else-block - } - else - { - /** - * The following code handles an external invocation of pdf-as. External invocation is done by - * redirecting the user to the Sign-Servlet using the parameters defined in class - * at.knowcenter.wag.egov.egiz.web.FormFields. - * e.g. http://localhost:48080/pdf-as/Sign?preview=false&connector=bku&mode=textual&sig_type=SIGNATURBLOCK_DE&inline=false&filename=test.pdf&num-bytes=45916&pdf-url=http%3A%2F%2Flocalhost%3A8080%2Fmyapp%2FProvidePDF&pdf-id=1956507909008215134&invoke-app-url=https%3A%2F%2Flocalhost%3A8443%2Fmyapp%2FReturnSignedPDF&invoke-app-error-url=https%3A%2F%2Flocalhost%3A8443%2Fmyapp%2Fpdfaserror.do&session-id=9085B85B364BEC31E7D38047FE54577D&locale=de - */ - log.debug("External webapp invocation detected."); - byte [] signed_pdf = null; - if (si.output instanceof FileBasedDataSink) - { - FileBasedDataSink fbds = (FileBasedDataSink)si.output; - signed_pdf = new byte [(int)fbds.getFile().length()]; - FileInputStream fis = new FileInputStream(fbds.getFile()); - fis.read(signed_pdf); - fis.close(); - } - else - { - ByteArrayDataSink bads = (ByteArrayDataSink)si.output; - signed_pdf = bads.getByteArray(); - } - HttpSession session = request.getSession(); - - PDFContainer entry = new PDFContainer(signed_pdf, si.exappinf.pdf_id); - ProvidePDFServlet.signedDocuments.add(entry); - - // notify webapp... - String invoke_url = si.exappinf.invoke_url; - - String providePDFServlet = "ProvidePDF"; - String pdf_id = String.valueOf(si.exappinf.pdf_id); - String session_id = si.exappinf.session_id; - - log.debug("External application has to be notified. Building url from callback url \"" + invoke_url + "\"."); - - // build URL - int ind = invoke_url.indexOf("?"); - - // fixed by tknall: must not presume that invoke_url contains "?" - String sep = "&"; - if (ind == -1) { - ind = invoke_url.length(); - sep = "?"; - } - - String query = invoke_url.substring(0, ind) + ";jsessionid=" + session_id + invoke_url.substring(ind) - + sep + FormFields.FIELD_PDF_URL + "=" + providePDFServlet + "&" + FormFields.FIELD_PDF_ID - + "=" + pdf_id + "&" + FormFields.FIELD_FILE_LENGTH + "=" + signed_pdf.length - + "&" + FormFields.FIELD_PDFAS_SESSION_ID + "=" + session.getId(); - - /* - * Using the external web-interface of pdf-as (as described above) pdf-as should be run within - * an iframe. In case of a signature performed with a local citizen card software or with the - * server bku the result has to be provided outside the iframe. To break out of the iframe a - * helper jsp (redirect_to_parent) has to be used that redirects the user to the parent - * window. - */ - disableBrowserCacheForResponse(response); - if (Constants.SIGNATURE_DEVICE_BKU.equals(si.connector) || Constants.SIGNATURE_DEVICE_MOC.equals(si.connector)) { - log.debug("Pdf-as is supposed to run within an iframe."); - log.debug("Putting external application notify url (\"" + query + "\") in session (" + session.getId() + ") for later use."); - session.setAttribute(SessionAttributes.PARENT_WEBAPP_REDIRECT_URL, query); - String redirectHelper = response.encodeRedirectURL(request.getContextPath() + "/jsp/redirect_to_parent.jsp"); - - log.debug("Redirecting to " + redirectHelper); - log.debug("The browser will finally be redirected outside the iframe to " + query + " in order to notify the external application."); - - response.sendRedirect(redirectHelper); - - } else { - log.debug("Notifying external application by redirecting to \"" + query + "\"."); - response.sendRedirect(query); - } - - } - - } - - public static void disableBrowserCacheForResponse(HttpServletResponse response) { - log.debug("Disabling browser cache for HttpServletResponse."); - response.setHeader("Cache-Control", "no-cache"); - response.setHeader("Pragma","no-cache"); - response.setDateHeader("Expires", -1); - } - - /** - * Formats the file name according to the SignResult. - * - * @param file_name - * The file name. - * @param sign_result - * The sign result. - * @return Returns the formatted file name. - */ - public static String formatFileNameForSignResult(String file_name, String mimeType) - { - String output = file_name + "_signed"; - if (mimeType.equals(DetachedSignator_1_0_0.MIME_TYPE)) - { - output += ".xml"; - } - else - { - output += ".pdf"; - } - - return output; - } -} diff --git a/src/main/java/at/gv/egiz/pdfas/web/helper/SigningTimeHelper.java b/src/main/java/at/gv/egiz/pdfas/web/helper/SigningTimeHelper.java deleted file mode 100644 index 673c197..0000000 --- a/src/main/java/at/gv/egiz/pdfas/web/helper/SigningTimeHelper.java +++ /dev/null @@ -1,83 +0,0 @@ -package at.gv.egiz.pdfas.web.helper; - -import java.util.Date; - -import org.apache.commons.lang.time.DateFormatUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import at.gv.egiz.pdfas.exceptions.ErrorCode; -import at.gv.egiz.pdfas.framework.signator.SignatorInformation; -import at.knowcenter.wag.egov.egiz.cfg.SettingsReader; -import at.knowcenter.wag.egov.egiz.exceptions.SettingsException; -import at.knowcenter.wag.egov.egiz.exceptions.SignatureException; -import at.knowcenter.wag.egov.egiz.pdf.EGIZDate; -import at.knowcenter.wag.egov.egiz.sig.connectors.bku.SignSignatureObject; - -/** - * This class deals with invalid signing times. - * @author tknall - */ -public final class SigningTimeHelper { - - private SigningTimeHelper() { - } - - private static Integer tolerance = null; - - /** - * The log. - */ - private final static Log LOG = LogFactory.getLog(SigningTimeHelper.class); - - private final static String SIGNING_TIME_TOLERANCE_KEY = "signing_time_tolerance"; - private final static String FORMAT_UTC_DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss'Z'"; - - public static void checkSigningTimeAgainstHostTime(SignatorInformation si) throws SignatureException { - checkSigningTimeAgainstHostTime(si.getSignSignatureObject()); - } - - public static synchronized void checkSigningTimeAgainstHostTime(SignSignatureObject sso) throws SignatureException { - if (tolerance == null) { - try { - String toleranceString = SettingsReader.getInstance().getSetting(SIGNING_TIME_TOLERANCE_KEY, "-1"); - tolerance = new Integer(Integer.parseInt(toleranceString)); - } catch (NumberFormatException e) { - LOG.warn("Invalid configuration key = " + SIGNING_TIME_TOLERANCE_KEY + ". Disabling signing time check."); - tolerance = new Integer(-1); - } catch (SettingsException e) { - LOG.error("Error reading settings. Disabling signing time check.", e); - tolerance = new Integer(-1); - } - } - if (tolerance.intValue() == -1) { - return; - } - - // signing time - Date signingTime = EGIZDate.parseDateFromString(sso.getDate()); - - // current time - Date currentTime = new Date(); - - // lower limit - Date lowerLimit = new Date(currentTime.getTime() - tolerance.intValue()*1000); - - // upper limit - Date upperLimit = new Date(currentTime.getTime() + tolerance.intValue()*1000); - - String signingTimeString = DateFormatUtils.formatUTC(signingTime, FORMAT_UTC_DATE_PATTERN); - - if (LOG.isDebugEnabled()) { - String lower = DateFormatUtils.formatUTC(lowerLimit, FORMAT_UTC_DATE_PATTERN); - String upper = DateFormatUtils.formatUTC(upperLimit, FORMAT_UTC_DATE_PATTERN); - LOG.debug("Checking if signing time " + signingTimeString + " is valid according to the given time frame [ " + lower + ", " + upper + " ]."); - } - - if (signingTime.before(lowerLimit) || signingTime.after(upperLimit)) { - throw new SignatureException(ErrorCode.INVALID_SIGNING_TIME, "The signing time " + signingTimeString + " is out of the given tolerance of " + tolerance.intValue() + " seconds."); - } - - } - -} diff --git a/src/main/java/at/gv/egiz/pdfas/web/helper/TempDirHelper.java b/src/main/java/at/gv/egiz/pdfas/web/helper/TempDirHelper.java deleted file mode 100644 index e7ce3ac..0000000 --- a/src/main/java/at/gv/egiz/pdfas/web/helper/TempDirHelper.java +++ /dev/null @@ -1,362 +0,0 @@ -/** - * - */ -package at.gv.egiz.pdfas.web.helper; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.text.DecimalFormat; -import java.text.NumberFormat; -import java.util.Iterator; -import java.util.List; - -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import at.gv.egiz.pdfas.framework.input.DataSource; -import at.gv.egiz.pdfas.framework.input.PdfDataSource; -import at.gv.egiz.pdfas.framework.input.TextDataSource; -import at.gv.egiz.pdfas.framework.output.DataSink; -import at.gv.egiz.pdfas.impl.input.ByteArrayPdfDataSourceImpl; -import at.gv.egiz.pdfas.impl.input.FileBased; -import at.gv.egiz.pdfas.impl.input.FileBasedTextDataSourceImpl; -import at.gv.egiz.pdfas.impl.input.TextDataSourceImpl; -import at.gv.egiz.pdfas.impl.input.helper.DataSourceHelper; -import at.gv.egiz.pdfas.impl.output.ByteArrayDataSink; -import at.gv.egiz.pdfas.impl.output.FileBasedDataSink; -import at.knowcenter.wag.egov.egiz.cfg.SettingsReader; -import at.knowcenter.wag.egov.egiz.pdf.SignatureHolder; -import at.knowcenter.wag.egov.egiz.pdf.TextualSignatureHolder; - -/** - * @author wprinz - * - */ -public class TempDirHelper -{ - /** - * The log. - */ - private static Log log = LogFactory.getLog(TempDirHelper.class); - - protected static long runningIndex = 0; - - /** - * Assembles the File of the temporary directory without checking if it really - * exists. - */ - public static File assembleTemporaryDirectoryFile() - { - File temp_dir = new File(SettingsReader.TMP_PATH); - return temp_dir; - } - - /** - * Returns the directory where temporary files should be stored. - * - *

- * If the directory doesn't exist, it is created. - *

- * - * @return Returns the directory where temporary files should be stored. - */ - public static File getTemporaryDirectory() - { - File temp_dir = assembleTemporaryDirectoryFile(); - if (!temp_dir.exists()) - { - temp_dir.mkdirs(); - } - return temp_dir; - } - - /** - * Deletes all files in the temporary directory, if it exists. - * - *

- * This should be used to clear temporary files when the application shuts - * down. - *

- */ - public static void clearTemporaryDirectory() - { - File temp_dir = assembleTemporaryDirectoryFile(); - log.debug("Clearing temporary directory: " + temp_dir); - - if (!temp_dir.exists()) - { - return; - } - - File[] files = temp_dir.listFiles(); - for (int i = 0; i < files.length; i++) - { - // added by tknall: do not try to remove svn-metadata - if (files[i].getName().endsWith(".svn")) { - continue; - } - log.debug(" Clearing temporary file: " + files[i]); - boolean delete_success = files[i].delete(); - if (!delete_success) - { - log.error("Couldn't delete the temporary file: " + files[i]); - } - } - } - - public static void storeTextSignatureHoldersIfApplicable(List shs, String fileNameSuffix) throws IOException - { - Iterator it = shs.iterator(); - while (it.hasNext()) - { - SignatureHolder sh = (SignatureHolder) it.next(); - if (sh instanceof TextualSignatureHolder) - { - TextualSignatureHolder tsh = (TextualSignatureHolder) sh; - if (!(tsh.getDataSource() instanceof FileBased)) - { - TextDataSource tds = (TextDataSource) tsh.getDataSource(); - if (isReasonableToStore(tds.getText().length())) - { - TextDataSource fbtds = placeTextIntoTempDir(tds.getText(), fileNameSuffix); - tsh.exchangeDataSource(fbtds); - } - } - } - } - } - - /** - * Places the text into the temp dir if reasonable. - * - *

- * Reasonable means that the text is longer than a certain threshold. - * Otherwise a short text is simply held in memory. - *

- * - * @param text - * The text to be stored. - * @param fileNameSuffix - * A file name suffix so that the temp file gets a more "readable" - * name. - * @return Returns the TextDataSource. - * @throws IOException - * F.e. - */ - public static TextDataSource placeTextIntoTempDir(String text, String fileNameSuffix) throws IOException - { - if (isReasonableToStore(text.length())) - { - String fileName = formatFileName(fileNameSuffix); - - File tmpFile = createTempFileInDir(fileName); - - FileOutputStream fos = new FileOutputStream(tmpFile); - OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); - osw.write(text); - osw.close(); - - FileBasedTextDataSourceImpl textDataSource = new FileBasedTextDataSourceImpl(tmpFile, "UTF-8"); - return textDataSource; - } - else - { - return new TextDataSourceImpl(text); - } - } - - /** - * Tells, if it is reasonable to store the text of the given length onto the - * disk. - * - * @param textLength - * The length of the text under question. - * @return Returns true if the text should be stored on the disk. - */ - public static boolean isReasonableToStore(int textLength) - { - return false; -// return textLength >= 10000; - } - - public static PdfDataSource placePdfIntoTempDir(InputStream pdfInput, String fileNameSuffix) throws IOException - { - log.debug("PERF: placing pdf into memory cache"); - - byte [] pdfData = DataSourceHelper.convertInputStreamToByteArray(pdfInput); - PdfDataSource pdfDataSource = new ByteArrayPdfDataSourceImpl(pdfData); - -// File pdfFile = placeInputIntoTempDirFile(pdfInput, fileNameSuffix); -// -// FileBasedPdfDataSourceImpl pdfDataSource = new FileBasedPdfDataSourceImpl(pdfFile, (int) pdfFile.length()); - return pdfDataSource; - } - - public static File placeInputIntoTempDirFile(InputStream input, String fileNameSuffix) throws IOException - { - String fileName = formatFileName(fileNameSuffix); - - File tmpFile = createTempFileInDir(fileName); - - FileOutputStream fos = new FileOutputStream(tmpFile); - - byte[] buffer = new byte[2048]; - int read = -1; - while ((read = input.read(buffer)) > 0) - { - fos.write(buffer, 0, read); - } - fos.close(); - input.close(); - - return tmpFile; - } - - public static File formTempFile(String fileNameSuffix) - { - String fileName = formatFileName(fileNameSuffix); - File tmpFile = getFileInTempDir(fileName); - - return tmpFile; - } - - protected static File getFileInTempDir (String fileName) - { -// File tempDir = new File(new File(SettingsReader.RESOURCES_PATH), "pdfastmp"); - File tempDir = assembleTemporaryDirectoryFile(); - - File tmpFile = new File(tempDir, fileName); - - return tmpFile; - } - - protected static String formatFileName(String fileNameSuffix) - { - // double check so that file name is always correct. - fileNameSuffix = extractFileNameSuffix(fileNameSuffix); - String fileName = "tmp" + formatIndex(runningIndex) + "_" + fileNameSuffix; - runningIndex++; - - return fileName; - } - - protected static String formatIndex(long index) - { - NumberFormat nf = new DecimalFormat("00000000"); - - return nf.format(index); - } - - protected static File createTempFileInDir(String fileName) throws IOException - { - File tmpFile = getFileInTempDir(fileName); - - tmpFile.createNewFile(); - - tmpFile.deleteOnExit(); - - return tmpFile; - } - - public static DataSink createTempDataSink(String fileNameSuffix) throws IOException - { - log.debug("PERF: placing pdf into memory cache"); - - DataSink ds = new ByteArrayDataSink(); - -// String fileName = formatFileName(fileNameSuffix); -// -// File tmpFile = createTempFileInDir(fileName); -// -// FileBasedDataSink ds = new FileBasedDataSink(tmpFile); - - return ds; - } - - public static void writeDataSinkToHttpResponse(DataSink ds, HttpServletResponse response) throws IOException - { - - response.setContentType(ds.getMimeType()); - response.setCharacterEncoding(ds.getCharacterEncoding()); - - OutputStream os = response.getOutputStream(); - - if (ds instanceof FileBasedDataSink) - { - FileBasedDataSink fbds = (FileBasedDataSink)ds; - byte[] buffer = new byte[2048]; - FileInputStream fis = new FileInputStream(fbds.getFile()); - int n = -1; - while ((n = fis.read(buffer)) > 0) - { - os.write(buffer, 0, n); - } - fis.close(); - } - else - { - ByteArrayDataSink bads = (ByteArrayDataSink)ds; - os.write(bads.getByteArray()); - os.flush(); - - } - - os.close(); -} - - /** - * Deletes the underlying file of the FileBased DataSource. - * - *

- * If the DataSource is not FileBased, nothing is done. - *

- *

- * This is usually used by the application to delete temporary files. - *

- * - * @param dataSource - */ - public static void deleteDataSourceIfFileBased(DataSource dataSource) - { - if (dataSource instanceof FileBased) - { - FileBased fb = (FileBased) dataSource; - log.debug("Deleting temp file " + fb.getFile()); - boolean deleted = fb.getFile().delete(); - log.debug("deleted = " + deleted); - } - } - - public static void deleteDataSinkIfFileBased(DataSink dataSink) - { - if (dataSink instanceof FileBased) - { - FileBased fb = (FileBased) dataSink; - log.debug("Deleting temp file " + fb.getFile()); - boolean deleted = fb.getFile().delete(); - log.debug("deleted = " + deleted); - } - } - - /** - * Given a file (maybe with path), extracts the file name suffix. - * @param file The file and maybe path. - * @return Returns the file name. - */ - public static String extractFileNameSuffix (String file) - { - if (file == null || file.trim().length() == 0) - { - return "nofilename"; - } - File f = new File(file); - return f.getName(); - } -} -- cgit v1.2.3