1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package gov.nist.secauto.metaschema.core.model.validation;
28
29 import gov.nist.secauto.metaschema.core.model.constraint.IConstraint.Level;
30 import gov.nist.secauto.metaschema.core.util.CollectionUtil;
31 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
32
33 import java.util.LinkedList;
34 import java.util.List;
35 import java.util.concurrent.atomic.AtomicReference;
36 import java.util.stream.Stream;
37
38 import edu.umd.cs.findbugs.annotations.NonNull;
39
40 public final class AggregateValidationResult implements IValidationResult {
41 @NonNull
42 private final List<IValidationFinding> findings;
43 @NonNull
44 private final Level highestSeverity;
45
46 private AggregateValidationResult(@NonNull List<IValidationFinding> findings, @NonNull Level highestSeverity) {
47 this.findings = CollectionUtil.unmodifiableList(findings);
48 this.highestSeverity = highestSeverity;
49 }
50
51 public static IValidationResult aggregate(@NonNull IValidationResult result) {
52 return result;
53 }
54
55 public static IValidationResult aggregate(@NonNull IValidationResult... results) {
56 Stream<? extends IValidationFinding> stream = Stream.empty();
57 for (IValidationResult result : results) {
58 stream = Stream.concat(stream, result.getFindings().stream());
59 }
60 assert stream != null;
61 return aggregate(stream);
62 }
63
64 public static IValidationResult aggregate(@NonNull Stream<? extends IValidationFinding> findingStream) {
65 AtomicReference<Level> highestSeverity = new AtomicReference<>(Level.INFORMATIONAL);
66
67 List<IValidationFinding> findings = new LinkedList<>();
68 findingStream.sequential().forEachOrdered(finding -> {
69 findings.add(finding);
70 Level severity = finding.getSeverity();
71 if (highestSeverity.get().ordinal() < severity.ordinal()) {
72 highestSeverity.set(severity);
73 }
74 });
75
76 return new AggregateValidationResult(findings, ObjectUtils.notNull(highestSeverity.get()));
77 }
78
79 @Override
80 public Level getHighestSeverity() {
81 return highestSeverity;
82 }
83
84 @Override
85 public List<? extends IValidationFinding> getFindings() {
86 return findings;
87 }
88
89 }