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

org.rapidpm.ddi.reflections.ReflectionsModel Maven / Gradle / Ivy

There is a newer version: 1.1.1
Show newest version
package org.rapidpm.ddi.reflections;

import org.reflections.Reflections;
import org.reflections.scanners.MethodAnnotationsScanner;
import org.reflections.scanners.Scanner;
import org.reflections.scanners.SubTypesScanner;
import org.reflections.scanners.TypeAnnotationsScanner;
import org.reflections.util.ClasspathHelper;
import org.reflections.util.ConfigurationBuilder;
import org.reflections.util.FilterBuilder;

import java.lang.annotation.Annotation;
import java.net.URL;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Created by svenruppert on 14.07.15.
 */
public class ReflectionsModel {


  //TODO refactoring to pessimistic write / concurrent read

  private boolean parallelExecutors = false;
  private Map activatedPackagesMap = new ConcurrentHashMap<>();

  private Reflections reflections = new Reflections(
      createConfigurationBuilder()
          .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix("org.rapidpm")))
          .setScanners(createScanners())
  );

  private Object obj = new Object();

  public ReflectionsModel() {
  }


  public void setParallelExecutors(final boolean parallelExecutors) {
    this.parallelExecutors = parallelExecutors;
  }

  public void rescann() {
    synchronized (obj) {
      reflections.merge(new Reflections(createConfigurationBuilder()
          .setScanners(createScanners())));
    }
  }

  private ConfigurationBuilder createConfigurationBuilder() {
    final ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
    configurationBuilder.setUrls(ClasspathHelper.forJavaClassPath());
    if (parallelExecutors) return configurationBuilder.useParallelExecutor();
    else return configurationBuilder;
  }

  private Scanner[] createScanners() {
    Scanner[] sccannerArray = new Scanner[3];
    sccannerArray[0] = new SubTypesScanner();
    sccannerArray[1] = new TypeAnnotationsScanner();
    sccannerArray[2] = new MethodAnnotationsScanner();
    return sccannerArray;
  }

  public void rescann(URL... urls) {
    synchronized (obj) {
      reflections.merge(new Reflections(createConfigurationBuilder()
          .setUrls(urls)
          .setScanners(createScanners())));
      activatedPackagesMap.put("", LocalDateTime.now());
    }
  }

  public void rescann(Collection urls) {
    synchronized (obj) {
      reflections.merge(new Reflections(createConfigurationBuilder()
          .setUrls(urls)
          .setScanners(createScanners())));
      activatedPackagesMap.put("", LocalDateTime.now());
    }
  }

  public void rescann(String pkgPrefix) {
    synchronized (obj) {
      reflections.merge(new Reflections(createConfigurationBuilder()
          .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix(pkgPrefix)))
          .setScanners(createScanners())));
      activatedPackagesMap.put(pkgPrefix, LocalDateTime.now());
    }
  }

  public void rescann(String pkgPrefix, URL... urls) {
    synchronized (obj) {
      reflections.merge(new Reflections(createConfigurationBuilder()
          .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix(pkgPrefix)))
          .setUrls(urls)
          .setScanners(createScanners())));
      activatedPackagesMap.put(pkgPrefix, LocalDateTime.now());
    }
  }

  public void rescann(String pkgPrefix, Collection urls) {
    synchronized (obj) {
      reflections.merge(new Reflections(createConfigurationBuilder()
          .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix(pkgPrefix)))
          .setUrls(urls)
          .setScanners(createScanners())));
      activatedPackagesMap.put(pkgPrefix, LocalDateTime.now());
    }
  }


  public boolean isPkgPrefixActivated(String pkgPrefix) {
    return activatedPackagesMap.containsKey(pkgPrefix);
  }

  public LocalDateTime getPkgPrefixActivatedTimestamp(String pkgPrefix) {
    return activatedPackagesMap.getOrDefault(pkgPrefix, LocalDateTime.MIN);
  }


  //delegated methods
//must be synchronized

  public  Set> getSubTypesOf(final Class type) {
    return reflections.getSubTypesOf(type);
  }

  public Set> getTypesAnnotatedWith(final Class annotation) {
    return reflections.getTypesAnnotatedWith(annotation);
  }

  public Set> getTypesAnnotatedWith(final Class annotation, final boolean honorInherited) {
    return reflections.getTypesAnnotatedWith(annotation, honorInherited);
  }

  public Set> getTypesAnnotatedWith(final Annotation annotation) {
    return reflections.getTypesAnnotatedWith(annotation);
  }

  public Set> getTypesAnnotatedWith(final Annotation annotation, final boolean honorInherited) {
    return reflections.getTypesAnnotatedWith(annotation, honorInherited);
  }
}





© 2015 - 2024 Weber Informatics LLC | Privacy Policy