tikhomirov@607: /* tikhomirov@607: * Copyright (c) 2013 TMate Software Ltd tikhomirov@607: * tikhomirov@607: * This program is free software; you can redistribute it and/or modify tikhomirov@607: * it under the terms of the GNU General Public License as published by tikhomirov@607: * the Free Software Foundation; version 2 of the License. tikhomirov@607: * tikhomirov@607: * This program is distributed in the hope that it will be useful, tikhomirov@607: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@607: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@607: * GNU General Public License for more details. tikhomirov@607: * tikhomirov@607: * For information on how to redistribute this software under tikhomirov@607: * the terms of a license other than GNU General Public License tikhomirov@607: * contact TMate Software at support@hg4j.com tikhomirov@607: */ tikhomirov@607: package org.tmatesoft.hg.internal; tikhomirov@607: tikhomirov@607: import java.io.File; tikhomirov@607: import java.util.WeakHashMap; tikhomirov@607: tikhomirov@607: /** tikhomirov@607: * Detect changes to revlog files. Not a general file change monitoring as we utilize the fact revlogs are append-only (and even in case tikhomirov@607: * of stripped-off tail revisions, with e.g. mq, detection approach is still valid). tikhomirov@607: * tikhomirov@607: * @author Artem Tikhomirov tikhomirov@607: * @author TMate Software Ltd. tikhomirov@607: */ tikhomirov@607: public class RevlogChangeMonitor { tikhomirov@607: tikhomirov@607: private final WeakHashMap lastKnownSize; tikhomirov@621: private final WeakHashMap lastKnownTime; tikhomirov@607: private final File soleFile; tikhomirov@621: private long soleFileSize = -1; tikhomirov@621: private long soleFileTime = -1; tikhomirov@607: tikhomirov@621: // use single for multiple files. TODO [1.2] repository/session context shall provide tikhomirov@607: // alternative (configurable) implementations, so that Java7 users may supply better one tikhomirov@607: public RevlogChangeMonitor() { tikhomirov@607: lastKnownSize = new WeakHashMap(); tikhomirov@621: lastKnownTime= new WeakHashMap(); tikhomirov@607: soleFile = null; tikhomirov@607: } tikhomirov@607: tikhomirov@607: public RevlogChangeMonitor(File f) { tikhomirov@607: assert f != null; tikhomirov@621: lastKnownSize = lastKnownTime = null; tikhomirov@607: soleFile = f; tikhomirov@607: } tikhomirov@607: tikhomirov@607: public void touch(File f) { tikhomirov@607: assert f != null; tikhomirov@607: if (lastKnownSize == null) { tikhomirov@607: assert f == soleFile; tikhomirov@621: soleFileSize = f.length(); tikhomirov@621: soleFileTime = f.lastModified(); tikhomirov@607: } else { tikhomirov@607: lastKnownSize.put(f, f.length()); tikhomirov@621: lastKnownTime.put(f, f.lastModified()); tikhomirov@607: } tikhomirov@607: } tikhomirov@607: tikhomirov@607: public boolean hasChanged(File f) { tikhomirov@607: assert f != null; tikhomirov@607: if (lastKnownSize == null) { tikhomirov@607: assert f == soleFile; tikhomirov@621: return soleFileSize != f.length() || soleFileTime != f.lastModified(); tikhomirov@607: } else { tikhomirov@607: Long lastSize = lastKnownSize.get(f); tikhomirov@621: Long lastTime = lastKnownTime.get(f); tikhomirov@621: if (lastSize == null || lastTime == null) { tikhomirov@607: return true; tikhomirov@607: } tikhomirov@621: return f.length() != lastSize || f.lastModified() != lastTime; tikhomirov@607: } tikhomirov@607: } tikhomirov@607: }