| 1 8 package org.codehaus.loom.components.util.monitor; 9 10 import java.io.File ; 11 import java.util.HashMap ; 12 import java.util.HashSet ; 13 import java.util.Iterator ; 14 import java.util.Map ; 15 import java.util.Set ; 16 17 26 public class DirectoryScanner implements Runnable  27 { 28 29 private final Thread m_monitorThread = new Thread ( this ); 30 31 32 private volatile boolean m_keepRunning = false; 33 34 35 private long m_frequency = 1000L * 5L; 36 37 38 private int m_priority = Thread.NORM_PRIORITY; 39 40 41 private DirectoryChangeListener m_directoryChangeListener; 42 43 44 private long m_lastModified; 45 46 47 private File m_directory; 48 49 50 private Set m_files; 51 52 53 private Map m_times; 54 55 61 public void setDirectory( final String path ) 62 { 63 m_directory = new File ( path ); 64 if( !m_directory.isDirectory() ) 65 { 66 final String message = 67 "Argument [" + path + "] doesn't seem to be a directory."; 68 throw new IllegalArgumentException ( message ); 69 } 70 m_files = new HashSet (); 71 m_times = new HashMap (); 72 final File [] files = m_directory.listFiles(); 73 for( int i = 0; i < files.length; i++ ) 74 { 75 final File file = files[i]; 76 m_files.add( file ); 77 m_times.put( file, new Long ( file.lastModified() ) ); 78 } 79 m_lastModified = System.currentTimeMillis(); 80 } 81 82 88 public void setDirectoryChangeListener( final DirectoryChangeListener directoryChangeListener ) 89 { 90 m_directoryChangeListener = directoryChangeListener; 91 } 92 93 98 public void setFrequency( final long frequency ) 99 { 100 m_frequency = frequency; 101 } 102 103 106 public void start() throws Exception  107 { 108 m_keepRunning = true; 109 m_monitorThread.setDaemon( true ); 110 m_monitorThread.setPriority( m_priority ); 111 m_monitorThread.start(); 112 } 113 114 117 public void stop() throws Exception  118 { 119 m_keepRunning = false; 120 m_monitorThread.interrupt(); 121 m_monitorThread.join(); 122 } 123 124 127 public final void run() 128 { 129 try 130 { 131 while( m_keepRunning ) 132 { 133 Thread.sleep( m_frequency ); 134 testModifiedAfter( System.currentTimeMillis() ); 135 } 136 } 137 catch( InterruptedException e ) 138 { 139 Thread.interrupted(); 140 } 141 } 142 143 148 public void testModifiedAfter( final long time ) 149 { 150 if( m_lastModified > time ) 151 { 152 return; 153 } 154 155 final File [] files = m_directory.listFiles(); 156 157 if( null == files ) 161 { 162 m_directoryChangeListener.unableToListContents(); 163 } 164 else 165 { 166 final HashSet existingFiles = new HashSet (); 167 final HashSet modifiedFiles = new HashSet (); 168 final HashSet addedFiles = new HashSet (); 169 final int fileCount = files.length; 170 171 for( int i = 0; i < files.length; i++ ) 172 { 173 final File file = files[i]; 174 final long newModTime = file.lastModified(); 175 if( m_files.contains( file ) ) 176 { 177 existingFiles.add( file ); 178 final Long oldModTime = (Long )m_times.get( file ); 179 if( oldModTime.longValue() != newModTime ) 180 { 181 modifiedFiles.add( file ); 182 } 183 } 184 else 185 { 186 addedFiles.add( file ); 187 } 188 m_times.put( file, new Long ( newModTime ) ); 189 } 190 191 final int lastCount = m_files.size(); 192 final int addedCount = addedFiles.size(); 193 final int modifiedCount = modifiedFiles.size(); 194 195 if( fileCount == lastCount && 0 == addedCount && 0 == modifiedCount ) 198 { 199 return; 200 } 201 202 final HashSet deletedFiles = new HashSet (); 203 204 if( fileCount != lastCount + addedCount ) 207 { 208 final Iterator iterator = m_files.iterator(); 209 while( iterator.hasNext() ) 210 { 211 final File file = (File )iterator.next(); 212 if( !existingFiles.contains( file ) ) 213 { 214 deletedFiles.add( file ); 215 m_times.remove( file ); 216 } 217 } 218 } 219 220 final int deletedCount = deletedFiles.size(); 221 222 if( 0 != addedCount ) 223 { 224 m_directoryChangeListener.directoryChange( 225 DirectoryChangeListener.ADDITION, addedFiles ); 226 } 227 if( 0 != deletedCount ) 228 { 229 m_directoryChangeListener.directoryChange( 230 DirectoryChangeListener.REMOVAL, deletedFiles ); 231 } 232 if( 0 != modifiedCount ) 233 { 234 m_directoryChangeListener.directoryChange( 235 DirectoryChangeListener.MODIFICATION, modifiedFiles ); 236 } 237 238 existingFiles.addAll( addedFiles ); 239 m_files = existingFiles; 240 } 241 } 242 } 243 | Popular Tags |