AdaptorManager.java

/*
 * @copyright defined in LICENSE.txt
 */

package hera.custom;

import hera.Custom;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.ServiceLoader;
import java.util.Set;
import lombok.Getter;

public class AdaptorManager {

  @Getter
  protected static final AdaptorManager instance = new AdaptorManager();

  protected Set<Adaptee<?>> initialized = new HashSet<Adaptee<?>>();

  /**
   * Get and return registered adaptees for {@code candidateClass}.
   *
   * @param <AdapteeT> adaptee type
   * @param candidateClass adaptee type class
   *
   * @return adaptees
   */
  @SuppressWarnings("unchecked")
  public <AdapteeT> List<? extends AdapteeT> getAdaptors(Class<AdapteeT> candidateClass) {
    final ServiceLoader<Custom> serviceLoader = ServiceLoader.load(Custom.class);
    final List<AdapteeT> list = new ArrayList<AdapteeT>();
    for (final Custom custom : serviceLoader) {
      if (candidateClass.isInstance(custom)) {
        list.add((AdapteeT) custom);
      }
    }

    for (final AdapteeT adaptee : list) {
      if (adaptee instanceof Adaptee<?>) {
        final Adaptee<?> custom = ((Adaptee<?>) adaptee);
        if (!initialized.contains(custom)) {
          custom.initialize(this);
          initialized.add(custom);
        }
      }
    }

    return list;
  }
}