package io.katharsis.resource.registry;
import io.katharsis.repository.RelationshipRepository;
import io.katharsis.repository.ResourceRepository;
import io.katharsis.repository.annotations.JsonApiRelationshipRepository;
import io.katharsis.repository.annotations.JsonApiResourceRepository;
import io.katharsis.resource.annotations.JsonApiResource;
import org.reflections.Reflections;
import java.util.HashSet;
import java.util.Set;
/**
* Scans all classes in provided package and finds all resources and repositories associated with found resource.
*/
public class DefaultResourceLookup implements ResourceLookup {
private String packageName;
private Reflections reflections;
public DefaultResourceLookup(String packageName) {
this.packageName = packageName;
if (packageName != null) {
String[] packageNames = packageName.split(",");
reflections = new Reflections(packageNames);
} else {
reflections = new Reflections(packageName);
}
}
@Override
public Set<Class<?>> getResourceClasses() {
return reflections.getTypesAnnotatedWith(JsonApiResource.class);
}
@Override
public Set<Class<?>> getResourceRepositoryClasses() {
Set<Class<?>> annotatedResourceRepositories = reflections.getTypesAnnotatedWith(JsonApiResourceRepository.class);
Set<Class<?>> annotatedRelationshipRepositories = reflections.getTypesAnnotatedWith(JsonApiRelationshipRepository.class);
Set<Class<? extends ResourceRepository>> resourceRepositories = reflections.getSubTypesOf(ResourceRepository.class);
Set<Class<? extends RelationshipRepository>> relationshipRepositories = reflections.getSubTypesOf(RelationshipRepository.class);
Set<Class<?>> result = new HashSet<>();
result.addAll(annotatedResourceRepositories);
result.addAll(annotatedRelationshipRepositories);
result.addAll(resourceRepositories);
result.addAll(relationshipRepositories);
return result;
}
}