internal.sdmxdl.web.spi.WebCachingLoader Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of sdmx-dl-api Show documentation
Show all versions of sdmx-dl-api Show documentation
Easily download official statistics - API
The newest version!
package internal.sdmxdl.web.spi;
import internal.sdmxdl.NoOpCaching;
import java.lang.Iterable;
import java.util.Collections;
import java.util.Comparator;
import java.util.ServiceLoader;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import java.util.stream.StreamSupport;
import sdmxdl.web.spi.WebCaching;
/**
* Custom service loader for {@link sdmxdl.web.spi.WebCaching}.
*
This class is thread-safe.
* Properties:
*
* - Quantifier: SINGLE
* - Fallback: {@link internal.sdmxdl.NoOpCaching}
* - Preprocessing: wrapper: none filters:[] sorters:[getWebCachingRank]
* - Mutability: NONE
* - Singleton: false
* - Name: internal.{{canonicalName}}Loader
* - Backend: null
* - Cleaner: null
* - Batch: false
* - Batch name: null
*
*/
public final class WebCachingLoader {
public static final Pattern ID_PATTERN = Pattern.compile("^[A-Z0-9]+(?:_[A-Z0-9]+)*$");
private final Iterable source = ServiceLoader.load(WebCaching.class);
private final Predicate filter = o -> ID_PATTERN.matcher(o.getWebCachingId()).matches();
private final Comparator sorter = Collections.reverseOrder(Comparator.comparingInt(WebCaching::getWebCachingRank));
private final WebCaching resource = doLoad();
private WebCaching doLoad() {
return StreamSupport.stream(source.spliterator(), false)
.filter(filter)
.sorted(sorter)
.findFirst()
.orElseGet(() -> NoOpCaching.INSTANCE);
}
/**
* Gets a {@link sdmxdl.web.spi.WebCaching} instance.
*
This method is thread-safe.
* @return the current non-null value
*/
public WebCaching get() {
return resource;
}
/**
* Gets a {@link sdmxdl.web.spi.WebCaching} instance.
*
This is equivalent to the following code: new WebCachingLoader().get()
*
Therefore, the returned value might be different at each call.
*
This method is thread-safe.
* @return a non-null value
*/
public static WebCaching load() {
return new WebCachingLoader().get();
}
}