package org.openslx.imagemaster.ftp; import java.io.File; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Timer; import java.util.TimerTask; import org.apache.log4j.Logger; import org.openslx.imagemaster.App; import org.openslx.imagemaster.Globals; import org.openslx.imagemaster.db.DbImage; import org.openslx.imagemaster.util.Util; public class FtpCredentialsScheduler extends TimerTask { private static Logger log = Logger.getLogger( FtpCredentialsScheduler.class ); public static final long timeout = Long.valueOf( Globals.getPropertyInt( Globals.PropInt.FTPTIMEOUT ) ) * 60L * 1000L; // timeout in ms @Override public void run() { synchronized ( App.ftpServer.users ) { List uploadingImages = DbImage.getUploadingImages(); // get the uploading images // check all folders for ( Map.Entry entry : App.ftpServer.users.entrySet() ) { if ( entry == null ) continue; String username = entry.getKey(); File dir = new File( Globals.getPropertyString( Globals.PropString.FTPBASEDIR ) + "/" + username ); if ( !dir.exists() ) continue; File[] list = dir.listFiles(); if ( list.length == 1 ) { // check file size first DbImage currentImage = null; for (DbImage img : uploadingImages) { // find the image that was uploaded by this user if (img.ftpUser == username) currentImage = img; } if (currentImage != null && list[0].getTotalSpace() == currentImage.fileSize) { ImageProcessor.processImageAfterUpload( username, list[0].getName() ); } else if ( ( new Date().getTime() - list[0].lastModified() ) >= timeout ) { // check timeout log.info( username + "'s files are too old. Deleting him and his folder." ); Util.deleteFolder( dir ); App.ftpServer.removeUser( username ); ImageProcessor.removeImageFromProcessList( username ); } } else if ( list.length > 1 ) { log.info( "User '" + username + "' uploaded too many files. Deleting his account and his folder." ); Util.deleteFolder( dir ); App.ftpServer.removeUser( username ); ImageProcessor.removeImageFromProcessList( username ); } else { // check the creation time of the user if ( ( System.currentTimeMillis() - App.ftpServer.users.get( username ) ) >= timeout ) { log.info( username + " did nothing for too long. Deleting him and his folder" ); Util.deleteFolder( dir ); App.ftpServer.removeUser( username ); ImageProcessor.removeImageFromProcessList( username ); } } } } } public static void startScheduling() { Timer timer = new Timer( "FtpScheduler" ); // start timer now and fire every 60 seconds timer.schedule( new FtpCredentialsScheduler(), 0, 60000 ); } }