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

ai.h2o.mojos.runtime.frame.MojoColumnFactoryService Maven / Gradle / Ivy

There is a newer version: 2.8.7.1
Show newest version
package ai.h2o.mojos.runtime.frame;

import java.util.ArrayList;
import java.util.List;
import java.util.ServiceLoader;

import ai.h2o.mojos.runtime.utils.ClassLoaderUtils;

/**
 * Service to obtain instance of {@link MojoColumnFactory}.
 *
 * The service is using Java SPI to obtain all classes
 * implementing {@link MojoColumnFactory} interface.
 *
 * https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom#Example_Java_Implementation
 */
final class MojoColumnFactoryService {

  private static class InstanceHolder {
    private static MojoColumnFactoryService INSTANCE = new MojoColumnFactoryService();
  }

  public static MojoColumnFactoryService getInstance() {
    return InstanceHolder.INSTANCE;
  }

  private final MojoColumnFactory mojoColumnFactory;
  private final RuntimeException error;

  private MojoColumnFactoryService() {
    ServiceLoader loader = ServiceLoader.load(
        MojoColumnFactory.class,
        ClassLoaderUtils.getPreferredSpiClassLoader(MojoColumnFactory.class));
    MojoColumnFactory[] factories = getAll(loader);
    if (factories.length == 0) {
      mojoColumnFactory = null;
      error = new RuntimeException("Cannot find MOJO column factory implementation! Check the classpath if it contains mojo2-runtime-impl!");
    } else if (factories.length > 1) {
      mojoColumnFactory = null;
      error = new RuntimeException("Found multiple MOJO column factories implementation backends, but expected only one! Check the classpath if it contains mojo2-runtime-impl!");
    } else {
      error = null;
      mojoColumnFactory = factories[0];
    }
  }

  public MojoColumnFactory getMojoColumnFactory() {
    if (mojoColumnFactory != null) {
      return mojoColumnFactory;
    } else {
      throw error;
    }
  }

  /**
   * Get all implementors of {@link MojoColumnFactory} interface.
   *
   * @return array of objects implementing {@link MojoColumnFactory} interface. Empty array
   * if no implementor is found.
   */
  private static MojoColumnFactory[] getAll(ServiceLoader loader) {
    List l = new ArrayList<>();
    for (MojoColumnFactory mcf : loader) {
      l.add(mcf);
    }
    return l.toArray(new MojoColumnFactory[0]);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy