From 4cbd124da9e4126bb61d4254427f4206af40ed2b Mon Sep 17 00:00:00 2001 From: Joe Ellis Date: Thu, 30 Jan 2025 09:58:20 -0700 Subject: [PATCH] [RC] Use Guava instead of Caffeine caches for Android --- .../java/dialogue/serde/ConjureBodySerDe.java | 35 +++++++++++++------ .../dialogue/serde/DefaultConjureRuntime.java | 6 ++-- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/ConjureBodySerDe.java b/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/ConjureBodySerDe.java index b738b8529..28151013d 100644 --- a/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/ConjureBodySerDe.java +++ b/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/ConjureBodySerDe.java @@ -16,10 +16,11 @@ package com.palantir.conjure.java.dialogue.serde; -import com.github.benmanes.caffeine.cache.Caffeine; -import com.github.benmanes.caffeine.cache.CaffeineSpec; -import com.github.benmanes.caffeine.cache.LoadingCache; import com.google.common.base.Suppliers; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheBuilderSpec; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.net.HttpHeaders; @@ -57,7 +58,11 @@ final class ConjureBodySerDe implements BodySerDe { private final Deserializer binaryInputStreamDeserializer; private final Deserializer> optionalBinaryInputStreamDeserializer; private final Deserializer emptyBodyDeserializer; + + @SuppressWarnings("checkstyle:IllegalType") private final LoadingCache> serializers; + + @SuppressWarnings("checkstyle:IllegalType") private final LoadingCache> deserializers; /** @@ -69,7 +74,7 @@ final class ConjureBodySerDe implements BodySerDe { List rawEncodings, ErrorDecoder errorDecoder, EmptyContainerDeserializer emptyContainerDeserializer, - CaffeineSpec cacheSpec) { + CacheBuilderSpec cacheSpec) { List encodings = decorateEncodings(rawEncodings); this.encodingsSortedByWeight = sortByWeight(encodings); Preconditions.checkArgument(encodings.size() > 0, "At least one Encoding is required"); @@ -87,11 +92,19 @@ final class ConjureBodySerDe implements BodySerDe { this.emptyBodyDeserializer = new EmptyBodyDeserializer(errorDecoder); // Class unloading: Not supported, Jackson keeps strong references to the types // it sees: https://github.com/FasterXML/jackson-databind/issues/489 - this.serializers = Caffeine.from(cacheSpec) - .build(type -> new EncodingSerializerRegistry<>(defaultEncoding, TypeMarker.of(type))); - this.deserializers = Caffeine.from(cacheSpec) - .build(type -> new EncodingDeserializerRegistry<>( - encodingsSortedByWeight, errorDecoder, emptyContainerDeserializer, TypeMarker.of(type))); + this.serializers = CacheBuilder.from(cacheSpec).build(new CacheLoader<>() { + @Override + public Serializer load(Type type) { + return new EncodingSerializerRegistry<>(defaultEncoding, TypeMarker.of(type)); + } + }); + this.deserializers = CacheBuilder.from(cacheSpec).build(new CacheLoader<>() { + @Override + public Deserializer load(Type type) { + return new EncodingDeserializerRegistry<>( + encodingsSortedByWeight, errorDecoder, emptyContainerDeserializer, TypeMarker.of(type)); + } + }); } private static List decorateEncodings(List input) { @@ -113,13 +126,13 @@ private ImmutableList sortByWeight(List encodings) { @Override @SuppressWarnings("unchecked") public Serializer serializer(TypeMarker token) { - return (Serializer) serializers.get(token.getType()); + return (Serializer) serializers.getUnchecked(token.getType()); } @Override @SuppressWarnings("unchecked") public Deserializer deserializer(TypeMarker token) { - return (Deserializer) deserializers.get(token.getType()); + return (Deserializer) deserializers.getUnchecked(token.getType()); } @Override diff --git a/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/DefaultConjureRuntime.java b/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/DefaultConjureRuntime.java index 3e4766fda..dd0a95e6c 100644 --- a/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/DefaultConjureRuntime.java +++ b/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/DefaultConjureRuntime.java @@ -16,8 +16,8 @@ package com.palantir.conjure.java.dialogue.serde; -import com.github.benmanes.caffeine.cache.CaffeineSpec; import com.google.common.annotations.VisibleForTesting; +import com.google.common.cache.CacheBuilderSpec; import com.google.common.collect.ImmutableList; import com.google.errorprone.annotations.CanIgnoreReturnValue; import com.palantir.dialogue.BodySerDe; @@ -32,8 +32,8 @@ */ public final class DefaultConjureRuntime implements ConjureRuntime { @VisibleForTesting - static final CaffeineSpec DEFAULT_SERDE_CACHE_SPEC = - CaffeineSpec.parse("maximumSize=1000,expireAfterAccess=1m,weakKeys,weakValues"); + static final CacheBuilderSpec DEFAULT_SERDE_CACHE_SPEC = + CacheBuilderSpec.parse("maximumSize=1000,expireAfterAccess=1m,weakKeys,weakValues"); static final ImmutableList DEFAULT_ENCODINGS = ImmutableList.of( WeightedEncoding.of(Encodings.json(), .9),