tikhomirov@610: /* tikhomirov@610: * Copyright (c) 2013 TMate Software Ltd tikhomirov@610: * tikhomirov@610: * This program is free software; you can redistribute it and/or modify tikhomirov@610: * it under the terms of the GNU General Public License as published by tikhomirov@610: * the Free Software Foundation; version 2 of the License. tikhomirov@610: * tikhomirov@610: * This program is distributed in the hope that it will be useful, tikhomirov@610: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@610: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@610: * GNU General Public License for more details. tikhomirov@610: * tikhomirov@610: * For information on how to redistribute this software under tikhomirov@610: * the terms of a license other than GNU General Public License tikhomirov@610: * contact TMate Software at support@hg4j.com tikhomirov@610: */ tikhomirov@610: package org.tmatesoft.hg.internal; tikhomirov@610: tikhomirov@610: import java.io.File; tikhomirov@610: tikhomirov@610: /** tikhomirov@610: * This shall become interface/abstract class accessible from SessionContext, tikhomirov@610: * with plugable implementations, e.g. Java7 (file monitoring facilities) based, tikhomirov@610: * or any other convenient means. It shall allow both "check at the moment asked" tikhomirov@610: * and "collect changes and dispatch on demand" implementation approaches, so that tikhomirov@610: * implementors may use best available technology tikhomirov@610: * tikhomirov@610: * @author Artem Tikhomirov tikhomirov@610: * @author TMate Software Ltd. tikhomirov@610: */ tikhomirov@610: public class FileChangeMonitor { tikhomirov@610: private final File file; tikhomirov@610: private long lastModified; tikhomirov@610: private long length; tikhomirov@610: tikhomirov@610: /** tikhomirov@610: * First round: support for 1-monitor-1-file only tikhomirov@610: * Next round: 1-monitor-N files tikhomirov@610: */ tikhomirov@610: public FileChangeMonitor(File f) { tikhomirov@610: file = f; tikhomirov@610: } tikhomirov@610: tikhomirov@610: // shall work for files that do not exist tikhomirov@610: public void touch(Object source) { tikhomirov@610: lastModified = file.lastModified(); tikhomirov@610: length = file.length(); tikhomirov@610: } tikhomirov@610: tikhomirov@610: public void check(Object source, Action onChange) { tikhomirov@610: if (changed(source)) { tikhomirov@610: onChange.changed(); tikhomirov@610: } tikhomirov@610: } tikhomirov@610: tikhomirov@610: public boolean changed(Object source) { tikhomirov@610: if (file.lastModified() != lastModified) { tikhomirov@610: return true; tikhomirov@610: } tikhomirov@610: return file.length() != length; tikhomirov@610: } tikhomirov@610: tikhomirov@610: public interface Action { tikhomirov@610: public void changed(); tikhomirov@610: } tikhomirov@610: }