java-commons/commons-gson/src/main/java/io/gitlab/jfronny/commons/serialize/gson/api/v2/GsonHolders.java
2023-08-25 16:24:28 +02:00

56 lines
1.9 KiB
Java

package io.gitlab.jfronny.commons.serialize.gson.api.v2;
import io.gitlab.jfronny.commons.ref.WeakSet;
import io.gitlab.jfronny.commons.serialize.Serializer;
import io.gitlab.jfronny.commons.serialize.gson.impl.GsonHolderSerializer;
import org.jetbrains.annotations.ApiStatus;
import java.util.List;
import java.util.ServiceLoader;
import java.util.stream.Stream;
public class GsonHolders {
@ApiStatus.Internal
static GsonTransformer PAST_MODIFICATIONS = GsonTransformer.IDENTITY;
@ApiStatus.Internal
static final WeakSet<GsonHolder> KNOWN_INSTANCES = new WeakSet<>();
public static final GsonHolder API = new GsonHolder();
public static final GsonHolder CONFIG = new GsonHolder().apply(b -> b
.setOmitQuotes()
.serializeSpecialFloatingPointValues()
.serializeNulls()
.setPrettyPrinting()
);
public static void applyTransform(GsonTransformer transformer) {
synchronized (KNOWN_INSTANCES) {
PAST_MODIFICATIONS = GsonTransformer.concat(List.of(PAST_MODIFICATIONS, transformer));
for (GsonHolder holder : KNOWN_INSTANCES) holder.apply(transformer);
}
}
public static void applyTransforms(List<GsonTransformer> transformers) {
synchronized (KNOWN_INSTANCES) {
PAST_MODIFICATIONS = GsonTransformer.concat(Stream.concat(
Stream.of(PAST_MODIFICATIONS),
transformers.stream()
).toList());
for (GsonHolder holder : KNOWN_INSTANCES)
for (GsonTransformer transformer : transformers)
holder.apply(transformer);
}
}
static {
applyTransforms(ServiceLoader.load(GsonTransformer.class)
.stream()
.map(ServiceLoader.Provider::get)
.toList());
}
public static void registerSerializer() {
Serializer.setInstance(new GsonHolderSerializer(API));
}
}