
com.heliorm.mojo.annotated.AnnotatedPojoGenerator Maven / Gradle / Ivy
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