KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > jforum > util > FileMonitor


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
45 import java.io.File JavaDoc;
46 import java.util.HashMap JavaDoc;
47 import java.util.Map JavaDoc;
48 import java.util.Timer JavaDoc;
49 import java.util.TimerTask JavaDoc;
50
51 import org.apache.log4j.Logger;
52
53 /**
54  * Monitor class for file changes.
55  *
56  * @author Rafael Steil
57  * @version $Id: FileMonitor.java,v 1.8 2005/07/26 03:05:25 rafaelsteil Exp $
58  */

59 public class FileMonitor
60 {
61     private static Logger logger = Logger.getLogger(FileMonitor.class);
62     private static final FileMonitor instance = new FileMonitor();
63     private Timer JavaDoc timer;
64     private Map JavaDoc timerEntries;
65     
66     private FileMonitor() {
67         this.timerEntries = new HashMap JavaDoc();
68         this.timer = new Timer JavaDoc(true);
69     }
70     
71     public static FileMonitor getInstance() {
72         return instance;
73     }
74     
75     /**
76      * Add a file to the monitor
77      *
78      * @param listener The file listener
79      * @param filename The filename to watch
80      * @param period The watch interval.
81      */

82     public void addFileChangeListener(FileChangeListener listener,
83         String JavaDoc filename, long period) {
84         this.removeFileChangeListener(filename);
85         
86         logger.info("Watching " + filename);
87         
88         FileMonitorTask task = new FileMonitorTask(listener, filename);
89         
90         this.timerEntries.put(filename, task);
91         this.timer.schedule(task, period, period);
92     }
93     
94     /**
95      * Stop watching a file
96      *
97      * @param listener The file listener
98      * @param filename The filename to keep watch
99      */

100     public void removeFileChangeListener(String JavaDoc filename) {
101         FileMonitorTask task = (FileMonitorTask)this.timerEntries.remove(filename);
102         
103         if (task != null) {
104             task.cancel();
105         }
106     }
107     
108     private class FileMonitorTask extends TimerTask JavaDoc {
109         private FileChangeListener listener;
110         private String JavaDoc filename;
111         private File JavaDoc monitoredFile;
112         private long lastModified;
113         
114         public FileMonitorTask(FileChangeListener listener, String JavaDoc filename) {
115             this.listener = listener;
116             this.filename = filename;
117             
118             this.monitoredFile = new File JavaDoc(filename);
119             if (!this.monitoredFile.exists()) {
120                 return;
121             }
122             
123             this.lastModified = this.monitoredFile.lastModified();
124         }
125         
126         public void run() {
127             long latestChange = this.monitoredFile.lastModified();
128             if (this.lastModified != latestChange) {
129                 this.lastModified = latestChange;
130                 
131                 this.listener.fileChanged(this.filename);
132             }
133         }
134     }
135 }
136
Popular Tags