content: package com._17od.upm.util;
  
  import java.io.File;
  
  /**
   * Monitor a file and call a callback when the file changes.
   */
  public class FileMonitor implements Runnable {
  
      private FileChangedCallback fileChangedCallback;
      private File fileToMonitor;
      private long previousLastModified;
      private boolean paused;
  
      public FileMonitor(File fileToMonitor, FileChangedCallback fileChangedCallback) {
          this.fileChangedCallback = fileChangedCallback;
          this.fileToMonitor = fileToMonitor;
          this.previousLastModified = fileToMonitor.lastModified();
      }
  
      public void run() {
          while (true) {
              synchronized (this) {
                  if (!paused && fileChanged()) {
                      fileChangedCallback.fileChanged(fileToMonitor);
                      paused = true;
                  }
              }
              try {
                  Thread.sleep(1000);
              } catch (InterruptedException e) {
              }
          }
      }
  
      public void start() {
          this.previousLastModified = fileToMonitor.lastModified();
          paused = false;
      }
  
      public synchronized void pause() {
          paused = true;
      }
  
      public boolean fileChanged() {
          boolean fileModified = false;
          long currentLastModified = fileToMonitor.lastModified();
          if (previousLastModified != currentLastModified) {
              fileModified = true;
          }
          this.previousLastModified = currentLastModified;
          return fileModified;
      }
  
  }
  