private List<Object> addDeclaredExtensions(ComponentContainer container, Predicate<Object> extensionFilter, Predicate<Object> additionalSideFilter, CoreExtension coreExtension) { ContextImpl context = new ContextImpl(container, extensionFilter, additionalSideFilter, coreExtension.getName()); coreExtension.load(context); return context.getProviders(); }
@PlatformLevel(1) public interface MyBatisConfExtension { default void loadAliases(LoadAliasContext context) { // no alias to load } interface LoadAliasContext { void loadAlias(String alias, Class<?> dtoClass); } Stream<Class<?>> getMapperClasses(); }
/** * @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 static void startLevel1(ComponentContainer level1) { level1.getComponentByType(CoreExtensionsLoader.class) .load(); level1.getComponentByType(CECoreExtensionsInstaller.class) .install(level1, hasPlatformLevel(1), noAdditionalSideFilter()); level1.startComponents(); }
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); } }
@Override public void load(Context context) { context.addExtensions(CeClass.class, ScannerClass.class, WebServerClass.class, NoAnnotationClass.class, OtherAnnotationClass.class, MultipleAnnotationClass.class); } }));
public static Predicate<Object> hasPlatformLevel(int i) { checkSupportedLevel(i, null); return o -> { PlatformLevel platformLevel = AnnotationUtils.getAnnotation(o, PlatformLevel.class); return platformLevel != null && checkSupportedLevel(platformLevel.value(), o) == i; }; }
@Test public void installed_fails_with_ISE_if_called_before_setLoadedCoreExtensions() { CoreExtension coreExtension = newCoreExtension(); expectRepositoryNotInitializedISE(); underTest.installed(coreExtension); }
@Test public void isInstalled_fails_with_ISE_if_called_before_setLoadedCoreExtensions() { expectRepositoryNotInitializedISE(); underTest.isInstalled("foo"); }
@Test public void loadedCoreExtensions_fails_with_ISE_if_called_before_setLoadedCoreExtensions() { expectRepositoryNotInitializedISE(); underTest.loadedCoreExtensions(); }
@WestSide public static class PartiallyWestSideProvider extends ExtensionProvider { @Override public Object provide() { return NotWestSideProvided.class; } }
@EastSide public static class EastSideProvider extends ExtensionProvider { @Override public Object provide() { throw new IllegalStateException("EastSideProvider#provide should not be called"); } }
private static CoreExtension newCoreExtension() { String name = "name_" + nameCounter; nameCounter++; return newCoreExtension(name); }
private static CoreExtension newCoreExtension() { return newCoreExtension(t -> { }); }
@Override public void load(Context context) { context.addExtensions(CeClass.class, ScannerClass.class, WebServerClass.class, NoAnnotationClass.class, OtherAnnotationClass.class, MultipleAnnotationClass.class); } }));
public static Predicate<Object> hasPlatformLevel4OrNone() { return o -> { PlatformLevel platformLevel = AnnotationUtils.getAnnotation(o, PlatformLevel.class); return platformLevel == null || checkSupportedLevel(platformLevel.value(), o) == 4; }; } }
@WestSide public static class WestSideProvider extends ExtensionProvider { @Override public Object provide() { return WestSideProvided.class; } }
@Override public void load(Context context) { context.addExtensions(CeClass.class, ScannerClass.class, WebServerClass.class, NoAnnotationClass.class, OtherAnnotationClass.class, MultipleAnnotationClass.class); } }));