package org.gcube.informationsystem.utils.documentation.generator; import java.util.ArrayList; import java.util.Arrays; 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() { } protected 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()); } ServiceLoader regsitrationProviders = ServiceLoader .load(RegistrationProvider.class); for(RegistrationProvider registrationProvider : regsitrationProviders) { packages.addAll(registrationProvider.getPackagesToRegister()); } return packages; } public void generate() throws Exception { List pkgs = getPackages(); generate(pkgs.toArray(new Package[pkgs.size()])); } protected void discover(AccessType at, Package[] packages) throws Exception { /* * I need to get all types also the types defined in IS Model * to properly support the specilizations if any */ ElementSpecilizationDiscovery discovery = new ElementSpecilizationDiscovery<>(at.getTypeClass(), true); if(Objects.nonNull(packages)) { Arrays.stream(packages).forEach(p -> discovery.addPackage(p)); } discovery.discover(); for(Class clz : discovery.getDiscovered()) { Type type = TypeMapper.createTypeDefinition(clz); treeGenerator.addType(type); } } protected void generate(Package[] 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(); } }