Skip to content

Commit

Permalink
[RC] Use Guava instead of Caffeine caches for Android
Browse files Browse the repository at this point in the history
  • Loading branch information
ellisjoe committed Jan 30, 2025
1 parent 538707f commit 4cbd124
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -57,7 +58,11 @@ final class ConjureBodySerDe implements BodySerDe {
private final Deserializer<InputStream> binaryInputStreamDeserializer;
private final Deserializer<Optional<InputStream>> optionalBinaryInputStreamDeserializer;
private final Deserializer<Void> emptyBodyDeserializer;

@SuppressWarnings("checkstyle:IllegalType")
private final LoadingCache<Type, Serializer<?>> serializers;

@SuppressWarnings("checkstyle:IllegalType")
private final LoadingCache<Type, Deserializer<?>> deserializers;

/**
Expand All @@ -69,7 +74,7 @@ final class ConjureBodySerDe implements BodySerDe {
List<WeightedEncoding> rawEncodings,
ErrorDecoder errorDecoder,
EmptyContainerDeserializer emptyContainerDeserializer,
CaffeineSpec cacheSpec) {
CacheBuilderSpec cacheSpec) {
List<WeightedEncoding> encodings = decorateEncodings(rawEncodings);
this.encodingsSortedByWeight = sortByWeight(encodings);
Preconditions.checkArgument(encodings.size() > 0, "At least one Encoding is required");
Expand All @@ -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<WeightedEncoding> decorateEncodings(List<WeightedEncoding> input) {
Expand All @@ -113,13 +126,13 @@ private ImmutableList<Encoding> sortByWeight(List<WeightedEncoding> encodings) {
@Override
@SuppressWarnings("unchecked")
public <T> Serializer<T> serializer(TypeMarker<T> token) {
return (Serializer<T>) serializers.get(token.getType());
return (Serializer<T>) serializers.getUnchecked(token.getType());
}

@Override
@SuppressWarnings("unchecked")
public <T> Deserializer<T> deserializer(TypeMarker<T> token) {
return (Deserializer<T>) deserializers.get(token.getType());
return (Deserializer<T>) deserializers.getUnchecked(token.getType());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<WeightedEncoding> DEFAULT_ENCODINGS = ImmutableList.of(
WeightedEncoding.of(Encodings.json(), .9),
Expand Down

0 comments on commit 4cbd124

Please sign in to comment.