package com.xfestudio.xfeservermanager.core.rollback;
import java.util.List;
/** An atomically captured, fixed high-watermark view. */
public record JournalSlice(long watermark, List<JournalEntry> entries, List<JournalGap> gaps) {
public JournalSlice {
if (watermark < 0) throw new IllegalArgumentException("watermark must be non-negative");
entries = List.copyOf(entries);
gaps = List.copyOf(gaps);
if (entries.stream().anyMatch(entry -> entry.sequence() > watermark)) {
throw new IllegalArgumentException("entry exceeds watermark");
}
var sequences = new java.util.HashSet<Long>();
var eventIds = new java.util.HashSet<java.util.UUID>();
for (JournalEntry entry : entries) {
if (!sequences.add(entry.sequence())) throw new IllegalArgumentException("duplicate journal sequence");
if (!eventIds.add(entry.change().eventId())) throw new IllegalArgumentException("duplicate journal event id");
}
}
}
package com.xfestudio.xfeservermanager.core.rollback;
import java.util.List;
/** An atomically captured, fixed high-watermark view. */
public record JournalSlice(long watermark, List<JournalEntry> entries, List<JournalGap> gaps) {
public JournalSlice {
if (watermark < 0) throw new IllegalArgumentException("watermark must be non-negative");
entries = List.copyOf(entries);
gaps = List.copyOf(gaps);
if (entries.stream().anyMatch(entry -> entry.sequence() > watermark)) {
throw new IllegalArgumentException("entry exceeds watermark");
}
var sequences = new java.util.HashSet<Long>();
var eventIds = new java.util.HashSet<java.util.UUID>();
for (JournalEntry entry : entries) {
if (!sequences.add(entry.sequence())) throw new IllegalArgumentException("duplicate journal sequence");
if (!eventIds.add(entry.change().eventId())) throw new IllegalArgumentException("duplicate journal event id");
}
}
}