package org.javers.core.metamodel.scanner; import org.javers.common.collections.Lists; import org.javers.common.reflection.ReflectionUtil; import java.lang.annotation.Annotation; import java.util.*; /** * @author bartosz walacik */ class AnnotationNamesProvider { private final Set<String> entityAliases = new HashSet<>(); private final Set<String> typeNameAliases = new HashSet<>(); private final Set<String> valueObjectAliases = new HashSet<>(); private final Set<String> valueAliases = new HashSet<>(); private final Set<String> transientPropertyAliases = new HashSet<>(); private final Set<String> propertyNameAliases = new HashSet<>(); private final List<AnnotationsNameSpace> namesProviders = Lists.immutableListOf( new JPAAnnotationsNameSpace()); AnnotationNamesProvider() { for (AnnotationsNameSpace provider : namesProviders){ entityAliases.addAll(provider.getEntityAliases()); valueObjectAliases.addAll(provider.getValueObjectAliases()); valueAliases.addAll(provider.getValueAliases()); transientPropertyAliases.addAll(provider.getTransientPropertyAliases()); typeNameAliases.addAll(provider.getTypeNameAliases()); propertyNameAliases.addAll(provider.getPropertyNameAliases()); } } boolean hasEntityAnnAlias(Set<Class<? extends Annotation>> annTypes) { return annTypes.stream().anyMatch(annType -> entityAliases.contains(annType.getSimpleName())); } boolean hasValueObjectAnnAlias(Set<Class<? extends Annotation>> annTypes) { return annTypes.stream().anyMatch(annType -> valueObjectAliases.contains(annType.getSimpleName())); } boolean hasValueAnnAlias(Set<Class<? extends Annotation>> annTypes){ return annTypes.stream().anyMatch(annType -> valueAliases.contains(annType.getSimpleName())); } boolean hasTransientPropertyAnn(Set<Class<? extends Annotation>> annTypes){ return annTypes.contains(JaversAnnotationsNameSpace.DIFF_IGNORE_ANN) || annTypes.stream().anyMatch(annType -> transientPropertyAliases.contains(annType.getSimpleName())); } boolean hasShallowReferenceAnn(Set<Class<? extends Annotation>> annTypes) { return annTypes.contains(JaversAnnotationsNameSpace.SHALLOW_REFERENCE_ANN); } Optional<String> findTypeNameAnnValue(Set<Annotation> annotations) { return getAnnotationValue(annotations, JaversAnnotationsNameSpace.TYPE_NAME_ANN, typeNameAliases); } Optional<String> findPropertyNameAnnValue(Set<Annotation> annotations) { return getAnnotationValue(annotations, JaversAnnotationsNameSpace.PROPERTY_NAME_ANN, propertyNameAliases); } private Optional<String> getAnnotationValue(Set<Annotation> annotations, Class<? extends Annotation> javersAnnType, Set<String> aliases) { Optional<Annotation> annotation = findAnnotation(annotations, javersAnnType, aliases); return annotation.map(ann -> ReflectionUtil.getAnnotationValue(ann, "value")); } private Optional<Annotation> findAnnotation(Set<Annotation> annotations, Class<? extends Annotation> javersAnnType, Set<String> aliases) { Optional<Annotation> jTypeName = annotations.stream() .filter(ann -> javersAnnType.isAssignableFrom(ann.getClass())) .findAny(); if (jTypeName.isPresent()) { return jTypeName; } return annotations.stream() .filter(ann -> aliases.contains(ann.annotationType().getSimpleName())) .findFirst(); } }