001package co.codewizards.cloudstore.local.transport; 002 003import static java.util.Objects.*; 004 005import java.util.HashMap; 006import java.util.Map; 007 008import co.codewizards.cloudstore.core.oio.File; 009 010public class ParentFileLastModifiedManager { 011 private static class ParentFileEntry { 012 public final File parentFile; 013 public final long lastModified; 014 public int refCount = 0; 015 016 public ParentFileEntry(final File parentFile) { 017 this.parentFile = requireNonNull(parentFile, "parentFile"); 018 this.lastModified = parentFile.exists() ? parentFile.lastModified() : Long.MIN_VALUE; 019 } 020 } 021 022 private static final class ParentFileLastModifiedManagerHolder { 023 public static final ParentFileLastModifiedManager instance = new ParentFileLastModifiedManager(); 024 } 025 026 private final Map<File, ParentFileEntry> parentFile2ParentFileEntry = new HashMap<File, ParentFileEntry>(); 027 028 private ParentFileLastModifiedManager() { } 029 030 public static ParentFileLastModifiedManager getInstance() { 031 return ParentFileLastModifiedManagerHolder.instance; 032 } 033 034 public synchronized void backupParentFileLastModified(final File parentFile) { 035 requireNonNull(parentFile, "parentFile"); 036 ParentFileEntry parentFileEntry = parentFile2ParentFileEntry.get(parentFile); 037 if (parentFileEntry == null) { 038 parentFileEntry = new ParentFileEntry(parentFile); 039 parentFile2ParentFileEntry.put(parentFile, parentFileEntry); 040 } 041 ++parentFileEntry.refCount; 042 } 043 044 public synchronized void restoreParentFileLastModified(final File parentFile) { 045 requireNonNull(parentFile, "parentFile"); 046 final ParentFileEntry parentFileEntry = parentFile2ParentFileEntry.get(parentFile); 047 if (parentFileEntry == null) 048 throw new IllegalStateException("parentFileEntry == null :: less invocations of restore... than of backup...!!! :: parentFile=" + parentFile); 049 050 if (--parentFileEntry.refCount == 0) { 051 if (parentFileEntry.lastModified != Long.MIN_VALUE) 052 parentFileEntry.parentFile.setLastModified(parentFileEntry.lastModified); 053 054 parentFile2ParentFileEntry.remove(parentFile); 055 } 056 } 057}