CMSgov/dpc-app

View on GitHub
dpc-common/src/main/java/gov/cms/dpc/common/hibernate/EntityScanner.java

Summary

Maintainability
A
0 mins
Test Coverage
package gov.cms.dpc.common.hibernate;

import com.google.common.collect.ImmutableList;
import org.reflections.Reflections;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.persistence.Entity;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * Helper class for scanning a given class path and returning an {@link ImmutableList} of {@link Entity} annotated classes.
 */
public class EntityScanner {

    private static final Logger logger = LoggerFactory.getLogger(EntityScanner.class);

    private EntityScanner() {
        // Not used
    }


    /**
     * Add additional paths to a single prefix, and then call {@link EntityScanner#applicationEntities(List)}
     *
     * @param prefix          - {@link String} default prefix
     * @param additionalPaths - {@link List} of {@link String} additional package prefixes to scan
     * @return - {@link ImmutableList} of {@link Class}
     */
    public static ImmutableList<Class<?>> applicationEntities(String prefix, List<String> additionalPaths) {
        final ArrayList<String> paths = new ArrayList<>(additionalPaths);
        paths.add(prefix);
        return applicationEntities(paths);
    }

    /**
     * Scan the given {@link List} of package prefixes for any {@link Entity} annoted classes
     *
     * @param paths - {@link String} class package to class
     * @return - {@link ImmutableList} of annotated {@link Class}es
     */
    public static ImmutableList<Class<?>> applicationEntities(List<String> paths) {

        final List<Class<?>> collect = paths
                .stream()
                .map(path -> {
                    logger.info("Scanning {} for Hibernate entities", path);
                    final Reflections reflections = new Reflections(path);
                    final Set<Class<?>> entities = reflections.getTypesAnnotatedWith(Entity.class);
                    logger.info("Found {} Hibernate entities", entities.getClass());
                    if (logger.isDebugEnabled()) {
                        entities.forEach((entity) -> logger.debug("Registered {}.", entity.getName()));
                    }
                    return entities;
                })
                .flatMap(Collection::stream)
                .collect(Collectors.toList());

        return ImmutableList.copyOf(collect);
    }
}