Skip to content

Commit

Permalink
[backend] use spring class path scanning to get classes' subtypes
Browse files Browse the repository at this point in the history
  • Loading branch information
isselparra committed Oct 4, 2024
1 parent 3d923fa commit 247c7bd
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 13 deletions.
5 changes: 0 additions & 5 deletions openbas-framework/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,6 @@
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.10.2</version> <!-- Check for the latest version -->
</dependency>
<!-- TEST -->
<dependency>
<groupId>org.springframework.boot</groupId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package io.openbas.utils;

import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.core.type.filter.AssignableTypeFilter;

import java.util.Set;
import java.util.stream.Collectors;

public class SubclassScanner {
public static Set<Class<?>> getSubclasses(String basePackage, Class<?> clazz) {
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
provider.addIncludeFilter(new AssignableTypeFilter(clazz));
return provider.findCandidateComponents(basePackage).stream()
.map(beanDefinition -> {
try {
return Class.forName(beanDefinition.getBeanClassName());
} catch (ClassNotFoundException e) {
return null;
}
})
.collect(Collectors.toSet());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

import com.fasterxml.jackson.annotation.JsonProperty;
import io.openbas.annotation.Queryable;
import io.openbas.utils.SubclassScanner;
import jakarta.persistence.Column;
import jakarta.persistence.JoinTable;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import org.reflections.Reflections;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
Expand All @@ -18,7 +18,6 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

import static org.reflections.scanners.Scanners.SubTypes;
import static org.springframework.util.StringUtils.hasText;

public class SchemaUtils {
Expand All @@ -33,18 +32,19 @@ private SchemaUtils() {
Email.class
);

private static final String BASE_CLASS_PACKAGE = "io.openbas.database.model";

private static final ConcurrentHashMap<Class<?>, List<PropertySchema>> cacheMap = new ConcurrentHashMap<>();

// -- SCHEMA --
public static List<PropertySchema> schemaWithSubtypes(@NotNull Class<?> clazz) throws ClassNotFoundException {
Reflections reflections = new Reflections("io.openbas.database.model");
Set<Class<?>> subTypes = reflections.get(SubTypes.of(clazz).asClass());

List<List<PropertySchema>> propertySchemasAll = new ArrayList<>();
propertySchemasAll.add(schema(clazz));
for (Class<?> subType : subTypes) {
propertySchemasAll.add(schema(subType));
}
propertySchemasAll
.addAll(SubclassScanner.getSubclasses(BASE_CLASS_PACKAGE, clazz)
.stream()
.map(SchemaUtils::schema)
.toList());

return propertySchemasAll.stream().flatMap(List::stream)
.collect(Collectors.toMap(
Expand Down

0 comments on commit 247c7bd

Please sign in to comment.