- frameworkStartLevel.setStartLevel(activeStartLevel, (FrameworkEvent event) -> {
- if (OsgiBootUtils.isDebug())
- OsgiBootUtils.debug("Framework event: " + event);
- int initialStartLevel = frameworkStartLevel.getInitialBundleStartLevel();
- int startLevel = frameworkStartLevel.getStartLevel();
- OsgiBootUtils.debug("Framework start level: " + startLevel + " (initial: " + initialStartLevel + ")");
- });
+
+ if (OsgiBootUtils.isDebug())
+ OsgiBootUtils.debug("About to set framework start level to " + activeStartLevel + " ...");
+
+ // Start the framework level after level
+ stages: for (int stage = initialStartLevel; stage <= activeStartLevel; stage++) {
+ OsgiBootUtils.info("Starting stage " + stage + "...");
+ final int nextStage = stage;
+ final CompletableFuture<FrameworkEvent> stageCompleted = new CompletableFuture<>();
+ ForkJoinPool.commonPool().execute(() -> {
+ frameworkStartLevel.setStartLevel(nextStage, (FrameworkEvent event) -> {
+ stageCompleted.complete(event);
+ });
+ });
+ FrameworkEvent event;
+ try {
+ event = stageCompleted.get();
+ } catch (InterruptedException | ExecutionException e) {
+ throw new IllegalStateException("Cannot continue start", e);
+ }
+ if (event.getThrowable() != null) {
+ OsgiBootUtils.error("Stage " + nextStage + " failed, aborting start.", event.getThrowable());
+ break stages;
+ }
+ }