Skip to content

Commit 210f7a5

Browse files
DerSimeoniProdigy
andauthored
feat: use ServiceLoader to discover cache providers (#367)
Co-authored-by: iProdigy <[email protected]>
1 parent ac805e8 commit 210f7a5

File tree

22 files changed

+72
-27
lines changed

22 files changed

+72
-27
lines changed

core/src/main/java/io/github/xanthic/cache/core/AbstractCacheProvider.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.github.xanthic.cache.api.domain.ExpiryType;
55
import io.github.xanthic.cache.api.domain.MisconfigurationPolicy;
66
import io.github.xanthic.cache.api.exception.MisconfiguredCacheException;
7+
import org.jetbrains.annotations.ApiStatus;
78

89
import java.time.Duration;
910
import java.util.function.BiConsumer;
@@ -34,5 +35,10 @@ protected void handleExpiration(Duration time, ExpiryType type, BiConsumer<Durat
3435
protected ExpiryType preferredType() {
3536
return ExpiryType.POST_ACCESS; // LRU
3637
}
38+
39+
@ApiStatus.Internal
40+
public int getDiscoveryOrder() {
41+
return 1000;
42+
}
3743

3844
}

core/src/main/java/io/github/xanthic/cache/core/CacheApiSettings.java

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@
1212
import org.jetbrains.annotations.Nullable;
1313

1414
import java.util.Collections;
15+
import java.util.Comparator;
1516
import java.util.IdentityHashMap;
1617
import java.util.Map;
17-
import java.util.concurrent.atomic.AtomicInteger;
18+
import java.util.ServiceLoader;
1819
import java.util.concurrent.atomic.AtomicReference;
19-
import java.util.function.Consumer;
20+
import java.util.stream.StreamSupport;
2021

2122
/**
2223
* Holds a registry of default settings and cache providers.
@@ -103,31 +104,12 @@ public void registerCacheProvider(@NonNull Class<? extends CacheProvider> cacheP
103104
private void populateProviders() {
104105
log.debug("Xanthic: Registering canonical cache providers from the classpath...");
105106

106-
AtomicInteger registered = new AtomicInteger();
107-
Consumer<String> loadImpl = (providerClass) -> {
108-
try {
109-
Class<? extends CacheProvider> clazz = Class.forName(providerClass).asSubclass(CacheProvider.class);
110-
registerCacheProvider(clazz, null); // lazy, init if needed
111-
registered.incrementAndGet();
112-
} catch (ClassNotFoundException cx) {
113-
log.trace("Xanthic: Could not find optional cache provider " + providerClass);
114-
} catch (Exception e) {
115-
log.trace("Xanthic: Could not find optional cache provider " + providerClass, e);
116-
}
117-
};
118-
119-
loadImpl.accept("io.github.xanthic.cache.provider.androidx.AndroidLruProvider");
120-
loadImpl.accept("io.github.xanthic.cache.provider.caffeine3.Caffeine3Provider");
121-
loadImpl.accept("io.github.xanthic.cache.provider.caffeine.CaffeineProvider");
122-
loadImpl.accept("io.github.xanthic.cache.provider.cache2k.Cache2kProvider");
123-
loadImpl.accept("io.github.xanthic.cache.provider.infinispanjdk17.InfinispanProvider");
124-
loadImpl.accept("io.github.xanthic.cache.provider.infinispanjdk11.InfinispanProvider");
125-
loadImpl.accept("io.github.xanthic.cache.provider.infinispan.InfinispanProvider");
126-
loadImpl.accept("io.github.xanthic.cache.provider.expiringmap.ExpiringMapProvider");
127-
loadImpl.accept("io.github.xanthic.cache.provider.guava.GuavaProvider");
128-
loadImpl.accept("io.github.xanthic.cache.provider.ehcache.EhcacheProvider");
129-
130-
log.debug("Xanthic: Loaded {} canonical cache provider(s) on settings construction!", registered.get());
107+
ServiceLoader<AbstractCacheProvider> load = ServiceLoader.load(AbstractCacheProvider.class);
108+
StreamSupport.stream(load.spliterator(), false)
109+
.sorted(Comparator.comparingInt(AbstractCacheProvider::getDiscoveryOrder))
110+
.forEach(provider -> registerCacheProvider(provider.getClass(), provider));
111+
112+
log.debug("Xanthic: Loaded {} canonical cache provider(s) on settings construction!", providers.size());
131113
}
132114

133115
/**

provider-androidx/src/main/java/io/github/xanthic/cache/provider/androidx/AndroidLruProvider.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,8 @@ protected void entryRemoved(boolean evicted, @NotNull K key, @NotNull V oldValue
5555
};
5656
}
5757

58+
@Override
59+
public int getDiscoveryOrder() {
60+
return 1;
61+
}
5862
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.github.xanthic.cache.provider.androidx.AndroidLruProvider

provider-cache2k/src/main/java/io/github/xanthic/cache/provider/cache2k/Cache2kProvider.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,4 +108,8 @@ private static <K, V> Collection<CacheEntryOperationListener<K, V>> buildListene
108108
);
109109
}
110110

111+
@Override
112+
public int getDiscoveryOrder() {
113+
return 4;
114+
}
111115
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.github.xanthic.cache.provider.cache2k.Cache2kProvider

provider-caffeine/src/main/java/io/github/xanthic/cache/provider/caffeine/CaffeineProvider.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,9 @@ private static RemovalCause getCause(com.github.benmanes.caffeine.cache.RemovalC
5151
return RemovalCause.OTHER;
5252
}
5353
}
54+
55+
@Override
56+
public int getDiscoveryOrder() {
57+
return 3;
58+
}
5459
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.github.xanthic.cache.provider.caffeine.CaffeineProvider

provider-caffeine3/src/main/java/io/github/xanthic/cache/provider/caffeine3/Caffeine3Provider.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,9 @@ private static RemovalCause getCause(com.github.benmanes.caffeine.cache.RemovalC
4949
return RemovalCause.OTHER;
5050
}
5151
}
52+
53+
@Override
54+
public int getDiscoveryOrder() {
55+
return 2;
56+
}
5257
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.github.xanthic.cache.provider.caffeine3.Caffeine3Provider

provider-ehcache/src/main/java/io/github/xanthic/cache/provider/ehcache/EhcacheProvider.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,8 @@ private static RemovalCause getCause(EventType type) {
101101
}
102102
}
103103

104+
@Override
105+
public int getDiscoveryOrder() {
106+
return 10;
107+
}
104108
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.github.xanthic.cache.provider.ehcache.EhcacheProvider

provider-expiringmap/src/main/java/io/github/xanthic/cache/provider/expiringmap/ExpiringMapProvider.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,9 @@ public <K, V> Cache<K, V> build(ICacheSpec<K, V> spec) {
3636

3737
return new ExpiringMapDelegate<>(builder.build());
3838
}
39+
40+
@Override
41+
public int getDiscoveryOrder() {
42+
return 8;
43+
}
3944
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.github.xanthic.cache.provider.expiringmap.ExpiringMapProvider

provider-guava/src/main/java/io/github/xanthic/cache/provider/guava/GuavaProvider.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,9 @@ private static RemovalCause getCause(com.google.common.cache.RemovalCause cause)
7272
return RemovalCause.OTHER;
7373
}
7474
}
75+
76+
@Override
77+
public int getDiscoveryOrder() {
78+
return 9;
79+
}
7580
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.github.xanthic.cache.provider.guava.GuavaProvider

provider-infinispan-java11/src/main/java/io/github/xanthic/cache/provider/infinispanjdk11/InfinispanProvider.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,9 @@ public <K, V> Cache<K, V> build(ICacheSpec<K, V> spec) {
4747

4848
return new InfinispanDelegate<>(cache);
4949
}
50+
51+
@Override
52+
public int getDiscoveryOrder() {
53+
return 6;
54+
}
5055
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.github.xanthic.cache.provider.infinispanjdk11.InfinispanProvider

provider-infinispan-java17/src/main/java/io/github/xanthic/cache/provider/infinispanjdk17/InfinispanProvider.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,9 @@ public <K, V> Cache<K, V> build(ICacheSpec<K, V> spec) {
4747

4848
return new InfinispanDelegate<>(cache);
4949
}
50+
51+
@Override
52+
public int getDiscoveryOrder() {
53+
return 5;
54+
}
5055
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.github.xanthic.cache.provider.infinispanjdk17.InfinispanProvider

provider-infinispan/src/main/java/io/github/xanthic/cache/provider/infinispan/InfinispanProvider.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,9 @@ public <K, V> Cache<K, V> build(ICacheSpec<K, V> spec) {
4747

4848
return new InfinispanDelegate<>(cache);
4949
}
50+
51+
@Override
52+
public int getDiscoveryOrder() {
53+
return 7;
54+
}
5055
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.github.xanthic.cache.provider.infinispan.InfinispanProvider

0 commit comments

Comments
 (0)