001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.spi.preferences;
003
004import java.util.Collections;
005import java.util.HashMap;
006import java.util.Map;
007import java.util.Objects;
008import java.util.Set;
009import java.util.TreeMap;
010
011/**
012 * Preferences implementation that keeps all settings in memory.
013 *
014 * Holds saved preferences for the current session, but does not retain any data when the
015 * program terminates.
016 *
017 * @since 12906
018 */
019public class MemoryPreferences extends AbstractPreferences {
020
021    private final Map<String, Setting<?>> settings = new HashMap<>();
022
023    @Override
024    public boolean putSetting(String key, Setting<?> setting) {
025        Setting<?> current = settings.get(key);
026        if (setting == null) {
027            settings.remove(key);
028        } else {
029            settings.put(key, setting);
030        }
031        return Objects.equals(setting, current);
032    }
033
034    @Override
035    public <T extends Setting<?>> T getSetting(String key, T def, Class<T> klass) {
036        Setting<?> current = settings.get(key);
037        if (current != null && klass.isInstance(current)) {
038            @SuppressWarnings("unchecked")
039            T result = (T) current;
040            return result;
041        }
042        return def;
043    }
044
045    @Override
046    public Set<String> getKeySet() {
047        return Collections.unmodifiableSet(settings.keySet());
048    }
049
050    @Override
051    public Map<String, Setting<?>> getAllSettings() {
052        return new TreeMap<>(settings);
053    }
054
055    @Override
056    public void addPreferenceChangeListener(PreferenceChangedListener listener) {
057        // do nothing
058    }
059
060    @Override
061    public void removePreferenceChangeListener(PreferenceChangedListener listener) {
062        // do nothing
063    }
064
065    @Override
066    public void addKeyPreferenceChangeListener(String key, PreferenceChangedListener listener) {
067        // do nothing
068    }
069
070    @Override
071    public void removeKeyPreferenceChangeListener(String key, PreferenceChangedListener listener) {
072        // do nothing
073    }
074}