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

com.tvd12.ezyfox.identifier.EzyIdEncapsulationBuilder Maven / Gradle / Ivy

The newest version!
package com.tvd12.ezyfox.identifier;

import com.tvd12.ezyfox.builder.EzyBuilder;
import com.tvd12.ezyfox.collect.Sets;
import com.tvd12.ezyfox.reflect.EzyReflection;
import com.tvd12.ezyfox.reflect.EzyReflectionProxy;
import com.tvd12.ezyfox.util.EzyHasIdEntity;

import java.lang.annotation.Annotation;
import java.util.HashSet;
import java.util.Set;

@SuppressWarnings({"rawtypes", "unchecked"})
public abstract class EzyIdEncapsulationBuilder<
    T, B extends EzyIdEncapsulationBuilder
    >
    implements EzyBuilder {

    protected final Set entityClasses;
    protected final Set packagesToScan;
    protected final Set> annotationClasses;

    public EzyIdEncapsulationBuilder() {
        this.packagesToScan = new HashSet<>();
        this.entityClasses = new HashSet<>();
        this.annotationClasses = getAnnotationClasses();
    }

    public B scan(String packageName) {
        packagesToScan.add(packageName);
        return (B) this;
    }

    public B scan(String... packageNames) {
        return scan(Sets.newHashSet(packageNames));
    }

    public B scan(Iterable packageNames) {
        for (String packageName : packageNames) {
            this.scan(packageName);
        }
        return (B) this;
    }

    public B addClass(Class clazz) {
        if (isHasIdClass(clazz) || isAnnotatedClass(clazz)) {
            this.entityClasses.add(clazz);
        }
        return (B) this;
    }

    public B addClasses(Class... classes) {
        return addClasses(Sets.newHashSet(classes));
    }

    public B addClasses(Iterable classes) {
        for (Class clazz : classes) {
            this.addClass(clazz);
        }
        return (B) this;
    }

    public B addClasses(EzyReflection reflection) {
        Set> hasIdClasses = reflection
            .getExtendsClasses(EzyHasIdEntity.class);
        Set> annotatedClasses = new HashSet<>(
            reflection.getAnnotatedClasses(annotationClasses)
        );
        this.entityClasses.addAll(hasIdClasses);
        this.entityClasses.addAll(annotatedClasses);
        return (B) this;
    }

    @Override
    public T build() {
        preBuild();
        return newProduct();
    }

    protected abstract T newProduct();

    protected void preBuild() {
        scanAllPackages();
        parseEntityClasses();
    }

    protected abstract void parseEntityClasses();

    protected void scanAllPackages() {
        if (packagesToScan.isEmpty()) {
            return;
        }
        EzyReflection reflection = new EzyReflectionProxy(packagesToScan);
        addClasses(reflection);
    }

    protected boolean isHasIdClass(Class clazz) {
        return EzyHasIdEntity.class.isAssignableFrom(clazz);
    }

    protected boolean isAnnotatedClass(Class clazz) {
        for (Class annClass : annotationClasses) {
            if (clazz.isAnnotationPresent(annClass)) {
                return true;
            }
        }
        return false;
    }

    protected Set> getAnnotationClasses() {
        return new HashSet<>();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy