//Dstl (c) Crown Copyright 2017 package uk.gov.dstl.baleen.resources.gazetteer; import java.util.Collections; import java.util.HashMap; import java.util.Map; import org.apache.uima.resource.Resource; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; import uk.gov.dstl.baleen.exceptions.BaleenException; /** * An abstract class to implement a gazetteer using a MultiMap as the backend. * * Developers should provide a reloadValues() method, and override any existing methods they wish to extend. * * The following configuration parameters are expected/allowed: * <ul> * <li><b>caseSensitive</b> - If false, then all values are lower cased; otherwise the original casing is kept and comparisons are done case sensitively. Defaults to false</li> * </ul> * * * @param <T> The type used for the ID of terms */ public abstract class AbstractMultiMapGazetteer<T> implements IGazetteer { private Multimap<T, String> idToValues = ArrayListMultimap.create(); private Map<String, T> valueToId = new HashMap<>(); public static final String CONFIG_CASE_SENSITIVE = "caseSensitive"; public static final Boolean DEFAULT_CASE_SENSITIVE = false; protected boolean caseSensitive = DEFAULT_CASE_SENSITIVE; @Override public void init(Resource connection, Map<String, Object> config) throws BaleenException { caseSensitive = false; if (config.containsKey(CONFIG_CASE_SENSITIVE) && "true".equalsIgnoreCase(config.get(CONFIG_CASE_SENSITIVE).toString())) { caseSensitive = true; } reloadValues(); } @Override public String[] getValues() { return valueToId.keySet().toArray(new String[0]); } @Override public boolean hasValue(String key) { return valueToId.containsKey(caseSensitive ? key : key.toLowerCase()); } @Override public String[] getAliases(String key) { String val = caseSensitive ? key : key.toLowerCase(); T id = valueToId.get(val); return idToValues.get(id).stream().filter(s -> !s.equals(val)).toArray(size -> new String[size]); } @Override public Map<String, Object> getAdditionalData(String key) { return Collections.emptyMap(); } @Override public void destroy() { idToValues = null; valueToId = null; } protected void reset(){ valueToId.clear(); idToValues.clear(); } protected void addTerm(T id, String value){ String val = value; if(!caseSensitive){ val = value.toLowerCase(); } valueToId.put(val, id); idToValues.put(id, val); } protected T getId(String value){ return valueToId.get(caseSensitive ? value : value.toLowerCase()); } }