/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.pieshare.service.filewatcher;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import static java.nio.file.StandardWatchEventKinds.*;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.List;
import javax.swing.event.EventListenerList;
import org.apache.log4j.Logger;
import org.pieshare.domain.PieceOfPie;
import org.pieshare.service.event.IEventBaseService;
/**
*
* @author Richard Leopold
*/
public class FileWatcherService implements IFileWatcherService
{
private static final Logger logger = Logger.getLogger(FileWatcherService.class);
private IEventBaseService eventBaseService;
private String path = "../";
private boolean doRun = true;
@Override
public void setEventBaseService(IEventBaseService eventBaseService)
{
this.eventBaseService = eventBaseService;
}
@Override
public void run()
{
WatchService watcher = null;
try
{
watcher = FileSystems.getDefault().newWatchService();
}
catch (IOException ex)
{
logger.debug("Not possible to set up watcher. Err: " + ex.getMessage());
return;
}
//ToDo: Decide from where the Path is comming.
File file = new File(path);
Path dir = file.toPath();
WatchKey key = null;
try
{
key = dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
}
catch (IOException ex)
{
logger.debug("Not possible register watcher on directory/file. Err: " + ex.getMessage());
return;
}
while(doRun)
{
// wait for key to be signaled
try
{
key = watcher.take();
}
catch (InterruptedException x)
{
return;
}
for (WatchEvent<?> event : key.pollEvents())
{
WatchEvent.Kind<?> kind = event.kind();
// This key is registered only
// for ENTRY_CREATE events,
// but an OVERFLOW event can
// occur regardless if events
// are lost or discarded.
if (kind == OVERFLOW)
{
continue;
}
// The filename is the
// context of the event.
WatchEvent<Path> ev = (WatchEvent<Path>) event;
Path filename = ev.context();
eventBaseService.fireEvent(FileWatcherEvent.class, this, new PieceOfPie(filename.toFile(), kind));
}
// Reset the key -- this step is critical if you want to
// receive further watch events. If the key is no longer valid,
// the directory is inaccessible so exit the loop.
boolean valid = key.reset();
if (!valid)
{
break;
}
}
}
public void stopRunning()
{
doRun = false;
}
public void setDirectory(String path)
{
this.path = path;
}
@Override
public void addFileChangeEventListener(Object listener)
{
//eventBaseService.addEventListener(FileWatcherEvent.class, listener);
}
@Override
public void removeFileChangeEventListener(Object listener)
{
eventBaseService.removeEventListener(FileWatcherEvent.class, listener);
}
}