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

com.heliorm.mojo.annotated.AnnotatedPojoGenerator Maven / Gradle / Ivy

There is a newer version: 0.99.107
Show newest version
package com.heliorm.mojo.annotated;

import com.heliorm.Database;
import com.heliorm.annotation.Pojo;
import com.heliorm.mojo.GenerateModel;
import com.heliorm.mojo.Generator;
import com.heliorm.mojo.GeneratorException;
import io.github.classgraph.ClassGraph;
import io.github.classgraph.ClassInfo;
import io.github.classgraph.ClassInfoList;
import io.github.classgraph.ScanResult;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @author gideon
 */
public final class AnnotatedPojoGenerator implements Generator {

    private final GenerateModel generator;
    private final ScanResult scan;

    public AnnotatedPojoGenerator(GenerateModel generator, Set packages) throws GeneratorException {
        this.generator = generator;
        scan = new ClassGraph()
                .enableAllInfo()
                .addClassLoader(generator.getLocalClassLoader())
                .addClassLoader(generator.getGlobalClassLoader())
                .whitelistPackages(packages.toArray(new String[]{}))
                .scan();
    }

    @Override
    public Set> getAllPojoClasses() throws GeneratorException {
        try {
            HashSet> res = new HashSet<>();
            ClassInfoList all = scan.getAllClasses().getStandardClasses();
            ClassInfoList anno = scan.getClassesWithAnnotation(Pojo.class.getName());
            for (ClassInfo info : findMissingSubClasses(anno, all)) {
                res.add(generator.getGlobalClassLoader().loadClass(info.getName()));
            }
            return res;
        } catch (ClassNotFoundException ex) {
            throw new GeneratorException(ex.getMessage(), ex);
        }

    }

    @Override
    public AnnotatedPojoTable getPojoModel(Class clazz, Database database, Set subTables) {
        return new AnnotatedPojoTable(database, clazz, subTables);
    }

    /**
     * Find subclasses for Pojo super classes which are not annotated as Pojo.
     *
     * @param annos The list of super class
     * @param all   The list of subclasses
     * @return The list containing the missing classes
     */
    private List findMissingSubClasses(ClassInfoList annos, ClassInfoList all) {
        List res = new ArrayList<>();
        for (ClassInfo info : annos) {
            res.add(info);
            res.addAll(findMissingSubClasses(info, all));
        }
        return res;
    }

    /**
     * Find subclasses off Pojo super class which are not annotated as Pojo.
     *
     * @param superClass         The super class
     * @param possibleSubClasses The list of subclasses
     * @return The list containing the missing classes
     */
    private List findMissingSubClasses(ClassInfo superClass, ClassInfoList possibleSubClasses) {
        List subClasses = new ArrayList<>();
        for (ClassInfo info : possibleSubClasses) {
            if (info.hasAnnotation(Pojo.class.getName())) {
                continue;
            }
            if (info.getSuperclass() == null) {
                continue;
            }
            if (info.getSuperclass().equals(superClass) && !info.hasAnnotation(Pojo.class.getName())) {
                subClasses.add(info);
                subClasses.addAll(findMissingSubClasses(info, possibleSubClasses));
            }
        }
        return subClasses;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy