]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6056 API: closeable components must be closed when stopping picocontainer
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Thu, 15 Jan 2015 10:10:10 +0000 (11:10 +0100)
committerSimon Brandhof <simon.brandhof@sonarsource.com>
Tue, 20 Jan 2015 12:27:34 +0000 (13:27 +0100)
sonar-plugin-api/src/main/java/org/sonar/api/platform/ComponentContainer.java
sonar-plugin-api/src/test/java/org/sonar/api/platform/ComponentContainerTest.java

index daf6a1e12d7556c373ac1a2b5798dcffc7e82c42..d92592678eb98851dd5d58ae59dcfccea8a50497 100644 (file)
@@ -32,7 +32,6 @@ import org.sonar.api.ServerComponent;
 import org.sonar.api.config.PropertyDefinitions;
 
 import javax.annotation.Nullable;
-
 import java.util.Collection;
 import java.util.List;
 
@@ -122,6 +121,7 @@ public class ComponentContainer implements BatchComponent, ServerComponent {
   public ComponentContainer stopComponents(boolean swallowException) {
     try {
       pico.stop();
+      pico.dispose();
 
     } catch (RuntimeException e) {
       if (!swallowException) {
@@ -230,7 +230,7 @@ public class ComponentContainer implements BatchComponent, ServerComponent {
   }
 
   static MutablePicoContainer createPicoContainer() {
-    ReflectionLifecycleStrategy lifecycleStrategy = new ReflectionLifecycleStrategy(new NullComponentMonitor(), "start", "stop", "dispose");
+    ReflectionLifecycleStrategy lifecycleStrategy = new ReflectionLifecycleStrategy(new NullComponentMonitor(), "start", "stop", "close");
     return new DefaultPicoContainer(new OptInCaching(), lifecycleStrategy, null);
   }
 
index 4135639a8773aeccfd7c63f6833ac4964ac4969e..44660bf61c794739d9c1362149681d433980f7b4 100644 (file)
@@ -288,6 +288,37 @@ public class ComponentContainerTest {
     assertThat(component.stopped).isTrue();
   }
 
+  /**
+   * Method close() must be called even if the methods start() or stop()
+   * are not defined.
+   */
+  @Test
+  public void should_close_components_without_lifecycle() throws Exception {
+    ComponentContainer container = new ComponentContainer();
+    CloseableComponent component = new CloseableComponent();
+    container.add(component);
+
+    container.execute();
+
+    assertThat(component.isClosed).isTrue();
+  }
+
+  /**
+   * Method close() must be executed after stop()
+   */
+  @Test
+  public void should_close_components_with_lifecycle() throws Exception {
+    ComponentContainer container = new ComponentContainer();
+    StartableCloseableComponent component = new StartableCloseableComponent();
+    container.add(component);
+
+    container.execute();
+
+    assertThat(component.isStopped).isTrue();
+    assertThat(component.isClosed).isTrue();
+    assertThat(component.isClosedAfterStop).isTrue();
+  }
+
   public static class StartableComponent {
     public boolean started = false, stopped = false;
 
@@ -333,4 +364,27 @@ public class ComponentContainerTest {
       return new SimpleComponent();
     }
   }
+
+  public static class CloseableComponent implements AutoCloseable {
+    public boolean isClosed = false;
+
+    @Override
+    public void close() throws Exception {
+      isClosed = true;
+    }
+  }
+
+  public static class StartableCloseableComponent implements AutoCloseable {
+    public boolean isClosed = false, isStopped = false, isClosedAfterStop = false;
+
+    public void stop() {
+      isStopped = true;
+    }
+
+    @Override
+    public void close() throws Exception {
+      isClosed = true;
+      isClosedAfterStop = isStopped;
+    }
+  }
 }