From 5c404c26fcc10fa84bcc8d93ccd880bfaa8982a1 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Tue, 26 Jul 2016 14:42:48 +0200 Subject: [PATCH] #55 - Added support for changing the sort direction when accessing revisions. We now make use of the RevisionSort type introduced in Spring Data Commons [0] to determine the order of the revisions to be read. [0] https://jira.spring.io/browse/DATACMNS-888 --- .../support/EnversRevisionRepositoryImpl.java | 20 +++++++++---- .../support/RepositoryIntegrationTests.java | 30 +++++++++++++++++-- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/springframework/data/envers/repository/support/EnversRevisionRepositoryImpl.java b/src/main/java/org/springframework/data/envers/repository/support/EnversRevisionRepositoryImpl.java index 4971fea..2b35466 100755 --- a/src/main/java/org/springframework/data/envers/repository/support/EnversRevisionRepositoryImpl.java +++ b/src/main/java/org/springframework/data/envers/repository/support/EnversRevisionRepositoryImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,6 +37,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.history.AnnotationRevisionMetadata; import org.springframework.data.history.Revision; import org.springframework.data.history.RevisionMetadata; +import org.springframework.data.history.RevisionSort; import org.springframework.data.history.Revisions; import org.springframework.data.jpa.repository.support.JpaEntityInformation; import org.springframework.data.jpa.repository.support.SimpleJpaRepository; @@ -51,8 +52,8 @@ import org.springframework.util.Assert; * @author Philipp Huegelmeyer * @author Michael Igler */ -public class EnversRevisionRepositoryImpl> extends - SimpleJpaRepository implements EnversRevisionRepository { +public class EnversRevisionRepositoryImpl> + extends SimpleJpaRepository implements EnversRevisionRepository { private final EntityInformation entityInformation; private final RevisionEntityInformation revisionEntityInformation; @@ -127,8 +128,8 @@ public class EnversRevisionRepositoryImpl revisionNumbers = reader.getRevisions(type, id); - return revisionNumbers.isEmpty() ? new Revisions(Collections.EMPTY_LIST) : getEntitiesForRevisions( - (List) revisionNumbers, id, reader); + return revisionNumbers.isEmpty() ? new Revisions(Collections.EMPTY_LIST) + : getEntitiesForRevisions((List) revisionNumbers, id, reader); } /* @@ -141,9 +142,14 @@ public class EnversRevisionRepositoryImpl type = entityInformation.getJavaType(); AuditReader reader = AuditReaderFactory.get(entityManager); List revisionNumbers = reader.getRevisions(type, id); + boolean isDescending = RevisionSort.getRevisionDirection(pageable.getSort()).isDescending(); + + if (isDescending) { + Collections.reverse(revisionNumbers); + } if (pageable.getOffset() > revisionNumbers.size()) { - return new PageImpl>(Collections.> emptyList(), pageable, 0); + return new PageImpl>(Collections.>emptyList(), pageable, 0); } int upperBound = pageable.getOffset() + pageable.getPageSize(); @@ -152,6 +158,8 @@ public class EnversRevisionRepositoryImpl subList = revisionNumbers.subList(pageable.getOffset(), upperBound); Revisions revisions = getEntitiesForRevisions((List) subList, id, reader); + revisions = isDescending ? revisions.reverse() : revisions; + return new PageImpl>(revisions.getContent(), pageable, revisionNumbers.size()); } diff --git a/src/test/java/org/springframework/data/envers/repository/support/RepositoryIntegrationTests.java b/src/test/java/org/springframework/data/envers/repository/support/RepositoryIntegrationTests.java index e59070a..b73486d 100755 --- a/src/test/java/org/springframework/data/envers/repository/support/RepositoryIntegrationTests.java +++ b/src/test/java/org/springframework/data/envers/repository/support/RepositoryIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2014 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import static org.junit.Assert.*; import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import org.hamcrest.Matchers; import org.junit.Before; @@ -35,6 +36,7 @@ import org.springframework.data.envers.sample.CountryRepository; import org.springframework.data.envers.sample.License; import org.springframework.data.envers.sample.LicenseRepository; import org.springframework.data.history.Revision; +import org.springframework.data.history.RevisionSort; import org.springframework.data.history.Revisions; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -117,7 +119,7 @@ public class RepositoryIntegrationTests { Revisions revisions = countryRepository.findRevisions(de.id); - assertThat(revisions, is(Matchers.> iterableWithSize(2))); + assertThat(revisions, is(Matchers.>iterableWithSize(2))); Iterator> iterator = revisions.iterator(); Revision first = iterator.next(); @@ -126,4 +128,28 @@ public class RepositoryIntegrationTests { assertThat(countryRepository.findRevision(de.id, first.getRevisionNumber()).getEntity().name, is("Deutschland")); assertThat(countryRepository.findRevision(de.id, second.getRevisionNumber()).getEntity().name, is("Germany")); } + + /** + * @see #55 + */ + @Test + public void considersRevisionNumberSortOrder() { + + Country de = new Country(); + de.code = "de"; + de.name = "Deutschland"; + + countryRepository.save(de); + + de.name = "Germany"; + + countryRepository.save(de); + + List> content = countryRepository + .findRevisions(de.id, new PageRequest(0, 10, RevisionSort.desc())).getContent(); + + assertThat(content, hasSize(2)); + assertThat(content.get(0).getRevisionNumber(), is(2)); + assertThat(content.get(1).getRevisionNumber(), is(1)); + } }