/**
* Copyright (c) 2013-2016, The SeedStack authors <http://seedstack.org>
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.seedstack.seed.core.internal.init;
import org.seedstack.coffig.Coffig;
import org.seedstack.coffig.provider.EnvironmentProvider;
import org.seedstack.coffig.provider.JacksonProvider;
import org.seedstack.coffig.provider.PrefixProvider;
import org.seedstack.coffig.provider.PropertiesProvider;
import org.seedstack.coffig.provider.SystemPropertiesProvider;
import org.seedstack.seed.core.Seed;
import org.seedstack.seed.core.internal.configuration.ConfigurationPriority;
import org.seedstack.seed.core.internal.configuration.PrioritizedProvider;
import org.seedstack.shed.ClassLoaders;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.validation.ValidatorFactory;
import java.io.IOException;
import java.net.URL;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Set;
public class BaseConfiguration {
private static final Logger LOGGER = LoggerFactory.getLogger(BaseConfiguration.class);
private static final String ENVIRONMENT_VARIABLES_PREFIX = "env";
private static final String SYSTEM_PROPERTIES_PREFIX = "sys";
private final Coffig baseConfiguration;
private static class Holder {
private static final BaseConfiguration INSTANCE = new BaseConfiguration(GlobalValidatorFactory.get());
}
public static Coffig get() {
return Holder.INSTANCE.baseConfiguration;
}
private BaseConfiguration(ValidatorFactory validatorFactory) {
baseConfiguration = Coffig.builder()
.withProviders(new PrioritizedProvider()
.registerProvider(
buildJacksonProvider("application.yaml", "application.yml", "application.json"),
ConfigurationPriority.BASE
)
.registerProvider(
buildPropertiesProvider("application.properties"),
ConfigurationPriority.BASE
)
.registerProvider(
buildJacksonProvider("application.override.yaml", "application.override.yml", "application.override.json"),
ConfigurationPriority.BASE_OVERRIDE
)
.registerProvider(
buildPropertiesProvider("application.override.properties"),
ConfigurationPriority.BASE_OVERRIDE
)
.registerProvider(
new PrefixProvider<>(ENVIRONMENT_VARIABLES_PREFIX, new EnvironmentProvider()),
ConfigurationPriority.ENVIRONMENT_VARIABLES
)
.registerProvider(
new PrefixProvider<>(SYSTEM_PROPERTIES_PREFIX, new SystemPropertiesProvider()),
ConfigurationPriority.SYSTEM_PROPERTIES
))
.enableValidation(validatorFactory)
.build();
}
private JacksonProvider buildJacksonProvider(String... resourceNames) {
JacksonProvider jacksonProvider = new JacksonProvider();
getResources(resourceNames).forEach(jacksonProvider::addSource);
return jacksonProvider;
}
private PropertiesProvider buildPropertiesProvider(String... resourceNames) {
PropertiesProvider propertiesProvider = new PropertiesProvider();
getResources(resourceNames).forEach(propertiesProvider::addSource);
return propertiesProvider;
}
private Set<URL> getResources(String... resourceNames) {
Set<URL> result = new HashSet<>();
for (String resourceName : resourceNames) {
try {
Enumeration<URL> configResources = ClassLoaders.findMostCompleteClassLoader(Seed.class).getResources(resourceName);
while (configResources.hasMoreElements()) {
URL url = configResources.nextElement();
LOGGER.debug("Detected configuration resource: {}", url.toExternalForm());
result.add(url);
}
} catch (IOException e) {
LOGGER.warn("I/O error during detection of configuration file " + resourceName, e);
}
}
return result;
}
}