private boolean verifyNoDisallowed(
final ApiSurface checkedApiSurface,
final Set<Matcher<Class<?>>> allowedClasses,
final Description mismatchDescription) {
final Function<Class<?>, List<Class<?>>> toExposure = checkedApiSurface::getAnyExposurePath;
final Maps.EntryTransformer<Class<?>, List<Class<?>>, String> toMessage =
(aClass, exposure) ->
aClass + " exposed via:\n\t\t" + Joiner.on("\n\t\t").join(exposure);
final Predicate<Class<?>> disallowed = aClass -> !classIsAllowed(aClass, allowedClasses);
final FluentIterable<Class<?>> disallowedClasses =
FluentIterable.from(checkedApiSurface.getExposedClasses()).filter(disallowed);
final ImmutableMap<Class<?>, List<Class<?>>> exposures =
Maps.toMap(disallowedClasses, toExposure);
final ImmutableList<String> messages =
FluentIterable.from(Maps.transformEntries(exposures, toMessage).values())
.toSortedList(Ordering.natural());
if (!messages.isEmpty()) {
mismatchDescription.appendText(
"The following disallowed classes appeared on the API surface:\n\t"
+ Joiner.on("\n\t").join(messages));
}
return messages.isEmpty();
}