All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.javers.core.metamodel.scanner.AnnotationNamesProvider Maven / Gradle / Ivy

There is a newer version: 7.6.1
Show newest version
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 entityAliases = new HashSet<>();
    private final Set typeNameAliases = new HashSet<>();
    private final Set valueObjectAliases = new HashSet<>();
    private final Set valueAliases = new HashSet<>();
    private final Set transientPropertyAliases = new HashSet<>();
    private final Set propertyNameAliases = new HashSet<>();

    private final List 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> annTypes) {
        return annTypes.stream().anyMatch(annType -> entityAliases.contains(annType.getSimpleName()));
    }

    boolean hasValueObjectAnnAlias(Set> annTypes) {
        return annTypes.stream().anyMatch(annType -> valueObjectAliases.contains(annType.getSimpleName()));
    }

    boolean hasValueAnnAlias(Set> annTypes){
        return annTypes.stream().anyMatch(annType -> valueAliases.contains(annType.getSimpleName()));
    }

    boolean hasTransientPropertyAnn(Set> annTypes){
        return annTypes.contains(JaversAnnotationsNameSpace.DIFF_IGNORE_ANN) ||
               annTypes.stream().anyMatch(annType -> transientPropertyAliases.contains(annType.getSimpleName()));
    }

    boolean hasShallowReferenceAnn(Set> annTypes) {
        return annTypes.contains(JaversAnnotationsNameSpace.SHALLOW_REFERENCE_ANN);
    }

    Optional findTypeNameAnnValue(Set annotations) {
        return getAnnotationValue(annotations, JaversAnnotationsNameSpace.TYPE_NAME_ANN, typeNameAliases);
    }

    Optional findPropertyNameAnnValue(Set annotations) {
        return getAnnotationValue(annotations, JaversAnnotationsNameSpace.PROPERTY_NAME_ANN, propertyNameAliases);
    }

    private Optional getAnnotationValue(Set annotations, Class javersAnnType, Set aliases) {
        Optional annotation = findAnnotation(annotations, javersAnnType, aliases);
        return annotation.map(ann -> ReflectionUtil.getAnnotationValue(ann, "value"));
    }

    private Optional findAnnotation(Set annotations, Class javersAnnType, Set aliases) {
        Optional 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();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy