66import java .net .URI ;
77import java .time .OffsetDateTime ;
88import java .time .temporal .ChronoUnit ;
9+ import java .util .Collection ;
910import java .util .LinkedHashSet ;
1011import java .util .LinkedList ;
1112import java .util .List ;
2223import io .reliza .model .ArtifactData ;
2324import io .reliza .model .ArtifactData .ArtifactType ;
2425import io .reliza .model .ArtifactData .BomFormat ;
26+ import io .reliza .model .ArtifactData .DigestRecord ;
2527import io .reliza .model .ArtifactData .DigestScope ;
2628import io .reliza .model .ArtifactData .StoredIn ;
2729import io .reliza .model .ComponentData ;
30+ import io .reliza .model .DeliverableData ;
2831import io .reliza .model .ComponentData .ComponentType ;
2932import io .reliza .model .ParentRelease ;
3033import io .reliza .model .ReleaseData ;
4346import io .reliza .model .tea .TeaProduct ;
4447import io .reliza .model .tea .TeaProductRelease ;
4548import io .reliza .model .tea .TeaRelease ;
49+ import io .reliza .model .tea .TeaReleaseDistribution ;
4650import io .reliza .model .tea .TeaTeaServerInfo ;
4751import io .reliza .service .AcollectionService ;
4852import io .reliza .service .ArtifactService ;
4953import io .reliza .service .GetComponentService ;
54+ import io .reliza .service .GetDeliverableService ;
5055import io .reliza .service .SharedReleaseService ;
5156import io .reliza .service .UserService ;
57+ import io .reliza .service .VariantService ;
5258import io .reliza .ws .RelizaConfigProps ;
5359import lombok .extern .slf4j .Slf4j ;
5460
@@ -68,6 +74,12 @@ public class TeaTransformerService {
6874 @ Autowired
6975 private AcollectionService acollectionService ;
7076
77+ @ Autowired
78+ private VariantService variantService ;
79+
80+ @ Autowired
81+ private GetDeliverableService getDeliverableService ;
82+
7183 private RelizaConfigProps relizaConfigProps ;
7284
7385 @ Autowired
@@ -137,9 +149,40 @@ public TeaRelease transformReleaseToTea(ReleaseData rearmRD) {
137149 ComponentData cd = getComponentService .getComponentData (rearmRD .getComponent ()).get ();
138150 tr .setComponent (rearmRD .getComponent ());
139151 tr .setComponentName (cd .getName ());
152+ var distributions = gatherDistributionsPerRelease (rearmRD );
153+ tr .setDistributions (distributions );
140154 return tr ;
141155 }
142156
157+ private List <TeaReleaseDistribution > gatherDistributionsPerRelease (ReleaseData rearmRD ) {
158+ List <TeaReleaseDistribution > distributions = new LinkedList <>();
159+ var vd = variantService .getBaseVariantForRelease (rearmRD );
160+ if (null != vd .getOutboundDeliverables () && !vd .getOutboundDeliverables ().isEmpty ()) {
161+ for (UUID delUuid : vd .getOutboundDeliverables ()) {
162+ var deliverableData = getDeliverableService
163+ .getDeliverableData (delUuid )
164+ .get ();
165+ var trd = transformDeliverableToTeaDistribution (deliverableData );
166+ distributions .add (trd );
167+ }
168+ }
169+ return distributions ;
170+ }
171+
172+ private TeaReleaseDistribution transformDeliverableToTeaDistribution (DeliverableData dd ) {
173+ TeaReleaseDistribution trd = new TeaReleaseDistribution ();
174+ trd .setUrl (dd .getDisplayIdentifier ());
175+ trd .setDescription (dd .getNotes ());
176+ trd .setIdentifiers (dd .getIdentifiers ());
177+ if (null != dd .getSoftwareMetadata ()) {
178+ var tcList = transformDigestRecordToTeaChecksum (dd .getSoftwareMetadata ().getDigestRecords ());
179+ trd .setChecksums (tcList );
180+ }
181+ // trd.setDistributionType(dd.getSoftwareMetadata().getPackageType()); TODO + refer to https://github.com/CycloneDX/transparency-exchange-api/issues/198
182+ // trd.setSignatureUrl(); // TODO
183+ return trd ;
184+ }
185+
143186 public TeaComponentReleaseWithCollection transformComponentReleaseWithCollectionToTea (ReleaseData rearmRD ) {
144187 TeaComponentReleaseWithCollection tcr = new TeaComponentReleaseWithCollection ();
145188 TeaRelease tr = transformReleaseToTea (rearmRD );
@@ -262,6 +305,19 @@ private String resolveMediaType(BomFormat bomFormat, String initialType) {
262305 return resolvedType ;
263306 }
264307
308+ private List <TeaChecksum > transformDigestRecordToTeaChecksum (Collection <DigestRecord > digestRecords ) {
309+ List <TeaChecksum > tcList = new LinkedList <>();
310+ if (null != digestRecords && !digestRecords .isEmpty ()) {
311+ digestRecords .stream ().filter (d -> d .scope () == DigestScope .ORIGINAL_FILE ).forEach (d -> {
312+ TeaChecksum tc = new TeaChecksum ();
313+ tc .setAlgType (d .algo ());
314+ tc .setAlgValue (d .digest ());
315+ tcList .add (tc );
316+ });
317+ }
318+ return tcList ;
319+ }
320+
265321 public TeaArtifact transformArtifactToTea (ArtifactData rearmAD ) {
266322 TeaArtifact ta = new TeaArtifact ();
267323 ta .setUuid (rearmAD .getUuid ());
@@ -282,13 +338,7 @@ public TeaArtifact transformArtifactToTea(ArtifactData rearmAD) {
282338 if (optSignatureAD .isPresent ()) {
283339 taf .setSignatureUrl (relizaConfigProps .getBaseuri () + "/downloadArtifact/raw/" + optSignatureAD .get ().getUuid ());
284340 } else taf .setSignatureUrl (null );
285- List <TeaChecksum > tcList = new LinkedList <>();
286- rearmAD .getDigestRecords ().stream ().filter (d -> d .scope () == DigestScope .ORIGINAL_FILE ).forEach (d -> {
287- TeaChecksum tc = new TeaChecksum ();
288- tc .setAlgType (d .algo ());
289- tc .setAlgValue (d .digest ());
290- tcList .add (tc );
291- });
341+ var tcList = transformDigestRecordToTeaChecksum (rearmAD .getDigestRecords ());
292342 taf .setChecksums (tcList );
293343 tafList .add (taf );
294344
0 commit comments