public void runOneCycle()

in src/main/java/org/apache/sling/installer/provider/jcr/impl/JcrInstaller.java [412:502]


    public void runOneCycle(final InstallerConfig cfg, final Session session) {
        logger.debug("Running watch cycle.");

        try {
            boolean didRefresh = false;

            if (cfg.anyWatchFolderNeedsScan()) {
                session.refresh(false);
                didRefresh = true;
                if (scanningIsPaused(cfg, session)) {
                    if (!pauseMessageLogged) {
                        // Avoid flooding the logs every 500 msec so log at info level once
                        logger.info("Detected signal for pausing the JCR Provider i.e. child nodes found under path {}. " +
                                "JCR Provider scanning would not be performed", cfg.getPauseScanNodePath());
                        pauseMessageLogged = true;
                    }

                    try {
                        Thread.sleep(JcrInstaller.RUN_LOOP_DELAY_MSEC);
                    } catch (InterruptedException ignored) {
                        logger.debug("InterruptedException in scanningIsPaused block");
                    }

                    return;
                } else if (pauseMessageLogged) {
                    pauseMessageLogged = false;
                }
            }

            // Rescan WatchedFolders if needed
            boolean scanWf = false;
            for (final WatchedFolder wf : cfg.cloneWatchedFolders()) {
                if (!wf.needsScan()) {
                    continue;
                }
                scanWf = true;
                if (!didRefresh) {
                    session.refresh(false);
                    didRefresh = true;
                }
                counters.incrementAndGet(SCAN_FOLDERS_COUNTER);

                final WatchedFolder.ScanResult sr = wf.scan();
                boolean toDo = false;
                if (sr.toAdd.size() > 0) {
                    logger.info("Registering resource with OSGi installer: {}", sr.toAdd);
                    toDo = true;
                }
                if (sr.toRemove.size() > 0) {
                    logger.info("Removing resource from OSGi installer: {}", sr.toRemove);
                    toDo = true;
                }
                if (toDo) {
                    installer.updateResources(URL_SCHEME, sr.toAdd.toArray(new InstallableResource[sr.toAdd.size()]),
                            sr.toRemove.toArray(new String[sr.toRemove.size()]));
                }
            }

            // Update list of WatchedFolder if we got any relevant events,
            // or if there were any WatchedFolder events
            if (scanWf || updateFoldersListTimer.expired()) {
                if (!didRefresh) {
                    session.refresh(false);
                    didRefresh = true;
                }
                updateFoldersListTimer.reset();
                counters.incrementAndGet(UPDATE_FOLDERS_LIST_COUNTER);
                final List<String> toRemove = updateFoldersList(cfg, session);
                if (toRemove.size() > 0) {
                    logger.info("Removing resource from OSGi installer (folder deleted): {}", toRemove);
                    installer.updateResources(URL_SCHEME, null,
                            toRemove.toArray(new String[toRemove.size()]));
                }
            }


        } catch (final Exception e) {
            logger.warn("Exception in runOneCycle()", e);
        }

        if (backgroundThread.active.get()) {
            synchronized (backgroundThread.lock) {
                try {
                    backgroundThread.lock.wait(RUN_LOOP_DELAY_MSEC);
                } catch (final InterruptedException ignore) {
                    Thread.currentThread().interrupt();
                }
            }
        }
        counters.incrementAndGet(RUN_LOOP_COUNTER);
    }