001package com.box.sdkgen.internal;
002
003import com.fasterxml.jackson.core.JsonGenerator;
004import com.fasterxml.jackson.databind.SerializerProvider;
005import com.fasterxml.jackson.databind.ser.PropertyWriter;
006import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
007
008public class NullablePropertyFilter extends SimpleBeanPropertyFilter {
009  @Override
010  public void serializeAsField(
011      Object pojo, JsonGenerator jgen, SerializerProvider provider, PropertyWriter writer)
012      throws Exception {
013
014    Object value = writer.getMember().getValue(pojo);
015    boolean isNullable = writer.getMember().hasAnnotation(Nullable.class);
016
017    if (isNullable) {
018      // Always serialize if the field is explicitly set to null
019      if (value != null) {
020        writer.serializeAsField(pojo, jgen, provider);
021        return;
022      }
023      // If the field is explicitly set to null, serialize it
024      if (pojo instanceof NullableFieldTracker
025          && ((NullableFieldTracker) pojo).isFieldExplicitlySet(writer.getName())) {
026        writer.serializeAsField(pojo, jgen, provider);
027        return;
028      }
029      // If the field is not explicitly set and is null, skip serialization
030      return;
031    }
032
033    boolean isOneOfWithNoNonNullValue =
034        value instanceof OneOfUnion && !((OneOfUnion) value).hasAnyNonNullValue();
035    if (value != null && !isOneOfWithNoNonNullValue) {
036      writer.serializeAsField(pojo, jgen, provider);
037    }
038  }
039}