private static List<OptionMetadata> mergeOptionSet(List<OptionMetadata> options)
{
ListMultimap<OptionMetadata, OptionMetadata> metadataIndex = ArrayListMultimap.create();
for (OptionMetadata option : options) {
metadataIndex.put(option, option);
}
options = ImmutableList.copyOf(transform(metadataIndex.asMap().values(), new Function<Collection<OptionMetadata>, OptionMetadata>()
{
@Override
public OptionMetadata apply(@Nullable Collection<OptionMetadata> options)
{
return new OptionMetadata(options);
}
}));
Map<String, OptionMetadata> optionIndex = newHashMap();
for (OptionMetadata option : options) {
for (String optionName : option.getOptions()) {
if (optionIndex.containsKey(optionName)) {
throw new IllegalArgumentException(String.format("Fields %s and %s have conflicting definitions of option %s",
optionIndex.get(optionName).getAccessors().iterator().next(),
option.getAccessors().iterator().next(),
optionName));
}
optionIndex.put(optionName, option);
}
}
return options;
}