Skip to content

Commit 69dd45d

Browse files
bukajsytlosBrutus5000
authored andcommitted
Elide 6.0
1 parent 4634a53 commit 69dd45d

8 files changed

Lines changed: 69 additions & 117 deletions

File tree

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,10 +238,10 @@ dependencies {
238238
runtimeOnly("org.mariadb.jdbc:mariadb-java-client")
239239

240240
// Manually managed dependencies
241-
def elideVersion = "5.1.2"
241+
def elideVersion = "6.1.1"
242242
implementation("com.yahoo.elide:elide-core:${elideVersion}")
243243
implementation("com.yahoo.elide:elide-swagger:${elideVersion}")
244-
implementation("com.yahoo.elide:elide-datastore-hibernate5:${elideVersion}")
244+
implementation("com.yahoo.elide:elide-datastore-jpa:${elideVersion}")
245245
implementation("com.yahoo.elide:elide-datastore-multiplex:${elideVersion}")
246246
implementation("org.springdoc:springdoc-openapi-ui:1.6.6")
247247
implementation("org.springdoc:springdoc-openapi-security:1.6.6")

src/inttest/java/com/faforever/api/data/AvatarAssignmentElideTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,15 +185,15 @@ public void cannotUpdateAvatarAssignmentExpirationWithoutRole() throws Exception
185185
public void ownerCanUpdateAvatarAssignmentSelection() throws Exception {
186186
final AvatarAssignment avatarAssignment = (AvatarAssignment) new AvatarAssignment()
187187
.setSelected(true)
188-
.setId("1");
188+
.setId("2");
189189
mockMvc.perform(
190-
patch("/data/avatarAssignment/{assignmentId}", 1)
190+
patch("/data/avatarAssignment/{assignmentId}", 2)
191191
.with(getOAuthTokenWithActiveUser(NO_SCOPE, NO_AUTHORITIES))
192192
.header(HttpHeaders.CONTENT_TYPE, JSON_API_MEDIA_TYPE)
193193
.content(createJsonApiContent(avatarAssignment)))
194194
.andExpect(status().isNoContent());
195195
mockMvc.perform(
196-
get("/data/avatarAssignment/{assignmentId}", 1)
196+
get("/data/avatarAssignment/{assignmentId}", 2)
197197
.with(getOAuthTokenWithActiveUser(NO_SCOPE, NO_AUTHORITIES)))
198198
.andExpect(status().isOk())
199199
.andExpect(jsonPath("$.data.attributes.selected", is(true)));

src/main/java/com/faforever/api/config/FafDatasourceConfig.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.faforever.api.config.elide.SpringHibernateDataStore;
44
import com.yahoo.elide.core.datastore.DataStore;
5-
import org.hibernate.ScrollMode;
65
import org.hibernate.cfg.AvailableSettings;
76
import org.springframework.beans.factory.annotation.Qualifier;
87
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
@@ -77,6 +76,6 @@ DataStore fafDataStore(
7776
@Qualifier("fafTransactionManager") PlatformTransactionManager fafTransactionManager,
7877
@Qualifier("fafEntityManagerFactory") EntityManager entityManager
7978
) {
80-
return new SpringHibernateDataStore(fafTransactionManager, entityManager, true, ScrollMode.FORWARD_ONLY);
79+
return new SpringHibernateDataStore(fafTransactionManager, entityManager);
8180
}
8281
}

src/main/java/com/faforever/api/config/LeagueDatasourceConfig.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.faforever.api.config.elide.SpringHibernateDataStore;
44
import com.yahoo.elide.core.datastore.DataStore;
5-
import org.hibernate.ScrollMode;
65
import org.springframework.beans.factory.annotation.Qualifier;
76
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
87
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -59,6 +58,6 @@ DataStore leagueDataStore(
5958
@Qualifier(LEAGUE_TRANSACTION_MANAGER) PlatformTransactionManager leagueTransactionManager,
6059
@Qualifier("leagueEntityManagerFactory") EntityManager entityManager
6160
) {
62-
return new SpringHibernateDataStore(leagueTransactionManager, entityManager, true, ScrollMode.FORWARD_ONLY);
61+
return new SpringHibernateDataStore(leagueTransactionManager, entityManager);
6362
}
6463
}

src/main/java/com/faforever/api/config/elide/ElideConfig.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33
import com.faforever.api.security.ExtendedAuditLogger;
44
import com.fasterxml.jackson.databind.ObjectMapper;
55
import com.yahoo.elide.Elide;
6+
import com.yahoo.elide.ElideSettings;
67
import com.yahoo.elide.ElideSettingsBuilder;
8+
import com.yahoo.elide.core.TransactionRegistry;
79
import com.yahoo.elide.core.datastore.DataStore;
810
import com.yahoo.elide.core.dictionary.EntityDictionary;
911
import com.yahoo.elide.core.dictionary.Injector;
1012
import com.yahoo.elide.core.filter.dialect.CaseSensitivityStrategy;
1113
import com.yahoo.elide.core.filter.dialect.RSQLFilterDialect;
14+
import com.yahoo.elide.core.utils.DefaultClassScanner;
1215
import com.yahoo.elide.core.utils.coerce.CoerceUtil;
1316
import com.yahoo.elide.datastores.multiplex.MultiplexManager;
1417
import com.yahoo.elide.jsonapi.JsonApiMapper;
@@ -22,6 +25,7 @@
2225
import java.time.Instant;
2326
import java.time.OffsetDateTime;
2427
import java.util.Map;
28+
import java.util.Set;
2529

2630
@Configuration
2731
public class ElideConfig {
@@ -38,17 +42,18 @@ MultiplexManager multiplexDataStore(
3842

3943
@Bean
4044
public Elide elide(DataStore multiplexDataStore, ObjectMapper objectMapper, EntityDictionary entityDictionary, ExtendedAuditLogger extendedAuditLogger) {
41-
RSQLFilterDialect rsqlFilterDialect = new RSQLFilterDialect(entityDictionary, new CaseSensitivityStrategy.UseColumnCollation());
45+
RSQLFilterDialect rsqlFilterDialect = new RSQLFilterDialect(entityDictionary, new CaseSensitivityStrategy.UseColumnCollation(), true);
4246

4347
registerAdditionalConverters();
4448

45-
return new Elide(new ElideSettingsBuilder(multiplexDataStore)
49+
final ElideSettings elideSettings = new ElideSettingsBuilder(multiplexDataStore)
4650
.withJsonApiMapper(new JsonApiMapper(objectMapper))
4751
.withAuditLogger(extendedAuditLogger)
4852
.withEntityDictionary(entityDictionary)
4953
.withJoinFilterDialect(rsqlFilterDialect)
5054
.withSubqueryFilterDialect(rsqlFilterDialect)
51-
.build());
55+
.build();
56+
return new Elide(elideSettings, new TransactionRegistry(), elideSettings.getDictionary().getScanner(), true);
5257
}
5358

5459
/**
@@ -81,7 +86,7 @@ public <T> T convert(Class<T> type, Object value) {
8186

8287
@Bean
8388
public EntityDictionary entityDictionary(AutowireCapableBeanFactory beanFactory) {
84-
final EntityDictionary entityDictionary = new EntityDictionary(Map.of(), new Injector() {
89+
final EntityDictionary entityDictionary = new EntityDictionary(Map.of(), Map.of(), new Injector() {
8590
@Override
8691
public void inject(Object entity) {
8792
beanFactory.autowireBean(entity);
@@ -91,7 +96,10 @@ public void inject(Object entity) {
9196
public <T> T instantiate(Class<T> cls) {
9297
return beanFactory.createBean(cls);
9398
}
94-
});
99+
},
100+
CoerceUtil::lookup,
101+
Set.of(),
102+
new DefaultClassScanner());
95103

96104
entityDictionary.scanForSecurityChecks();
97105

src/main/java/com/faforever/api/config/elide/SpringHibernateDataStore.java

Lines changed: 29 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -17,101 +17,40 @@
1717
package com.faforever.api.config.elide;
1818

1919
import com.google.common.base.Preconditions;
20-
import com.yahoo.elide.core.datastore.DataStore;
2120
import com.yahoo.elide.core.datastore.DataStoreTransaction;
22-
import com.yahoo.elide.core.dictionary.EntityDictionary;
23-
import com.yahoo.elide.core.utils.TypeHelper;
24-
import org.hibernate.ScrollMode;
21+
import com.yahoo.elide.datastores.jpa.JpaDataStore;
2522
import org.hibernate.Session;
26-
import org.slf4j.Logger;
27-
import org.slf4j.LoggerFactory;
2823
import org.springframework.transaction.PlatformTransactionManager;
2924
import org.springframework.transaction.TransactionDefinition;
3025
import org.springframework.transaction.TransactionStatus;
3126
import org.springframework.transaction.support.DefaultTransactionDefinition;
3227

3328
import javax.persistence.EntityManager;
34-
import javax.persistence.metamodel.EntityType;
35-
import java.util.Objects;
36-
import java.util.Set;
3729

38-
/**
39-
* Spring Hibernate DataStore.
40-
*
41-
* @author olOwOlo
42-
*/
43-
public class SpringHibernateDataStore implements DataStore {
44-
45-
private static final Logger logger = LoggerFactory.getLogger(SpringHibernateDataStore.class);
30+
public class SpringHibernateDataStore extends JpaDataStore {
4631

4732
protected final PlatformTransactionManager txManager;
4833
protected final EntityManager entityManager;
49-
protected final boolean isScrollEnabled;
50-
protected final ScrollMode scrollMode;
5134
protected final HibernateTransactionSupplier transactionSupplier;
5235

53-
/**
54-
* Constructor.
55-
*
56-
* @param txManager Spring PlatformTransactionManager
57-
* @param entityManager EntityManager
58-
* @param isScrollEnabled Whether or not scrolling is enabled on driver
59-
* @param scrollMode Scroll mode to use for scrolling driver
60-
*/
61-
public SpringHibernateDataStore(PlatformTransactionManager txManager,
62-
EntityManager entityManager,
63-
boolean isScrollEnabled,
64-
ScrollMode scrollMode) {
65-
this(txManager, entityManager, isScrollEnabled, scrollMode, SpringHibernateTransaction::new);
36+
public SpringHibernateDataStore(
37+
PlatformTransactionManager txManager,
38+
EntityManager entityManager
39+
) {
40+
this(txManager, entityManager, SpringHibernateTransaction::new);
6641
}
6742

68-
/**
69-
* <p>Constructor.</p>
70-
* Useful for extending the store and relying on existing code to instantiate custom hibernate transaction.
71-
*
72-
* @param txManager Spring PlatformTransactionManager
73-
* @param entityManager EntityManager factory
74-
* @param isScrollEnabled Whether or not scrolling is enabled on driver
75-
* @param scrollMode Scroll mode to use for scrolling driver
76-
* @param transactionSupplier Supplier for transaction
77-
*/
78-
protected SpringHibernateDataStore(PlatformTransactionManager txManager,
79-
EntityManager entityManager,
80-
boolean isScrollEnabled,
81-
ScrollMode scrollMode,
82-
HibernateTransactionSupplier transactionSupplier) {
43+
protected SpringHibernateDataStore(
44+
PlatformTransactionManager txManager,
45+
EntityManager entityManager,
46+
HibernateTransactionSupplier transactionSupplier
47+
) {
48+
super(() -> entityManager, null);
8349
this.txManager = txManager;
8450
this.entityManager = entityManager;
85-
this.isScrollEnabled = isScrollEnabled;
86-
this.scrollMode = scrollMode;
8751
this.transactionSupplier = transactionSupplier;
8852
}
8953

90-
@Override
91-
public void populateEntityDictionary(EntityDictionary dictionary) {
92-
Set<EntityType<?>> entities = entityManager.getMetamodel().getEntities();
93-
/* bind all entities */
94-
entities.stream()
95-
.map(EntityType::getJavaType)
96-
.filter(Objects::nonNull)
97-
.forEach(mappedClass -> {
98-
try {
99-
// Ignore this result.
100-
// We are just checking to see if it throws an exception meaning that
101-
// provided class was _not_ an entity.
102-
dictionary.lookupEntityClass(TypeHelper.getClassType(mappedClass));
103-
// Bind if successful
104-
dictionary.bindEntity(mappedClass);
105-
} catch (IllegalArgumentException e) {
106-
// Ignore this entity
107-
// Turns out that hibernate may include non-entity types in this list when using things
108-
// like envers. Since they are not entities, we do not want to bind them into the entity
109-
// dictionary
110-
logger.debug("Ignoring entity", e);
111-
}
112-
});
113-
}
114-
11554
@Override
11655
public DataStoreTransaction beginTransaction() {
11756
// begin a spring transaction
@@ -123,15 +62,28 @@ public DataStoreTransaction beginTransaction() {
12362
Session session = entityManager.unwrap(Session.class);
12463
Preconditions.checkNotNull(session);
12564

126-
return transactionSupplier.get(session, txManager, txStatus, isScrollEnabled, scrollMode);
65+
return transactionSupplier.get(session, txManager, txStatus);
66+
}
67+
68+
@Override
69+
public DataStoreTransaction beginReadTransaction() {
70+
// begin a spring transaction
71+
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
72+
def.setName("elide read transaction");
73+
def.setReadOnly(true);
74+
TransactionStatus txStatus = txManager.getTransaction(def);
75+
76+
Session session = entityManager.unwrap(Session.class);
77+
Preconditions.checkNotNull(session);
78+
79+
return transactionSupplier.get(session, txManager, txStatus);
12780
}
12881

12982
/**
13083
* Functional interface for describing a method to supply a custom Hibernate transaction.
13184
*/
13285
@FunctionalInterface
13386
public interface HibernateTransactionSupplier {
134-
SpringHibernateTransaction get(Session session, PlatformTransactionManager txManager,
135-
TransactionStatus txStatus, boolean isScrollEnabled, ScrollMode scrollMode);
87+
SpringHibernateTransaction get(Session session, PlatformTransactionManager txManager, TransactionStatus txStatus);
13688
}
13789
}

src/main/java/com/faforever/api/config/elide/SpringHibernateTransaction.java

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,45 +18,41 @@
1818

1919
import com.yahoo.elide.core.RequestScope;
2020
import com.yahoo.elide.core.exceptions.TransactionException;
21-
import com.yahoo.elide.datastores.hibernate5.HibernateTransaction;
22-
import org.hibernate.ScrollMode;
21+
import com.yahoo.elide.datastores.jpa.transaction.AbstractJpaTransaction;
22+
import com.yahoo.elide.datastores.jpql.query.DefaultQueryLogger;
2323
import org.hibernate.Session;
2424
import org.springframework.transaction.PlatformTransactionManager;
2525
import org.springframework.transaction.TransactionStatus;
2626

2727
import java.io.IOException;
2828

29-
/**
30-
* Spring Hibernate Transaction.
31-
*
32-
* @author olOwOlo
33-
*/
34-
public class SpringHibernateTransaction extends HibernateTransaction {
29+
public class SpringHibernateTransaction extends AbstractJpaTransaction {
3530

3631
private final Session session;
3732
private final TransactionStatus txStatus;
3833
private final PlatformTransactionManager txManager;
3934

40-
/**
41-
* Constructor.
42-
*
43-
* @param session Hibernate session
44-
* @param txManager Spring PlatformTransactionManager
45-
* @param txStatus Spring Transaction status
46-
* @param isScrollEnabled Whether or not scrolling is enabled
47-
* @param scrollMode Scroll mode to use if scrolling enabled
48-
*/
49-
protected SpringHibernateTransaction(Session session,
50-
PlatformTransactionManager txManager,
51-
TransactionStatus txStatus,
52-
boolean isScrollEnabled,
53-
ScrollMode scrollMode) {
54-
super(session, isScrollEnabled, scrollMode);
35+
protected SpringHibernateTransaction(
36+
Session session,
37+
PlatformTransactionManager txManager,
38+
TransactionStatus txStatus
39+
) {
40+
super(session, em -> em.unwrap(Session.class).cancelQuery(), new DefaultQueryLogger(), true, true);
5541
this.session = session;
5642
this.txManager = txManager;
5743
this.txStatus = txStatus;
5844
}
5945

46+
@Override
47+
public void begin() {
48+
//no op
49+
}
50+
51+
@Override
52+
public boolean isOpen() {
53+
return session.isOpen() && !txStatus.isCompleted();
54+
}
55+
6056
@Override
6157
public void commit(RequestScope scope) {
6258
try {
@@ -69,10 +65,9 @@ public void commit(RequestScope scope) {
6965

7066
@Override
7167
public void close() throws IOException {
72-
if (session.isOpen() && !txStatus.isCompleted()) {
68+
if (isOpen()) {
7369
txManager.rollback(txStatus);
7470
throw new IOException("Transaction not closed");
7571
}
7672
}
77-
7873
}

src/main/resources/config/application-local.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,3 @@ spring:
7474
logging:
7575
level:
7676
com.faforever.api: debug
77-

0 commit comments

Comments
 (0)