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

xyz.morphia.ext.entityscanner.EntityScanner Maven / Gradle / Ivy

The newest version!
package xyz.morphia.ext.entityscanner;

import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import xyz.morphia.Morphia;
import xyz.morphia.annotations.Entity;
import xyz.morphia.utils.Assert;
import org.reflections.Reflections;
import org.reflections.scanners.SubTypesScanner;
import org.reflections.scanners.TypeAnnotationsScanner;
import org.reflections.scanners.TypeElementsScanner;
import org.reflections.util.ClasspathHelper;
import org.reflections.util.ConfigurationBuilder;

import java.net.URL;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * Provides a scanner to find entities according to a given predicate
 *
 * @author [email protected]
 */
public class EntityScanner {

    /**
     * Creates an EntityScanner using the given Morphia instance with no predicate defined.
     *
     * @param m the Morphia instance
     */
    public EntityScanner(final Morphia m) {
        this(m, null);
    }

    /**
     * Creates an EntityScanner using the given Morphia instance with the given predicate.
     *
     * @param m         the Morphia instance
     * @param predicate the Predicate to use when determining which classes to map.
     */
    public EntityScanner(final Morphia m, final Predicate predicate) {
        Predicate localPredicate = predicate;
        if (localPredicate == null) {
            localPredicate = Predicates.alwaysTrue();
        }
        Assert.parametersNotNull("m, predicate", m, localPredicate);
        final ConfigurationBuilder conf = new ConfigurationBuilder();
        conf.setScanners(new TypeElementsScanner(), new TypeAnnotationsScanner());

        final Set s = new HashSet();
        s.addAll(ClasspathHelper.forClassLoader());
        s.addAll(ClasspathHelper.forJavaClassPath());
        final Iterator iterator = s.iterator();
        while (iterator.hasNext()) {
            final URL url = iterator.next();
            if (url.getPath().endsWith("jnilib")) {
                iterator.remove();
            }
        }
        conf.setUrls(new ArrayList(s));

        conf.filterInputsBy(localPredicate);
        conf.addScanners(new SubTypesScanner());

        final Reflections r = new Reflections(conf);

        final Set> entities = r.getTypesAnnotatedWith(Entity.class);
        for (final Class c : entities) {
            m.map(c);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy