/
JaversSqlRepository.java
193 lines (170 loc) · 7.14 KB
/
JaversSqlRepository.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
package org.javers.repository.sql;
import org.javers.common.validation.Validate;
import org.javers.core.commit.Commit;
import org.javers.core.commit.CommitId;
import org.javers.core.json.JsonConverter;
import org.javers.core.metamodel.object.CdoSnapshot;
import org.javers.core.metamodel.object.GlobalId;
import org.javers.core.metamodel.type.EntityType;
import org.javers.core.metamodel.type.ManagedType;
import org.javers.repository.api.JaversRepository;
import org.javers.repository.api.QueryParams;
import org.javers.repository.api.SnapshotIdentifier;
import org.javers.repository.sql.finders.CdoSnapshotFinder;
import org.javers.repository.sql.repositories.CdoSnapshotRepository;
import org.javers.repository.sql.repositories.CommitMetadataRepository;
import org.javers.repository.sql.repositories.GlobalIdRepository;
import org.javers.repository.sql.schema.JaversSchemaManager;
import org.javers.repository.sql.session.Session;
import org.javers.repository.sql.session.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.*;
import java.util.stream.Collectors;
import static org.javers.repository.sql.session.Session.SQL_LOGGER_NAME;
public class JaversSqlRepository implements JaversRepository {
private static final Logger logger = LoggerFactory.getLogger(SQL_LOGGER_NAME);
private final SessionFactory sessionFactory;
private final CommitMetadataRepository commitRepository;
private final GlobalIdRepository globalIdRepository;
private final CdoSnapshotRepository cdoSnapshotRepository;
private final CdoSnapshotFinder finder;
private final JaversSchemaManager schemaManager;
private final SqlRepositoryConfiguration sqlRepositoryConfiguration;
public JaversSqlRepository(SessionFactory sessionFactory,
CommitMetadataRepository commitRepository,
GlobalIdRepository globalIdRepository,
CdoSnapshotRepository cdoSnapshotRepository,
CdoSnapshotFinder finder,
JaversSchemaManager schemaManager,
SqlRepositoryConfiguration sqlRepositoryConfiguration) {
this.sessionFactory = sessionFactory;
this.commitRepository = commitRepository;
this.globalIdRepository = globalIdRepository;
this.cdoSnapshotRepository = cdoSnapshotRepository;
this.finder = finder;
this.schemaManager = schemaManager;
this.sqlRepositoryConfiguration = sqlRepositoryConfiguration;
}
@Override
public Optional<CdoSnapshot> getLatest(GlobalId globalId) {
try(Session session = sessionFactory.create("get latest snapshot")) {
return finder.getLatest(globalId, session, true);
}
}
@Override
public List<CdoSnapshot> getLatest(Collection<GlobalId> globalIds) {
Validate.argumentIsNotNull(globalIds);
try(Session session = sessionFactory.create("get latest snapshots")) {
return globalIds.stream()
.map(id -> finder.getLatest(id, session, false))
.filter(it -> it.isPresent())
.map(it -> it.get())
.collect(Collectors.toList());
}
}
@Override
public List<CdoSnapshot> getSnapshots(QueryParams queryParams) {
try(Session session = sessionFactory.create("find snapshots")) {
return finder.getSnapshots(queryParams, session);
}
}
@Override
public void persist(Commit commit) {
try(Session session = sessionFactory.create("persist commit")) {
long commitPk = commitRepository.save(commit.getAuthor(), commit.getProperties(), commit.getCommitDate(), commit.getCommitDateInstant(), commit.getId(), session);
cdoSnapshotRepository.save(commitPk, commit.getSnapshots(), session);
}
}
@Override
public CommitId getHeadId() {
try(Session session = sessionFactory.create("get head id")) {
return commitRepository.getCommitHeadId(session);
}
}
@Override
public List<CdoSnapshot> getSnapshots(Collection<SnapshotIdentifier> snapshotIdentifiers) {
if (isEmpty(snapshotIdentifiers)) {
return Collections.emptyList();
}
try(Session session = sessionFactory.create("find snapshots by ids")) {
return finder.getSnapshots(snapshotIdentifiers, session);
}
}
@Override
public List<CdoSnapshot> getStateHistory(GlobalId globalId, QueryParams queryParams) {
try(Session session = sessionFactory.create("find snapshots by globalId")) {
return finder.getStateHistory(globalId, queryParams, session);
}
}
@Override
public List<CdoSnapshot> getStateHistory(Set<ManagedType> givenClasses, QueryParams queryParams) {
if (isEmpty(givenClasses)) {
return Collections.emptyList();
}
try(Session session = sessionFactory.create("find snapshots by type")) {
return finder.getStateHistory(givenClasses, queryParams, session);
}
}
@Override
public List<CdoSnapshot> getValueObjectStateHistory(EntityType ownerEntity, String path, QueryParams queryParams) {
try(Session session = sessionFactory.create("find VO snapshots by path")) {
return finder.getVOStateHistory(ownerEntity, path, queryParams, session);
}
}
/**
* JaversSqlRepository uses the cache for GlobalId primary keys.
* This cache is non-transactional.
* <br/><br/>
*
* If a SQL transaction encounters errors and must be rolled back,
* then cache modifications should be rolled back as well.
* <br/><br/>
*
* JaVers does this automatically in <code>JaversTransactionalDecorator</code>
* from <code>javers-spring</code> module.
* If you are using <code>javers-spring-boot-starter-sql</code>
* (or directly <code>javers-spring</code>) you don't need to call this method.
*
* @since 2.7.2
*/
public void evictCache() {
globalIdRepository.evictCache();
}
/**
* @since 2.7.2
*/
public int getGlobalIdPkCacheSize(){
return globalIdRepository.getGlobalIdPkCacheSize();
}
/**
* @since 2.7.2
*/
public SqlRepositoryConfiguration getConfiguration() {
return sqlRepositoryConfiguration;
}
/**
* Clears the sequence allocation cache. It can be useful for testing.
* See https://github.com/javers/javers/issues/532
* @since 3.1.1
*/
public void evictSequenceAllocationCache() {
sessionFactory.resetKeyGeneratorCache();
}
@Override
public void setJsonConverter(JsonConverter jsonConverter) {
//TODO centralize to Session?
globalIdRepository.setJsonConverter(jsonConverter);
cdoSnapshotRepository.setJsonConverter(jsonConverter);
finder.setJsonConverter(jsonConverter);
}
@Override
public void ensureSchema() {
if(sqlRepositoryConfiguration.isSchemaManagementEnabled()) {
schemaManager.ensureSchema();
}
}
private boolean isEmpty(Collection c) {
return c == null || c.size() == 0;
}
}