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}