@Test public void install_has_no_effect_if_CoreExtensionRepository_has_no_loaded_CoreExtension() { ComponentContainer container = new ComponentContainer(); underTest.install(container, noExtensionFilter(), noAdditionalSideFilter()); assertAddedExtensions(container, 0); }
private void install(ComponentContainer container, Predicate<Object> extensionFilter, Predicate<Object> additionalSideFilter, CoreExtension coreExtension) { String coreExtensionName = coreExtension.getName(); try { List<Object> providerKeys = addDeclaredExtensions(container, extensionFilter, additionalSideFilter, coreExtension); addProvidedExtensions(container, additionalSideFilter, coreExtensionName, providerKeys); LOG.debug("Installed core extension: " + coreExtensionName); coreExtensionRepository.installed(coreExtension); } catch (Exception e) { throw new RuntimeException("Failed to load core extension " + coreExtensionName, e); } }
private void addProvidedExtensions(ComponentContainer container, Predicate<Object> additionalSideFilter, String extensionCategory, List<Object> providerKeys) { providerKeys.stream() .map(providerKey -> (ExtensionProvider) container.getComponentByKey(providerKey)) .forEach(provider -> addFromProvider(container, additionalSideFilter, extensionCategory, provider)); }
@Override public PlatformLevel start() { ComponentContainer container = getContainer(); CoreExtensionsInstaller coreExtensionsInstaller = get(WebCoreExtensionsInstaller.class); coreExtensionsInstaller.install(container, hasPlatformLevel(3), noAdditionalSideFilter()); return super.start(); } }
private void addScannerExtensions() { getComponentByType(CoreExtensionsInstaller.class) .install(this, noExtensionFilter(), extension -> getScannerProjectExtensionsFilter().accept(extension)); getComponentByType(ExtensionInstaller.class) .install(this, getScannerProjectExtensionsFilter()); }
@Test public void install_only_adds_ServerSide_annotated_extension_to_container() { when(coreExtensionRepository.loadedCoreExtensions()).thenReturn(Stream.of( new CoreExtension() { @Override public String getName() { return "foo"; } @Override public void load(Context context) { context.addExtensions(CeClass.class, ScannerClass.class, WebServerClass.class, NoAnnotationClass.class, OtherAnnotationClass.class, MultipleAnnotationClass.class); } })); ComponentContainer container = new ComponentContainer(); underTest.install(container, noExtensionFilter(), noAdditionalSideFilter()); assertThat(container.getPicoContainer().getComponentAdapters()) .hasSize(ComponentContainer.COMPONENTS_IN_EMPTY_COMPONENT_CONTAINER + 2); assertThat(container.getComponentByType(WebServerClass.class)).isNotNull(); assertThat(container.getComponentByType(MultipleAnnotationClass.class)).isNotNull(); }
private static void startLevel3(ComponentContainer level3) { level3.getComponentByType(CECoreExtensionsInstaller.class) .install(level3, hasPlatformLevel(3), noAdditionalSideFilter()); level3.startComponents(); }
/** * @param container the container into which extensions will be installed * @param extensionFilter filters extensions added to {@link CoreExtension.Context}. When it returns false, the * extension is ignored as if it had never been added to the context. * @param additionalSideFilter applied on top of filtering on {@link #supportedAnnotationType} to decide whether * extension should be added to container as an object or only as a PropertyDefinition. */ public void install(ComponentContainer container, Predicate<Object> extensionFilter, Predicate<Object> additionalSideFilter) { coreExtensionRepository.loadedCoreExtensions() .forEach(coreExtension -> install(container, extensionFilter, additionalSideFilter, coreExtension)); }
private <T> boolean addSupportedExtension(ComponentContainer container, Predicate<Object> additionalSideFilter, String extensionCategory, T component) { if (hasSupportedAnnotation(component) && additionalSideFilter.test(component)) { container.addExtension(extensionCategory, component); return true; } return false; }
private void addFromProvider(ComponentContainer container, Predicate<Object> additionalSideFilter, String extensionCategory, ExtensionProvider provider) { Object obj = provider.provide(); if (obj != null) { if (obj instanceof Iterable) { for (Object ext : (Iterable) obj) { addSupportedExtension(container, additionalSideFilter, extensionCategory, ext); } } else { addSupportedExtension(container, additionalSideFilter, extensionCategory, obj); } } }
@Test @UseDataProvider("allMethodsToAddExtension") public void install_does_not_install_extensions_annotated_with_expected_annotation_but_filtered_out(BiConsumer<CoreExtension.Context, Collection<Object>> extensionAdder) { List<Object> extensions = ImmutableList.of(WestSideClass.class, EastSideClass.class, OtherSideClass.class, Latitude.class); CoreExtension coreExtension = newCoreExtension(context -> extensionAdder.accept(context, extensions)); when(coreExtensionRepository.loadedCoreExtensions()).thenReturn(Stream.of(coreExtension)); ComponentContainer container = new ComponentContainer(); underTest.install(container, noExtensionFilter(), t -> t != Latitude.class); assertAddedExtensions(container, WestSideClass.class); assertPropertyDefinitions(container); }
@Override public PlatformLevel start() { // ensuring the HistoryTable exists must be the first thing done when this level is started getOptional(MigrationHistoryTable.class).ifPresent(MigrationHistoryTable::start); ComponentContainer container = getContainer(); CoreExtensionsInstaller coreExtensionsInstaller = get(WebCoreExtensionsInstaller.class); coreExtensionsInstaller.install(container, hasPlatformLevel(2), noAdditionalSideFilter()); return super.start(); } }
@Test public void install_only_adds_ScannerSide_annotated_extension_to_container() { when(coreExtensionRepository.loadedCoreExtensions()).thenReturn(Stream.of( new CoreExtension() { @Override public String getName() { return "foo"; } @Override public void load(Context context) { context.addExtensions(CeClass.class, ScannerClass.class, WebServerClass.class, NoAnnotationClass.class, OtherAnnotationClass.class, MultipleAnnotationClass.class); } })); ComponentContainer container = new ComponentContainer(); underTest.install(container, noExtensionFilter(), noAdditionalSideFilter()); assertThat(container.getPicoContainer().getComponentAdapters()) .hasSize(ComponentContainer.COMPONENTS_IN_EMPTY_COMPONENT_CONTAINER + 2); assertThat(container.getComponentByType(ScannerClass.class)).isNotNull(); assertThat(container.getComponentByType(MultipleAnnotationClass.class)).isNotNull(); }
private static void startLevel2(ComponentContainer level2) { level2.getComponentByType(CECoreExtensionsInstaller.class) .install(level2, hasPlatformLevel(2), noAdditionalSideFilter()); level2.startComponents(); }
/** * @param container the container into which extensions will be installed * @param extensionFilter filters extensions added to {@link CoreExtension.Context}. When it returns false, the * extension is ignored as if it had never been added to the context. * @param additionalSideFilter applied on top of filtering on {@link #supportedAnnotationType} to decide whether * extension should be added to container as an object or only as a PropertyDefinition. */ public void install(ComponentContainer container, Predicate<Object> extensionFilter, Predicate<Object> additionalSideFilter) { coreExtensionRepository.loadedCoreExtensions() .forEach(coreExtension -> install(container, extensionFilter, additionalSideFilter, coreExtension)); }
private <T> boolean addSupportedExtension(ComponentContainer container, Predicate<Object> additionalSideFilter, String extensionCategory, T component) { if (hasSupportedAnnotation(component) && additionalSideFilter.test(component)) { container.addExtension(extensionCategory, component); return true; } return false; }
private void addFromProvider(ComponentContainer container, Predicate<Object> additionalSideFilter, String extensionCategory, ExtensionProvider provider) { Object obj = provider.provide(); if (obj != null) { if (obj instanceof Iterable) { for (Object ext : (Iterable) obj) { addSupportedExtension(container, additionalSideFilter, extensionCategory, ext); } } else { addSupportedExtension(container, additionalSideFilter, extensionCategory, obj); } } }
@Test public void install_provides_new_Configuration_when_getBootConfiguration_is_called_and_there_is_none_in_container() { CoreExtension coreExtension1 = newCoreExtension(); CoreExtension coreExtension2 = newCoreExtension(); when(coreExtensionRepository.loadedCoreExtensions()).thenReturn(Stream.of(coreExtension1, coreExtension2)); ComponentContainer container = new ComponentContainer(); underTest.install(container, noExtensionFilter(), noAdditionalSideFilter()); verify(coreExtension1).load(contextCaptor.capture()); verify(coreExtension2).load(contextCaptor.capture()); // verify each core extension gets its own configuration assertThat(contextCaptor.getAllValues()) .hasSameElementsAs(ImmutableSet.copyOf(contextCaptor.getAllValues())); }
@Test @UseDataProvider("allMethodsToAddExtension") public void install_adds_PropertyDefinition_from_annotation_no_matter_annotations_even_if_filtered_out(BiConsumer<CoreExtension.Context, Collection<Object>> extensionAdder) { List<Object> extensions = ImmutableList.of(WestSidePropertyDefinition.class, EastSidePropertyDefinition.class, OtherSidePropertyDefinition.class, LatitudePropertyDefinition.class, BlankPropertyDefinition.class); CoreExtension coreExtension = newCoreExtension(context -> extensionAdder.accept(context, extensions)); when(coreExtensionRepository.loadedCoreExtensions()).thenReturn(Stream.of(coreExtension)); ComponentContainer container = new ComponentContainer(); underTest.install(container, noExtensionFilter(), t -> false); assertAddedExtensions(container, 0); assertPropertyDefinitions(container, "westKey", "eastKey", "otherKey", "latitudeKey", "blankKey"); }
@Override public PlatformLevel start() { ComponentContainer container = getContainer(); CoreExtensionsInstaller coreExtensionsInstaller = get(WebCoreExtensionsInstaller.class); coreExtensionsInstaller.install(container, hasPlatformLevel4OrNone(), noAdditionalSideFilter()); ServerExtensionInstaller extensionInstaller = get(ServerExtensionInstaller.class); extensionInstaller.installExtensions(container); super.start(); return this; } }