001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.data.preferences;
003
004import org.openstreetmap.josm.spi.preferences.Config;
005import org.openstreetmap.josm.tools.Logging;
006
007/**
008 * Abstract base class for properties with {@link Enum} value, where the preference
009 * key is generated from a list of parameters.
010 * @param <T> the {@code Enum} class
011 */
012public abstract class ParametrizedEnumProperty<T extends Enum<T>> {
013
014    protected final T defaultValue;
015    protected final Class<T> enumClass;
016
017    protected ParametrizedEnumProperty(Class<T> enumClass, T defaultValue) {
018        this.defaultValue = defaultValue;
019        this.enumClass = enumClass;
020    }
021
022    protected abstract String getKey(String... params);
023
024    public T get(String... params) {
025        return parse(Config.getPref().get(getKey(params), defaultValue.name()));
026    }
027
028    public boolean put(T value, String... params) {
029        return Config.getPref().put(getKey(params), value.name());
030    }
031
032    protected T parse(String s) {
033        try {
034            return Enum.valueOf(enumClass, s);
035        } catch (IllegalArgumentException e) {
036            Logging.trace(e);
037            return defaultValue;
038        }
039    }
040}