in src/main/java/org/apache/sling/fsprovider/internal/FileMonitor.java [148: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
if (contentFileCache != null) {
contentFileCache.remove(this.provider.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
if (contentFileCache != null) {
contentFileCache.remove(this.provider.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);
}
}
}
}
}