private ACTION executeTasks()

in src/main/java/org/apache/sling/installer/core/impl/OsgiInstallerImpl.java [718:756]


    private ACTION executeTasks(final SortedSet<InstallTask> tasks) {
        if (this.switchStartLevel && this.hasBundleUpdateTask(tasks)) {
            // StartLevel service is always available
            final ServiceReference ref = ctx.getServiceReference(StartLevel.class.getName());
            final StartLevel startLevel = (StartLevel) ctx.getService(ref);
            try {
                final int targetStartLevel = this.getLowestStartLevel(tasks, startLevel);
                final int currentStartLevel = startLevel.getStartLevel();
                if (targetStartLevel < currentStartLevel) {
                    auditLogger.info("Switching to start level {}", targetStartLevel);
                    try {
                        startLevel.setStartLevel(targetStartLevel);
                        // now we have to wait until the start level is reached
                        while (startLevel.getStartLevel() > targetStartLevel) {
                            try {
                                Thread.sleep(300);
                            } catch (final InterruptedException ie) {
                                Thread.currentThread().interrupt();
                            }

                        }

                        return doExecuteTasks(tasks);

                    } finally {
                        // restore old start level in any case
                        startLevel.setStartLevel(currentStartLevel);
                        auditLogger.info("Switching back to start level {} after performing the required " +
                                "installation tasks", currentStartLevel);

                    }
                }

            } finally {
                ctx.ungetService(ref);
            }
        }
        return doExecuteTasks(tasks);
    }