package org.infoglue.calendar.util; import java.io.File; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.StringTokenizer; import javax.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.infoglue.calendar.actions.CalendarAbstractAction; import org.infoglue.common.util.JFreeReportHelper; import org.infoglue.common.util.PropertyHelper; import com.opensymphony.webwork.ServletActionContext; public class EntrySearchResultfilesConstructor { private static Log log = LogFactory.getLog(EntrySearchResultfilesConstructor.class); private Map parameters = new HashMap(); private Set entries; private Map searchResultFiles; private Map searchResultFilePaths; private String tempFilePath; private String scheme; private String serverName; private int port; private String fileFolderLocation; private List resultValues; private CalendarAbstractAction action; private String entryTypeId; public EntrySearchResultfilesConstructor(Map parameters, Set entries, String tempFilePath, String scheme, String serverName, int port, List resultValues, CalendarAbstractAction action, String entryTypeId) { this.parameters = parameters; this.entries = entries; this.tempFilePath = tempFilePath; this.scheme = scheme; this.serverName = serverName; this.port = port; this.resultValues = resultValues; this.action = action; this.entryTypeId = entryTypeId; createResults(); } private void createResults() { searchResultFiles = new LinkedHashMap(); searchResultFilePaths = new LinkedHashMap(); HttpServletRequest request = ServletActionContext.getRequest(); String exportEntryResultsFolder = PropertyHelper.getProperty("exportEntryResultsFolder"); fileFolderLocation = tempFilePath + File.separator + exportEntryResultsFolder + File.separator; String httpFolderLocation = scheme + "://" + serverName + ":" + port + "/infoglueCalendar/digitalAssets/" + exportEntryResultsFolder + "/"; File f = new File(fileFolderLocation); if (!f.exists()) { f.mkdir(); } // start the thread cleaning the directory of old files new Thread(new ResultFilesCleaner()).start(); String exportEntryResultsTypes = PropertyHelper.getProperty("exportEntryResultsTypes"); if (exportEntryResultsTypes != null) { StringTokenizer st = new StringTokenizer(exportEntryResultsTypes, ",", false); while (st.hasMoreElements()) { String resultType = st.nextToken().trim(); if (resultType.equals("TXT")) { EntrySearchResultfilesConstructor_TXT txtConstructor = new EntrySearchResultfilesConstructor_TXT(entries, fileFolderLocation, httpFolderLocation, resultValues, action); if (txtConstructor.createFile()) { searchResultFiles.put("Text", txtConstructor.getFileLocation()); //searchResultFilePaths.put("Text", txtConstructor.get) } } if (resultType.indexOf("CSV") > -1) { log.debug("fileFolderLocation:" + fileFolderLocation); String fileName = fileFolderLocation + File.separator + "entries_" + System.currentTimeMillis() + ".csv"; String fileURL = httpFolderLocation + "entries_" + System.currentTimeMillis() + ".csv"; searchResultFiles.put("CSV", fileURL); searchResultFilePaths.put("CSV", fileName); new JFreeReportHelper().getEntriesReport(parameters, entries, fileName, "csv", entryTypeId); } if (resultType.indexOf("XLS") > -1) { log.debug("fileFolderLocation:" + fileFolderLocation); String fileName = fileFolderLocation + File.separator + "entries_" + System.currentTimeMillis() + ".xls"; String fileURL = httpFolderLocation + "entries_" + System.currentTimeMillis() + ".xls"; searchResultFiles.put("Excel", fileURL); searchResultFilePaths.put("Excel", fileName); new JFreeReportHelper().getEntriesReport(parameters, entries, fileName, "xls", entryTypeId); } if (resultType.indexOf("PDF") > -1) { log.debug("fileFolderLocation:" + fileFolderLocation); String fileName = fileFolderLocation + File.separator + "entries_" + System.currentTimeMillis() + ".pdf"; String fileURL = httpFolderLocation + "entries_" + System.currentTimeMillis() + ".pdf"; searchResultFiles.put("PDF", fileURL); searchResultFilePaths.put("PDF", fileName); new JFreeReportHelper().getEntriesReport(parameters, entries, fileName, "pdf", entryTypeId); } if (resultType.indexOf("HTML") > -1) { log.debug("fileFolderLocation:" + fileFolderLocation); String fileName = fileFolderLocation + File.separator + "entries_" + System.currentTimeMillis() + ".html"; String fileURL = httpFolderLocation + "entries_" + System.currentTimeMillis() + ".html"; searchResultFiles.put("HTML", fileURL); searchResultFilePaths.put("HTML", fileName); new JFreeReportHelper().getEntriesReport(parameters, entries, fileName, "html", entryTypeId); } } } } public Map getResults() { return searchResultFiles; } public Map getFileResults() { return searchResultFilePaths; } class ResultFilesCleaner implements Runnable { long waitForTurn; long maxAge; public ResultFilesCleaner() { waitForTurn = PropertyHelper.getLongProperty( "exportEntryResultsTypesCleanerFrequency", 3600000); maxAge = PropertyHelper.getLongProperty( "exportEntryResultsTypesFileMaxage", 86400000); log.debug( "frequency: " + waitForTurn + ", maxAge: " + maxAge ); } public void run() { while( true ) { try { log.debug("Running cleanup for old result files."); long maxAgeTime = System.currentTimeMillis() - maxAge; Date d = new Date( maxAgeTime ); log.debug( "Delete older than: " + d.toString() ); File folder = new File(fileFolderLocation); File[] fileNames = folder.listFiles(); log.debug( "Found: " + fileNames.length + " files." ); for (int i = 0; i < fileNames.length; i++) { File file = fileNames[i]; log.debug( "File: " + file.getName() + ": " + file.isFile() + ", " + file.canRead() + ", " + file.canWrite() ); if( !file.isDirectory() ) { log.debug( "LM: " + file.lastModified() + ", maxAge: " + maxAgeTime ); if (file.lastModified() < maxAgeTime ) { log.info("Deleting file: " + file.getName()); file.delete(); } } } } catch (Exception e) { log.warn("Failed deleting old result files.", e); } try { Thread.currentThread().sleep(waitForTurn); } catch (Exception e) { log.warn("Sleep failed.", e); } } } } }