package com.tacitknowledge.slowlight.proxyserver.config.json; import com.google.gson.GsonBuilder; import com.tacitknowledge.slowlight.proxyserver.config.ConfigBuilder; import com.tacitknowledge.slowlight.proxyserver.config.SlowlightConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.net.URL; import java.util.Scanner; /** * Config builder implementation to create slowlight configuration from an JSON based configuration file. * Config builder will initially try to load the JSON configuration file from given path and then from classpath. * * @author Alexandr Donciu (adonciu@tacitknowledge.com) */ public class JSONConfigBuilder implements ConfigBuilder { private static final Logger LOG = LoggerFactory.getLogger(JSONConfigBuilder.class); @Override public SlowlightConfig getConfig(final String configFileName) { final String configJson = getConfigJSON(configFileName); final GsonBuilder gson = new GsonBuilder(); return gson.create().fromJson(configJson, SlowlightConfig.class); } private String getConfigJSON(final String configFileName) { LOG.info("Load slowlight configuration [{}]", configFileName); File configFile = getConfigFromPath(configFileName); if (configFile == null) { configFile = getConfigFromClasspath(configFileName); } try { return new Scanner(configFile).useDelimiter("\\Z").next(); } catch (Exception e) { throw new IllegalArgumentException("Cannot find config file [" + configFileName + "]", e); } } private File getConfigFromPath(final String configFileName) { LOG.debug("Loading configuration file [{}] from the path", configFileName); File configFile = new File(configFileName); if (!configFile.exists()) { configFile = null; } return configFile; } private File getConfigFromClasspath(final String configFileName) { LOG.debug("Loading configuration file [{}] from the classpath", configFileName); File configFile = null; final URL url = Thread.currentThread().getContextClassLoader().getResource(configFileName); if (url != null) { configFile = new File(url.getFile()); } return configFile; } }