/* * [Deletions.java] * * Summary: Notice files that have been deleted since we last distributed. * * Copyright: (c) 2007-2017 Roedy Green, Canadian Mind Products, http://mindprod.com * * Licence: This software may be copied and used freely for any purpose but military. * http://mindprod.com/contact/nonmil.html * * Requires: JDK 1.8+ * * Created with: JetBrains IntelliJ IDEA IDE http://www.jetbrains.com/idea/ * * Version History: * 8.4 2007-07-18 */ package com.mindprod.replicatorsender; import com.mindprod.sorted.Merge; import com.mindprod.sorted.SortedArrayList; /** * Notice files that have been deleted since we last distributed. * * @author Roedy Green, Canadian Mind Products * @version 8.4 2007-07-18 * @since 2007 */ final class Deletions { /** * Discover files that have either been deleted or updated * since the last distribution. The old versions in the zip files are now deadwood. We * record the amount of new deadwood in each zip. */ public static void process() { // obsolete includes both files newly replaced and newly deleted. SortedArrayList obsolete = Merge.allBut( ReplicatorSender.oldFilesDistributed, ReplicatorSender.filesToDistribute, MaxiFD.BY_DATE_AND_FILENAME ); for ( MaxiFD fd : obsolete ) { // deadwood accounting for files that have been been replaced or // deleted long fileLength = fd.getFileLength(); MaxiZD zd = fd.getZip(); assert zd != null : "unassigned file was distributed"; zd.deadwood += fileLength; zd.livewood -= fileLength; // don't change timestamp or would disturb ordering. // don't bother to setFileLength or assignZip(null) since // most of these are replacements which will just be dropped anyway. } // split off the true deletions from the obsoletes, excluding old // deletions. final SortedArrayList deletions = Merge.allBut( obsolete, ReplicatorSender.filesToDistribute, MaxiFD.BY_FILENAME ); StatsForSender.recentDeletedFilesCount = deletions.size(); StatsForSender.recentUpdatedFilesCount = obsolete.size() - deletions.size(); // stop tracking files we deleted long ago. final int size = ReplicatorSender.oldFilesDeleted.size(); for ( int i = 0; i < size; i++ ) { final MaxiFD fd = ReplicatorSender.oldFilesDeleted.get( i ); if ( fd.getClumping() < ConfigForSender.KEEP_DELETED_CUTOFF_TIMESTAMP ) { ReplicatorSender.oldFilesDeleted.set( i, null ); // effectively delete it. } } // physically delete nulled elements. ReplicatorSender.oldFilesDeleted = Merge.pruneNulls( ReplicatorSender.oldFilesDeleted ); // new list of files to delete is old list minus files "undeleted", // re-emerged plus newly deleted files. ReplicatorSender.filesToDelete = Merge.allBut( ReplicatorSender.oldFilesDeleted, ReplicatorSender.filesToDistribute, MaxiFD.BY_FILENAME ); // add newly discovered deletions. for ( MaxiFD fd : deletions ) { // date effectively noticed it disappeared. fd.markAsDeleted(); fd.setFileLength( 0 ); fd.setTimestamp( ReplicatorSender.cutOffTimestamp ); fd.setClumping( ReplicatorSender.cutOffTimestamp ); fd.assignZip( null ); ReplicatorSender.filesToDelete.add( fd ); } // we have wrecked the order of any SortedArrayList one of the deletions // might have been in. ReplicatorSender.filesToDelete.invalidate(); ReplicatorSender.oldFilesDistributed.invalidate(); } }