001/*-
002 * #%L
003 * Smile CDR - CDR
004 * %%
005 * Copyright (C) 2016 - 2025 Smile CDR, Inc.
006 * %%
007 * All rights reserved.
008 * #L%
009 */
010package ca.cdr.api.model.json;
011
012import com.fasterxml.jackson.annotation.JsonProperty;
013import com.fasterxml.jackson.core.JsonGenerator;
014import com.fasterxml.jackson.databind.JsonSerializer;
015import com.fasterxml.jackson.databind.ObjectMapper;
016import com.fasterxml.jackson.databind.SerializerProvider;
017import com.fasterxml.jackson.databind.annotation.JsonSerialize;
018
019import java.io.IOException;
020import java.util.Collection;
021import java.util.List;
022
023import static java.util.Objects.nonNull;
024
025/**
026 * N.B. GGG. If you ever add a high cardinality element to {@link AuditEventJson}, you must reflect that change in this
027 * class as well, or else CSV exporting will stop working.
028 *
029 * This abstract class serves as a mixin for serialization purposes, ensuring that collections of high-cardinality
030 * JSON model elements are serialized as strings. This is achieved using the {@link HighCardinalityStringifyingSerializer}.
031 * The serialized string representation is only currently used for CSV export.
032 */
033public abstract class StringifiedCollectionMixin {
034
035        @JsonSerialize(using = HighCardinalityStringifyingSerializer.class)
036        @JsonProperty("headers")
037        private Collection<AuditEventHeaderJson> myHeaders;
038
039        @JsonSerialize(using = HighCardinalityStringifyingSerializer.class)
040        @JsonProperty("targetResources")
041        private List<AuditEventTargetResourceJson> myTargetResources;
042
043        @JsonSerialize(using = HighCardinalityStringifyingSerializer.class)
044        @JsonProperty("targetModules")
045        private Collection<AuditEventTargetModuleJson> myTargetModules;
046
047        @JsonSerialize(using = HighCardinalityStringifyingSerializer.class)
048        @JsonProperty("targetUsers")
049        private Collection<AuditEventTargetUserJson> myTargetUsers;
050
051        /**
052         * This class strictly exists to serialize high cardinality elements into a string, for CSV export. See {@link StringifiedCollectionMixin}
053         * to see how we use it.
054         */
055        public static class HighCardinalityStringifyingSerializer extends JsonSerializer<Collection> {
056
057                private final ObjectMapper myObjectMapper = new ObjectMapper();
058
059                @Override
060                public void serialize(Collection theValue, JsonGenerator theGen, SerializerProvider theSerializers)
061                                throws IOException {
062                        if (nonNull(theValue)) {
063                                theGen.writeString(myObjectMapper.writeValueAsString(theValue));
064                        }
065                }
066        }
067}