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}