001/**
002 * Copyright (C) 2014  Universidade de Aveiro, DETI/IEETA, Bioinformatics Group - http://bioinformatics.ua.pt/
003 *
004 * This file is part of Dicoogle/dicoogle.
005 *
006 * Dicoogle/dicoogle is free software: you can redistribute it and/or modify
007 * it under the terms of the GNU General Public License as published by
008 * the Free Software Foundation, either version 3 of the License, or
009 * (at your option) any later version.
010 *
011 * Dicoogle/dicoogle is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
014 * GNU General Public License for more details.
015 *
016 * You should have received a copy of the GNU General Public License
017 * along with Dicoogle.  If not, see <http://www.gnu.org/licenses/>.
018 */
019package pt.ua.dicoogle.server;
020
021/**
022 * Keeps track of modifications on a file
023 * @author Filipe Freitas
024 */
025import java.util.*;
026import java.io.*;
027
028public abstract class FileWatcher extends TimerTask {
029  private long timeStamp;
030  private File file;
031
032  public FileWatcher( File file )
033  {
034    this.file = file;
035    this.timeStamp = file.lastModified();    
036  }
037
038    @Override
039  public final void run()
040  { 
041    /* STUPID WINDOWS HACK
042     * 
043     * windows does NOT update the modified time
044     * of a file until it is closed (DOS Legacy code)
045     * 
046     */
047    
048    if (System.getProperty("os.name").toUpperCase().indexOf("WINDOWS") != -1)
049    {
050        onChange(file);
051    }
052    else
053    {
054        long localtimeStamp = file.lastModified();    
055        if( this.timeStamp != localtimeStamp ) 
056        {
057            this.timeStamp = localtimeStamp;
058            onChange(file);
059        }
060    }
061  }
062
063  protected abstract void onChange( File file );
064}