/*
 * Copyright 2017-2020 original authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.micronaut.core.io;

import io.micronaut.core.io.file.FileSystemResourceLoader;
import io.micronaut.core.io.scan.ClassPathResourceLoader;
import io.micronaut.core.util.ArgumentUtils;

import edu.umd.cs.findbugs.annotations.NonNull;
import java.io.InputStream;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

Resolves resources from a set of ResourceLoader instances.
Author:James Kleeh, graemerocher
Since:1.0
/** * Resolves resources from a set of {@link ResourceLoader} instances. * * @author James Kleeh * @author graemerocher * @since 1.0 */
public class ResourceResolver { private final List<ResourceLoader> resourceLoaders;
Params:
  • resourceLoaders – The resource loaders
/** * @param resourceLoaders The resource loaders */
public ResourceResolver(@NonNull ResourceLoader[] resourceLoaders) { this(Arrays.asList(resourceLoaders)); }
Params:
  • resourceLoaders – The resource loaders
/** * @param resourceLoaders The resource loaders */
public ResourceResolver(@NonNull List<ResourceLoader> resourceLoaders) { ArgumentUtils.requireNonNull("resourceLoaders", resourceLoaders); this.resourceLoaders = resourceLoaders; }
Default constructor.
/** * Default constructor. */
public ResourceResolver() { this(new ResourceLoader[]{ ClassPathResourceLoader.defaultLoader(ResourceResolver.class.getClassLoader()), FileSystemResourceLoader.defaultLoader()}); }
Searches resource loaders for one that matches or is a subclass of the specified type.
Params:
  • resolverType – The type of resolver to retrieve
Type parameters:
  • <T> – The type
Returns:An optional resource loader
/** * Searches resource loaders for one that matches or is a subclass of the specified type. * * @param resolverType The type of resolver to retrieve * @param <T> The type * @return An optional resource loader */
public @NonNull <T extends ResourceLoader> Optional<T> getLoader(@NonNull Class<T> resolverType) { ArgumentUtils.requireNonNull("resolverType", resolverType); return resourceLoaders.stream() .filter(rl -> resolverType.isAssignableFrom(rl.getClass())) .map(rl -> (T) rl) .findFirst(); }
Searches resource loaders for one that supports the given prefix.
Params:
  • prefix – The prefix the loader should support. (classpath:, file:, etc)
Returns:An optional resource loader
/** * Searches resource loaders for one that supports the given prefix. * * @param prefix The prefix the loader should support. (classpath:, file:, etc) * @return An optional resource loader */
public @NonNull Optional<ResourceLoader> getSupportingLoader(@NonNull String prefix) { ArgumentUtils.requireNonNull("prefix", prefix); return resourceLoaders.stream() .filter(rl -> rl.supportsPrefix(prefix)) .findFirst(); }
Searches resource loaders for one that supports the given path. If found, create a new loader with the context of the base path.
Params:
  • basePath – The path to load resources from
Returns:An optional resource loader
/** * Searches resource loaders for one that supports the given path. If found, create a new loader with the * context of the base path. * * @param basePath The path to load resources from * @return An optional resource loader */
public @NonNull Optional<ResourceLoader> getLoaderForBasePath(@NonNull String basePath) { ArgumentUtils.requireNonNull("basePath", basePath); Optional<ResourceLoader> resourceLoader = getSupportingLoader(basePath); return resourceLoader.map(rl -> rl.forBase(basePath)); }
Searches resource loaders for one that supports the given path. If found, return the resource stream.
Params:
  • path – The path to the resource
Returns:An optional input stream
/** * Searches resource loaders for one that supports the given path. If found, return the resource stream. * * @param path The path to the resource * @return An optional input stream */
public @NonNull Optional<InputStream> getResourceAsStream(@NonNull String path) { ArgumentUtils.requireNonNull("path", path); Optional<ResourceLoader> resourceLoader = getSupportingLoader(path); if (resourceLoader.isPresent()) { return resourceLoader.get().getResourceAsStream(path); } return Optional.empty(); }
Searches resource loaders for one that supports the given path. If found, return the resource URL.
Params:
  • path – The path to the resource
Returns:An optional URL
/** * Searches resource loaders for one that supports the given path. If found, return the resource URL. * * @param path The path to the resource * @return An optional URL */
public @NonNull Optional<URL> getResource(@NonNull String path) { ArgumentUtils.requireNonNull("path", path); Optional<ResourceLoader> resourceLoader = getSupportingLoader(path); if (resourceLoader.isPresent()) { return resourceLoader.get().getResource(path); } return Optional.empty(); }
Searches resource loaders for one that supports the given path. If found, return a stream of matching resources.
Params:
  • path – The path to the resource
Returns:A stream of URLs
/** * Searches resource loaders for one that supports the given path. If found, return a stream of matching resources. * * @param path The path to the resource * @return A stream of URLs */
public @NonNull Stream<URL> getResources(@NonNull String path) { ArgumentUtils.requireNonNull("path", path); Optional<ResourceLoader> resourceLoader = getSupportingLoader(path); if (resourceLoader.isPresent()) { return resourceLoader.get().getResources(path); } return Stream.empty(); } }