RepositoryItemReader<T> reader = new RepositoryItemReader<>(); reader.setArguments(this.arguments); reader.setRepository(this.repository); reader.setMethodName(this.methodName); reader.setPageSize(this.pageSize); reader.setCurrentItemCount(this.currentItemCount); reader.setMaxItemCount(this.maxItemCount); reader.setSaveState(this.saveState); reader.setSort(this.sorts); reader.setName(this.name); return reader;
@Override protected void jumpToItem(int itemLastIndex) throws Exception { synchronized (lock) { page = (itemLastIndex - 1) / pageSize; current = (itemLastIndex - 1) % pageSize; results = doPageRead(); page++; } }
/** * Provides ordering of the results so that order is maintained between paged queries * * @param sorts the fields to sort by and the directions */ public void setSort(Map<String, Sort.Direction> sorts) { this.sort = convertToSort(sorts); }
@Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); sorts = new HashMap<>(); sorts.put("id", Direction.ASC); reader = new RepositoryItemReader<>(); reader.setRepository(repository); reader.setPageSize(1); reader.setSort(sorts); reader.setMethodName("findAll"); }
/** * Performs the actual reading of a page via the repository. * Available for overriding as needed. * * @return the list of items that make up the page * @throws Exception Based on what the underlying method throws or related to the * calling of the method */ @SuppressWarnings("unchecked") protected List<T> doPageRead() throws Exception { Pageable pageRequest = PageRequest.of(page, pageSize, sort); MethodInvoker invoker = createMethodInvoker(repository, methodName); List<Object> parameters = new ArrayList<>(); if(arguments != null && arguments.size() > 0) { parameters.addAll(arguments); } parameters.add(pageRequest); invoker.setArguments(parameters.toArray()); Page<T> curPage = (Page<T>) doInvoke(invoker); return curPage.getContent(); }
@Test public void testAfterPropertiesSet() throws Exception { try { new RepositoryItemReader<>().afterPropertiesSet(); fail(); } catch (IllegalStateException e) { reader = new RepositoryItemReader<>(); reader.setRepository(repository); reader.afterPropertiesSet(); fail(); } catch (IllegalStateException iae) { reader = new RepositoryItemReader<>(); reader.setRepository(repository); reader.setPageSize(-1); reader.afterPropertiesSet(); fail(); } catch (IllegalStateException iae) { reader = new RepositoryItemReader<>(); reader.setRepository(repository); reader.setPageSize(1); reader.afterPropertiesSet(); fail(); } catch (IllegalStateException iae) { reader = new RepositoryItemReader<>(); reader.setRepository(repository); reader.setPageSize(1);
@Test public void testSettingCurrentItemCountRestart() throws Exception { reader.setCurrentItemCount(3); reader.setPageSize(2); PageRequest request = PageRequest.of(1, 2, new Sort(Direction.ASC, "id")); when(repository.findAll(request)).thenReturn(new PageImpl<>(new ArrayList<Object>(){{ add("3"); add("4"); }})); request = PageRequest.of(2, 2, new Sort(Direction.ASC, "id")); when(repository.findAll(request)).thenReturn(new PageImpl<>(new ArrayList<Object>() {{ add("5"); add("6"); }})); ExecutionContext executionContext = new ExecutionContext(); reader.open(executionContext); Object result = reader.read(); reader.update(executionContext); reader.close(); assertEquals("3", result); reader.open(executionContext); assertEquals("4", reader.read()); assertEquals("5", reader.read()); assertEquals("6", reader.read()); }
@Test public void testSettingCurrentItemCountExplicitly() throws Exception { reader.setCurrentItemCount(3); reader.setPageSize(2); PageRequest request = PageRequest.of(1, 2, new Sort(Direction.ASC, "id")); when(repository.findAll(request)).thenReturn(new PageImpl<>(new ArrayList<Object>() {{ add("3"); add("4"); }})); request = PageRequest.of(2, 2, new Sort(Direction.ASC, "id")); when(repository.findAll(request)).thenReturn(new PageImpl<>(new ArrayList<Object>(){{ add("5"); add("6"); }})); reader.open(new ExecutionContext()); Object result = reader.read(); assertEquals("3", result); assertEquals("4", reader.read()); assertEquals("5", reader.read()); assertEquals("6", reader.read()); }
@Test public void testInvalidMethodName() throws Exception { reader.setMethodName("thisMethodDoesNotExist"); try { reader.doPageRead(); fail(); } catch (DynamicMethodInvocationException dmie) { assertTrue(dmie.getCause() instanceof NoSuchMethodException); } }
@Test public void testResetOfPage() throws Exception { reader.setPageSize(2); PageRequest request = PageRequest.of(0, 2, new Sort(Direction.ASC, "id")); when(repository.findAll(request)).thenReturn(new PageImpl<>(new ArrayList<Object>(){{ add("1"); add("2"); }})); request = PageRequest.of(1, 2, new Sort(Direction.ASC, "id")); when(repository.findAll(request)).thenReturn(new PageImpl<>(new ArrayList<Object>() {{ add("3"); add("4"); }})); ExecutionContext executionContext = new ExecutionContext(); reader.open(executionContext); Object result = reader.read(); reader.close(); assertEquals("1", result); reader.open(executionContext); assertEquals("1", reader.read()); assertEquals("2", reader.read()); assertEquals("3", reader.read()); }
@Test @SuppressWarnings("serial") public void testJumpToItem() throws Exception { reader.setPageSize(100); ArgumentCaptor<PageRequest> pageRequestContainer = ArgumentCaptor.forClass(PageRequest.class); when(repository.findAll(pageRequestContainer.capture())).thenReturn(new PageImpl<>(new ArrayList<Object>() {{ add(new Object()); }})); reader.jumpToItem(485); Pageable pageRequest = pageRequestContainer.getValue(); assertEquals(400, pageRequest.getOffset()); assertEquals(4, pageRequest.getPageNumber()); assertEquals(100, pageRequest.getPageSize()); assertEquals("id: ASC", pageRequest.getSort().toString()); }
@Test public void testDifferentTypes() throws Exception { TestRepository differentRepository = mock(TestRepository.class); RepositoryItemReader<String> reader = new RepositoryItemReader<>(); sorts = new HashMap<>(); sorts.put("id", Direction.ASC); reader.setRepository(differentRepository); reader.setPageSize(1); reader.setSort(sorts); reader.setMethodName("findFirstNames"); ArgumentCaptor<PageRequest> pageRequestContainer = ArgumentCaptor.forClass(PageRequest.class); when(differentRepository.findFirstNames(pageRequestContainer.capture())).thenReturn(new PageImpl<>(new ArrayList<String>(){{ add("result"); }})); assertEquals("result", reader.doRead()); Pageable pageRequest = pageRequestContainer.getValue(); assertEquals(0, pageRequest.getOffset()); assertEquals(0, pageRequest.getPageNumber()); assertEquals(1, pageRequest.getPageSize()); assertEquals("id: ASC", pageRequest.getSort().toString()); }
/** * Performs the actual reading of a page via the repository. * Available for overriding as needed. * * @return the list of items that make up the page * @throws Exception Based on what the underlying method throws or related to the * calling of the method */ @SuppressWarnings("unchecked") protected List<T> doPageRead() throws Exception { Pageable pageRequest = PageRequest.of(page, pageSize, sort); MethodInvoker invoker = createMethodInvoker(repository, methodName); List<Object> parameters = new ArrayList<>(); if(arguments != null && arguments.size() > 0) { parameters.addAll(arguments); } parameters.add(pageRequest); invoker.setArguments(parameters.toArray()); Page<T> curPage = (Page<T>) doInvoke(invoker); return curPage.getContent(); }
RepositoryItemReader<T> reader = new RepositoryItemReader<>(); reader.setArguments(this.arguments); reader.setRepository(this.repository); reader.setMethodName(this.methodName); reader.setPageSize(this.pageSize); reader.setCurrentItemCount(this.currentItemCount); reader.setMaxItemCount(this.maxItemCount); reader.setSaveState(this.saveState); reader.setSort(this.sorts); reader.setName(this.name); return reader;
@Override protected T doRead() throws Exception { synchronized (lock) { if(results == null || current >= results.size()) { if (logger.isDebugEnabled()) { logger.debug("Reading page " + page); } results = doPageRead(); current = 0; page ++; if(results.size() <= 0) { return null; } } if(current < results.size()) { T curLine = results.get(current); current++; return curLine; } else { return null; } } }
/** * Provides ordering of the results so that order is maintained between paged queries * * @param sorts the fields to sort by and the directions */ public void setSort(Map<String, Sort.Direction> sorts) { this.sort = convertToSort(sorts); }
@Override protected void jumpToItem(int itemLastIndex) throws Exception { synchronized (lock) { page = (itemLastIndex - 1) / pageSize; current = (itemLastIndex - 1) % pageSize; results = doPageRead(); page++; } }
@Override protected T doRead() throws Exception { synchronized (lock) { if(results == null || current >= results.size()) { if (logger.isDebugEnabled()) { logger.debug("Reading page " + page); } results = doPageRead(); current = 0; page ++; if(results.size() <= 0) { return null; } } if(current < results.size()) { T curLine = results.get(current); current++; return curLine; } else { return null; } } }