package co.codewizards.cloudstore.local.transport;
import java.util.HashMap;
import java.util.Map;
import co.codewizards.cloudstore.core.oio.File;
import co.codewizards.cloudstore.core.util.AssertUtil;
public class ParentFileLastModifiedManager {
private static class ParentFileEntry {
public final File parentFile;
public final long lastModified;
public int refCount = 0;
public ParentFileEntry(final File parentFile) {
this.parentFile = AssertUtil.assertNotNull(parentFile, "parentFile");
this.lastModified = parentFile.exists() ? parentFile.lastModified() : Long.MIN_VALUE;
}
}
private static final class ParentFileLastModifiedManagerHolder {
public static final ParentFileLastModifiedManager instance = new ParentFileLastModifiedManager();
}
private final Map<File, ParentFileEntry> parentFile2ParentFileEntry = new HashMap<File, ParentFileEntry>();
private ParentFileLastModifiedManager() { }
public static ParentFileLastModifiedManager getInstance() {
return ParentFileLastModifiedManagerHolder.instance;
}
public synchronized void backupParentFileLastModified(final File parentFile) {
AssertUtil.assertNotNull(parentFile, "parentFile");
ParentFileEntry parentFileEntry = parentFile2ParentFileEntry.get(parentFile);
if (parentFileEntry == null) {
parentFileEntry = new ParentFileEntry(parentFile);
parentFile2ParentFileEntry.put(parentFile, parentFileEntry);
}
++parentFileEntry.refCount;
}
public synchronized void restoreParentFileLastModified(final File parentFile) {
AssertUtil.assertNotNull(parentFile, "parentFile");
final ParentFileEntry parentFileEntry = parentFile2ParentFileEntry.get(parentFile);
if (parentFileEntry == null)
throw new IllegalStateException("parentFileEntry == null :: less invocations of restore... than of backup...!!! :: parentFile=" + parentFile);
if (--parentFileEntry.refCount == 0) {
if (parentFileEntry.lastModified != Long.MIN_VALUE)
parentFileEntry.parentFile.setLastModified(parentFileEntry.lastModified);
parentFile2ParentFileEntry.remove(parentFile);
}
}
}