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}