for (Plugin plugin : plugins) {
container.as(Characteristics.CACHE).addComponent(plugin);
for (Object extension : plugin.getExtensions()) {
- installExtension(container, extension);
+ installExtension(container, extension, true);
}
}
installExtensionProviders(container);
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);
+ }
}
}
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;
}
@Test
- public void shouldInvokeServerExtensionProviderss() {
+ public void shouldInvokeServerExtensionProviders() {
DefaultServerPluginRepository repository = new DefaultServerPluginRepository(mock(PluginDeployer.class));
TransientPicoContainer container = new TransientPicoContainer();
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));
return Arrays.asList(FakeBatchExtension.class, FakeServerExtension.class);
}
}
+
+ public static class SuperExtensionProvider extends ExtensionProvider implements ServerExtension {
+
+ @Override
+ public Object provide() {
+ return FakeExtensionProvider.class;
+ }
+ }
}