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 EventSearchResultfilesConstructor { private static Log log = LogFactory.getLog(EventSearchResultfilesConstructor.class); private Map parameters = new HashMap(); private List events; 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; public EventSearchResultfilesConstructor(Map parameters, List list, String tempFilePath, String scheme, String serverName, int port, List resultValues, CalendarAbstractAction action) { this.parameters = parameters; this.events = list; this.tempFilePath = tempFilePath; this.scheme = scheme; this.serverName = serverName; this.port = port; this.resultValues = resultValues; this.action = action; 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(); log.debug("fileFolderLocation:" + fileFolderLocation); String fileName = fileFolderLocation + File.separator + "events_" + System.currentTimeMillis() + ".xls"; String fileURL = httpFolderLocation + "events_" + System.currentTimeMillis() + ".xls"; searchResultFiles.put("Excel", fileURL); searchResultFilePaths.put("Excel", fileName); new JFreeReportHelper().getEventReportAsXLS(parameters, events, fileName); } 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); } } } } }