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