package fr.tikione.steam.cleaner.util.conf; import fr.tikione.ini.InfinitiveLoopException; import fr.tikione.ini.Ini; import fr.tikione.steam.cleaner.Main; import fr.tikione.steam.cleaner.util.Log; import fr.tikione.steam.cleaner.util.Redist; import java.io.CharConversionException; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Configuration handler. */ public class Patterns { public static final String REMOTE_DEFINITION_FILES_SEPARATOR = "##n##"; /** INI configuration file section : redistributable packages file and folder patterns. */ private static final String CONFIG_REDIST_PATTERNS = "REDISTRIBUTABLE_PACKAGES_PATTERNS"; /** INI configuration file key : redistributable package file patterns. */ private static final String CONFIG_REDIST_PATTERNS__FILE_PATTERNS = "redistFilePatterns"; /** INI configuration file key : redistributable package folder patterns. */ private static final String CONFIG_REDIST_PATTERNS__FOLDER_PATTERNS = "redistFolderPatterns"; /** INI configuration file key : redistributable package file patterns. */ private static final String CONFIG_REDIST_PATTERNS__FILE_PATTERNS_EXP = "experimentalRedistFilesPatterns"; /** INI configuration file key : redistributable package folder patterns. */ private static final String CONFIG_REDIST_PATTERNS__FOLDER_PATTERNS_EXP = "experimentalRedistFolderPatterns"; /** INI configuration file key : enable experimental patterns. */ private static final String CONFIG_REDIST_PATTERNS__ENABLE_EXP_PATTERNS = "enableExperimentalPatterns"; private static final String CONFIG_FILENAME = "tikione-steam-cleaner_patterns_rev244.ini"; /** Singleton handler. */ private static final Patterns config; /** File to use for configuration loading and saving. */ private final File configFile; /** Configuration object. */ private Ini ini; private List<Ini> inis; private boolean updated = false; static { // Singleton creation. try { config = new Patterns(); } catch (IOException | InfinitiveLoopException ex) { Log.error(ex); throw new RuntimeException(ex); } } /** * Get the configuration handler as a singleton. * * @return the configuration handler singleton. */ public static synchronized Patterns getInstance() { return config; } /** * Load application configuration file. A default configuration file is created if necessary. * * @throws IOException if an I/O error occurs while retrieving the internal default configuration file, or while writing this default * configuration file. */ @SuppressWarnings("OverridableMethodCallInConstructor") private Patterns() throws IOException, InfinitiveLoopException { File backupConfigFile = new File("conf/backup/tikione-steam-cleaner_patterns.ini"); File userprofile = new File(Config.getProfilePath()); //noinspection ResultOfMethodCallIgnored userprofile.mkdirs(); configFile = new File(userprofile.getAbsolutePath() + "/" + CONFIG_FILENAME); if (!configFile.exists()) { org.apache.commons.io.FileUtils.copyFile(backupConfigFile, configFile); } reload(); } public void reload() throws IOException, InfinitiveLoopException { ini = new Ini(); ini.getConfig().enableParseLineConcat(true); ini.getConfig().enableReadUnicodeEscConv(true); ini.load(configFile, Main.CONF_ENCODING); inis = new ArrayList<>(8); inis.add(ini); inis.addAll(RemotePatterns.getInis()); } /** * Saves the configuration into a file. * * @throws IOException if an I/O error occurs while writing the file. */ public void save() throws IOException { if (updated) { ini.store(configFile, Main.CONF_ENCODING, Main.CONF_NEWLINE); } } public List<Redist> getRedistFilePatternsAndDesc(boolean includeExp) throws CharConversionException, InfinitiveLoopException { List<Redist> res = getRedistPatternsAndDesc(CONFIG_REDIST_PATTERNS__FILE_PATTERNS); if (includeExp) { List<Redist> resAdd = getRedistPatternsAndDesc(CONFIG_REDIST_PATTERNS__FILE_PATTERNS_EXP); res.addAll(resAdd); } return res; } public List<Redist> getRedistFolderPatternsAndDesc(boolean includeExp) throws CharConversionException, InfinitiveLoopException { List<Redist> res = getRedistPatternsAndDesc(CONFIG_REDIST_PATTERNS__FOLDER_PATTERNS); if (includeExp) { List<Redist> resAdd = getRedistPatternsAndDesc(CONFIG_REDIST_PATTERNS__FOLDER_PATTERNS_EXP); res.addAll(resAdd); } return res; } public boolean getEnableExperimentalPatterns() throws CharConversionException, InfinitiveLoopException { return Boolean.parseBoolean(ini.getKeyValue("false", CONFIG_REDIST_PATTERNS, CONFIG_REDIST_PATTERNS__ENABLE_EXP_PATTERNS)); } private List<Redist> getRedistPatternsAndDesc(String configKey) throws CharConversionException, InfinitiveLoopException { List<Redist> redistList = new ArrayList<>(8); List<String> redistTokens = new ArrayList<>(64); for (Ini singleIni : inis) { String[] tokens = singleIni.getKeyValue("", CONFIG_REDIST_PATTERNS, configKey).split("\"", 0); redistTokens.addAll(Arrays.asList(tokens)); } boolean FileDescToggle = true; String redistName = null; String redtsiDescription; for (String redist : redistTokens) { if (redist.length() > 0) { // Skip first and last tokens. if (FileDescToggle) { redistName = redist; } else { redtsiDescription = redist; redistList.add(new Redist(redistName, redtsiDescription)); } FileDescToggle ^= true; } } return redistList; } public void setEnableExperimentalPatterns(boolean enable) { updated = true; ini.setKeyValue(CONFIG_REDIST_PATTERNS, CONFIG_REDIST_PATTERNS__ENABLE_EXP_PATTERNS, Boolean.toString(enable)); } }