package sk.stuba.fiit.perconik.utilities.reflect.resolver; import java.util.List; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.collect.Lists.newLinkedList; import static sk.stuba.fiit.perconik.utilities.MoreThrowables.initializeSuppressor; final class CompositeClassResolver implements ClassResolver { private final List<ClassResolver> resolvers; CompositeClassResolver(final Iterable<ClassResolver> resolvers) { this.resolvers = ImmutableList.copyOf(resolvers); checkArgument(!this.resolvers.isEmpty()); } public Class<?> forName(final String name) throws ClassNotFoundException { List<Throwable> suppressions = newLinkedList(); for (ClassResolver resolver: this.resolvers) { try { return resolver.forName(name); } catch (Exception e) { suppressions.add(e); } } ClassNotFoundException failure = new ClassNotFoundException(name + " not found"); throw initializeSuppressor(failure, Lists.reverse(suppressions)); } @Override public String toString() { StringBuilder builder = new StringBuilder("CompositeClassResolver("); Joiner.on(",").appendTo(builder, this.resolvers); return builder.append(")").toString(); } }