diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/LPBukkitPlugin.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/LPBukkitPlugin.java
index a8eef4ded..eba042cc0 100644
--- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/LPBukkitPlugin.java
+++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/LPBukkitPlugin.java
@@ -50,6 +50,7 @@ import me.lucko.luckperms.common.contexts.ContextManager;
import me.lucko.luckperms.common.contexts.ServerCalculator;
import me.lucko.luckperms.common.core.UuidCache;
import me.lucko.luckperms.common.core.model.User;
+import me.lucko.luckperms.common.dependencies.Dependency;
import me.lucko.luckperms.common.dependencies.DependencyManager;
import me.lucko.luckperms.common.locale.LocaleManager;
import me.lucko.luckperms.common.locale.NoopLocaleManager;
@@ -89,6 +90,7 @@ import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.io.InputStream;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
@@ -130,12 +132,18 @@ public class LPBukkitPlugin extends JavaPlugin implements LuckPermsPlugin {
private PermissionVault permissionVault;
@Override
- public void onEnable() {
+ public void onLoad() {
+ // setup minimal functionality in order to load initial dependencies
scheduler = new LPBukkitScheduler(this);
-
localeManager = new NoopLocaleManager();
senderFactory = new BukkitSenderFactory(this);
log = new LoggerImpl(getConsoleSender());
+
+ DependencyManager.loadDependencies(this, Collections.singletonList(Dependency.CAFFEINE));
+ }
+
+ @Override
+ public void onEnable() {
LuckPermsPlugin.sendStartupBanner(getConsoleSender(), this);
ignoringLogs = ConcurrentHashMap.newKeySet();
diff --git a/bungee/src/main/java/me/lucko/luckperms/bungee/LPBungeePlugin.java b/bungee/src/main/java/me/lucko/luckperms/bungee/LPBungeePlugin.java
index 1127857ed..a77434be6 100644
--- a/bungee/src/main/java/me/lucko/luckperms/bungee/LPBungeePlugin.java
+++ b/bungee/src/main/java/me/lucko/luckperms/bungee/LPBungeePlugin.java
@@ -41,6 +41,7 @@ import me.lucko.luckperms.common.contexts.ContextManager;
import me.lucko.luckperms.common.contexts.ServerCalculator;
import me.lucko.luckperms.common.core.UuidCache;
import me.lucko.luckperms.common.core.model.User;
+import me.lucko.luckperms.common.dependencies.Dependency;
import me.lucko.luckperms.common.dependencies.DependencyManager;
import me.lucko.luckperms.common.locale.LocaleManager;
import me.lucko.luckperms.common.locale.NoopLocaleManager;
@@ -73,6 +74,7 @@ import net.md_5.bungee.api.plugin.Plugin;
import java.io.File;
import java.io.InputStream;
+import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -105,11 +107,18 @@ public class LPBungeePlugin extends Plugin implements LuckPermsPlugin {
private PermissionVault permissionVault;
@Override
- public void onEnable() {
+ public void onLoad() {
+ // setup minimal functionality in order to load initial dependencies
scheduler = new LPBungeeScheduler(this);
localeManager = new NoopLocaleManager();
senderFactory = new BungeeSenderFactory(this);
log = new LoggerImpl(getConsoleSender());
+
+ DependencyManager.loadDependencies(this, Collections.singletonList(Dependency.CAFFEINE));
+ }
+
+ @Override
+ public void onEnable() {
LuckPermsPlugin.sendStartupBanner(getConsoleSender(), this);
verboseHandler = new VerboseHandler(scheduler.getAsyncExecutor(), getVersion());
permissionVault = new PermissionVault(scheduler.getAsyncExecutor());
diff --git a/common/pom.xml b/common/pom.xml
index 24e426797..857afd285 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -118,6 +118,13 @@
19.0provided
+
+
+ com.github.ben-manes.caffeine
+ caffeine
+ 2.4.0
+ provided
+ org.projectlombok
diff --git a/common/src/main/java/me/lucko/luckperms/common/caching/UserCache.java b/common/src/main/java/me/lucko/luckperms/common/caching/UserCache.java
index 5d5e93ec6..2d3bb98e2 100644
--- a/common/src/main/java/me/lucko/luckperms/common/caching/UserCache.java
+++ b/common/src/main/java/me/lucko/luckperms/common/caching/UserCache.java
@@ -25,12 +25,10 @@ package me.lucko.luckperms.common.caching;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
+import com.github.benmanes.caffeine.cache.CacheLoader;
+import com.github.benmanes.caffeine.cache.Caffeine;
+import com.github.benmanes.caffeine.cache.LoadingCache;
import com.google.common.collect.ImmutableSet;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
import me.lucko.luckperms.api.Contexts;
import me.lucko.luckperms.api.caching.MetaData;
@@ -49,6 +47,7 @@ import java.util.concurrent.TimeUnit;
@RequiredArgsConstructor
public class UserCache implements UserData {
+
/**
* The user whom this data instance is representing
*/
@@ -59,7 +58,7 @@ public class UserCache implements UserData {
*/
private final CalculatorFactory calculatorFactory;
- private final LoadingCache permission = CacheBuilder.newBuilder()
+ private final LoadingCache permission = Caffeine.newBuilder()
.expireAfterAccess(10, TimeUnit.MINUTES)
.build(new CacheLoader() {
@Override
@@ -68,13 +67,13 @@ public class UserCache implements UserData {
}
@Override
- public ListenableFuture reload(Contexts contexts, PermissionCache oldData) {
+ public PermissionCache reload(Contexts contexts, PermissionCache oldData) {
oldData.comparePermissions(user.exportNodes(ExtractedContexts.generate(contexts), true));
- return Futures.immediateFuture(oldData);
+ return oldData;
}
});
- private final LoadingCache meta = CacheBuilder.newBuilder()
+ private final LoadingCache meta = Caffeine.newBuilder()
.expireAfterAccess(10, TimeUnit.MINUTES)
.build(new CacheLoader() {
@Override
@@ -83,20 +82,20 @@ public class UserCache implements UserData {
}
@Override
- public ListenableFuture reload(Contexts contexts, MetaCache oldData) {
+ public MetaCache reload(Contexts contexts, MetaCache oldData) {
oldData.loadMeta(user.accumulateMeta(null, null, ExtractedContexts.generate(contexts)));
- return Futures.immediateFuture(oldData);
+ return oldData;
}
});
@Override
public PermissionData getPermissionData(@NonNull Contexts contexts) {
- return permission.getUnchecked(contexts);
+ return permission.get(contexts);
}
@Override
public MetaData getMetaData(@NonNull Contexts contexts) {
- return meta.getUnchecked(contexts);
+ return meta.get(contexts);
}
@Override
@@ -142,8 +141,8 @@ public class UserCache implements UserData {
@Override
public void preCalculate(@NonNull Contexts contexts) {
- permission.getUnchecked(contexts);
- meta.getUnchecked(contexts);
+ permission.get(contexts);
+ meta.get(contexts);
}
public void invalidateCache() {
diff --git a/common/src/main/java/me/lucko/luckperms/common/caching/holder/ExportNodesHolder.java b/common/src/main/java/me/lucko/luckperms/common/caching/holder/ExportNodesHolder.java
deleted file mode 100644
index 513522ca0..000000000
--- a/common/src/main/java/me/lucko/luckperms/common/caching/holder/ExportNodesHolder.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2016 Lucko (Luck)
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package me.lucko.luckperms.common.caching.holder;
-
-import lombok.AllArgsConstructor;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.ToString;
-
-import me.lucko.luckperms.api.Contexts;
-
-@Getter
-@ToString
-@EqualsAndHashCode
-@AllArgsConstructor(staticName = "of")
-public class ExportNodesHolder {
-
- private final Contexts contexts;
- private final Boolean lowerCase;
-
-}
diff --git a/common/src/main/java/me/lucko/luckperms/common/caching/holder/GetAllNodesRequest.java b/common/src/main/java/me/lucko/luckperms/common/caching/holder/GetAllNodesRequest.java
deleted file mode 100644
index 73fa654c4..000000000
--- a/common/src/main/java/me/lucko/luckperms/common/caching/holder/GetAllNodesRequest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2016 Lucko (Luck)
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package me.lucko.luckperms.common.caching.holder;
-
-import lombok.AllArgsConstructor;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.ToString;
-
-import com.google.common.collect.ImmutableSet;
-
-import me.lucko.luckperms.common.utils.ExtractedContexts;
-
-@Getter
-@ToString
-@EqualsAndHashCode
-@AllArgsConstructor(staticName = "of")
-public class GetAllNodesRequest {
-
- private final ImmutableSet excludedGroups;
- private final ExtractedContexts contexts;
-
-}
diff --git a/common/src/main/java/me/lucko/luckperms/common/calculators/PermissionCalculator.java b/common/src/main/java/me/lucko/luckperms/common/calculators/PermissionCalculator.java
index 0e4fa9486..55617f759 100644
--- a/common/src/main/java/me/lucko/luckperms/common/calculators/PermissionCalculator.java
+++ b/common/src/main/java/me/lucko/luckperms/common/calculators/PermissionCalculator.java
@@ -24,9 +24,8 @@ package me.lucko.luckperms.common.calculators;
import lombok.RequiredArgsConstructor;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
+import com.github.benmanes.caffeine.cache.Caffeine;
+import com.github.benmanes.caffeine.cache.LoadingCache;
import me.lucko.luckperms.api.Tristate;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
@@ -43,13 +42,7 @@ public class PermissionCalculator {
private final String objectName;
private final List processors;
- private final LoadingCache cache = CacheBuilder.newBuilder()
- .build(new CacheLoader() {
- @Override
- public Tristate load(String s) {
- return lookupPermissionValue(s);
- }
- });
+ private final LoadingCache cache = Caffeine.newBuilder().build(this::lookupPermissionValue);
public void invalidateCache() {
cache.invalidateAll();
@@ -57,7 +50,7 @@ public class PermissionCalculator {
public Tristate getPermissionValue(String permission) {
permission = permission.toLowerCase();
- Tristate t = cache.getUnchecked(permission);
+ Tristate t = cache.get(permission);
plugin.getVerboseHandler().offer(objectName, permission, t);
plugin.getPermissionVault().offer(permission);
return t;
diff --git a/common/src/main/java/me/lucko/luckperms/common/config/AbstractConfiguration.java b/common/src/main/java/me/lucko/luckperms/common/config/AbstractConfiguration.java
index f62073a70..642f33d95 100644
--- a/common/src/main/java/me/lucko/luckperms/common/config/AbstractConfiguration.java
+++ b/common/src/main/java/me/lucko/luckperms/common/config/AbstractConfiguration.java
@@ -24,9 +24,8 @@ package me.lucko.luckperms.common.config;
import lombok.Getter;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
+import com.github.benmanes.caffeine.cache.Caffeine;
+import com.github.benmanes.caffeine.cache.LoadingCache;
import me.lucko.luckperms.common.api.delegates.LPConfigurationDelegate;
import me.lucko.luckperms.common.config.keys.EnduringKey;
@@ -35,27 +34,22 @@ import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
-@SuppressWarnings("unchecked")
public abstract class AbstractConfiguration implements LuckPermsConfiguration {
- private final LoadingCache, Optional