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

com.testingsyndicate.jupiter.extensions.resources.ResourceResolver Maven / Gradle / Ivy

The newest version!
package com.testingsyndicate.jupiter.extensions.resources;

import static java.util.stream.Collectors.toUnmodifiableMap;

import java.io.IOException;
import java.io.UncheckedIOException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.Map;
import java.util.Optional;
import java.util.ServiceLoader;
import java.util.ServiceLoader.Provider;

/**
 * Resolver of a specific resource type. Implementations of this class are located using
 * ServiceLoader and should be added to a relevant services file to be discovered.
 *
 * @param  type of the resource this resolves
 */
public abstract class ResourceResolver {
  private static final Map, ResourceResolver> RESOLVERS;

  private final Class target;

  public static  Optional> getResolver(Class target) {
    // noinspection unchecked
    var resolver = (ResourceResolver) RESOLVERS.get(target);

    return Optional.ofNullable(resolver);
  }

  protected ResourceResolver(Class target) {
    this.target = target;
  }

  public Class getTarget() {
    return target;
  }

  public final T resolve(ResolutionContext context, URL url) {
    try {
      return doResolve(context, url);
    } catch (IOException iox) {
      throw new UncheckedIOException(iox);
    }
  }

  protected abstract T doResolve(ResolutionContext context, URL url) throws IOException;

  static {
    RESOLVERS =
        ServiceLoader.load(ResourceResolver.class).stream()
            .map((Provider provider) -> (ResourceResolver) provider.get())
            .collect(
                toUnmodifiableMap(
                    resolver -> (Class) resolver.getTarget(),
                    resolver -> (ResourceResolver) resolver));
  }

  public interface ResolutionContext {
    String name();

    Class sourceClass();

    Optional charset();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy