ArchitectureArtifactLossManifest.java
package com.taxonomy.export.artifact;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
/** Canonically ordered loss evidence for one export profile. */
public record ArchitectureArtifactLossManifest(
String profileVersion,
List<ArchitectureArtifactLoss> losses) {
public ArchitectureArtifactLossManifest {
profileVersion = ArchitectureArtifactText.requireSafeText(
profileVersion,
"profileVersion");
losses = canonicalize(losses);
}
public static ArchitectureArtifactLossManifest lossless(
String profileVersion) {
return new ArchitectureArtifactLossManifest(
profileVersion,
List.of());
}
private static List<ArchitectureArtifactLoss> canonicalize(
List<ArchitectureArtifactLoss> losses) {
if (losses == null) {
throw new IllegalArgumentException("losses must not be null");
}
Set<String> codes = new HashSet<>();
List<ArchitectureArtifactLoss> canonical = losses.stream()
.map(loss -> Objects.requireNonNull(loss, "loss"))
.sorted()
.toList();
for (ArchitectureArtifactLoss loss : canonical) {
if (!codes.add(loss.code())) {
throw new IllegalArgumentException("Duplicate loss code");
}
}
return canonical;
}
}