11package org .cyclonedx .util .serializer ;
22
33import java .io .IOException ;
4+ import java .lang .reflect .Field ;
45import java .util .List ;
56
67import com .fasterxml .jackson .core .JsonGenerator ;
78import com .fasterxml .jackson .databind .SerializerProvider ;
89import com .fasterxml .jackson .databind .ser .std .StdSerializer ;
910import com .fasterxml .jackson .dataformat .xml .ser .ToXmlGenerator ;
11+ import org .apache .commons .collections4 .CollectionUtils ;
1012import org .cyclonedx .Version ;
1113import org .cyclonedx .model .Metadata ;
1214import org .cyclonedx .model .Property ;
15+ import org .cyclonedx .model .VersionFilter ;
1316import org .cyclonedx .model .metadata .ToolInformation ;
1417
1518public class MetadataSerializer
@@ -45,20 +48,20 @@ private void createMetadataInfo(final Metadata metadata, final JsonGenerator jso
4548 {
4649 jsonGenerator .writeStartObject ();
4750
48- if (metadata .getTimestamp () != null ) {
51+ if (metadata .getTimestamp () != null && shouldSerializeField ( metadata , "timestamp" ) ) {
4952 jsonGenerator .writeFieldName ("timestamp" );
5053 new CustomDateSerializer ().serialize (metadata .getTimestamp (), jsonGenerator , serializerProvider );
5154 }
5255
53- if (metadata .getLifecycles () != null ) {
56+ if (metadata .getLifecycles () != null && shouldSerializeField ( metadata , "lifecycles" ) ) {
5457 jsonGenerator .writeFieldName ("lifecycles" );
5558 new LifecycleSerializer (isXml ).serialize (metadata .getLifecycles (), jsonGenerator , serializerProvider );
5659 }
5760
5861 //Tools
5962 parseTools (metadata , jsonGenerator );
6063
61- if (metadata .getAuthors () != null ) {
64+ if (metadata .getAuthors () != null && shouldSerializeField ( metadata , "author" ) ) {
6265 if (isXml ) {
6366 ToXmlGenerator xmlGenerator = (ToXmlGenerator ) jsonGenerator ;
6467 writeArrayFieldXML (metadata .getAuthors (), xmlGenerator , "author" );
@@ -68,28 +71,28 @@ private void createMetadataInfo(final Metadata metadata, final JsonGenerator jso
6871 }
6972 }
7073
71- if (metadata .getComponent () != null ) {
74+ if (metadata .getComponent () != null && shouldSerializeField ( metadata , "component" ) ) {
7275 jsonGenerator .writeObjectField ("component" , metadata .getComponent ());
7376 }
7477
75- if (metadata .getManufacture () != null ) {
78+ if (metadata .getManufacture () != null && shouldSerializeField ( metadata , "manufacture" ) ) {
7679 jsonGenerator .writeObjectField ("manufacture" , metadata .getManufacture ());
7780 }
7881
79- if (metadata .getManufacturer () != null ) {
82+ if (metadata .getManufacturer () != null && shouldSerializeField ( metadata , "manufacturer" ) ) {
8083 jsonGenerator .writeObjectField ("manufacturer" , metadata .getManufacturer ());
8184 }
8285
83- if (metadata .getSupplier () != null ) {
86+ if (metadata .getSupplier () != null && shouldSerializeField ( metadata , "supplier" ) ) {
8487 jsonGenerator .writeObjectField ("supplier" , metadata .getSupplier ());
8588 }
8689
87- if (metadata .getLicenses () != null ) {
90+ if (metadata .getLicenses () != null && shouldSerializeField ( metadata , "licenses" ) ) {
8891 jsonGenerator .writeFieldName ("licenses" );
8992 new LicenseChoiceSerializer (isXml , version ).serialize (metadata .getLicenses (), jsonGenerator , serializerProvider );
9093 }
9194
92- if ( metadata .getProperties ()!= null ) {
95+ if ( CollectionUtils . isNotEmpty ( metadata .getProperties ()) && shouldSerializeField ( metadata , "properties" ) ) {
9396 if (isXml ) {
9497 ToXmlGenerator xmlGenerator = (ToXmlGenerator ) jsonGenerator ;
9598 xmlGenerator .writeFieldName ("properties" );
@@ -165,6 +168,17 @@ private <T> void writeArrayFieldXML(List<T> items, ToXmlGenerator xmlGenerator,
165168 }
166169 }
167170
171+ private boolean shouldSerializeField (Object obj , String fieldName ) {
172+ try {
173+ Field field = obj .getClass ().getDeclaredField (fieldName );
174+ VersionFilter filter = field .getAnnotation (VersionFilter .class );
175+ return filter == null || filter .value ().getVersion () <= version .getVersion ();
176+ } catch (NoSuchFieldException e ) {
177+ // If the field does not exist, assume it should be serialized
178+ return true ;
179+ }
180+ }
181+
168182 @ Override
169183 public Class <Metadata > handledType () {
170184 return Metadata .class ;
0 commit comments