/* * @(#)Settings.java - holds all data of interest to re-use * * Copyright (c) 2005 * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, * as a non-commercial test project. * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ /* * initiated by pstorch */ package net.sourceforge.dvb.projectx.common; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.InputStreamReader; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.TreeMap; import net.sourceforge.dvb.projectx.xinput.XInputDirectory; /** * The Settings class handles the settings for Project-X. * * @author Peter Storch */ public class Settings extends Object { /** the default ini filename */ private static final String DEFAULT_INI = "X.ini"; /** the current ini filename */ private String inifile = ""; /** all settings are being hold in this properties object */ private Properties props = new Properties(); /** */ private ArrayList input_directories = new ArrayList(); /** */ private ArrayList output_directories = new ArrayList(); /** * Constructor */ public Settings() { this(Resource.workdir + Resource.filesep + DEFAULT_INI); } /** * Constructor * * @param filename */ public Settings(String filename) { inifile = filename; load(); buildInputDirectories(); buildOutputDirectories(); } /** * */ public void loadProperties(java.io.ByteArrayInputStream is) throws IOException { props.load(is); } /** * */ public byte[] storeProperties() throws IOException { ByteArrayOutputStream os = new ByteArrayOutputStream(); props.store(os, null); return os.toByteArray(); } /** * Loads the ini file. */ public void load() { try { BufferedReader r = new BufferedReader(new FileReader(inifile)); String line = null; while ((line = r.readLine()) != null) { if (line.startsWith("#")) continue; int pos = line.indexOf('='); if (pos != -1) { String key = line.substring(0, pos); String value = line.substring(pos + 1); props.put(key, value); } } r.close(); } catch(IOException e) { System.out.println(Resource.getString("msg.loadini.error") + " " + e); } } /** * Saves the ini file. */ public void save() { save(inifile); } /** * Saves the ini file (std or extra name) */ public void save(String str) { if (str == null) str = inifile; try { PrintWriter w = new PrintWriter(new FileWriter(str)); String base_key = "# Project-X INI"; w.println(base_key); w.println("# " + Common.getVersionName() + " / " + Common.getVersionDate()); TreeMap map = new TreeMap(props); Set keys = map.keySet(); for (Iterator iter = keys.iterator(); iter.hasNext(); ) { String element = (String) iter.next(); String key = element.substring(0, element.indexOf(".")); if (!base_key.equals(key)) { w.println(); w.println("# " + key); base_key = key; } w.println(element + "=" + map.get(element)); } w.close(); } catch(IOException e) { Common.setExceptionMessage(e); } } /** * build input_directory Xinput object from property list (strings only) */ public void buildInputDirectories() { String key = Keys.KEY_InputDirectories; ArrayList input = (ArrayList)getListProperty(key); int i = 0; for ( ; i < input.size(); i++) { if (addInputDirectory(input.get(i)) == null) { input.remove(i); i--; } } if (i != input.size()) setListProperty(key, input); } /** * updates property list (strings only) */ public void updateInputDirectories() { ArrayList input = new ArrayList(); for (int i = 0; i < input_directories.size(); i++) input.add( input_directories.get(i).toString()); setListProperty(Keys.KEY_InputDirectories, input); } /** * adds input_directory Xinput object */ public String addInputDirectory(Object value) { if (value == null) return null; try { XInputDirectory xInputDirectory = (XInputDirectory) value; input_directories.add(xInputDirectory); return xInputDirectory.toString(); } catch (Exception e) { // is not yet xinput object } try { XInputDirectory xInputDirectory = new XInputDirectory(value); if (xInputDirectory.test()) { input_directories.add(xInputDirectory); return xInputDirectory.toString(); } } catch (RuntimeException e) { // If there are problems with the directory simply ignore it and do nothing } return null; } /** * removes input_directory Xinput object */ public void removeInputDirectory(int index) { if (index < 0 || input_directories.isEmpty() || input_directories.size() <= index) return; input_directories.remove(index); } /** * returns input_directory Xinput objects */ public ArrayList getInputDirectories() { return input_directories; } /** * build output_directory from property list (strings only) */ public void buildOutputDirectories() { String key = Keys.KEY_OutputDirectories; ArrayList output = (ArrayList)getListProperty(key); int i = 0; for ( ; i < output.size(); i++) addOutputDirectory(output.get(i)); if (i != output.size()) setListProperty(key, output); } /** * updates property list (strings only) */ public void updateOutputDirectories() { ArrayList output = new ArrayList(); for (int i = 0; i < output_directories.size(); i++) output.add( output_directories.get(i).toString()); setListProperty(Keys.KEY_OutputDirectories, output); } /** * adds output_directory string */ public void addOutputDirectory(Object value) { addOutputDirectory(value, -1); } /** * adds output_directory string */ public void addOutputDirectory(Object value, int index) { if (value == null) return; if (index < 0 || index > output_directories.size()) output_directories.add(value); else output_directories.add(index, value); updateOutputDirectories(); } /** * removes output_directory string */ public void removeOutputDirectory(int index) { if (index < 0 || output_directories.size() < index - 1) return; output_directories.remove(index); updateOutputDirectories(); } /** * returns output_directory strings */ public ArrayList getOutputDirectories() { return output_directories; } /** * Sets a String property. * * @param key * @param value * @return */ public void setProperty(String key, String value) { if (value != null) props.setProperty(key, value); else props.remove(key); } /** * Sets a Object property. * * @param key * @param value * @return */ public void setProperty(String key, Object value) { String str = value == null ? null : String.valueOf(value); setProperty(key, str); } /** * Sets a Object property. * * @param key of obj * @param value * @return */ public void setProperty(Object[] key, Object value) { setProperty(key[0].toString(), String.valueOf(value)); } /** * Returns a String property. * * @param key * @return */ public String getProperty(String key) { return props.getProperty(key); } /** * Returns a String property. If not found it returns the given default value. * * @param key * @param defaultValue * @return */ public String getProperty(String key, String defaultValue) { return props.getProperty(key, defaultValue); } /** * Returns a String property. If not found it returns the given default value. * * @param key * @param defaultValue * @return */ public String getProperty(String[] key_defaultValue) { String key = key_defaultValue[0]; String defaultValue = key_defaultValue[1]; return props.getProperty(key, defaultValue); } /** * Returns an integer property. * * @param key * @param value * @return */ public void setIntProperty(String key, int value) { props.setProperty(key, String.valueOf(value)); } /** * Returns an integer property. * * @param key * @return */ public int getIntProperty(String key) { return Integer.parseInt(props.getProperty(key)); } /** * Returns an integer property. If not found or not parseable it returns the default value. * * @param key * @param defaultValue * @return */ public int getIntProperty(String key, int defaultValue) { int value = defaultValue; try { value = Integer.parseInt(getProperty(key)); } catch(Exception e) { // ok, then we stay with the default value } return value; } /** * Returns an integer property. If not found or not parseable it returns the default value. * * @param key * @param defaultValue * @return */ public int getIntProperty(String[] key_defaultValue) { String key = key_defaultValue[0]; int value = Integer.parseInt(key_defaultValue[1]); try { value = Integer.parseInt(getProperty(key)); } catch(Exception e) { // ok, then we stay with the default value } return value; } /** * Returns a boolean property. * Default is false. * * @param key * @return */ public void setBooleanProperty(String key, boolean value) { props.setProperty(key, value ? "1" : "0"); } /** * Returns a Boolean property. * Null if key not found. Default is false. * * @param key * @return */ public Boolean getBooleanProperty(String key) { String value = getProperty(key); if (value == null) return null; else if (value.equals("1") || value.equals("true") || value.equals("yes") || value.equals("on")) return Boolean.TRUE; return Boolean.FALSE; } /** * Returns a Boolean property or the given defaultValue. * * @param key * @param defaultValue * @return */ public boolean getBooleanProperty(String key, boolean defaultValue) { Boolean value = getBooleanProperty(key); if (value == null) return defaultValue; return value.booleanValue(); } /** * Returns a Boolean property or the given defaultValue. * * @param key * @param defaultValue * @return */ public boolean getBooleanProperty(String[] key_defaultValue) { String key = key_defaultValue[0]; String defaultValue = key_defaultValue[1]; Boolean value = getBooleanProperty(key); if (value != null) return value.booleanValue(); if (defaultValue.equals("1") || defaultValue.equals("true") || defaultValue.equals("yes") || defaultValue.equals("on")) return true; return false; } /** * Sets a List of properties starting with key. * * @param key * @param list * @return */ public void setListProperty(String key, List list) { removeListProperty(key); for (int i = 0; i < list.size(); i++) { Object element = list.get(i); setProperty(key + i, element); } } /** * Gets a List of properties starting with key. * * @param key * @return */ public List getListProperty(String key) { Set keys = props.keySet(); List list = new ArrayList(); for (Iterator iter = keys.iterator(); iter.hasNext(); ) { String element = (String) iter.next(); if (element.startsWith(key)) list.add(props.getProperty(element)); } return list; } /** * removes a List of properties starting with key. * * @param key * @return */ public void removeListProperty(String key) { Set keys = props.keySet(); ArrayList list = new ArrayList(); for (Iterator iter = keys.iterator(); iter.hasNext(); ) { String element = (String) iter.next(); if (element.startsWith(key)) list.add(element); } for (int i = 0; i < list.size(); i++) remove(list.get(i).toString()); } /** * Sets a Map of properties starting with key. * * @param key * @param map * @return */ public void setHashMapProperty(String key, Map map) { Set keys = map.keySet(); for (Iterator iter = keys.iterator(); iter.hasNext(); ) { String element = (String) iter.next(); setProperty(key + element, map.get(element)); } } /** * Gets a Map of properties starting with key. * The Map contains the entries with a new key like this: * mapKey = propsKey - key. * * @param key * @return */ public Map getHashMapProperty(String key) { Set keys = props.keySet(); Map map = new HashMap(); for (Iterator iter = keys.iterator(); iter.hasNext();) { String element = (String) iter.next(); if (element.startsWith(key)) map.put(element.substring(key.length()), props.getProperty(element)); } return map; } /** * Removes a property. * * @param key */ public void remove(String key) { props.remove(key); } /** * Returns the ini filename. * * @return */ public String getInifile() { return inifile; } }