/* GanttProject is an opensource project management tool. Copyright (C) 2009 Dmitry Barashev 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 3 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package net.sourceforge.ganttproject; import java.util.LinkedHashMap; import java.util.TreeMap; import org.osgi.service.prefs.BackingStoreException; import org.osgi.service.prefs.Preferences; public class PluginPreferencesImpl implements Preferences { private final String myName; private final Preferences myParent; private final LinkedHashMap<String, PluginPreferencesImpl> myChildren = new LinkedHashMap<String, PluginPreferencesImpl>(); private final TreeMap<String, String> myProps = new TreeMap<String, String>(); public PluginPreferencesImpl(Preferences parent, String name) { myName = name; myParent = parent; } @Override public Preferences node(String path) { if (path.endsWith("/")) { if (!"/".equals(path)) { throw new IllegalArgumentException("Path can't end with /"); } } if (path.startsWith("/")) { if (myParent != null) { return myParent.node(path); } path = path.substring(1); } if ("".equals(path)) { return this; } int firstSlash = path.indexOf('/'); String prefix = firstSlash == -1 ? path : path.substring(0, firstSlash); String suffix = firstSlash == -1 ? "" : path.substring(firstSlash + 1); Preferences child = myChildren.get(prefix); if (child == null) { child = createChild(prefix); } return child.node(suffix); } @Override public void removeNode() throws BackingStoreException { throw new UnsupportedOperationException(); } @Override public String absolutePath() { return myParent == null ? "/" : myParent.absolutePath() + "/" + myName; } @Override public String[] childrenNames() throws BackingStoreException { return myChildren.keySet().toArray(new String[0]); } @Override public void clear() throws BackingStoreException { myProps.clear(); } @Override public void flush() throws BackingStoreException { } @Override public String get(String key, String def) { String value = myProps.get(key); return value == null ? def : value; } @Override public boolean getBoolean(String key, boolean def) { String value = get(key, null); if (value == null) { return def; } try { return Boolean.parseBoolean(value); } catch (Exception e) { GPLogger.log(new RuntimeException("Failed to parse value=" + value + " as boolean", e)); return false; } } @Override public byte[] getByteArray(String key, byte[] def) { // TODO Auto-generated method stub return null; } @Override public double getDouble(String key, double def) { // TODO Auto-generated method stub return 0; } @Override public float getFloat(String key, float def) { // TODO Auto-generated method stub return 0; } @Override public int getInt(String key, int def) { String value = get(key, null); if (value == null) { return def; } try { return Integer.parseInt(value); } catch (NumberFormatException e) { return def; } } @Override public long getLong(String key, long def) { // TODO Auto-generated method stub return 0; } @Override public String[] keys() throws BackingStoreException { return myProps.keySet().toArray(new String[0]); } @Override public String name() { return myName; } @Override public boolean nodeExists(String pathName) throws BackingStoreException { return node(pathName) != null; } @Override public Preferences parent() { return myParent; } @Override public void put(String key, String value) { myProps.put(key, value); } @Override public void putBoolean(String key, boolean value) { myProps.put(key, Boolean.toString(value)); } @Override public void putByteArray(String key, byte[] value) { // TODO Auto-generated method stub } @Override public void putDouble(String key, double value) { // TODO Auto-generated method stub } @Override public void putFloat(String key, float value) { // TODO Auto-generated method stub } @Override public void putInt(String key, int value) { put(key, String.valueOf(value)); } @Override public void putLong(String key, long value) { // TODO Auto-generated method stub } @Override public void remove(String key) { myProps.remove(key); } @Override public void sync() throws BackingStoreException { throw new UnsupportedOperationException(); } PluginPreferencesImpl createChild(String name) { PluginPreferencesImpl child = new PluginPreferencesImpl(this, name); myChildren.put(name, child); return child; } }