in src/main/java/org/apache/sling/installer/provider/file/impl/FileMonitor.java [162:231]
private void check(final Monitorable monitorable, final Collector collector) {
logger.debug("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);
final List<File> files = new ArrayList<File>();
collect(monitorable.file, files);
for(final File file : files ) {
collector.added.add(file);
}
}
} else {
// check if the file has been removed
if ( !monitorable.file.exists() ) {
// removed file and update status
final List<File> files = new ArrayList<File>();
collectDeleted(monitorable, files);
for(final File file : files ) {
collector.removed.add(file);
}
monitorable.status = NonExistingStatus.SINGLETON;
} 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 ( monitorable.file.isFile() ) {
collector.changed.add(monitorable.file);
}
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], collector);
}
// if the dir changed we have to update
if ( changed ) {
// and now update
final File[] files = monitorable.file.listFiles();
if (files != null) {
final Monitorable[] children = new Monitorable[files.length];
for (int i = 0; i < files.length; i++) {
// search in old list
for (int m = 0; m < ds.children.length; m++) {
if (ds.children[m].file.equals(files[i])) {
children[i] = ds.children[m];
break;
}
}
if (children[i] == null) {
children[i] = new Monitorable(files[i]);
children[i].status = NonExistingStatus.SINGLETON;
check(children[i], collector);
}
}
ds.children = children;
} else {
ds.children = new Monitorable[0];
}
}
}
}
}
}