Command.java

package estore.presentation.command;

import java.util.HashMap;
import java.util.Map;

public enum Command {
    ADD(1, "add", "a"),
    SEARCH(2, "search", "s"),
    QUIT(3, "quit", "q"),
    VIEW(4, "metadata", "m");

    private final int index;
    private final String[] aliases;
    private static final Map<String, Command> COMMAND_TYPE_MAP = new HashMap<String, Command>();

    static {
        for (Command command : Command.values()) {
            COMMAND_TYPE_MAP.put(String.valueOf(command.index), command);
            for (String alias : command.aliases) {
                COMMAND_TYPE_MAP.put(alias, command);
            }
        }
    }

    Command(int index, String... aliases) {
        this.index = index;
        this.aliases = aliases;
    }

    public int getIndex() {
        return index;
    }

    public static String getOptions() {
        StringBuilder options = new StringBuilder();
        for (Command command : Command.values()) {
            options.append("(").append(command.index).append(")")
                    .append(command.name().charAt(0))
                    .append(command.name().substring(1).toLowerCase())
                    .append("\n");
        }
        return options.toString();
    }

    public static Command findByType(String type) {
        if (type == null) {
            return null;
        }
        return COMMAND_TYPE_MAP.get(type.toLowerCase().trim());
    }
}