@Override public void stop(StopContext context) { ConfigProviderResolver.setInstance(null); }
private Config buildConfig(ClassLoader loader) { return getBuilder().forClassLoader(loader) .addDefaultSources() .addDiscoveredSources() .addDiscoveredConverters() .build(); }
@Override public void deploy(DeploymentPhaseContext phaseContext) { DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit(); Module module = deploymentUnit.getAttachment(Attachments.MODULE); SmallRyeConfigBuilder builder = new SmallRyeConfigBuilder(); builder.forClassLoader(module.getClassLoader()) .addDefaultSources() .addDiscoveredSources() .addDiscoveredConverters(); addConfigSourcesFromServices(builder, phaseContext.getServiceRegistry(), module.getClassLoader()); Config config = builder.build(); deploymentUnit.putAttachment(CONFIG, config); ConfigProviderResolver configProviderResolver = deploymentUnit.getAttachment(CONFIG_PROVIDER_RESOLVER); configProviderResolver.registerConfig(config, module.getClassLoader()); }
private void addConfigSource(ConfigSource source) { LOGGER.finest(() -> "Adding config source: " + source.getName() + " (" + source.getClass() .getName() + "), values: " + source.getProperties()); mpConfigSources.add(source); helidonConfigSources.add(wrapSource(source)); }
private OrdinalConfigSource wrapSource(ConfigSource source) { io.helidon.config.spi.ConfigSource myCs = ConfigSources.create(source.getProperties()).build(); return new OrdinalConfigSource(myCs, source.getOrdinal()); }
private void addConfigSourcesFromServices(ConfigBuilder builder, ServiceRegistry serviceRegistry, ClassLoader classloader) { List<ServiceName> serviceNames = serviceRegistry.getServiceNames(); for (ServiceName serviceName: serviceNames) { if (ServiceNames.CONFIG_SOURCE.isParentOf(serviceName)) { ServiceController<?> service = serviceRegistry.getService(serviceName); ConfigSource configSource = ConfigSource.class.cast(service.getValue()); builder.withSources(configSource); } else if (ServiceNames.CONFIG_SOURCE_PROVIDER.isParentOf(serviceName)) { ServiceController<?> service = serviceRegistry.getService(serviceName); ConfigSourceProvider configSourceProvider = ConfigSourceProvider.class.cast(service.getValue()); for (ConfigSource configSource : configSourceProvider.getConfigSources(classloader)) { builder.withSources(configSource); } } } }
private Optional<String> findInMpSources(String propertyName) { String propertyValue = null; for (ConfigSource source : mpConfigSources) { propertyValue = source.getValue(propertyName); if (null != propertyValue) { break; } } return Optional.ofNullable(propertyValue); }
@Override public ConfigBuilder addDiscoveredSources() { ServiceLoader.load(ConfigSource.class, getClassLoader()) .forEach(this::addConfigSource); ServiceLoader.load(ConfigSourceProvider.class, getClassLoader()) .forEach(csp -> csp.getConfigSources(getClassLoader()) .forEach(this::addConfigSource)); return this; }
/** * Register a config producer bean for each {@link ConfigProperty} injection. * * @param abd event from CDI container * @param bm bean manager */ public void registerConfigProducer(@Observes AfterBeanDiscovery abd, BeanManager bm) { // each injection point will have its own bean qualifiers.forEach(q -> abd.addBean(new ConfigPropertyProducer(q.qualifier, q.type, bm))); // we also must support injection of Config itself abd.addBean() .addType(Config.class) .createWith(creationalContext -> ((MpConfig) configResolver.getConfig()).helidonConfig()); abd.addBean() .addType(org.eclipse.microprofile.config.Config.class) .createWith(creationalContext -> { return new SerializableConfig(); }); }
@Override public void undeploy(DeploymentUnit context) { Config config = context.getAttachment(CONFIG); ConfigProviderResolver configProviderResolver = context.getAttachment(CONFIG_PROVIDER_RESOLVER); configProviderResolver.releaseConfig(config); } }
/** * Get all properties of this config as a map. * * @return map where keys are configuration keys and values are associated string values */ public Map<String, String> asMap() { // config from helidon config instance Map<String, String> map = new HashMap<>(config.get().asMap().get()); // now add all properties from sources of MP config List<ConfigSource> configSources = new ArrayList<>(mpConfigSources); Collections.reverse(configSources); for (ConfigSource configSource : configSources) { map.putAll(configSource.getProperties()); } return map; }
/** * Create a new instance. * * @param config configuration * @param mpConfigSources config sources * @param converterClasses classes of converters * @param converters class to converter mapping */ MpConfig(Config config, List<ConfigSource> mpConfigSources, Set<Class<?>> converterClasses, Map<Class<?>, Converter<?>> converters) { final AtomicReference<Config> ref = new AtomicReference<>(config); config.onChange(newConfig -> { ref.set(newConfig); return true; }); this.config = ref::get; this.mpConfigSources = mpConfigSources; this.propertyNames = Stream.concat(mpConfigSources.stream() .flatMap(cs -> cs.getPropertyNames().stream()), config.traverse(Config::isLeaf) .map(Config::key) .map(Config.Key::toString)) .collect(Collectors.toSet()); this.converterClasses = new HashSet<>(converterClasses); this.converters = converters; }
return (T) maybeConverter.convert(value);
MpConfig mpConfig = (MpConfig) configResolver.getConfig();
@Override public void start(StartContext context) { ConfigProviderResolver.setInstance(SmallRyeConfigProviderResolver.INSTANCE); }
/** * Load this builder from a configuration. * * @param config configuration to load from * @return updated builder instance */ public Builder config(Config config) { config.get("optional").asBoolean().ifPresent(this::optional); config.get("authenticate").asBoolean().ifPresent(this::authenticate); config.get("propagate").asBoolean().ifPresent(this::propagate); config.get("allow-impersonation").asBoolean().ifPresent(this::allowImpersonation); config.get("principal-type").asString().as(SubjectType::valueOf).ifPresent(this::subjectType); config.get("atn-token.handler").as(TokenHandler::create).ifPresent(this::atnTokenHandler); config.get("atn-token").ifExists(this::verifyKeys); config.get("atn-token.jwt-audience").asString().ifPresent(this::expectedAudience); config.get("atn-token.default-key-id").asString().ifPresent(this::defaultKeyId); config.get("atn-token.verify-key").asString().ifPresent(this::publicKeyPath); config.get("sign-token").ifExists(outbound -> outboundConfig(OutboundConfig.create(outbound))); config.get("sign-token").ifExists(this::outbound); org.eclipse.microprofile.config.Config mpConfig = ConfigProviderResolver.instance().getConfig(); mpConfig.getOptionalValue(CONFIG_PUBLIC_KEY, String.class).ifPresent(this::publicKey); mpConfig.getOptionalValue(CONFIG_PUBLIC_KEY_PATH, String.class).ifPresent(this::publicKeyPath); mpConfig.getOptionalValue(CONFIG_EXPECTED_ISSUER, String.class).ifPresent(this::expectedIssuer); return this; }