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

org.cfg4j.provider.ConfigurationProviderBuilder Maven / Gradle / Ivy

/*
 * Copyright 2015 Norbert Potocki ([email protected])
 *
 * 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 org.cfg4j.provider;

import static java.util.Objects.requireNonNull;

import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.Timer;
import org.cfg4j.source.ConfigurationSource;
import org.cfg4j.source.context.environment.DefaultEnvironment;
import org.cfg4j.source.context.environment.Environment;
import org.cfg4j.source.empty.EmptyConfigurationSource;
import org.cfg4j.source.metered.MeteredConfigurationSource;
import org.cfg4j.source.reload.ReloadStrategy;
import org.cfg4j.source.reload.strategy.ImmediateReloadStrategy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * A builder producing {@link ConfigurationProvider}s. If you don't specify the value for one the fields
 * then the default value will be provided - read the constructor's documentation to learn
 * what the default values are.
 */
public class ConfigurationProviderBuilder {

  private static final Logger LOG = LoggerFactory.getLogger(ConfigurationProviderBuilder.class);

  private ConfigurationSource configurationSource;
  private ReloadStrategy reloadStrategy;
  private Environment environment;
  private MetricRegistry metricRegistry;
  private String prefix;

  /**
   * Construct {@link ConfigurationProvider}s builder.
   * 

* Default setup (override using with*() methods) *

    *
  • ConfigurationSource: {@link EmptyConfigurationSource}
  • *
  • ReloadStrategy: {@link ImmediateReloadStrategy}
  • *
  • Environment: {@link DefaultEnvironment}
  • *
  • Metrics: disabled
  • *
*/ public ConfigurationProviderBuilder() { configurationSource = new EmptyConfigurationSource(); reloadStrategy = new ImmediateReloadStrategy(); environment = new DefaultEnvironment(); prefix = ""; } /** * Set {@link ConfigurationSource} for {@link ConfigurationProvider}s built by this builder. * * @param configurationSource {@link ConfigurationSource} to use * @return this builder with {@link ConfigurationSource} set to {@code configurationSource} */ public ConfigurationProviderBuilder withConfigurationSource(ConfigurationSource configurationSource) { this.configurationSource = configurationSource; return this; } /** * Set {@link ReloadStrategy} for {@link ConfigurationProvider}s built by this builder. * * @param reloadStrategy {@link ReloadStrategy} to use * @return this builder with {@link ReloadStrategy} set to {@code reloadStrategy} */ public ConfigurationProviderBuilder withReloadStrategy(ReloadStrategy reloadStrategy) { this.reloadStrategy = reloadStrategy; return this; } /** * Set {@link Environment} for {@link ConfigurationProvider}s built by this builder. * * @param environment {@link Environment} to use * @return this builder with {@link Environment} set to {@code environment} */ public ConfigurationProviderBuilder withEnvironment(Environment environment) { this.environment = environment; return this; } /** * Enable metrics emission for {@link ConfigurationProvider}s built by this builder. All metrics will be registered * with {@code metricRegistry} and prefixed by {@code prefix}. Provider built by this builder will emit the following metrics: *

Provider-level metrics:

*
    *
  • allConfigurationAsProperties
  • *
  • getProperty
  • *
  • getPropertyGeneric
  • *
  • bind
  • *
*

Source-level metrics

*
    *
  • source.getConfiguration
  • *
  • source.init
  • *
  • source.reload
  • *
* Each of those metrics is of {@link Timer} type (i.e. includes execution time percentiles, execution count, etc.) * * @param metricRegistry metric registry for registering metrics * @param prefix prefix for metric names * @return this builder */ public ConfigurationProviderBuilder withMetrics(MetricRegistry metricRegistry, String prefix) { this.prefix = requireNonNull(prefix); this.metricRegistry = metricRegistry; return this; } /** * Build a {@link ConfigurationProvider} using this builder's configuration. * * @return new {@link ConfigurationProvider} */ public ConfigurationProvider build() { LOG.info("Initializing ConfigurationProvider with " + configurationSource.getClass().getCanonicalName() + " source, " + reloadStrategy.getClass().getCanonicalName() + " reload strategy and " + environment.getClass().getCanonicalName() + " environment"); ConfigurationSource configurationSource = this.configurationSource; if (metricRegistry != null) { configurationSource = new MeteredConfigurationSource(metricRegistry, prefix, configurationSource); } configurationSource.init(); reloadStrategy.register(configurationSource); SimpleConfigurationProvider configurationProvider = new SimpleConfigurationProvider(configurationSource, environment); if (metricRegistry != null) { return new MeteredConfigurationProvider(metricRegistry, prefix, configurationProvider); } return configurationProvider; } @Override public String toString() { return "ConfigurationProviderBuilder{" + "configurationSource=" + configurationSource + ", reloadStrategy=" + reloadStrategy + ", environment=" + environment + '}'; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy