/* * Copyright 2016 The Simple File Server Authors * * 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.sfs.util; import com.google.common.base.Joiner; import com.google.common.base.Predicates; import com.google.common.base.Splitter; import com.google.common.collect.FluentIterable; import com.google.common.collect.Iterables; import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; import io.vertx.core.logging.Logger; import io.vertx.core.logging.LoggerFactory; import java.util.Arrays; import java.util.NavigableSet; import java.util.concurrent.ConcurrentSkipListSet; public class ConfigHelper { private static final Logger LOGGER = LoggerFactory.getLogger(ConfigHelper.class); private static NavigableSet<String> USED_ENV_VARS = new ConcurrentSkipListSet<>(); public static Iterable<String> getArrayFieldOrEnv(JsonObject config, String name, String[] defaultValue) { return getArrayFieldOrEnv(config, name, Arrays.asList(defaultValue)); } public static Iterable<String> getArrayFieldOrEnv(JsonObject config, String name, Iterable<String> defaultValue) { String envVar = formatEnvVariable(name); //USED_ENV_VARS.add(envVar); if (config.containsKey(name)) { JsonArray values = config.getJsonArray(name); if (values != null) { Iterable<String> iterable = FluentIterable.from(values) .filter(Predicates.notNull()) .filter(input -> input instanceof String) .transform(input -> input.toString()); log(name, envVar, name, iterable); return iterable; } } else { String value = System.getenv(envVar); if (value != null) { log(name, envVar, envVar, value); return Splitter.on(',').split(value); } } log(name, envVar, null, defaultValue); return defaultValue; } public static String getFieldOrEnv(JsonObject config, String name, String defaultValue) { String envVar = formatEnvVariable(name); //USED_ENV_VARS.add(envVar); if (config.containsKey(name)) { Object value = config.getValue(name); if (value != null) { String valueAsString = value.toString(); log(name, envVar, name, valueAsString); return valueAsString; } } else { String value = System.getenv(envVar); if (value != null) { log(name, envVar, envVar, value); return value; } } log(name, envVar, null, defaultValue); return defaultValue; } public static String getFieldOrEnv(JsonObject config, String name) { return getFieldOrEnv(config, name, null); } public static NavigableSet<String> getEnvVars() { return USED_ENV_VARS; } protected static String formatEnvVariable(String name) { Iterable<String> splits = Splitter.on('.').split(name); Iterable<String> upperCased = FluentIterable.from(splits) .transform(String::toUpperCase); String joined = "SFS_" + Joiner.on('_').join(upperCased); return joined; } protected static void log(String name, String envVar, String foundName, String value) { if (foundName != null) { LOGGER.info(String.format("Config['%s'], Env['%s']. Found value in %s: %s", name, envVar, foundName, value)); } else { LOGGER.info(String.format("Config['%s'], Env['%s']. Value not found using default: %s", name, envVar, value)); } } protected static void log(String name, String envVar, String foundName, Iterable<String> value) { if (LOGGER.isInfoEnabled()) { if (foundName != null) { LOGGER.info(String.format("Config['%s'], Env['%s']. Found value in %s: %s", name, envVar, foundName, Iterables.toString(value))); } else { LOGGER.info(String.format("Config['%s'], Env['%s']. Value not found using default: %s", name, envVar, value)); } } } }