package edu.umd.rhsmith.diads.meater.core.config.props; import edu.umd.rhsmith.diads.meater.core.config.setup.MEaterSetupConsole; import edu.umd.rhsmith.diads.meater.util.console.ConsolePrompter; public abstract class BasicConfigProperty<T> implements ConfigProperty<T> { private final String name; private final String uiName; private final String uiDescription; private T val; private final T defaultVal; public BasicConfigProperty(String name, T defaultVal, String uiName, String uiDescription) { this.name = name; this.defaultVal = defaultVal; this.val = defaultVal; this.uiName = uiName; this.uiDescription = uiDescription; } @Override public String getName() { return name; } @Override public String getUiName() { return uiName; } @Override public String getUiDescription() { return uiDescription; } public T getDefaultVal() { return defaultVal; } @Override public void reset() { this.val = this.defaultVal; } @Override public T getVal() { return this.val; } @Override public void setVal(T val) { if (val == null) { this.val = this.defaultVal; } this.val = val; } @Override public void setup(MEaterSetupConsole setup) { setup.getConsole() .say(MSG_INFO_FMT, getUiName(), getPropertyTypeName()); if (getUiDescription() != null && !getUiDescription().isEmpty()) { setup.getConsole().say(MSG_HELPTEXT_FMT, getUiDescription()); } setup.getConsole().say(MSG_CURRVAL_FMT, getVal()); this.setVal(setup.getConsole().prompt(getConsolePrompter(), true)); } public abstract String getPropertyTypeName(); protected abstract ConsolePrompter<? extends T> getConsolePrompter(); /* * -------------------------------- * Messages * -------------------------------- */ private static final String MSG_CURRVAL_FMT = "(current value: '%s' -- enter empty line to retain)"; private static final String MSG_HELPTEXT_FMT = "-- %s"; private static final String MSG_INFO_FMT = "Property: %s (%s)"; }