@Override public synchronized void deleteExpired() { long currentTimeMillis = System.currentTimeMillis(); for (Iterator<EncryptedEmailPacket> iterator=iterator(); iterator.hasNext();) { EncryptedEmailPacket emailPacket = iterator.next(); if (currentTimeMillis > emailPacket.getStoreTime() + EXPIRATION_TIME_MILLISECONDS) { log.debug("Deleting expired email packet: <" + emailPacket + ">"); iterator.remove(); } } }
/** Overridden to set a time stamp on the packet */ @Override public void store(DhtStorablePacket packetToStore) { if (!(packetToStore instanceof EncryptedEmailPacket)) throw new IllegalArgumentException("Invalid packet type: " + packetToStore.getClass().getSimpleName() + "; this folder only stores packets of type " + EncryptedEmailPacket.class.getSimpleName() + "."); EncryptedEmailPacket emailPacket = (EncryptedEmailPacket)packetToStore; // If the packet didn't come with a time stamp, set it to the current time if (emailPacket.getStoreTime() == 0) emailPacket.setStoreTime(System.currentTimeMillis()); super.store(packetToStore); }
@Test public void testCheckExpiration() throws GeneralSecurityException, InterruptedException, PasswordException { final long cutoffTime = System.currentTimeMillis() - ExpirationListener.EXPIRATION_TIME_MILLISECONDS; // store a packet that expired 10 seconds ago long expirationTime1 = cutoffTime - 10*1000; EncryptedEmailPacket emailPacket1 = new SettableStoreTimeEncryptedEmailPacket(unencryptedPacket, recipient, expirationTime1); packetFolder.store(emailPacket1); assertEquals(expirationTime1/1000L, packetFolder.getElements().get(0).getStoreTime()/1000L); // round to seconds // store a packet that expires in 10 seconds long expirationTime2 = cutoffTime + 10*1000; EncryptedEmailPacket emailPacket2 = new SettableStoreTimeEncryptedEmailPacket(unencryptedPacket2, recipient, expirationTime2); packetFolder.store(emailPacket2); assertEquals(2, packetFolder.getElements().size()); // delete expired packets and check that one of the two packets got deleted packetFolder.deleteExpired(); assertEquals(1, packetFolder.getElements().size()); // 11 seconds later, the remaining packet should have expired TimeUnit.SECONDS.sleep(11); packetFolder.deleteExpired(); assertEquals(0, packetFolder.getElements().size()); }