public Optional<Object> createComponent(final String plugin, final String name, final ComponentType componentType, final int version, final Map<String, String> configuration) { final String familyName = container.buildAutoIdFromName(plugin); return find(pluginContainer -> Stream.of(pluginContainer.get(ContainerComponentRegistry.class))) .filter(Objects::nonNull) .map(r -> r.getComponents().get(familyName)) .filter(Objects::nonNull) .map(component -> ofNullable(componentType.findMeta(component).get(name)) .map(comp -> comp .getInstantiator() .apply(configuration == null ? null : comp.getMigrationHandler().migrate(version, configuration)))) .findFirst() .flatMap(identity()) // unwrap to access the actual instance which is the desired one .map(i -> Delegated.class.isInstance(i) ? Delegated.class.cast(i).getDelegate() : i); }
private <C, T, A> A create(final Class<A> api, final Class<T> componentType, final C configuration) { final ComponentFamilyMeta.BaseMeta<? extends Lifecycle> meta = findMeta(componentType); return api .cast(meta .getInstantiator() .apply(configuration == null || meta.getParameterMetas().isEmpty() ? emptyMap() : configurationByExample(configuration, meta .getParameterMetas() .stream() .filter(p -> p.getName().equals(p.getPath())) .findFirst() .map(p -> p.getName() + '.') .orElseThrow(() -> new IllegalArgumentException( "Didn't find any option and therefore " + "can't convert the configuration instance to a configuration"))))); }