Polish to reslove BATCH-2606
This commit is contained in:
@@ -30,6 +30,7 @@ import org.springframework.cglib.proxy.MethodProxy;
|
||||
import org.springframework.data.domain.Sort;
|
||||
import org.springframework.data.repository.PagingAndSortingRepository;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
@@ -123,11 +124,14 @@ public class RepositoryItemReaderBuilder<T>
|
||||
}
|
||||
|
||||
/**
|
||||
* Specifies a repository and the type-safe method to call for the reader. This method
|
||||
* must take {@link org.springframework.data.domain.Pageable} as the <em>last</em>
|
||||
* argument. This method can be used in place of {@link #methodName(String)},
|
||||
* {@link #arguments(List)} and {@link #repository(PagingAndSortingRepository)}. The
|
||||
* repository that is used by the repositoryMethodReference must be non-final.
|
||||
* Specifies a repository and the type-safe method to call for the reader. The method
|
||||
* configured via this mechanism must take
|
||||
* {@link org.springframework.data.domain.Pageable} as the <em>last</em>
|
||||
* argument. This method can be used in place of {@link #repository(PagingAndSortingRepository)},
|
||||
* {@link #methodName(String)}, and {@link #arguments(List)}.
|
||||
*
|
||||
* Note: The repository that is used by the repositoryMethodReference must be
|
||||
* non-final.
|
||||
*
|
||||
* @param repositoryMethodReference of the used to get a repository and type-safe
|
||||
* method for use by the reader.
|
||||
@@ -151,7 +155,10 @@ public class RepositoryItemReaderBuilder<T>
|
||||
if (this.repositoryMethodReference != null) {
|
||||
this.methodName = this.repositoryMethodReference.getMethodName();
|
||||
this.repository = this.repositoryMethodReference.getRepository();
|
||||
this.arguments = this.repositoryMethodReference.getArguments();
|
||||
|
||||
if(CollectionUtils.isEmpty(this.arguments)) {
|
||||
this.arguments = this.repositoryMethodReference.getArguments();
|
||||
}
|
||||
}
|
||||
|
||||
Assert.notNull(this.sorts, "sorts map is required.");
|
||||
@@ -177,7 +184,8 @@ public class RepositoryItemReaderBuilder<T>
|
||||
/**
|
||||
* Establishes a proxy that will capture a the Repository and the associated
|
||||
* methodName that will be used by the reader.
|
||||
* @param <T> The type of repository that will be used by the reader.
|
||||
* @param <T> The type of repository that will be used by the reader. The class must
|
||||
* not be final.
|
||||
*/
|
||||
public static class RepositoryMethodReference<T> {
|
||||
private RepositoryMethodIterceptor repositoryInvocationHandler;
|
||||
@@ -201,15 +209,15 @@ public class RepositoryItemReaderBuilder<T>
|
||||
return (T) enhancer.create();
|
||||
}
|
||||
|
||||
public PagingAndSortingRepository<?, ?> getRepository() {
|
||||
PagingAndSortingRepository<?, ?> getRepository() {
|
||||
return this.repository;
|
||||
}
|
||||
|
||||
public String getMethodName() {
|
||||
String getMethodName() {
|
||||
return this.repositoryInvocationHandler.getMethodName();
|
||||
}
|
||||
|
||||
public List<Object> getArguments() {
|
||||
List<Object> getArguments() {
|
||||
return this.repositoryInvocationHandler.getArguments();
|
||||
}
|
||||
}
|
||||
@@ -231,11 +239,11 @@ public class RepositoryItemReaderBuilder<T>
|
||||
return null;
|
||||
}
|
||||
|
||||
public String getMethodName() {
|
||||
String getMethodName() {
|
||||
return this.methodName;
|
||||
}
|
||||
|
||||
public List<Object> getArguments() {
|
||||
List<Object> getArguments() {
|
||||
return arguments;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ public class RepositoryItemReaderBuilderTests {
|
||||
private static final String ARG2 = "bar";
|
||||
private static final String ARG3 = "baz";
|
||||
|
||||
public static final String TEST_CONTENT = "FOOBAR";
|
||||
private static final String TEST_CONTENT = "FOOBAR";
|
||||
|
||||
@Mock
|
||||
private TestRepository repository;
|
||||
@@ -57,18 +57,16 @@ public class RepositoryItemReaderBuilderTests {
|
||||
|
||||
private Map<String, Sort.Direction> sorts;
|
||||
|
||||
private List<String> testResult;
|
||||
|
||||
private ArgumentCaptor<PageRequest> pageRequestContainer;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
this.sorts = new HashMap<String, Sort.Direction>();
|
||||
this.sorts = new HashMap<>();
|
||||
this.sorts.put("id", Sort.Direction.ASC);
|
||||
this.pageRequestContainer = ArgumentCaptor.forClass(PageRequest.class);
|
||||
|
||||
testResult = new ArrayList<>();
|
||||
List<String> testResult = new ArrayList<>();
|
||||
testResult.add(TEST_CONTENT);
|
||||
when(page.getContent()).thenReturn(testResult);
|
||||
when(page.getSize()).thenReturn(5);
|
||||
@@ -77,8 +75,12 @@ public class RepositoryItemReaderBuilderTests {
|
||||
|
||||
@Test
|
||||
public void testBasicRead() throws Exception {
|
||||
RepositoryItemReader<Object> reader = new RepositoryItemReaderBuilder<Object>().repository(this.repository)
|
||||
.sorts(this.sorts).maxItemCount(5).methodName("foo").name("bar").build();
|
||||
RepositoryItemReader<Object> reader = new RepositoryItemReaderBuilder<>().repository(this.repository)
|
||||
.sorts(this.sorts)
|
||||
.maxItemCount(5)
|
||||
.methodName("foo")
|
||||
.name("bar")
|
||||
.build();
|
||||
String result = (String) reader.read();
|
||||
assertEquals("Result returned from reader was not expected value.", TEST_CONTENT, result);
|
||||
assertEquals("page size was not expected value.", 10, this.pageRequestContainer.getValue().getPageSize());
|
||||
@@ -86,10 +88,10 @@ public class RepositoryItemReaderBuilderTests {
|
||||
|
||||
@Test
|
||||
public void testRepositoryMethodReference() throws Exception {
|
||||
RepositoryItemReaderBuilder.RepositoryMethodReference<TestRepository> repositoryMethodReference = new RepositoryItemReaderBuilder.RepositoryMethodReference(
|
||||
this.repository);
|
||||
RepositoryItemReaderBuilder.RepositoryMethodReference<TestRepository> repositoryMethodReference =
|
||||
new RepositoryItemReaderBuilder.RepositoryMethodReference<>(this.repository);
|
||||
repositoryMethodReference.methodIs().foo(null);
|
||||
RepositoryItemReader<Object> reader = new RepositoryItemReaderBuilder<Object>()
|
||||
RepositoryItemReader<Object> reader = new RepositoryItemReaderBuilder<>()
|
||||
.repository(repositoryMethodReference)
|
||||
.sorts(this.sorts)
|
||||
.maxItemCount(5)
|
||||
@@ -101,10 +103,10 @@ public class RepositoryItemReaderBuilderTests {
|
||||
|
||||
@Test
|
||||
public void testRepositoryMethodReferenceWithArgs() throws Exception {
|
||||
RepositoryItemReaderBuilder.RepositoryMethodReference<TestRepository> repositoryMethodReference = new RepositoryItemReaderBuilder.RepositoryMethodReference(
|
||||
this.repository);
|
||||
RepositoryItemReaderBuilder.RepositoryMethodReference<TestRepository> repositoryMethodReference =
|
||||
new RepositoryItemReaderBuilder.RepositoryMethodReference<>(this.repository);
|
||||
repositoryMethodReference.methodIs().foo(ARG1, ARG2, ARG3, null);
|
||||
RepositoryItemReader<Object> reader = new RepositoryItemReaderBuilder<Object>()
|
||||
RepositoryItemReader<Object> reader = new RepositoryItemReaderBuilder<>()
|
||||
.repository(repositoryMethodReference)
|
||||
.sorts(this.sorts)
|
||||
.maxItemCount(5)
|
||||
@@ -122,15 +124,25 @@ public class RepositoryItemReaderBuilderTests {
|
||||
|
||||
@Test
|
||||
public void testCurrentItemCount() throws Exception {
|
||||
RepositoryItemReader<Object> reader = new RepositoryItemReaderBuilder<Object>().repository(this.repository)
|
||||
.sorts(this.sorts).currentItemCount(6).maxItemCount(5).methodName("foo").name("bar").build();
|
||||
RepositoryItemReader<Object> reader = new RepositoryItemReaderBuilder<>().repository(this.repository)
|
||||
.sorts(this.sorts)
|
||||
.currentItemCount(6)
|
||||
.maxItemCount(5)
|
||||
.methodName("foo")
|
||||
.name("bar")
|
||||
.build();
|
||||
assertNull("Result returned from reader was not null.", reader.read());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPageSize() throws Exception {
|
||||
RepositoryItemReader<Object> reader = new RepositoryItemReaderBuilder<Object>().repository(this.repository)
|
||||
.sorts(this.sorts).maxItemCount(5).methodName("foo").name("bar").pageSize(2).build();
|
||||
RepositoryItemReader<Object> reader = new RepositoryItemReaderBuilder<>().repository(this.repository)
|
||||
.sorts(this.sorts)
|
||||
.maxItemCount(5)
|
||||
.methodName("foo")
|
||||
.name("bar")
|
||||
.pageSize(2)
|
||||
.build();
|
||||
reader.read();
|
||||
assertEquals("page size was not expected value.", 2, this.pageRequestContainer.getValue().getPageSize());
|
||||
}
|
||||
@@ -138,7 +150,9 @@ public class RepositoryItemReaderBuilderTests {
|
||||
@Test
|
||||
public void testNoMethodName() throws Exception {
|
||||
try {
|
||||
new RepositoryItemReaderBuilder<Object>().repository(this.repository).sorts(this.sorts).maxItemCount(10)
|
||||
new RepositoryItemReaderBuilder<>().repository(this.repository)
|
||||
.sorts(this.sorts)
|
||||
.maxItemCount(10)
|
||||
.build();
|
||||
|
||||
fail("IllegalArgumentException should have been thrown");
|
||||
@@ -148,8 +162,11 @@ public class RepositoryItemReaderBuilderTests {
|
||||
"methodName is required.", iae.getMessage());
|
||||
}
|
||||
try {
|
||||
new RepositoryItemReaderBuilder<Object>().repository(this.repository).sorts(this.sorts).methodName("")
|
||||
.maxItemCount(5).build();
|
||||
new RepositoryItemReaderBuilder<>().repository(this.repository)
|
||||
.sorts(this.sorts)
|
||||
.methodName("")
|
||||
.maxItemCount(5)
|
||||
.build();
|
||||
|
||||
fail("IllegalArgumentException should have been thrown");
|
||||
}
|
||||
@@ -162,8 +179,11 @@ public class RepositoryItemReaderBuilderTests {
|
||||
@Test
|
||||
public void testSaveState() throws Exception {
|
||||
try {
|
||||
new RepositoryItemReaderBuilder<Object>().repository(repository).methodName("foo").sorts(sorts)
|
||||
.maxItemCount(5).build();
|
||||
new RepositoryItemReaderBuilder<>().repository(repository)
|
||||
.methodName("foo")
|
||||
.sorts(sorts)
|
||||
.maxItemCount(5)
|
||||
.build();
|
||||
|
||||
fail("IllegalArgumentException should have been thrown");
|
||||
}
|
||||
@@ -173,15 +193,21 @@ public class RepositoryItemReaderBuilderTests {
|
||||
}
|
||||
// No IllegalStateException for a name that is not set, should not be thrown since
|
||||
// saveState was false.
|
||||
new RepositoryItemReaderBuilder<Object>().repository(repository).saveState(false).methodName("foo").sorts(sorts)
|
||||
.maxItemCount(5).build();
|
||||
new RepositoryItemReaderBuilder<>().repository(repository)
|
||||
.saveState(false)
|
||||
.methodName("foo")
|
||||
.sorts(sorts)
|
||||
.maxItemCount(5)
|
||||
.build();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNullSort() throws Exception {
|
||||
try {
|
||||
new RepositoryItemReaderBuilder<Object>().repository(repository).methodName("foo")
|
||||
.maxItemCount(5).build();
|
||||
new RepositoryItemReaderBuilder<>().repository(repository)
|
||||
.methodName("foo")
|
||||
.maxItemCount(5)
|
||||
.build();
|
||||
|
||||
fail("IllegalArgumentException should have been thrown");
|
||||
}
|
||||
@@ -194,7 +220,10 @@ public class RepositoryItemReaderBuilderTests {
|
||||
@Test
|
||||
public void testNoRepository() throws Exception {
|
||||
try {
|
||||
new RepositoryItemReaderBuilder<Object>().sorts(this.sorts).maxItemCount(10).methodName("foo").build();
|
||||
new RepositoryItemReaderBuilder<>().sorts(this.sorts)
|
||||
.maxItemCount(10)
|
||||
.methodName("foo")
|
||||
.build();
|
||||
|
||||
fail("IllegalArgumentException should have been thrown");
|
||||
}
|
||||
@@ -216,18 +245,23 @@ public class RepositoryItemReaderBuilderTests {
|
||||
when(this.repository.foo(arg1Captor.capture(), arg2Captor.capture(), arg3Captor.capture(),
|
||||
this.pageRequestContainer.capture())).thenReturn(this.page);
|
||||
|
||||
RepositoryItemReader<Object> reader = new RepositoryItemReaderBuilder<Object>().repository(this.repository)
|
||||
.sorts(this.sorts).maxItemCount(5).methodName("foo").name("bar").arguments(args).build();
|
||||
RepositoryItemReader<Object> reader = new RepositoryItemReaderBuilder<>().repository(this.repository)
|
||||
.sorts(this.sorts)
|
||||
.maxItemCount(5)
|
||||
.methodName("foo")
|
||||
.name("bar")
|
||||
.arguments(args)
|
||||
.build();
|
||||
|
||||
String result = (String) reader.read();
|
||||
verifyMultiArgRead(arg1Captor, arg2Captor, arg3Captor, result);
|
||||
}
|
||||
|
||||
public static interface TestRepository extends PagingAndSortingRepository<Object, Integer> {
|
||||
public interface TestRepository extends PagingAndSortingRepository<Object, Integer> {
|
||||
|
||||
public Object foo(PageRequest request);
|
||||
Object foo(PageRequest request);
|
||||
|
||||
public Object foo(String arg1, String arg2, String arg3, PageRequest request);
|
||||
Object foo(String arg1, String arg2, String arg3, PageRequest request);
|
||||
}
|
||||
|
||||
private void verifyMultiArgRead(ArgumentCaptor<String> arg1Captor, ArgumentCaptor<String> arg2Captor, ArgumentCaptor<String> arg3Captor, String result) {
|
||||
|
||||
Reference in New Issue
Block a user