/************************************************************************** OmegaT - Computer Assisted Translation (CAT) tool with fuzzy matching, translation memory, keyword search, glossaries, and translation leveraging into updated projects. Copyright (C) 2000-2006 Keith Godfrey, Maxym Mykhalchuk, and Henry Pijffers 2007 Zoltan Bartko 2008-2009 Didier Briel 2010 Wildrich Fourie, Antonio Vilei, Didier Briel 2011 John Moran, Didier Briel 2012 Martin Fleurke, Wildrich Fourie, Didier Briel, Thomas Cordonnier, Aaron Madlon-Kay 2013 Aaron Madlon-Kay, Zoltan Bartko 2014 Piotr Kulik, Aaron Madlon-Kay 2015 Aaron Madlon-Kay, Yu Tang, Didier Briel, Hiroshi Miura 2016 Aaron Madlon-Kay Home page: http://www.omegat.org/ Support center: http://groups.yahoo.com/group/OmegaT/ This file is part of OmegaT. OmegaT 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 3 of the License, or (at your option) any later version. OmegaT 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, see <http://www.gnu.org/licenses/>. **************************************************************************/ package org.omegat.util; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.omegat.util.Preferences.IPreferences; public class PreferencesImpl implements IPreferences { interface IPrefsPersistence { void load(List<String> keys, List<String> values); void save(List<String> keys, List<String> values) throws Exception; } private boolean m_changed; // use a hash map for fast lookup of data // use array lists for orderly recovery of it for saving to disk private final List<String> m_nameList; private final List<String> m_valList; private final Map<String, Integer> m_preferenceMap; private final IPrefsPersistence m_backing; public PreferencesImpl(IPrefsPersistence backing) { m_preferenceMap = new HashMap<String, Integer>(64); m_nameList = new ArrayList<String>(32); m_valList = new ArrayList<String>(32); m_backing = backing; m_changed = false; m_backing.load(m_nameList, m_valList); for (int i = 0; i < m_nameList.size(); i++) { m_preferenceMap.put(m_nameList.get(i), i); } } @Override public String getPreference(String key) { if (StringUtil.isEmpty(key)) { return ""; } Integer i = m_preferenceMap.get(key); Object v = ""; if (i != null) { // mapping exists - recover defaultValue v = m_valList.get(i); } return v.toString(); } @Override public boolean existsPreference(String key) { return m_preferenceMap.containsKey(key); } @Override public boolean isPreference(String key) { return "true".equals(getPreference(key)); } @Override public boolean isPreferenceDefault(String key, boolean defaultValue) { String val = getPreference(key); if (StringUtil.isEmpty(val)) { setPreference(key, defaultValue); return defaultValue; } return "true".equals(val); } @Override public String getPreferenceDefault(String key, String defaultValue) { String val = getPreference(key); if (val.equals("")) { val = defaultValue; setPreference(key, defaultValue); } return val; } @Override public <T extends Enum<T>> T getPreferenceEnumDefault(String key, T defaultValue) { String val = getPreference(key); T r; try { r = Enum.valueOf(defaultValue.getDeclaringClass(), val); } catch (IllegalArgumentException ex) { r = defaultValue; setPreference(key, defaultValue); } return r; } @Override public int getPreferenceDefault(String key, int defaultValue) { String val = getPreferenceDefault(key, Integer.toString(defaultValue)); int res = defaultValue; try { res = Integer.parseInt(val); } catch (NumberFormatException nfe) { } return res; } @Override public Object setPreference(String name, Object value) { if (StringUtil.isEmpty(name) || value == null) { return null; } if (value instanceof Enum) { if (!value.toString().equals(((Enum<?>) value).name())) { throw new IllegalArgumentException( "Enum prefs must return the same thing from toString() and name()"); } } m_changed = true; Object oldValue = null; Integer i = m_preferenceMap.get(name); if (i == null) { // defaultValue doesn't exist - add it i = m_valList.size(); m_preferenceMap.put(name, i); m_valList.add(value.toString()); m_nameList.add(name); } else { // mapping exists - reset defaultValue to new oldValue = m_valList.set(i.intValue(), value.toString()); } return oldValue; } @Override public void save() { try { if (m_changed) { m_backing.save(m_nameList, m_valList); m_changed = false; } } catch (Exception e) { Log.logErrorRB("PM_ERROR_SAVE"); Log.log(e); } } }