/** * $Date: 2003/12/01 13:46:35 $ * $Author: Rob $ * $Id: CleanerAgent.java,v 1.3 2003/12/01 13:46:35 Rob Exp $ * $Revision: 1.3 $ * $Source: /mnt/flashdrive/cvshome/cl1p/web-inf/src/com/diodesoftware/scb/agents/CleanerAgent.java,v $ */ package com.diodesoftware.scb.agents; import com.diodesoftware.R; import com.diodesoftware.dbmapper.DBConnectionMgr; import com.diodesoftware.dbmapper.DBMapper; import com.diodesoftware.scb.ClipMsg; import com.diodesoftware.scb.DownloadTokenMgr; import com.diodesoftware.scb.S3FileHandler; import com.diodesoftware.scb.clipboard.LockMaster; import com.diodesoftware.scb.tables.Clip; import com.diodesoftware.scb.tables.ClipS3Object; import com.diodesoftware.scb.upload.UploadStatusMgr; import org.apache.log4j.Logger; import org.jets3t.service.S3ServiceException; import javax.servlet.ServletContext; import java.sql.*; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.text.*; public class CleanerAgent { private static CleanerAgent instance; private static Logger log = Logger.getLogger(CleanerAgent.class); private DBConnectionMgr db = null; private boolean running = true; private ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); private static DateFormat dateFormat = DateFormat.getDateTimeInstance(); private CleanerAgent(DBMapper mapper) { this.db = new DBConnectionMgr(); } public static synchronized void initialize(DBMapper mapper) { instance = new CleanerAgent(mapper); } public static CleanerAgent getInstance() { return instance; } public void startCleanerThread(ServletContext context) { Runnable runner = new Runnable() { public void run() { ClipMsg.loadMsgFile(); if (running) { try { clean(); } catch (Throwable t) { log.error("Error cleaning Cl1p!", t); } } } }; executor.scheduleAtFixedRate(runner, 1l, 5l, TimeUnit.MINUTES); } public boolean isRunning() { return running; } public void setRunning(boolean running) { this.running = running; } public void kill() { this.running = false; executor.shutdownNow(); } public void clean() { LockMaster.getInstnace().cleanOldLocks(); R.refresh(); String sql3 = "Select Number, Created, KeepFor from Clip where OwnerId = 0"; Connection con = db.getConnection(); cleanFiles(con); long now = System.currentTimeMillis(); String sql = null; try { Statement stmt = con.createStatement(); sql = sql3; ResultSet rs = stmt.executeQuery(sql); List list = new ArrayList(); while (rs.next()) { int clipId = rs.getInt(1); long created = rs.getLong(2); long keepFor = (long)rs.getInt(3); long cleanTime = created + ( (keepFor * 60l * 1000l)); if (now > cleanTime) { Date ct = new Date(cleanTime); Date nt = new Date(now); Date cr = new Date(created); log.debug("KeepFor[" + keepFor + "] cleantime[" + cleanTime + "] now [" +now + "] ct[" + dateFormat.format(ct) + "] nt[" + dateFormat.format(nt) + "]"); log.debug("Created[" + dateFormat.format(cr) + "]"); list.add(clipId); } } rs.close(); stmt.close(); Iterator iter = list.iterator(); while (iter.hasNext()) { int i = ((Integer) iter.next()).intValue(); clean(i, con); } if (log.isDebugEnabled()) log.debug("Cleaned [" + list.size() + "] Cl1ps"); } catch (SQLException e) { log.error("Error running SQL [" + sql + "]", e); } finally { db.returnConnection(con); } } public static void clean(int clipId, Connection con) { Clip clip = (Clip) DBMapper.getInstance().load(Clip.class, clipId, con); String sql = "Delete from Clip where Number = ?"; try { PreparedStatement prepStmt = con.prepareStatement(sql); prepStmt.setInt(1, clipId); prepStmt.executeUpdate(); prepStmt.close(); } catch (SQLException e) { log.error("Error cleaning clip [" + clipId + "]", e); } } public static void deleteFile(Clip clip) { /* String dirName = ClipFilter.uploadDirName(clip.getUri()); File dir = new File(dirName); if (dir.exists()) { File[] files = dir.listFiles(); for (int i = 0; i < files.length; i++) { File file = files[i]; if (!file.getName().equals("..") && !file.getName().equals(".")) { if (!file.delete()) { log.error("Could not delete file [" + file.getAbsolutePath() + "]"); } } } }*/ } public static void deleteFile(Clip clip, int fileNumber, Connection con) { String sql = "Select * from ClipS3Object where Number = ? and ClipId = ?"; try{ S3FileHandler s3file = new S3FileHandler(); PreparedStatement prepStmt = con.prepareStatement(sql); prepStmt.setInt(1, fileNumber); prepStmt.setInt(2, clip.getNumber()); ResultSet rs = prepStmt.executeQuery(); while(rs.next()){ ClipS3Object s3o = (ClipS3Object)DBMapper.loadSingle(ClipS3Object.class, rs); try{ s3file.deleteFile(clip, s3o.getName()); }catch(S3ServiceException seE) { log.error("Error deleteing file",seE); } } rs.close(); prepStmt.close(); sql = "Delete from ClipS3Object where Number = ? and ClipId = ?"; prepStmt = con.prepareStatement(sql); prepStmt.setInt(1, fileNumber); prepStmt.setInt(2, clip.getNumber()); prepStmt.executeUpdate(); prepStmt.close(); }catch(SQLException e){ log.error("Error running sql [" + sql + "]",e); } } private void cleanFiles(Connection con) { /* Calendar now = Calendar.getInstance(); long l = SQLUtil.calendarToLong(now); String sql = "Select Uri from Clip where CleanDate < " + l; try { Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { String uri = rs.getString(1); String dirName = ClipFilter.uploadDirName(uri); File dir = new File(dirName); if (dir.exists()) { dir.delete(); } } stmt.close(); } catch (SQLException e) { log.error("Error running SQL [" + sql + "]", e); }*/ } } /** * $Log: CleanerAgent.java,v $ * Revision 1.3 2003/12/01 13:46:35 Rob * Cleanup Thread now runs * * Revision 1.2 2003/10/13 22:11:23 Administrator * *** empty log message *** * * Revision 1.1.1.1 2003/10/13 19:19:31 Administrator * no message * * Revision 1.1.1.1 2003/10/13 00:21:18 root * no message * */