package com.aggrepoint.utils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
public class SelectOptionUtils {
public static class OptionGroup {
private Object key;
private String label;
private ArrayList<Option> options;
public OptionGroup(Object key, String label) {
this.key = key;
this.label = label;
options = new ArrayList<Option>();
}
public OptionGroup(String label) {
this(null, label);
}
public String getLabel() {
return label;
}
public Object getKey() {
return key;
}
public List<Option> getOptions() {
return options;
}
public Option add(Option option) {
options.add(option);
return option;
}
}
public static class Option {
private String value;
private String label;
public Option(String value, String label) {
this.value = value;
this.label = label;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
}
public static <T, K> List<OptionGroup> build(Collection<T> groups,
Collection<K> options, Function<T, ?> groupKeyMapper,
Function<T, String> groupLabelMapper,
Function<K, ?> optionGroupKeyMapper,
Function<K, String> optionValueMapper,
Function<K, String> optionLabelMapper) {
List<OptionGroup> all = groups
.stream()
.map(p -> new OptionGroup(groupKeyMapper.apply(p),
groupLabelMapper.apply(p)))
.collect(Collectors.toList());
HashMap<Object, OptionGroup> map = CollectionUtils.toHashMap(all,
OptionGroup::getKey);
options.stream().forEach(
p -> {
OptionGroup group = map.get(optionGroupKeyMapper.apply(p));
if (group != null)
group.add(new Option(optionValueMapper.apply(p),
optionLabelMapper.apply(p)));
});
return all;
}
public static <T> List<Option> build(List<T> list,
Function<T, Object> keyFunc, Function<T, Object> valueFunc) {
return list
.stream()
.map(p -> {
Object key = keyFunc.apply(p);
Object value = valueFunc.apply(p);
return new Option(key == null ? "" : key.toString(),
value == null ? "" : value.toString());
}).collect(Collectors.toList());
}
public static String getLabel(List<Option> list, String value) {
if (list == null || value == null)
return null;
for (Option option : list)
if (value.equals(option.value))
return option.label;
return null;
}
}