package org.javersion.object.mapping;
import static com.google.common.base.Strings.isNullOrEmpty;
import static java.util.Arrays.asList;
import static java.util.stream.Collectors.toMap;
import java.util.Map;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.javersion.object.VersionCreator;
import org.javersion.object.VersionValue;
import org.javersion.object.Versionable;
import org.javersion.object.Versionable.Subclass;
import org.javersion.reflect.*;
public class JaversionMappingResolver implements MappingResolver {
@Nullable
@Override
public Result<MethodDescriptor> delegateValue(MethodDescriptor method) {
if (method.hasAnnotation(VersionValue.class)) {
return Result.of(method);
}
return Result.notFound();
}
@Nullable
@Override
public <T extends StaticExecutable & ElementDescriptor> Result<StaticExecutable> creator(T methodOrConstructor) {
if (methodOrConstructor.hasAnnotation(VersionCreator.class)) {
return Result.of(methodOrConstructor);
}
return Result.notFound();
}
@Nullable
@Override
public Result<String> alias(TypeDescriptor type) {
Versionable versionable = type.getAnnotation(Versionable.class);
if (versionable != null && !isNullOrEmpty(versionable.alias())) {
return Result.of(versionable.alias());
}
return Result.notFound();
}
@Nullable
@Override
public Result<Map<TypeDescriptor, String>> subclasses(TypeDescriptor type) {
Versionable versionable = type.getAnnotation(Versionable.class);
if (versionable != null && versionable.subclasses().length > 0) {
TypeDescriptors typeDescriptors = type.getTypeDescriptors();
Map<TypeDescriptor, String> aliasesByTypes = asList(versionable.subclasses()).stream()
.collect(toMap(subclass -> typeDescriptors.get(subclass.value()), Subclass::alias));
return Result.of(aliasesByTypes);
}
return Result.notFound();
}
@Nonnull
@Override
public Result<String> name(ParameterDescriptor parameter) {
Param param = parameter.getAnnotation(Param.class);
if (param != null) {
return Result.of(param.value());
}
return Result.notFound();
}
}