Implemented scanning of multiple models packages (#3)

This commit is contained in:
Francesco 2023-10-02 09:16:20 +02:00
parent 52a2939b35
commit 1d66169a43
4 changed files with 57 additions and 41 deletions

View File

@ -23,6 +23,7 @@ import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
@ -70,7 +71,7 @@ public class DbAdmin {
private List<DbObjectSchema> schemas = new ArrayList<>();
private String modelsPackage;
private List<String> modelsPackage;
/**
* Builds the DbAdmin instance by scanning the `@Entity` beans and loading
@ -79,18 +80,21 @@ public class DbAdmin {
* @param properties the configuration properties
*/
public DbAdmin(@Autowired EntityManager entityManager, @Autowired DbAdminProperties properties) {
this.modelsPackage = properties.getModelsPackage();
this.modelsPackage = Arrays.stream(properties.getModelsPackage().split(",")).map(String::trim).toList();
this.entityManager = entityManager;
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
provider.addIncludeFilter(new AnnotationTypeFilter(Entity.class));
Set<BeanDefinition> beanDefs = provider.findCandidateComponents(modelsPackage);
for (String currentPackage : modelsPackage) {
Set<BeanDefinition> beanDefs = provider.findCandidateComponents(currentPackage);
for (BeanDefinition bd : beanDefs) {
schemas.add(processBeanDefinition(bd));
}
logger.info("Scanned package '" + currentPackage + "'. Loaded " + beanDefs.size() + " schemas.");
}
logger.info("Spring Boot Database Admin initialized. Loaded " + schemas.size() + " table definitions");
logger.info("Spring Boot Database Admin initialized. Loaded " + schemas.size() + " schemas from " + modelsPackage.size() + " packages");
logger.info("Spring Boot Database Admin web interface at: http://YOUR_HOST:YOUR_PORT/" + properties.getBaseUrl());
}
@ -154,6 +158,7 @@ public class DbAdmin {
CustomJpaRepository simpleJpaRepository = new CustomJpaRepository(schema, entityManager);
schema.setJpaRepository(simpleJpaRepository);
logger.debug("Processing class: " + klass + " - Table: " + schema.getTableName());
Field[] fields = klass.getDeclaredFields();

View File

@ -103,10 +103,13 @@ public class DefaultDbAdminController {
}).collect(Collectors.toList());
}
Map<String, List<DbObjectSchema>> groupedBy =
schemas.stream().collect(Collectors.groupingBy(s -> s.getBasePackage()));
Map<String, Long> counts =
schemas.stream().collect(Collectors.toMap(s -> s.getClassName(), s -> repository.count(s)));
model.addAttribute("schemas", schemas);
model.addAttribute("schemas", groupedBy);
model.addAttribute("query", query);
model.addAttribute("counts", counts);
model.addAttribute("activePage", "entities");

View File

@ -115,6 +115,10 @@ public class DbObjectSchema {
}
}
public String getBasePackage() {
return entityClass.getPackageName();
}
/**
* Returns the DbAdmin instance
* @return the DbAdmin instance

View File

@ -21,6 +21,8 @@
<div class="col">
<div class="box">
<th:block th:each="package : ${schemas.keySet()}">
<h4 class="fw-bold" th:text="${package}"></h4>
<table class="table table-striped mt-4" th:if="${!schemas.isEmpty()}">
<tr>
<th>Table</th>
@ -28,7 +30,7 @@
<th>Java class</th>
<th></th>
</tr>
<tr th:each="schema : ${schemas}">
<tr th:each="schema : ${schemas.get(package)}">
<td>
<a th:text="${schema.getTableName()}"
th:href="|/${baseUrl}/model/${schema.getClassName()}|"></a>
@ -45,6 +47,7 @@
</td>
</tr>
</table>
<div class="p-0 m-0" th:if="${schemas.isEmpty()}">
No entities have been loaded from Java classes.
@ -55,6 +58,7 @@
the <code>@Entity</code> annotation.</li>
</ul>
</div>
</th:block>
</div>
</div>
</div>