package betsy.common.repositories;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.log4j.Logger;
public class Repository<T> {
private static final Logger log = Logger.getLogger(Repository.class);
private final Map<String, List<T>> repository = new LinkedHashMap<>();
public void put(String key, List<T> values) {
if (key == null) {
throw new IllegalArgumentException("cannot add null into repository for values " + values);
}
repository.put(key, values);
}
public List<T> getByName(final String name) {
String trimmedName = name.trim();
final String key = repository.keySet().stream().filter(t -> t.equalsIgnoreCase(trimmedName)).findFirst().orElse(trimmedName);
if (!repository.containsKey(key)) {
throw new IllegalArgumentException("Name '" + key + "' does not exist in repository.");
}
List<T> result = new ArrayList<>();
result.addAll(repository.get(key));
return result;
}
public List<T> getByNames(final String... names) {
List<T> result = new ArrayList<>();
for (String name : names) {
result.addAll(getByName(name));
}
// only distinct values
result = result.stream().distinct().collect(Collectors.toList());
if (result.isEmpty()) {
throw new IllegalArgumentException("Names " + String.join(",", names) + " do not exist in repository.");
}
return result;
}
public List<String> getGroups() {
return repository.entrySet().stream().filter(e -> e.getValue().size() > 1).map(Map.Entry::getKey).collect(Collectors.toList());
}
public List<String> getNames() {
return new ArrayList<>(repository.keySet());
}
}