]> source.dussan.org Git - sonarqube.git/commitdiff
Log a warning if an ExtensionProvider includes other providers
authorSimon Brandhof <simon.brandhof@gmail.com>
Tue, 13 Sep 2011 17:18:29 +0000 (19:18 +0200)
committerSimon Brandhof <simon.brandhof@gmail.com>
Tue, 13 Sep 2011 17:18:29 +0000 (19:18 +0200)
sonar-server/src/main/java/org/sonar/server/plugins/DefaultServerPluginRepository.java
sonar-server/src/test/java/org/sonar/server/plugins/DefaultServerPluginRepositoryTest.java

index 6506f5caf8a96ad83036ec22f4ee76dedea1c74e..73defaa30d4423b0d6d0dcd7322eeb06a42f5aae 100644 (file)
@@ -125,7 +125,7 @@ public class DefaultServerPluginRepository implements ServerPluginRepository {
     for (Plugin plugin : plugins) {
       container.as(Characteristics.CACHE).addComponent(plugin);
       for (Object extension : plugin.getExtensions()) {
-        installExtension(container, extension);
+        installExtension(container, extension, true);
       }
     }
     installExtensionProviders(container);
@@ -138,18 +138,22 @@ public class DefaultServerPluginRepository implements ServerPluginRepository {
       if (obj != null) {
         if (obj instanceof Iterable) {
           for (Object extension : (Iterable) obj) {
-            installExtension(container, extension);
+            installExtension(container, extension, false);
           }
         } else {
-          installExtension(container, obj);
+          installExtension(container, obj, false);
         }
       }
     }
   }
 
-  void installExtension(MutablePicoContainer container, Object extension) {
+  void installExtension(MutablePicoContainer container, Object extension, boolean acceptProvider) {
     if (isType(extension, ServerExtension.class)) {
-      container.as(Characteristics.CACHE).addComponent(getExtensionKey(extension), extension);
+      if (!acceptProvider && (isType(extension, ExtensionProvider.class) || extension instanceof ExtensionProvider)) {
+        LoggerFactory.getLogger(getClass()).error("ExtensionProvider can not include providers itself: " + extension);
+      } else {
+        container.as(Characteristics.CACHE).addComponent(getExtensionKey(extension), extension);
+      }
     }
   }
 
index 7624e422b07e0cc72911c4e6968b8aaa06826b27..afe742b18874896c40ebeac07bc2a9fb5e4387cf 100644 (file)
@@ -26,6 +26,7 @@ import org.junit.Test;
 import org.picocontainer.containers.TransientPicoContainer;
 import org.sonar.api.*;
 import org.sonar.api.platform.PluginMetadata;
+import org.sonar.batch.Batch;
 import org.sonar.core.plugins.DefaultPluginMetadata;
 
 import java.io.File;
@@ -86,7 +87,7 @@ public class DefaultServerPluginRepositoryTest {
   }
 
   @Test
-  public void shouldInvokeServerExtensionProviderss() {
+  public void shouldInvokeServerExtensionProviders() {
     DefaultServerPluginRepository repository = new DefaultServerPluginRepository(mock(PluginDeployer.class));
 
     TransientPicoContainer container = new TransientPicoContainer();
@@ -97,6 +98,17 @@ public class DefaultServerPluginRepositoryTest {
     assertThat(container.getComponents(FakeBatchExtension.class).size(), is(0));
   }
 
+  @Test
+  public void shouldNotSupportProvidersOfProviders() {
+    DefaultServerPluginRepository repository = new DefaultServerPluginRepository(mock(PluginDeployer.class));
+
+    TransientPicoContainer container = new TransientPicoContainer();
+    repository.registerExtensions(container, Arrays.<Plugin>asList(new FakePlugin(Arrays.<Class>asList(SuperExtensionProvider.class))));
+
+    assertThat(container.getComponents(FakeBatchExtension.class).size(), is(0));
+    assertThat(container.getComponents(FakeServerExtension.class).size(), is(0));
+  }
+
   @Test
   public void shouldDisablePlugin() {
     DefaultServerPluginRepository repository = new DefaultServerPluginRepository(mock(PluginDeployer.class));
@@ -175,4 +187,12 @@ public class DefaultServerPluginRepositoryTest {
       return Arrays.asList(FakeBatchExtension.class, FakeServerExtension.class);
     }
   }
+
+  public static class SuperExtensionProvider extends ExtensionProvider implements ServerExtension {
+
+    @Override
+    public Object provide() {
+      return FakeExtensionProvider.class;
+    }
+  }
 }