//$Header: /cvsroot-fuse/mec-as2/39/mendelson/comm/as2/timing/MessageDeleteController.java,v 1.1 2012/04/18 14:10:39 heller Exp $ package de.mendelson.comm.as2.timing; import de.mendelson.comm.as2.clientserver.message.RefreshClientMessageOverviewList; import de.mendelson.comm.as2.log.LogAccessDB; import de.mendelson.comm.as2.message.AS2MessageInfo; import de.mendelson.comm.as2.message.MessageAccessDB; import de.mendelson.comm.as2.notification.Notification; import de.mendelson.comm.as2.preferences.PreferencesAS2; import de.mendelson.comm.as2.server.AS2Server; import de.mendelson.util.MecResourceBundle; import de.mendelson.util.clientserver.ClientServer; import java.io.File; import java.sql.Connection; import java.util.List; import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.logging.Logger; /* * Copyright (C) mendelson-e-commerce GmbH Berlin Germany * * This software is subject to the license agreement set forth in the license. * Please read and agree to all terms before using this software. * Other product and brand names are trademarks of their respective owners. */ /** * Controlles the timed deletion of AS2 entries from the log * @author S.Heller * @version $Revision: 1.1 $ */ public class MessageDeleteController { /**Logger to log inforamtion to*/ private Logger logger = Logger.getLogger(AS2Server.SERVER_LOGGER_NAME); private PreferencesAS2 preferences = new PreferencesAS2(); private MessageDeleteThread deleteThread; private ClientServer clientserver = null; private MecResourceBundle rb = null; private Connection configConnection; private Connection runtimeConnection; public MessageDeleteController(ClientServer clientserver, Connection configConnection, Connection runtimeConnection) { this.clientserver = clientserver; this.configConnection = configConnection; this.runtimeConnection = runtimeConnection; //Load default resourcebundle try { this.rb = (MecResourceBundle) ResourceBundle.getBundle( ResourceBundleMessageDeleteController.class.getName()); } //load up resourcebundle catch (MissingResourceException e) { throw new RuntimeException("Oops..resource bundle " + e.getClassName() + " not found."); } } /**Starts the embedded task that guards the log */ public void startAutoDeleteControl() { this.deleteThread = new MessageDeleteThread(this.configConnection, this.runtimeConnection); Executors.newSingleThreadExecutor().submit(this.deleteThread); } /**Deletes a message entry from the log. Clears all files */ public void deleteMessageFromLog(AS2MessageInfo info) { LogAccessDB logAccess = new LogAccessDB(this.configConnection, this.runtimeConnection); logAccess.deleteMessageLog(info.getMessageId()); MessageAccessDB messageAccess = new MessageAccessDB(this.configConnection, this.runtimeConnection); try { //delete all raw files from the disk List<String> rawfilenames = messageAccess.getRawFilenamesToDelete(info); if (rawfilenames != null) { for (String rawfilename : rawfilenames) { boolean success = new File(rawfilename).delete(); //did not work, schedule for delete after shutdown if (!success) { new File(rawfilename).deleteOnExit(); } } } messageAccess.deleteMessage(info); } catch (Exception e) { this.logger.severe("deleteMessageFromLog: " + e.getMessage()); Notification.systemFailure(this.configConnection, this.runtimeConnection, e); } if (this.clientserver != null) { this.clientserver.broadcastToClients(new RefreshClientMessageOverviewList()); } } public class MessageDeleteThread implements Runnable { private boolean stopRequested = false; //wait this time between checks, once an hour private final long WAIT_TIME = TimeUnit.HOURS.toMillis(1); //DB connection private Connection configConnection; private Connection runtimeConnection; public MessageDeleteThread(Connection configConnection, Connection runtimeConnection) { this.configConnection = configConnection; this.runtimeConnection = runtimeConnection; } @Override public void run() { Thread.currentThread().setName("Contol auto as2 message delete"); while (!stopRequested) { try { Thread.sleep(WAIT_TIME); } catch (InterruptedException e) { //nop } if (preferences.getBoolean(PreferencesAS2.AUTO_MSG_DELETE)) { MessageAccessDB messageAccess = null; try { messageAccess = new MessageAccessDB(this.configConnection, this.runtimeConnection); long olderThan = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(preferences.getInt(PreferencesAS2.AUTO_MSG_DELETE_OLDERTHAN)); List<AS2MessageInfo> overviewList = messageAccess.getMessagesOlderThan(olderThan, -1); if (overviewList != null) { for (AS2MessageInfo messageInfo:overviewList) { if (preferences.getBoolean(PreferencesAS2.AUTO_MSG_DELETE_LOG)) { logger.fine(rb.getResourceString("autodelete", new Object[]{ messageInfo.getMessageId(), String.valueOf(preferences.getInt(PreferencesAS2.AUTO_MSG_DELETE_OLDERTHAN)) })); } deleteMessageFromLog(messageInfo); } } } catch (Exception e) { logger.severe("MessageDeleteThread: " + e.getMessage()); Notification.systemFailure(this.configConnection, this.runtimeConnection, e); } } } } } }