DirectoryWatchJob.java
package eu.javaexperience.io.modification;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchEvent.Kind;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import eu.javaexperience.exceptions.UnimplementedCaseException;
import eu.javaexperience.interfaces.simple.publish.SimplePublish2;
import eu.javaexperience.multithread.Job;
public class DirectoryWatchJob implements Job<Void>
{
private final WatchService ws;
private final Path p;
private final SimplePublish2<Path, FileEvent> publish;
/**
*
* Ha a SimplePublish2 kivételt dob, a feladat csöndben leteszi a lantot...
* */
public DirectoryWatchJob(File dir, SimplePublish2<Path, FileEvent> onFileChange) throws IOException
{
ws = FileSystems.getDefault().newWatchService();
p = dir.toPath();
this.publish = onFileChange;
}
public static FileEvent asEvent(Kind<Path> ev)
{
if(ev == StandardWatchEventKinds.ENTRY_CREATE)
return FileEvent.created;
else if(ev == StandardWatchEventKinds.ENTRY_DELETE)
return FileEvent.deleted;
else if(ev == StandardWatchEventKinds.ENTRY_MODIFY)
return FileEvent.modified;
throw new UnimplementedCaseException("no case defined for "+ev);
}
@SuppressWarnings("unchecked")
@Override
public void exec(Void param) throws Throwable
{
try
{
p.register(ws, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
while(true)
{
WatchKey cwk = ws.take();
for (WatchEvent<?> event : cwk.pollEvents())
publish.publish(((Path) event.context()), asEvent((Kind<Path>) event.kind()));
cwk.reset();
}
}
finally
{
ws.close();
}
}
/*public static void main(String[] args) throws Throwable
{
DirectoryWatchJob j = new DirectoryWatchJob(new File("/tmp/1"), new SimplePublish2<Path,FileEvent>()
{
@Override
public void publish(Path a,FileEvent kind)
{
System.out.println(a+" "+kind);
}
});
JobExecutor.putJob(j, null);
while(true)
Thread.sleep(10000);
}*/
}