in src/main/java/org/apache/sling/fsprovider/internal/FileMonitor.java [153:203]
private void check(final Monitorable monitorable, final ObservationReporter reporter) {
log.trace("Checking {}", monitorable.file);
// if the file is non existing, check if it has been readded
if ( monitorable.status instanceof NonExistingStatus ) {
if ( monitorable.file.exists() ) {
// new file and reset status
createStatus(monitorable, contentFileExtensions, contentFileCache);
fileStatCache.clear();
sendEvents(monitorable, ChangeType.ADDED, reporter);
final FileStatus fs = (FileStatus)monitorable.status;
if ( fs instanceof DirStatus ) {
final DirStatus ds = (DirStatus)fs;
// remove monitorables for new folder and update folder children to send events for directory contents
ds.children = new Monitorable[0];
checkDirStatusChildren(monitorable, reporter);
}
}
} else {
// check if the file has been removed
if ( !monitorable.file.exists() ) {
// removed file and update status
contentFileCache.remove(transformPath(monitorable.path));
monitorable.status = NonExistingStatus.SINGLETON;
fileStatCache.clear();
sendEvents(monitorable, ChangeType.REMOVED, reporter);
} else {
// check for changes
final FileStatus fs = (FileStatus)monitorable.status;
boolean changed = false;
if ( fs.lastModified < monitorable.file.lastModified() ) {
fs.lastModified = monitorable.file.lastModified();
// changed
contentFileCache.remove(transformPath(monitorable.path));
sendEvents(monitorable, ChangeType.CHANGED, reporter);
changed = true;
}
if ( fs instanceof DirStatus ) {
// directory
final DirStatus ds = (DirStatus)fs;
for(int i=0; i<ds.children.length; i++) {
check(ds.children[i], reporter);
}
// if the dir changed we have to update
if ( changed ) {
// and now update
checkDirStatusChildren(monitorable, reporter);
}
}
}
}
}