org.javers.repository.api.PreviousSnapshotsCalculator Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of javers-core Show documentation
Show all versions of javers-core Show documentation
JaVers - object auditing and diff framework for Java
package org.javers.repository.api;
import org.javers.core.metamodel.object.CdoSnapshot;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import static org.javers.common.collections.Lists.toImmutableList;
class PreviousSnapshotsCalculator {
private final Function, List> snapshotProvider;
PreviousSnapshotsCalculator(Function, List> snapshotProvider) {
this.snapshotProvider = snapshotProvider;
}
/**
* Returns a Map from snapshot.id to snapshot with this id.
* The Map contains entries for all previous snapshots.
* I.e, for each snapshot S from a given list, there is a map entry for S.id.previous()
*/
Map calculate(List snapshots) {
Map previousSnapshots = new HashMap<>();
populatePreviousSnapshotsWithSnapshots(previousSnapshots, snapshots);
List missingPreviousSnapshots = getMissingPreviousSnapshots(snapshots, previousSnapshots);
populatePreviousSnapshotsWithSnapshots(previousSnapshots, missingPreviousSnapshots);
return previousSnapshots;
}
private List getSnapshots(Collection identifiers) {
return snapshotProvider.apply(identifiers);
}
private void populatePreviousSnapshotsWithSnapshots(Map previousSnapshots, List snapshots) {
for (CdoSnapshot snapshot : snapshots) {
previousSnapshots.put(SnapshotIdentifier.from(snapshot), snapshot);
}
}
private List getMissingPreviousSnapshots(List snapshots, Map previousSnapshots) {
List missingPreviousSnapshotIdentifiers =
determineMissingPreviousSnapshotIdentifiers(previousSnapshots, snapshots);
return getSnapshots(missingPreviousSnapshotIdentifiers);
}
private List determineMissingPreviousSnapshotIdentifiers(Map previousSnapshots, List snapshots) {
List missingPreviousSnapshotIdentifiers = snapshots.stream()
.filter(snapshot -> !(snapshot.isInitial() || snapshot.isTerminal()))
.map(snapshot -> SnapshotIdentifier.from(snapshot).previous())
.filter(previousSnapshotIdentifier -> !previousSnapshots.containsKey(previousSnapshotIdentifier))
.collect(toImmutableList());
return missingPreviousSnapshotIdentifiers;
}
}