8000 #291 make the behaviour customizable, defaulting to the old one · arangodb/spring-data@d5bf13c · GitHub
[go: up one dir, main page]

Skip to content

Commit d5bf13c

Browse files
committed
#291 make the behaviour customizable, defaulting to the old one
1 parent 58c2ce8 commit d5bf13c

File tree

5 files changed

+111
-30
lines changed

5 files changed

+111
-30
lines changed

src/main/java/com/arangodb/springframework/repository/ArangoRepositoryFactory.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ public class ArangoRepositoryFactory extends RepositoryFactorySupport {
5959

6060
private final ArangoOperations arangoOperations;
6161
private final ApplicationContext applicationContext;
62+
private boolean returnOriginalEntities = true;
6263
private final MappingContext<? extends ArangoPersistentEntity<?>, ArangoPersistentProperty> context;
6364

6465
public ArangoRepositoryFactory(final ArangoOperations arangoOperations, final ApplicationContext applicationContext) {
@@ -74,10 +75,21 @@ public <T, ID> ArangoEntityInformation<T, ID> getEntityInformation(final Class<T
7475
(ArangoPersistentEntity<T>) context.getRequiredPersistentEntity(domainClass));
7576
}
7677

78+
/**
79+
* Change the behaviour of {@link org.springframework.data.repository.CrudRepository#save(Object)} and
80+
* {@link org.springframework.data.repository.CrudRepository#saveAll(Iterable)} to either return the original
81+
* entities passed or those returned from the server using proxies for lazy evaluation.
82+
*
83+
* @see org.springframework.data.repository.core.support.RepositoryFactoryCustomizer
84+
*/
85+
public void setReturnOriginalEntities(boolean returnOriginalEntities) {
86+
this.returnOriginalEntities = returnOriginalEntities;
87+
}
88+
7789
@SuppressWarnings({ "rawtypes", "unchecked" })
7890
@Override
7991
protected Object getTargetRepository(final RepositoryInformation metadata) {
80-
return new SimpleArangoRepository(arangoOperations, metadata.getDomainType());
92+
return new SimpleArangoRepository(arangoOperations, metadata.getDomainType(), returnOriginalEntities);
8193
}
8294

8395
@Override

src/main/java/com/arangodb/springframework/repository/SimpleArangoRepository.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,17 +51,20 @@ public class SimpleArangoRepository<T, ID> implements ArangoRepository<T, ID> {
5151
private final ArangoMappingContext mappingContext;
5252
private final ArangoExampleConverter exampleConverter;
5353
private final Class<T> domainClass;
54+
private final boolean returnOriginalEnties;
5455

5556
/**
56-
*
57-
* @param arangoOperations The template used to execute much of the
58-
* functionality of this class
59-
* @param domainClass the class type of this repository
57+
* @param arangoOperations The template used to execute much of the
58+
* functionality of this class
59+
* @param domainClass the class type of this repository
60+
* @param returnOriginalEnties whether save and saveAll should return the
61+
* original entities passed or the server ones
6062
*/
61-
public SimpleArangoRepository(final ArangoOperations arangoOperations, final Class<T> domainClass) {
63+
public SimpleArangoRepository(final ArangoOperations arangoOperations, final Class<T> domainClass, boolean returnOriginalEnties) {
6264
super();
6365
this.arangoOperations = arangoOperations;
6466
this.domainClass = domainClass;
67+
this.returnOriginalEnties = returnOriginalEnties;
6568
mappingContext = (ArangoMappingContext) arangoOperations.getConverter().getMappingContext();
6669
exampleConverter = new ArangoExampleConverter(mappingContext, arangoOperations.getResolverFactory());
6770
}
@@ -74,7 +77,8 @@ public SimpleArangoRepository(final ArangoOperations arangoOperations, final Cla
7477
*/
7578
@Override
7679
public <S extends T> S save(final S entity) {
77-
return arangoOperations.repsert(entity);
80+
S saved = arangoOperations.repsert(entity);
81+
return returnOriginalEnties ? entity : saved;
7882
}
7983

8084
/**
@@ -86,7 +90,8 @@ public <S extends T> S save(final S entity) {
8690
*/
8791
@Override
8892
public <S extends T> Iterable<S> saveAll(final Iterable<S> entities) {
89-
return arangoOperations.repsertAll(entities, domainClass);
93+
Iterable<S> saved = arangoOperations.repsertAll(entities, domainClass);
94+
return returnOriginalEnties ? entities : saved;
9095
}
9196

9297
/**

src/test/java/com/arangodb/springframework/AbstractArangoTest.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,15 @@
2222

2323
import org.junit.jupiter.api.AfterAll;
2424
import org.junit.jupiter.api.BeforeEach;
25-
import org.junit.jupiter.api.extension.ExtendWith;
2625
import org.springframework.beans.factory.annotation.Autowired;
27-
import org.springframework.test.context.ContextConfiguration;
28-
import org.springframework.test.context.junit.jupiter.SpringExtension;
2926

3027
import com.arangodb.springframework.core.ArangoOperations;
28+
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
3129

3230
/**
3331
* @author Mark Vollmary
3432
*/
35-
@ExtendWith(SpringExtension.class)
36-
@ContextConfiguration(classes = { ArangoTestConfiguration.class })
33+
@SpringJUnitConfig(ArangoTestConfiguration.class)
3734
public abstract class AbstractArangoTest {
3835

3936
private static volatile ArangoOperations staticTemplate;

src/test/java/com/arangodb/springframework/ArangoTestConfiguration.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,18 @@
2626
import com.arangodb.springframework.annotation.EnableArangoRepositories;
2727
import com.arangodb.springframework.config.ArangoConfiguration;
2828
import com.arangodb.springframework.core.mapping.CustomMappingTest;
29+
import com.arangodb.springframework.repository.ArangoRepositoryFactory;
2930
import com.arangodb.springframework.testdata.Person;
31+
import org.springframework.beans.BeansException;
32+
import org.springframework.beans.factory.config.BeanPostProcessor;
3033
import org.springframework.context.annotation.Bean;
3134
import org.springframework.context.annotation.ComponentScan;
3235
import org.springframework.context.annotation.Configuration;
3336
import org.springframework.core.convert.converter.Converter;
37+
import org.springframework.core.env.Environment;
3438
import org.springframework.data.domain.AuditorAware;
39+
import org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport;
40+
import org.springframework.data.repository.core.support.RepositoryFactoryCustomizer;
3541

3642
import java.util.ArrayList;
3743
import java.util.Collection;
@@ -77,4 +83,22 @@ public String database() {
7783
public AuditorAware<Person> auditorProvider() {
7884
return new AuditorProvider();
7985
}
86+
87+
@Bean
88+
public BeanPostProcessor repositoryFactoryCustomizerRegistrar(Environment env) {
89+
boolean returnOriginalEntities = env.getProperty("returnOriginalEntities", Boolean.class, true);
90+
return new BeanPostProcessor() {
91+
@Override
92+
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
93+
if (bean instanceof RepositoryFactoryBeanSupport<?, ?, ?> repoFactoryBean) {
94+
repoFactoryBean.addRepositoryFactoryCustomizer(repositoryFactoryCustomizer(returnOriginalEntities));
95+
}
96+
return bean;
97+
}
98+
};
99+
}
100+
101+
private static RepositoryFactoryCustomizer repositoryFactoryCustomizer(boolean returnOriginalEntities) {
102+
return factory -> ((ArangoRepositoryFactory) factory).setReturnOriginalEntities(returnOriginalEntities);
103+
}
80104
}

src/test/java/com/arangodb/springframework/repository/ArangoRepositoryTest.java

Lines changed: 60 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,80 @@
66
import java.util.*;
77

88
import org.hamcrest.Matchers;
9+
import org.junit.jupiter.api.Nested;
910
import org.junit.jupiter.api.Test;
11+
import org.springframework.beans.factory.annotation.Autowired;
1012
import org.springframework.data.domain.*;
1113
import org.springframework.data.domain.ExampleMatcher.StringMatcher;
1214

1315
import com.arangodb.springframework.testdata.Address;
1416
import com.arangodb.springframework.testdata.Customer;
1517
import com.arangodb.springframework.testdata.ShoppingCart;
1618
import org.springframework.data.util.Streamable;
19+
import org.springframework.test.context.ActiveProfiles;
20+
import org.springframework.test.context.TestPropertySource;
1721

1822
/**
1923
* Created by F625633 on 06/07/2017.
2024
*/
2125
public class ArangoRepositoryTest extends AbstractArangoRepositoryTest {
2226

23-
@Test
24-
public void saveTest() {
25-
Customer res = repository.save(john);
26-
assertThat(res, not(sameInstance(john)));
27-
assertThat(res.getId(), is(notNullValue()));
28-
assertThat(res.getId(), equalTo(john.getId()));
27+
@Nested
28+
public class ReturnOriginalEntities {
29+
30+
@Autowired
31+
protected CustomerRepository repository;
32+
33+
@Test
34+
public void saveTest() {
35+
Customer res = repository.save(john);
36+
assertThat(res, sameInstance(john));
37+
assertThat(res.getId(), is(notNullValue()));
38+
assertThat(res.getId(), equalTo(john.getId()));
39+
}
40+
41+
@Test
42+
public void saveAllTest() {
43+
Iterable<Customer> res = repository.saveAll(customers);
44+
Iterator<Customer> cIt = customers.iterator();
45+
for (Customer re : res) {
46+
assertThat(re, sameInstance(cIt.next()));
47+
}
48+
Iterable<Customer> docs = repository.findAll();
49+
docs.forEach(d -> d.setName("saveAllTest"));
50+
repository.saveAll(docs);
51+
repository.findAll().forEach(it -> assertThat("name does not match", it.getName(), equalTo("saveAllTest")));
52+
}
53+
}
54+
55+
@Nested
56+
@TestPropertySource(properties = "returnOriginalEntities=false")
57+
public class ReturnServerResult {
58+
59+
@Autowired
60+
protected CustomerRepository repository;
61+
62+
@Test
63+
public void saveTest() {
64+
Customer res = repository.save(john);
65+
assertThat(res, not(sameInstance(john)));
66+
assertThat(res.getId(), is(notNullValue()));
67+
assertThat(res.getId(), equalTo(john.getId()));
68+
}
69+
70+
@Test
71+
public void saveAllTest() {
72+
List<Customer> res = Streamable.of(repository.saveAll(customers)).toList();
73+
assertThat(res, Matchers.hasSize(customers.size()));
74+
assertThat(res, Matchers.hasItems(customers.toArray(Customer[]::new)));
75+
for (Customer original : customers) {
76+
assertThat(res, everyItem(not(sameInstance(original))));
77+
}
78+
Iterable<Customer> docs = repository.findAll();
79+
docs.forEach(d -> d.setName("saveAllTest"));
80+
repository.saveAll(docs);
81+
repository.findAll().forEach(it -> assertThat("name does not match", it.getName(), equalTo("saveAllTest")));
82+
}
2983
}
3084

3185
@Test
@@ -40,17 +94,6 @@ public void findOneTest() {
4094
assertThat("customers do not match", customer, equalTo(john));
4195
}
4296

43-
@Test
44-
public void saveAllTest() {
45-
List<Customer> res = Streamable.of(repository.saveAll(customers)).toList();
46-
assertThat(res, Matchers.hasSize(customers.size()));
47-
assertThat(res, Matchers.hasItems(customers.toArray(Customer[]::new)));
48-
Iterable<Customer> docs = repository.findAll();
49-
docs.forEach(d -> d.setName("saveAllTest"));
50-
repository.saveAll(docs);
51-
repository.findAll().forEach(it -> assertThat("name does not match", it.getName(), equalTo("saveAllTest")));
52-
}
53-
5497
@Test
5598
public void findAllByIterableTest() {
5699
repository.saveAll(customers);

0 commit comments

Comments
 (0)
0