All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.helidon.config.etcd.EtcdConfigSourceBuilder Maven / Gradle / Ivy

There is a newer version: 4.1.0
Show newest version
/*
 * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package io.helidon.config.etcd;

import java.net.URI;
import java.util.Objects;

import io.helidon.config.Config;
import io.helidon.config.ConfigException;
import io.helidon.config.ConfigMappingException;
import io.helidon.config.MissingValueException;
import io.helidon.config.etcd.EtcdConfigSourceBuilder.EtcdEndpoint;
import io.helidon.config.spi.AbstractParsableConfigSource;
import io.helidon.config.spi.ConfigParser;
import io.helidon.config.spi.ConfigSource;
import io.helidon.config.spi.PollingStrategy;

/**
 * Etcd ConfigSource builder.
 * 

* It allows to configure following properties: *

    *
  • {@code uri} - etcd endpoint
  • *
  • {@code key} - an etcd key that is associated to value with configuration
  • *
  • {@code version} - an etcd API version
  • *
  • {@code mandatory} - is existence of configuration resource mandatory (by default) or is {@code optional}?
  • *
  • {@code media-type} - configuration content media type to be used to look for appropriate {@link ConfigParser};
  • *
  • {@code parser} - or directly set {@link ConfigParser} instance to be used to parse the source;
  • *
*

* If the Etcd ConfigSource is {@code mandatory} and a {@code uri} is not responsive or {@code key} does not exist * then {@link ConfigSource#load} throws {@link ConfigException}. *

* One of {@code media-type} and {@code parser} properties must be set to be clear how to parse the content. If both of them * are set, then {@code parser} has precedence. */ public final class EtcdConfigSourceBuilder extends AbstractParsableConfigSource.Builder { private static final String URI_KEY = "uri"; private static final String KEY_KEY = "key"; private static final String API_KEY = "api"; private final EtcdEndpoint etcdEndpoint; private EtcdConfigSourceBuilder(URI uri, String key, EtcdApi api) { super(EtcdEndpoint.class); Objects.requireNonNull(uri, "uri cannot be null"); Objects.requireNonNull(key, "key cannot be null"); Objects.requireNonNull(api, "api cannot be null"); this.etcdEndpoint = new EtcdEndpoint(uri, key, api); } /** * Create new instance of builder with specified mandatory Etcd endpoint remote descriptor. * * @param uri an Etcd endpoint remote URI. * @param key an Etcd key with which the value containing the configuration is associated. * @param api an Etcd API version. * @return new instance of builder * @see #from(Config) */ public static EtcdConfigSourceBuilder from(URI uri, String key, EtcdApi api) { return new EtcdConfigSourceBuilder(uri, key, api); } /** * Initializes config source instance from meta configuration properties, * see {@link io.helidon.config.ConfigSources#load(Config)}. *

* Mandatory {@code properties}, see {@link #from(URI, String, EtcdApi)}: *

    *
  • {@code uri} - type {@link URI}
  • *
  • {@code key} - type {@code String}
  • *
  • {@code api} - type {@link EtcdApi}, e.g. {@code v3}
  • *
* Optional {@code properties}: see {@link #init(Config)}. * * @param metaConfig meta-configuration used to initialize returned config source builder instance from. * @return new instance of config source builder described by {@code metaConfig} * @throws MissingValueException in case the configuration tree does not contain all expected sub-nodes * required by the mapper implementation to provide instance of Java type. * @throws ConfigMappingException in case the mapper fails to map the (existing) configuration tree represented by the * supplied configuration node to an instance of a given Java type. * @see #from(URI, String, EtcdApi) * @see #init(Config) */ public static EtcdConfigSourceBuilder from(Config metaConfig) throws ConfigMappingException, MissingValueException { return EtcdConfigSourceBuilder.from(metaConfig.get(URI_KEY).as(URI.class), metaConfig.get(KEY_KEY).asString(), metaConfig.get(API_KEY).as(EtcdApi.class)) .init(metaConfig); } @Override protected EtcdConfigSourceBuilder init(Config metaConfig) { return super.init(metaConfig); } @Override protected EtcdEndpoint getTarget() { return etcdEndpoint; } PollingStrategy getPollingStrategyInternal() { //just for testing purposes return super.getPollingStrategy(); } /** * Builds new instance of Etcd ConfigSource. *

* If the Etcd ConfigSource is {@code mandatory} and a {@code uri} is not responsive or {@code key} does not exist * then {@link ConfigSource#load} throws {@link ConfigException}. * * @return new instance of Etcd ConfigSource. */ @Override public ConfigSource build() { return new EtcdConfigSource(this); } /** * {@code EtcdApi} determines which etcd API version will be used. *

* There are two API versions: {@code v2} and {@code v3}. */ public enum EtcdApi { /** * Etcd API v2 version. */ v2, /** * Etcd API v3 version. */ v3 } /** * Etcd endpoint remote descriptor. *

* Holds attributes necessary to connect to remote Etcd service. */ public static class EtcdEndpoint { private final URI uri; private final String key; private final EtcdApi api; /** * Initializes descriptor. * * @param uri an Etcd endpoint remote URI. * @param key an etcd key with which the value containing the configuration is associated. * @param api an Etcd API version. */ public EtcdEndpoint(URI uri, String key, EtcdApi api) { this.uri = uri; this.key = key; this.api = api; } public URI getUri() { return uri; } public String getKey() { return key; } public EtcdApi getApi() { return api; } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy