/* * Autopsy Forensic Browser * * Copyright 2011 Basis Technology Corp. * Contact: carrier <at> sleuthkit <dot> org * * 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.sleuthkit.autopsy.coreutils; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.logging.Level; /** * This class contains the framework to read, add, update, and remove from the * property files located at %USERDIR%/Config/x.properties */ public class ModuleSettings { // The directory where the properties file is located private final static String moduleDirPath = PlatformUtil.getUserConfigDirectory(); public static final String DEFAULT_CONTEXT = "GeneralContext"; //NON-NLS public static final String MAIN_SETTINGS = "Case"; //NON-NLS public static final String CURRENT_CASE_TYPE = "Current_Case_Type"; //NON-NLS /** * the constructor */ private ModuleSettings() { } /** * Makes a new config file of the specified name. Do not include the * extension. * * @param moduleName - The name of the config file to make * * @return True if successfully created, false if already exists or an error * is thrown. */ public static boolean makeConfigFile(String moduleName) { if (!configExists(moduleName)) { File propPath = new File(moduleDirPath + File.separator + moduleName + ".properties"); File parent = new File(propPath.getParent()); if (!parent.exists()) { parent.mkdirs(); } Properties props = new Properties(); try { propPath.createNewFile(); FileOutputStream fos = new FileOutputStream(propPath); props.store(fos, ""); fos.close(); } catch (IOException e) { Logger.getLogger(ModuleSettings.class.getName()).log(Level.WARNING, "Was not able to create a new properties file.", e); //NON-NLS return false; } return true; } return false; } /** * Determines if a given properties file exists or not. * * @param moduleName - The name of the config file to evaluate * * @return true if the config exists, false otherwise. */ public static boolean configExists(String moduleName) { File f = new File(moduleDirPath + File.separator + moduleName + ".properties"); return f.exists(); } public static boolean settingExists(String moduleName, String settingName) { if (!configExists(moduleName)) { return false; } try { Properties props = fetchProperties(moduleName); return (props.getProperty(settingName) != null); } catch (IOException e) { return false; } } /** * Returns the path of the given properties file. * * @param moduleName - The name of the config file to evaluate * * @return The path of the given config file. Returns null if the config * file doesn't exist. */ private static String getPropertyPath(String moduleName) { if (configExists(moduleName)) { return moduleDirPath + File.separator + moduleName + ".properties"; //NON-NLS } return null; } /** * Returns the given properties file's setting as specific by settingName. * * @param moduleName - The name of the config file to read from. * @param settingName - The setting name to retrieve. * * @return - the value associated with the setting. * * @throws IOException */ public static String getConfigSetting(String moduleName, String settingName) { if (!configExists(moduleName)) { makeConfigFile(moduleName); Logger.getLogger(ModuleSettings.class.getName()).log(Level.INFO, "File did not exist. Created file [" + moduleName + ".properties]"); //NON-NLS NON-NLS } try { Properties props = fetchProperties(moduleName); return props.getProperty(settingName); } catch (IOException e) { Logger.getLogger(ModuleSettings.class.getName()).log(Level.WARNING, "Could not read config file [" + moduleName + "]", e); //NON-NLS return null; } } /** * Returns the given properties file's map of settings. * * @param moduleName - the name of the config file to read from. * * @return - the map of all key:value pairs representing the settings of the * config. * * @throws IOException */ public static Map< String, String> getConfigSettings(String moduleName) { if (!configExists(moduleName)) { makeConfigFile(moduleName); Logger.getLogger(ModuleSettings.class.getName()).log(Level.INFO, "File did not exist. Created file [" + moduleName + ".properties]"); //NON-NLS NON-NLS } try { Properties props = fetchProperties(moduleName); Set<String> keys = props.stringPropertyNames(); Map<String, String> map = new HashMap<String, String>(); for (String s : keys) { map.put(s, props.getProperty(s)); } return map; } catch (IOException e) { Logger.getLogger(ModuleSettings.class.getName()).log(Level.WARNING, "Could not read config file [" + moduleName + "]", e); //NON-NLS return null; } } /** * Sets the given properties file to the given setting map. * * @param moduleName - The name of the module to be written to. * @param settings - The mapping of all key:value pairs of settings to add * to the config. */ public static synchronized void setConfigSettings(String moduleName, Map<String, String> settings) { if (!configExists(moduleName)) { makeConfigFile(moduleName); Logger.getLogger(ModuleSettings.class.getName()).log(Level.INFO, "File did not exist. Created file [" + moduleName + ".properties]"); //NON-NLS NON-NLS } try { Properties props = fetchProperties(moduleName); for (Map.Entry<String, String> kvp : settings.entrySet()) { props.setProperty(kvp.getKey(), kvp.getValue()); } File path = new File(getPropertyPath(moduleName)); FileOutputStream fos = new FileOutputStream(path); props.store(fos, "Changed config settings(batch)"); //NON-NLS fos.close(); } catch (IOException e) { Logger.getLogger(ModuleSettings.class.getName()).log(Level.WARNING, "Property file exists for [" + moduleName + "] at [" + getPropertyPath(moduleName) + "] but could not be loaded.", e); //NON-NLS NON-NLS NON-NLS } } /** * Sets the given properties file to the given settings. * * @param moduleName - The name of the module to be written to. * @param settingName - The name of the setting to be modified. * @param settingVal - the value to set the setting to. */ public static synchronized void setConfigSetting(String moduleName, String settingName, String settingVal) { if (!configExists(moduleName)) { makeConfigFile(moduleName); Logger.getLogger(ModuleSettings.class.getName()).log(Level.INFO, "File did not exist. Created file [" + moduleName + ".properties]"); //NON-NLS NON-NLS } try { Properties props = fetchProperties(moduleName); props.setProperty(settingName, settingVal); File path = new File(getPropertyPath(moduleName)); FileOutputStream fos = new FileOutputStream(path); props.store(fos, "Changed config settings(single)"); //NON-NLS fos.close(); } catch (IOException e) { Logger.getLogger(ModuleSettings.class.getName()).log(Level.WARNING, "Property file exists for [" + moduleName + "] at [" + getPropertyPath(moduleName) + "] but could not be loaded.", e); //NON-NLS NON-NLS NON-NLS } } /** * Removes the given key from the given properties file. * * @param moduleName - The name of the properties file to be modified. * @param key - the name of the key to remove. */ public static synchronized void removeProperty(String moduleName, String key) { try { if (getConfigSetting(moduleName, key) != null) { Properties props = fetchProperties(moduleName); props.remove(key); File path = new File(getPropertyPath(moduleName)); FileOutputStream fos = new FileOutputStream(path); props.store(fos, "Removed " + key); //NON-NLS fos.close(); } } catch (IOException e) { Logger.getLogger(ModuleSettings.class.getName()).log(Level.WARNING, "Could not remove property from file, file not found", e); //NON-NLS } } /** * Returns the properties file as specified by moduleName. * * @param moduleName * * @return Properties file as specified by moduleName. * * @throws IOException */ private static Properties fetchProperties(String moduleName) throws IOException { InputStream inputStream = new FileInputStream(getPropertyPath(moduleName)); Properties props = new Properties(); props.load(inputStream); inputStream.close(); return props; } /** * Gets the property file as specified. * * @param moduleName * * @return A new file handle, returns null if the file does not exist. */ public static File getPropertyFile(String moduleName) { String path = getPropertyPath(moduleName); if (path == null) { return null; } else { return new File(getPropertyPath(moduleName)); } } }