/
CommitFactory.java
88 lines (68 loc) · 3.52 KB
/
CommitFactory.java
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package org.javers.core.commit;
import org.javers.common.collections.Lists;
import org.javers.common.collections.Optional;
import org.javers.common.date.DateProvider;
import org.javers.common.exception.JaversException;
import org.javers.common.exception.JaversExceptionCode;
import org.javers.common.validation.Validate;
import org.javers.core.diff.Diff;
import org.javers.core.diff.DiffFactory;
import org.javers.core.graph.LiveGraph;
import org.javers.core.graph.LiveGraphFactory;
import org.javers.core.metamodel.object.Cdo;
import org.javers.core.metamodel.object.CdoSnapshot;
import org.javers.core.metamodel.object.SnapshotFactory;
import org.javers.core.snapshot.GraphSnapshotFacade;
import org.javers.core.snapshot.ShadowGraph;
import org.javers.repository.api.JaversExtendedRepository;
import java.util.List;
/**
* @author bartosz walacik
*/
public class CommitFactory {
private final DiffFactory diffFactory;
private final JaversExtendedRepository javersRepository;
private final CommitSeqGenerator commitSeqGenerator;
private final DateProvider dateProvider;
private final GraphSnapshotFacade graphSnapshotFacade;
private final LiveGraphFactory liveGraphFactory;
private final SnapshotFactory snapshotFactory;
public CommitFactory(DiffFactory diffFactory, JaversExtendedRepository javersRepository, CommitSeqGenerator commitSeqGenerator, DateProvider dateProvider, GraphSnapshotFacade graphSnapshotFacade, LiveGraphFactory liveGraphFactory, SnapshotFactory snapshotFactory) {
this.diffFactory = diffFactory;
this.javersRepository = javersRepository;
this.commitSeqGenerator = commitSeqGenerator;
this.dateProvider = dateProvider;
this.graphSnapshotFacade = graphSnapshotFacade;
this.liveGraphFactory = liveGraphFactory;
this.snapshotFactory = snapshotFactory;
}
public Commit createTerminal(String author, Object removed){
Validate.argumentsAreNotNull(author, removed);
Cdo removedCdo = liveGraphFactory.createCdo(removed);
if (javersRepository.getLatest(removedCdo.getGlobalId()).isEmpty()){
throw new JaversException(JaversExceptionCode.CANT_DELETE_OBJECT_NOT_FOUND, removedCdo.getGlobalId().value());
}
CommitMetadata commitMetadata = nextCommit(author);
CdoSnapshot terminalSnapshot =
snapshotFactory.createTerminal(removedCdo.getGlobalId(), commitMetadata);
Diff diff = diffFactory.singleTerminal(removedCdo, commitMetadata);
return new Commit(commitMetadata, Lists.asList(terminalSnapshot), diff);
}
public Commit create(String author, Object currentVersion){
Validate.argumentsAreNotNull(author, currentVersion);
CommitMetadata commitMetadata = nextCommit(author);
LiveGraph currentGraph = liveGraphFactory.createLiveGraph(currentVersion);
ShadowGraph latestShadowGraph = graphSnapshotFacade.createLatestShadow(currentGraph);
//capture current state
List<CdoSnapshot> snapshots =
graphSnapshotFacade.createGraphSnapshot(currentGraph, latestShadowGraph, commitMetadata);
//do diff
Diff diff = diffFactory.create(latestShadowGraph, currentGraph, Optional.of(commitMetadata));
return new Commit(commitMetadata, snapshots, diff);
}
private CommitMetadata nextCommit(String author){
CommitId head = javersRepository.getHeadId();
CommitId newId = commitSeqGenerator.nextId(head);
return new CommitMetadata(author, dateProvider.now(), newId);
}
}