lifecycle for root bundle and reserse the stop compared to the start
diff --git a/winegrower-core/src/main/java/org/apache/winegrower/Ripener.java b/winegrower-core/src/main/java/org/apache/winegrower/Ripener.java
index 45c9276..2d241bc 100644
--- a/winegrower-core/src/main/java/org/apache/winegrower/Ripener.java
+++ b/winegrower-core/src/main/java/org/apache/winegrower/Ripener.java
@@ -28,6 +28,7 @@
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Collection;
+import java.util.Comparator;
import java.util.Map;
import java.util.ServiceLoader;
import java.util.UUID;
@@ -167,7 +168,9 @@
public synchronized void stop() {
LOGGER.info("Stopping Apache Winegrower application on {}", LocalDateTime.now());
final Map<Long, OSGiBundleLifecycle> bundles = registry.getBundles();
- bundles.forEach((k, v) -> v.stop());
+ bundles.values().stream()
+ .sorted((o1, o2) -> (int) (o2.getBundle().getBundleId() - o1.getBundle().getBundleId()))
+ .forEach(OSGiBundleLifecycle::stop);
bundles.clear();
if (configuration.getWorkDir().exists()) {
try {
diff --git a/winegrower-core/src/main/java/org/apache/winegrower/service/BundleRegistry.java b/winegrower-core/src/main/java/org/apache/winegrower/service/BundleRegistry.java
index ac35e3a..cdeb85e 100644
--- a/winegrower-core/src/main/java/org/apache/winegrower/service/BundleRegistry.java
+++ b/winegrower-core/src/main/java/org/apache/winegrower/service/BundleRegistry.java
@@ -39,7 +39,10 @@
frameworkManifest.getMainAttributes().putValue("Manifest-Version", "1.0");
frameworkManifest.getMainAttributes().putValue("Bundle-Version", "1.0");
frameworkManifest.getMainAttributes().putValue("Bundle-SymbolicName", "Ripener");
- bundles.put(0L, new OSGiBundleLifecycle(frameworkManifest, framework, services, this, configuration, 0L));
+ final OSGiBundleLifecycle frameworkBundle = new OSGiBundleLifecycle(
+ frameworkManifest, framework, services, this, configuration, 0L);
+ frameworkBundle.start();
+ bundles.put(0L, frameworkBundle);
}
public File getFramework() {
diff --git a/winegrower-core/src/test/java/org/apache/winegrower/RipenerTest.java b/winegrower-core/src/test/java/org/apache/winegrower/RipenerTest.java
index 4121958..096ab4c 100644
--- a/winegrower-core/src/test/java/org/apache/winegrower/RipenerTest.java
+++ b/winegrower-core/src/test/java/org/apache/winegrower/RipenerTest.java
@@ -25,6 +25,7 @@
import java.io.Writer;
import java.util.Map;
+import org.apache.winegrower.deployer.BundleImpl;
import org.apache.winegrower.deployer.OSGiBundleLifecycle;
import org.apache.winegrower.service.BundleActivatorHandler;
import org.apache.winegrower.test.WithRipener;
@@ -32,12 +33,22 @@
import org.apache.winegrower.test.WithRipener.Service;
import org.apache.winegrower.test.simpleactivator.MyActivator;
import org.junit.jupiter.api.Test;
+import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
class RipenerTest {
@Test
@WithRipener
+ void stopFrameworkBundle(@Service final Ripener ripener) {
+ final BundleImpl bundle = ripener.getRegistry().getBundles().get(0L).getBundle();
+ assertEquals(Bundle.ACTIVE, bundle.getState());
+ ripener.stop();
+ assertEquals(Bundle.UNINSTALLED, bundle.getState());
+ }
+
+ @Test
+ @WithRipener
void workDir(@Service final Ripener ripener) throws IOException {
final File workDir = ripener.getConfiguration().getWorkDir();
assertFalse(workDir.exists());