content: package dev.ai4j.openai4j.spi;
  
  import java.util.*;
  
  public class ServiceHelper {
  
      public static <T> Collection<T> loadFactories(Class<T> clazz) {
          return loadFactories(clazz, null);
      }
  
      public static <T> Collection<T> loadFactories(Class<T> clazz, ClassLoader classLoader) {
          List<T> list = new ArrayList<>();
          ServiceLoader<T> factories;
          if (classLoader != null) {
              factories = ServiceLoader.load(clazz, classLoader);
          } else {
              // this is equivalent to:
              // ServiceLoader.load(clazz, TCCL);
              factories = ServiceLoader.load(clazz);
          }
          if (factories.iterator().hasNext()) {
              factories.iterator().forEachRemaining(list::add);
              return list;
          } else {
              // By default, ServiceLoader.load uses the TCCL, this may not be enough in environment dealing with
              // classloaders differently such as OSGi. So we should try to use the  classloader having loaded this
              // class. In OSGi it would be the bundle exposing vert.x and so have access to all its classes.
              factories = ServiceLoader.load(clazz, ServiceHelper.class.getClassLoader());
              if (factories.iterator().hasNext()) {
                  factories.iterator().forEachRemaining(list::add);
                  return list;
              } else {
                  return Collections.emptyList();
              }
          }
      }
  }
  