package org.javersion.object.mapping;
import java.util.List;
import java.util.Map;
import javax.annotation.Nonnull;
import org.javersion.reflect.ElementDescriptor;
import org.javersion.reflect.MethodDescriptor;
import org.javersion.reflect.ParameterDescriptor;
import org.javersion.reflect.StaticExecutable;
import org.javersion.reflect.TypeDescriptor;
import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
public class CompositeMappingResolver implements MappingResolver {
private final List<MappingResolver> resolvers;
public CompositeMappingResolver(MappingResolver... resolvers) {
this(ImmutableList.copyOf(resolvers));
}
public CompositeMappingResolver(List<MappingResolver> resolvers) {
this.resolvers = ImmutableList.copyOf(resolvers);
}
@Nonnull
@Override
public Result<MethodDescriptor> delegateValue(MethodDescriptor method) {
return find(resolver -> resolver.delegateValue(method));
}
@Nonnull
@Override
public <T extends StaticExecutable & ElementDescriptor> Result<StaticExecutable> creator(T methodOrConstructor) {
return find(resolver -> resolver.creator(methodOrConstructor));
}
@Nonnull
@Override
public Result<String> alias(TypeDescriptor type) {
return find(resolver -> resolver.alias(type));
}
@Nonnull
@Override
public Result<Map<TypeDescriptor, String>> subclasses(TypeDescriptor type) {
return find(resolver -> resolver.subclasses(type));
}
@Nonnull
@Override
public Result<String> name(ParameterDescriptor parameter) {
return find(resolver -> resolver.name(parameter));
}
<T, P> Result<T> find(Function<MappingResolver, Result<T>> function) {
for (int i=0; i < resolvers.size(); i++) {
Result<T> result = function.apply(resolvers.get(i));
if (result != null && result.isPreset()) {
return result.withPriority(i);
}
}
return Result.notFound();
}
}