package org.ovirt.engine.core.searchbackend; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.ovirt.engine.core.compat.DayOfWeek; public class BaseAutoCompleter implements IAutoCompleter { protected final Set<String> verbs = new HashSet<>(); protected final Map<String, List<String>> verbCompletion = new HashMap<>(); private static final List<String> daysOfWeek = new ArrayList<>(); static { for(DayOfWeek day: DayOfWeek.values()) { daysOfWeek.add(day.toString()); } } public BaseAutoCompleter() { } public BaseAutoCompleter(String text) { acceptAll(text); buildCompletions(); } public BaseAutoCompleter(String... text) { acceptAll(text); buildCompletions(); } public BaseAutoCompleter(String[] text, String[] noAutocomplete) { this(text); acceptAll(noAutocomplete); } protected final void acceptAll(final String... tokens) { Collections.addAll(verbs, tokens); } protected final void buildCompletions() { final List<String> emptyKeyList = new ArrayList<>(); for (String title : verbs) { emptyKeyList.add(changeCaseDisplay(title)); for (int idx = 1; idx <= title.length(); idx++) { String curKey = title.substring(0, idx); if (!verbCompletion.containsKey(curKey)) { verbCompletion.put(curKey, new ArrayList<String>()); } final List<String> curList = verbCompletion.get(curKey); curList.add(changeCaseDisplay(title)); } } verbCompletion.put("", emptyKeyList); verbCompletion.put(" ", emptyKeyList); } @Override public final String[] getCompletion(String wordPart) { String[] retval = new String[0]; if (verbCompletion.containsKey(wordPart.toUpperCase())) { List<String> curList = verbCompletion.get(wordPart.toUpperCase()); retval = curList.toArray(new String[curList.size()]); } return retval; } @Override public final boolean validate(String text) { return (text != null) ? verbs.contains(text.toUpperCase()) : false; } @Override public final boolean validateCompletion(String text) { return verbCompletion.containsKey(text); } @Override public String changeCaseDisplay(String text) { if (daysOfWeek.contains(text)) { return text; } return text.toLowerCase(); } }