private void check()

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];
                        }
                    }
                }
            }
        }
    }