diff --git a/src/main/java/org/spongepowered/common/entity/living/human/HumanEntity.java b/src/main/java/org/spongepowered/common/entity/living/human/HumanEntity.java index 79190dcca16..7a8c27d45c9 100644 --- a/src/main/java/org/spongepowered/common/entity/living/human/HumanEntity.java +++ b/src/main/java/org/spongepowered/common/entity/living/human/HumanEntity.java @@ -24,9 +24,8 @@ */ package org.spongepowered.common.entity.living.human; -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 com.google.common.collect.Maps; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.PropertyMap; @@ -88,15 +87,11 @@ public class HumanEntity extends CreatureEntity implements TeamMember, IRangedAt // According to http://wiki.vg/Mojang_API#UUID_-.3E_Profile_.2B_Skin.2FCape // you can access this data once per minute, lets cache for 2 minutes - private static final LoadingCache PROPERTIES_CACHE = CacheBuilder.newBuilder().expireAfterWrite(2, TimeUnit.MINUTES) - .build(new CacheLoader() { - - @Override - public PropertyMap load(final UUID uuid) throws Exception { - return SpongeImpl.getServer().getMinecraftSessionService().fillProfileProperties(new GameProfile(uuid, ""), true) - .getProperties(); - } - }); + private static final LoadingCache PROPERTIES_CACHE = Caffeine.newBuilder() + .expireAfterWrite(2, TimeUnit.MINUTES) + .build((uuid) -> SpongeImpl.getServer().getMinecraftSessionService() + .fillProfileProperties(new GameProfile(uuid, ""), true) + .getProperties()); // A queue of packets waiting to send to players tracking this human private final Map[]>> playerPacketMap = Maps.newHashMap(); @@ -330,7 +325,7 @@ private void renameProfile(final String newName) { } private boolean updateFakeProfileWithSkin(final UUID skin) { - final PropertyMap properties = PROPERTIES_CACHE.getUnchecked(skin); + final PropertyMap properties = PROPERTIES_CACHE.get(skin); if (properties.isEmpty()) { return false; } diff --git a/src/main/java/org/spongepowered/common/event/ClassEventListenerFactory.java b/src/main/java/org/spongepowered/common/event/ClassEventListenerFactory.java index 00b165bbc99..e6a766f7ca2 100644 --- a/src/main/java/org/spongepowered/common/event/ClassEventListenerFactory.java +++ b/src/main/java/org/spongepowered/common/event/ClassEventListenerFactory.java @@ -48,9 +48,8 @@ import static org.objectweb.asm.Opcodes.RETURN; import static org.objectweb.asm.Opcodes.V1_6; -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 org.objectweb.asm.ClassWriter; import org.objectweb.asm.FieldVisitor; import org.objectweb.asm.Label; @@ -69,16 +68,8 @@ public final class ClassEventListenerFactory implements AnnotatedEventListener.F private final AtomicInteger id = new AtomicInteger(); private final DefineableClassLoader classLoader; - private final LoadingCache> cache = CacheBuilder.newBuilder() - .concurrencyLevel(1) - .weakValues() - .build(new CacheLoader>() { - - @Override - public Class load(Method method) throws Exception { - return ClassEventListenerFactory.this.createClass(method); - } - }); + private final LoadingCache> cache = Caffeine.newBuilder() + .weakValues().build(this::createClass); private FilterFactory filterFactory; private final String targetPackage; diff --git a/src/main/java/org/spongepowered/common/event/ListenerChecker.java b/src/main/java/org/spongepowered/common/event/ListenerChecker.java index 6d287951f04..91aa873937c 100644 --- a/src/main/java/org/spongepowered/common/event/ListenerChecker.java +++ b/src/main/java/org/spongepowered/common/event/ListenerChecker.java @@ -25,9 +25,6 @@ package org.spongepowered.common.event; import com.google.common.base.CaseFormat; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; import com.google.common.reflect.TypeToken; import org.spongepowered.api.event.Event; import org.spongepowered.api.event.SpongeEventFactory; diff --git a/src/main/java/org/spongepowered/common/event/filter/FilterFactory.java b/src/main/java/org/spongepowered/common/event/filter/FilterFactory.java index 010ff6e6c30..d34414d7572 100644 --- a/src/main/java/org/spongepowered/common/event/filter/FilterFactory.java +++ b/src/main/java/org/spongepowered/common/event/filter/FilterFactory.java @@ -24,29 +24,22 @@ */ package org.spongepowered.common.event.filter; -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; - -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 org.spongepowered.common.event.gen.DefineableClassLoader; import java.lang.reflect.Method; import java.util.concurrent.atomic.AtomicInteger; +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; + public class FilterFactory { private final AtomicInteger id = new AtomicInteger(); private final DefineableClassLoader classLoader; - private final LoadingCache> cache = CacheBuilder.newBuilder() - .concurrencyLevel(1).weakValues().build(new CacheLoader>() { - - @Override - public Class load(Method method) throws Exception { - return FilterFactory.this.createClass(method); - } - }); + private final LoadingCache> cache = Caffeine.newBuilder() + .weakValues().build(this::createClass); private final String targetPackage; public FilterFactory(String targetPackage, DefineableClassLoader classLoader) { diff --git a/src/main/java/org/spongepowered/common/service/permission/SpongeContextCalculator.java b/src/main/java/org/spongepowered/common/service/permission/SpongeContextCalculator.java index 5e28d8f5bb2..7f16411086c 100644 --- a/src/main/java/org/spongepowered/common/service/permission/SpongeContextCalculator.java +++ b/src/main/java/org/spongepowered/common/service/permission/SpongeContextCalculator.java @@ -24,9 +24,8 @@ */ package org.spongepowered.common.service.permission; -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 com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; import org.spongepowered.api.command.CommandSource; @@ -72,22 +71,19 @@ private static InetAddress getAddress(RemoteSource input, Function> buildAddressCache(final String contextKey, final Function function) { - return CacheBuilder.newBuilder() + return Caffeine.newBuilder() .weakKeys() - .build(new CacheLoader>() { - @Override - public Set load(RemoteSource key) { - ImmutableSet.Builder builder = ImmutableSet.builder(); - final InetAddress addr = function.apply(key); - if (addr == null) { - return builder.build(); - } - builder.add(new Context(contextKey, addr.getHostAddress())); - for (String set : Maps.filterValues(SpongeImpl.getGlobalConfigAdapter().getConfig().getIpSets(), input -> input.apply(addr)).keySet()) { - builder.add(new Context(contextKey, set)); - } + .>build((key) -> { + ImmutableSet.Builder builder = ImmutableSet.builder(); + final InetAddress addr = function.apply(key); + if (addr == null) { return builder.build(); } + builder.add(new Context(contextKey, addr.getHostAddress())); + for (String set : Maps.filterValues(SpongeImpl.getGlobalConfigAdapter().getConfig().getIpSets(), input -> input.apply(addr)).keySet()) { + builder.add(new Context(contextKey, set)); + } + return builder.build(); }); } diff --git a/src/main/java/org/spongepowered/common/service/sql/SqlServiceImpl.java b/src/main/java/org/spongepowered/common/service/sql/SqlServiceImpl.java index 5fa108aec65..42c64b71aa2 100644 --- a/src/main/java/org/spongepowered/common/service/sql/SqlServiceImpl.java +++ b/src/main/java/org/spongepowered/common/service/sql/SqlServiceImpl.java @@ -26,11 +26,11 @@ import static com.google.common.base.Preconditions.checkNotNull; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.benmanes.caffeine.cache.LoadingCache; +import com.github.benmanes.caffeine.cache.RemovalListener; import com.google.common.base.Objects; import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -import com.google.common.cache.RemovalListener; import com.google.common.collect.ImmutableMap; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; @@ -117,28 +117,26 @@ public SqlServiceImpl() { public void buildConnectionCache() { this.connectionCache = null; this.connectionCache = - CacheBuilder.newBuilder().removalListener((RemovalListener) notification -> { - HikariDataSource source = notification.getValue(); - if (source != null) { - source.close(); - } - }).build(new CacheLoader() { - @Override - public HikariDataSource load(@Nonnull ConnectionInfo key) throws Exception { - HikariConfig config = new HikariConfig(); - config.setUsername(key.getUser()); - config.setPassword(key.getPassword()); - config.setDriverClassName(key.getDriverClassName()); - // https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing for info on pool sizing - config.setMaximumPoolSize((Runtime.getRuntime().availableProcessors() * 2) + 1); - config.setLeakDetectionThreshold(60 * 1000); - Properties driverSpecificProperties = PROTOCOL_SPECIFIC_PROPS.get(key.getDriverClassName()); - if (driverSpecificProperties != null) { - config.setDataSourceProperties(driverSpecificProperties); - } - config.setJdbcUrl(key.getAuthlessUrl()); - return new HikariDataSource(config); + Caffeine.newBuilder() + .removalListener(((key, value, cause) -> { + HikariDataSource source = value; + if (source != null) { + source.close(); + } + })).build((key) -> { + HikariConfig config = new HikariConfig(); + config.setUsername(key.getUser()); + config.setPassword(key.getPassword()); + config.setDriverClassName(key.getDriverClassName()); + // https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing for info on pool sizing + config.setMaximumPoolSize((Runtime.getRuntime().availableProcessors() * 2) + 1); + config.setLeakDetectionThreshold(60 * 1000); + Properties driverSpecificProperties = PROTOCOL_SPECIFIC_PROPS.get(key.getDriverClassName()); + if (driverSpecificProperties != null) { + config.setDataSourceProperties(driverSpecificProperties); } + config.setJdbcUrl(key.getAuthlessUrl()); + return new HikariDataSource(config); }); } @Override diff --git a/src/main/java/org/spongepowered/common/text/action/SpongeCallbackHolder.java b/src/main/java/org/spongepowered/common/text/action/SpongeCallbackHolder.java index c37dfb46ccb..b15f40c4a97 100644 --- a/src/main/java/org/spongepowered/common/text/action/SpongeCallbackHolder.java +++ b/src/main/java/org/spongepowered/common/text/action/SpongeCallbackHolder.java @@ -27,11 +27,10 @@ import static com.google.common.base.Preconditions.checkNotNull; import static org.spongepowered.common.util.SpongeCommonTranslationHelper.t; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -import com.google.common.cache.RemovalListener; -import com.google.common.cache.RemovalNotification; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.benmanes.caffeine.cache.LoadingCache; +import com.github.benmanes.caffeine.cache.RemovalCause; +import com.github.benmanes.caffeine.cache.RemovalListener; import com.google.common.collect.ImmutableList; import org.spongepowered.api.command.CommandResult; import org.spongepowered.api.command.CommandSource; @@ -50,6 +49,7 @@ import java.util.concurrent.TimeUnit; import java.util.function.Consumer; +import javax.annotation.Nonnull; import javax.annotation.Nullable; public class SpongeCallbackHolder { @@ -58,20 +58,17 @@ public class SpongeCallbackHolder { private static final SpongeCallbackHolder INSTANCE = new SpongeCallbackHolder(); static final ConcurrentMap> reverseMap = new ConcurrentHashMap<>(); - private static final LoadingCache, UUID> callbackCache = CacheBuilder.newBuilder().expireAfterAccess(10, TimeUnit.MINUTES) - .removalListener(new RemovalListener, UUID>() { - @Override - public void onRemoval(RemovalNotification, UUID> notification) { - reverseMap.remove(notification.getValue(), notification.getKey()); - } - }) - .build(new CacheLoader, UUID>() { - @Override - public UUID load(Consumer key) throws Exception { - UUID ret = UUID.randomUUID(); - reverseMap.putIfAbsent(ret, key); - return ret; + private static final LoadingCache, UUID> callbackCache = Caffeine.newBuilder() + .expireAfterAccess(10, TimeUnit.MINUTES) + .removalListener(((key, value, cause) -> { + if (value != null) { + reverseMap.remove(value); } + })) + .build((key) -> { + UUID ret = UUID.randomUUID(); + reverseMap.putIfAbsent(ret, key); + return ret; }); @@ -81,7 +78,7 @@ public static SpongeCallbackHolder getInstance() { public UUID getOrCreateIdForCallback(Consumer callback) { - return callbackCache.getUnchecked(checkNotNull(callback, "callback")); + return callbackCache.get(checkNotNull(callback, "callback")); } public Optional> getCallbackForUUID(UUID id) {