All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.katharsis.resource.registry.DefaultResourceLookup Maven / Gradle / Ivy

The newest version!
package io.katharsis.resource.registry;

import java.lang.reflect.Modifier;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.reflections.Reflections;

import io.katharsis.legacy.repository.RelationshipRepository;
import io.katharsis.legacy.repository.ResourceRepository;
import io.katharsis.legacy.repository.annotations.JsonApiRelationshipRepository;
import io.katharsis.legacy.repository.annotations.JsonApiResourceRepository;
import io.katharsis.repository.BulkRelationshipRepositoryV2;
import io.katharsis.repository.RelationshipRepositoryBase;
import io.katharsis.repository.RelationshipRepositoryV2;
import io.katharsis.repository.ResourceRepositoryBase;
import io.katharsis.repository.ResourceRepositoryV2;
import io.katharsis.resource.annotations.JsonApiResource;

/**
 * Scans all classes in provided package and finds all resources and repositories associated with found resource.
 */
public class DefaultResourceLookup implements ResourceLookup {

	private Reflections reflections;

	public DefaultResourceLookup(String packageName) {
		if (packageName != null) {
			String[] packageNamesArray = packageName.split(",");
			reflections = new Reflections((Object[]) packageNamesArray);
		}
		else {
			reflections = new Reflections(packageName);
		}
	}

	@Override
	public Set> getResourceClasses() {
		return reflections.getTypesAnnotatedWith(JsonApiResource.class);
	}

	@SuppressWarnings("rawtypes")
	@Override
	public Set> getResourceRepositoryClasses() {
		Set> annotatedResourceRepositories = reflections.getTypesAnnotatedWith(JsonApiResourceRepository.class);
		Set> annotatedRelationshipRepositories = reflections.getTypesAnnotatedWith(JsonApiRelationshipRepository.class);
		Set> resourceRepositories = reflections.getSubTypesOf(ResourceRepository.class);
		Set> relationshipRepositories = reflections
				.getSubTypesOf(RelationshipRepository.class);
		Set> querySpecResourceRepositories = reflections
				.getSubTypesOf(ResourceRepositoryV2.class);
		Set> querySpecRelationshipRepositories = reflections
				.getSubTypesOf(RelationshipRepositoryV2.class);

		Set> result = new HashSet<>();
		result.addAll(annotatedResourceRepositories);
		result.addAll(annotatedRelationshipRepositories);
		result.addAll(resourceRepositories);
		result.addAll(relationshipRepositories);
		result.addAll(querySpecResourceRepositories);
		result.addAll(querySpecRelationshipRepositories);
		result.addAll(reflections.getSubTypesOf(BulkRelationshipRepositoryV2.class));
		result.addAll(reflections.getSubTypesOf(ResourceRepositoryBase.class));
		result.addAll(reflections.getSubTypesOf(RelationshipRepositoryBase.class));
		result.addAll(reflections.getSubTypesOf(RelationshipRepositoryBase.class));
		result.addAll(reflections.getSubTypesOf(ResourceRepositoryBase.class));
		
		// exclude interfaces an abstract base classes
		Iterator> iterator = result.iterator();
		while(iterator.hasNext()){
			Class repoClass = iterator.next();
			if(repoClass.isInterface() || Modifier.isAbstract(repoClass.getModifiers())){
				iterator.remove();
			}
		}
		
		return result;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy