package org.gcube.informationsystem.utils.documentation.generator; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.ServiceLoader; import org.gcube.informationsystem.base.reference.AccessType; import org.gcube.informationsystem.base.reference.Element; import org.gcube.informationsystem.types.TypeMapper; import org.gcube.informationsystem.types.reference.Type; import org.gcube.informationsystem.utils.discovery.ElementSpecilizationDiscovery; import org.gcube.informationsystem.utils.discovery.RegistrationProvider; /** * @author Luca Frosini (ISTI - CNR) */ public class ClassesDiscoveryGenerator extends Generator { protected TreeGenerator treeGenerator; public ClassesDiscoveryGenerator() { } public List getPackages(){ List packages = new ArrayList(); AccessType[] accessTypes = new AccessType[] { AccessType.PROPERTY, AccessType.ENTITY, AccessType.RELATION }; for(AccessType accessType : accessTypes) { Class clz = accessType.getTypeClass(); packages.add(clz.getPackage()); } return packages; } public List getExtensionsPackages(){ List packages = new ArrayList(); ServiceLoader regsitrationProviders = ServiceLoader .load(RegistrationProvider.class); for(RegistrationProvider registrationProvider : regsitrationProviders) { packages.addAll(registrationProvider.getPackagesToRegister()); } return packages; } public void generate() throws Exception { List packages = getPackages(); packages.addAll(getExtensionsPackages()); generate(packages); } protected void discover(AccessType at, List packages) throws Exception { ElementSpecilizationDiscovery discovery = new ElementSpecilizationDiscovery<>(at.getTypeClass(), false); if(Objects.nonNull(packages)) { for(Package p : packages) { discovery.addPackage(p); } } discovery.discover(); for(Class clz : discovery.getDiscovered()) { Type type = TypeMapper.createTypeDefinition(clz); treeGenerator.addType(type); } } public void generate(List packages) throws Exception { treeGenerator = new TreeGenerator(); AccessType[] types = new AccessType[] { AccessType.PROPERTY, AccessType.RESOURCE, AccessType.FACET, AccessType.CONSISTS_OF, AccessType.IS_RELATED_TO}; for(AccessType at : types) { discover(at, packages); } treeGenerator.generate(); } }