package com.sleekbyte.tailor.utils; import com.sleekbyte.tailor.common.YamlConfiguration; import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.constructor.Constructor; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Optional; /** * Retrieve and parse config file. */ public final class YamlConfigurationFileManager { private static final String DEFAULT_CONFIG_PATH = ".tailor.yml"; /** * Find and parse config file. * * @param configPath path passed in as configuration file option argument * @return config file data encapsulated in YamlConfiguration object. If no config file found, then default config. * @throws IOException if unable to open/read config file */ public static Optional<YamlConfiguration> getConfiguration(Optional<String> configPath) throws IOException { File configFile = new File(configPath.orElse(DEFAULT_CONFIG_PATH)); // Extract information from config file Yaml yaml = new Yaml(new Constructor(YamlConfiguration.class)); Optional<YamlConfiguration> configData; if (!configFile.exists()) { return Optional.empty(); } InputStream configFileStream = new FileInputStream(configFile); configData = Optional.ofNullable((YamlConfiguration) yaml.load(configFileStream)); configFileStream.close(); YamlConfiguration defaultConfig = new YamlConfiguration(); YamlConfiguration config = configData.orElse(defaultConfig); config.setFileLocation(configFile.getCanonicalPath()); if (config.getInclude() == null || config.getInclude().isEmpty()) { config.setInclude(defaultConfig.getInclude()); } if (config.getExclude() == null || config.getExclude().isEmpty()) { config.setExclude(defaultConfig.getExclude()); } return Optional.of(config); } }