FileMonitor.java
Upload User: gdxydsw
Upload Date: 2019-01-29
Package Size: 16721k
Code Size: 4k
Category:

Java Develop

Development Platform:

Java

  1. /*
  2.  * Copyright (c) 2003, 2004 Rafael Steil
  3.  * All rights reserved.
  4.  * 
  5.  * Redistribution and use in source and binary forms, 
  6.  * with or without modification, are permitted provided 
  7.  * that the following conditions are met:
  8.  * 
  9.  * 1) Redistributions of source code must retain the above 
  10.  * copyright notice, this list of conditions and the 
  11.  * following  disclaimer.
  12.  * 2)  Redistributions in binary form must reproduce the 
  13.  * above copyright notice, this list of conditions and 
  14.  * the following disclaimer in the documentation and/or 
  15.  * other materials provided with the distribution.
  16.  * 3) Neither the name of "Rafael Steil" nor 
  17.  * the names of its contributors may be used to endorse 
  18.  * or promote products derived from this software without 
  19.  * specific prior written permission.
  20.  * 
  21.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT 
  22.  * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
  23.  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 
  24.  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
  25.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
  26.  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 
  27.  * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 
  28.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
  29.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
  30.  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
  31.  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
  32.  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
  33.  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 
  34.  * IN CONTRACT, STRICT LIABILITY, OR TORT 
  35.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
  36.  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
  37.  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
  38.  * 
  39.  * Created on 02/06/2004 23:29:51
  40.  * The JForum Project
  41.  * http://www.jforum.net
  42.  */
  43. package net.jforum.util;
  44. import java.io.File;
  45. import java.util.HashMap;
  46. import java.util.Map;
  47. import java.util.Timer;
  48. import java.util.TimerTask;
  49. import org.apache.log4j.Logger;
  50. /**
  51.  * Monitor class for file changes.
  52.  * 
  53.  * @author Rafael Steil
  54.  * @version $Id: FileMonitor.java,v 1.9 2007/04/12 02:11:53 rafaelsteil Exp $
  55.  */
  56. public class FileMonitor
  57. {
  58. private static Logger logger = Logger.getLogger(FileMonitor.class);
  59. private static final FileMonitor instance = new FileMonitor();
  60. private Timer timer;
  61. private Map timerEntries;
  62. private FileMonitor() {
  63. this.timerEntries = new HashMap();
  64. this.timer = new Timer(true);
  65. }
  66. public static FileMonitor getInstance() {
  67. return instance;
  68. }
  69. /**
  70.  * Add a file to the monitor
  71.  * 
  72.  * @param listener The file listener
  73.  * @param filename The filename to watch
  74.  * @param period The watch interval.
  75.  */
  76. public void addFileChangeListener(FileChangeListener listener, 
  77. String filename, long period) {
  78. this.removeFileChangeListener(filename);
  79. logger.info("Watching " + filename);
  80. FileMonitorTask task = new FileMonitorTask(listener, filename);
  81. this.timerEntries.put(filename, task);
  82. this.timer.schedule(task, period, period);
  83. }
  84. /**
  85.  * Stop watching a file
  86.  * 
  87.  * @param listener The file listener
  88.  * @param filename The filename to keep watch
  89.  */
  90. public void removeFileChangeListener(String filename) {
  91. FileMonitorTask task = (FileMonitorTask)this.timerEntries.remove(filename);
  92. if (task != null) {
  93. task.cancel();
  94. }
  95. }
  96. private static class FileMonitorTask extends TimerTask {
  97. private FileChangeListener listener;
  98. private String filename;
  99. private File monitoredFile;
  100. private long lastModified;
  101. public FileMonitorTask(FileChangeListener listener, String filename) {
  102. this.listener = listener;
  103. this.filename = filename;
  104. this.monitoredFile = new File(filename);
  105. if (!this.monitoredFile.exists()) {
  106. return;
  107. }
  108. this.lastModified = this.monitoredFile.lastModified();
  109. }
  110. public void run() {
  111. long latestChange = this.monitoredFile.lastModified();
  112. if (this.lastModified != latestChange) {
  113. this.lastModified = latestChange;
  114. this.listener.fileChanged(this.filename);
  115. }
  116. }
  117. }
  118. }