From ed1417b2ead248da774eb3b665cd8dff12b811db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Fri, 22 Jun 2018 08:18:43 +0200 Subject: [PATCH 1/5] Replace guice inject with javax --- .../sonia/scm/api/v2/resources/GroupCollectionResource.java | 2 +- .../java/sonia/scm/api/v2/resources/GroupToGroupDtoMapper.java | 2 +- .../main/java/sonia/scm/api/v2/resources/GroupV2Resource.java | 3 +-- .../sonia/scm/api/v2/resources/UserCollectionResource.java | 2 +- .../java/sonia/scm/api/v2/resources/UserDtoToUserMapper.java | 3 ++- .../src/main/java/sonia/scm/api/v2/resources/UserResource.java | 2 +- .../main/java/sonia/scm/api/v2/resources/UserRootResource.java | 3 +-- .../java/sonia/scm/api/v2/resources/UserToUserDtoMapper.java | 3 ++- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupCollectionResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupCollectionResource.java index 930641d4ce..056938a381 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupCollectionResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupCollectionResource.java @@ -1,6 +1,5 @@ package sonia.scm.api.v2.resources; -import com.google.inject.Inject; import com.webcohesion.enunciate.metadata.rs.ResponseCode; import com.webcohesion.enunciate.metadata.rs.ResponseHeader; import com.webcohesion.enunciate.metadata.rs.StatusCodes; @@ -12,6 +11,7 @@ import sonia.scm.group.GroupException; import sonia.scm.group.GroupManager; import sonia.scm.web.VndMediaType; +import javax.inject.Inject; import javax.ws.rs.Consumes; import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupToGroupDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupToGroupDtoMapper.java index 8baafdc2b8..d439a148fa 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupToGroupDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupToGroupDtoMapper.java @@ -1,6 +1,5 @@ package sonia.scm.api.v2.resources; -import com.google.inject.Inject; import de.otto.edison.hal.Links; import org.mapstruct.AfterMapping; import org.mapstruct.Mapper; @@ -8,6 +7,7 @@ import org.mapstruct.MappingTarget; import sonia.scm.group.Group; import sonia.scm.group.GroupPermissions; +import javax.inject.Inject; import java.util.List; import java.util.stream.Collectors; diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupV2Resource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupV2Resource.java index a56fca3ad5..99227651c4 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupV2Resource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupV2Resource.java @@ -1,7 +1,6 @@ package sonia.scm.api.v2.resources; -import com.google.inject.Inject; - +import javax.inject.Inject; import javax.ws.rs.Path; @Path(GroupV2Resource.GROUPS_PATH_V2) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserCollectionResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserCollectionResource.java index f31c08c6c7..7d6ef89909 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserCollectionResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserCollectionResource.java @@ -1,6 +1,5 @@ package sonia.scm.api.v2.resources; -import com.google.inject.Inject; import com.webcohesion.enunciate.metadata.rs.ResponseCode; import com.webcohesion.enunciate.metadata.rs.ResponseHeader; import com.webcohesion.enunciate.metadata.rs.StatusCodes; @@ -12,6 +11,7 @@ import sonia.scm.user.UserException; import sonia.scm.user.UserManager; import sonia.scm.web.VndMediaType; +import javax.inject.Inject; import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; import javax.ws.rs.POST; diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserDtoToUserMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserDtoToUserMapper.java index 55ae67f22b..115ff3dcd5 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserDtoToUserMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserDtoToUserMapper.java @@ -1,6 +1,5 @@ package sonia.scm.api.v2.resources; -import com.google.inject.Inject; import org.apache.shiro.authc.credential.PasswordService; import org.mapstruct.Context; import org.mapstruct.Mapper; @@ -9,6 +8,8 @@ import org.mapstruct.Mappings; import org.mapstruct.Named; import sonia.scm.user.User; +import javax.inject.Inject; + import static sonia.scm.api.rest.resources.UserResource.DUMMY_PASSWORT; @Mapper diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserResource.java index ebfbdda6f1..ed0b8cdc77 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserResource.java @@ -1,6 +1,5 @@ package sonia.scm.api.v2.resources; -import com.google.inject.Inject; import com.webcohesion.enunciate.metadata.rs.ResponseCode; import com.webcohesion.enunciate.metadata.rs.StatusCodes; import com.webcohesion.enunciate.metadata.rs.TypeHint; @@ -10,6 +9,7 @@ import sonia.scm.user.UserException; import sonia.scm.user.UserManager; import sonia.scm.web.VndMediaType; +import javax.inject.Inject; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.PUT; diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserRootResource.java index 87b776ca66..7f3972dce2 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserRootResource.java @@ -1,7 +1,6 @@ package sonia.scm.api.v2.resources; -import com.google.inject.Inject; - +import javax.inject.Inject; import javax.inject.Provider; import javax.ws.rs.Path; diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserToUserDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserToUserDtoMapper.java index ed1dbf0e60..66e3d57fb1 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserToUserDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserToUserDtoMapper.java @@ -1,6 +1,5 @@ package sonia.scm.api.v2.resources; -import com.google.inject.Inject; import de.otto.edison.hal.Links; import org.mapstruct.AfterMapping; import org.mapstruct.Mapper; @@ -9,6 +8,8 @@ import sonia.scm.api.rest.resources.UserResource; import sonia.scm.user.User; import sonia.scm.user.UserPermissions; +import javax.inject.Inject; + import static de.otto.edison.hal.Link.link; import static de.otto.edison.hal.Links.linkingTo; import static sonia.scm.api.v2.resources.ResourceLinks.user; From 5836688f30b6481b38e1bcae8421822cd6dbc62e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Fri, 22 Jun 2018 08:28:18 +0200 Subject: [PATCH 2/5] Rename group resource classes --- ...{GroupSubResource.java => GroupResource.java} | 4 ++-- ...oupV2Resource.java => GroupRootResource.java} | 14 +++++++------- .../scm/api/v2/resources/ResourceLinks.java | 10 +++++----- .../GroupCollectionToDtoMapperTest.java | 2 +- ...ourceTest.java => GroupRootResourceTest.java} | 16 ++++++++-------- .../v2/resources/GroupToGroupDtoMapperTest.java | 2 +- .../scm/api/v2/resources/ResourceLinksTest.java | 10 +++++----- 7 files changed, 29 insertions(+), 29 deletions(-) rename scm-webapp/src/main/java/sonia/scm/api/v2/resources/{GroupSubResource.java => GroupResource.java} (91%) rename scm-webapp/src/main/java/sonia/scm/api/v2/resources/{GroupV2Resource.java => GroupRootResource.java} (54%) rename scm-webapp/src/test/java/sonia/scm/api/v2/resources/{GroupV2ResourceTest.java => GroupRootResourceTest.java} (87%) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupSubResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupResource.java similarity index 91% rename from scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupSubResource.java rename to scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupResource.java index 41ca16dc25..4834af8869 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupSubResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupResource.java @@ -23,12 +23,12 @@ import javax.ws.rs.core.UriInfo; import java.util.Collection; @Produces(VndMediaType.GROUP) -public class GroupSubResource extends AbstractManagerResource { +public class GroupResource extends AbstractManagerResource { private final GroupToGroupDtoMapper groupToGroupDtoMapper; @Inject - public GroupSubResource(GroupManager manager, GroupToGroupDtoMapper groupToGroupDtoMapper) { + public GroupResource(GroupManager manager, GroupToGroupDtoMapper groupToGroupDtoMapper) { super(manager); this.groupToGroupDtoMapper = groupToGroupDtoMapper; } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupV2Resource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupRootResource.java similarity index 54% rename from scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupV2Resource.java rename to scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupRootResource.java index 99227651c4..8909dcdd0c 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupV2Resource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupRootResource.java @@ -3,18 +3,18 @@ package sonia.scm.api.v2.resources; import javax.inject.Inject; import javax.ws.rs.Path; -@Path(GroupV2Resource.GROUPS_PATH_V2) -public class GroupV2Resource { +@Path(GroupRootResource.GROUPS_PATH_V2) +public class GroupRootResource { public static final String GROUPS_PATH_V2 = "v2/groups/"; private final GroupCollectionResource groupCollectionResource; - private final GroupSubResource groupSubResource; + private final GroupResource groupResource; @Inject - public GroupV2Resource(GroupCollectionResource groupCollectionResource, GroupSubResource groupSubResource) { + public GroupRootResource(GroupCollectionResource groupCollectionResource, GroupResource groupResource) { this.groupCollectionResource = groupCollectionResource; - this.groupSubResource = groupSubResource; + this.groupResource = groupResource; } @Path("") @@ -23,7 +23,7 @@ public class GroupV2Resource { } @Path("{id}") - public GroupSubResource getGroupSubResource() { - return groupSubResource; + public GroupResource getGroupResource() { + return groupResource; } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java index 46d4d42fe0..351c9c7f55 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java @@ -15,19 +15,19 @@ class ResourceLinks { private final LinkBuilder groupLinkBuilder; private GroupLinks(UriInfo uriInfo) { - groupLinkBuilder = new LinkBuilder(uriInfo, GroupV2Resource.class, GroupSubResource.class); + groupLinkBuilder = new LinkBuilder(uriInfo, GroupRootResource.class, GroupResource.class); } String self(String name) { - return groupLinkBuilder.method("getGroupSubResource").parameters(name).method("get").parameters().href(); + return groupLinkBuilder.method("getGroupResource").parameters(name).method("get").parameters().href(); } String delete(String name) { - return groupLinkBuilder.method("getGroupSubResource").parameters(name).method("delete").parameters().href(); + return groupLinkBuilder.method("getGroupResource").parameters(name).method("delete").parameters().href(); } String update(String name) { - return groupLinkBuilder.method("getGroupSubResource").parameters(name).method("update").parameters().href(); + return groupLinkBuilder.method("getGroupResource").parameters(name).method("update").parameters().href(); } } @@ -39,7 +39,7 @@ class ResourceLinks { private final LinkBuilder collectionLinkBuilder; private GroupCollectionLinks(UriInfo uriInfo) { - collectionLinkBuilder = new LinkBuilder(uriInfo, GroupV2Resource.class, GroupCollectionResource.class); + collectionLinkBuilder = new LinkBuilder(uriInfo, GroupRootResource.class, GroupCollectionResource.class); } String self() { diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapperTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapperTest.java index 72ed31ddeb..302affb299 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapperTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapperTest.java @@ -41,7 +41,7 @@ public class GroupCollectionToDtoMapperTest { public void init() throws URISyntaxException { uriInfoStore.set(uriInfo); URI baseUri = new URI("http://example.com/base/"); - expectedBaseUri = baseUri.resolve(GroupV2Resource.GROUPS_PATH_V2 + "/"); + expectedBaseUri = baseUri.resolve(GroupRootResource.GROUPS_PATH_V2 + "/"); when(uriInfo.getBaseUri()).thenReturn(baseUri); subjectThreadState.bind(); ThreadContext.bind(subject); diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupV2ResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java similarity index 87% rename from scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupV2ResourceTest.java rename to scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java index f514ee06c3..80693838b8 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupV2ResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java @@ -38,7 +38,7 @@ import static org.mockito.MockitoAnnotations.initMocks; password = "secret", configuration = "classpath:sonia/scm/repository/shiro.ini" ) -public class GroupV2ResourceTest { +public class GroupRootResourceTest { @Rule public ShiroRule shiro = new ShiroRule(); @@ -73,10 +73,10 @@ public class GroupV2ResourceTest { when(groupManager.get("admin")).thenReturn(group); GroupCollectionResource groupCollectionResource = new GroupCollectionResource(groupManager, dtoToGroupMapper, groupToDtoMapper, groupCollectionToDtoMapper); - GroupSubResource groupSubResource = new GroupSubResource(groupManager, groupToDtoMapper); - GroupV2Resource groupV2Resource = new GroupV2Resource(groupCollectionResource, groupSubResource); + GroupResource groupResource = new GroupResource(groupManager, groupToDtoMapper); + GroupRootResource groupRootResource = new GroupRootResource(groupCollectionResource, groupResource); - dispatcher.getRegistry().addSingletonResource(groupV2Resource); + dispatcher.getRegistry().addSingletonResource(groupRootResource); when(uriInfo.getBaseUri()).thenReturn(URI.create("/")); when(uriInfoStore.get()).thenReturn(uriInfo); @@ -84,7 +84,7 @@ public class GroupV2ResourceTest { @Test public void shouldGetNotFoundForNotExistentGroup() throws URISyntaxException { - MockHttpRequest request = MockHttpRequest.get("/" + GroupV2Resource.GROUPS_PATH_V2 + "nosuchgroup"); + MockHttpRequest request = MockHttpRequest.get("/" + GroupRootResource.GROUPS_PATH_V2 + "nosuchgroup"); MockHttpResponse response = new MockHttpResponse(); dispatcher.invoke(request, response); @@ -95,7 +95,7 @@ public class GroupV2ResourceTest { @Test @SubjectAware(username = "unpriv") public void shouldGetNotAuthorizedForWrongUser() throws URISyntaxException { - MockHttpRequest request = MockHttpRequest.get("/" + GroupV2Resource.GROUPS_PATH_V2 + "admin"); + MockHttpRequest request = MockHttpRequest.get("/" + GroupRootResource.GROUPS_PATH_V2 + "admin"); MockHttpResponse response = new MockHttpResponse(); dispatcher.invoke(request, response); @@ -111,7 +111,7 @@ public class GroupV2ResourceTest { group.setMembers(Collections.singletonList("user")); when(groupManager.get("admin")).thenReturn(group); - MockHttpRequest request = MockHttpRequest.get("/" + GroupV2Resource.GROUPS_PATH_V2 + "admin"); + MockHttpRequest request = MockHttpRequest.get("/" + GroupRootResource.GROUPS_PATH_V2 + "admin"); MockHttpResponse response = new MockHttpResponse(); dispatcher.invoke(request, response); @@ -129,7 +129,7 @@ public class GroupV2ResourceTest { byte[] groupJson = Resources.toByteArray(url); MockHttpRequest request = MockHttpRequest - .post("/" + GroupV2Resource.GROUPS_PATH_V2) + .post("/" + GroupRootResource.GROUPS_PATH_V2) .contentType(VndMediaType.GROUP) .content(groupJson); MockHttpResponse response = new MockHttpResponse(); diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupToGroupDtoMapperTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupToGroupDtoMapperTest.java index d5348fa28c..1a4c574182 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupToGroupDtoMapperTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupToGroupDtoMapperTest.java @@ -41,7 +41,7 @@ public class GroupToGroupDtoMapperTest { public void init() throws URISyntaxException { initMocks(this); URI baseUri = new URI("http://example.com/base/"); - expectedBaseUri = baseUri.resolve(GroupV2Resource.GROUPS_PATH_V2 + "/"); + expectedBaseUri = baseUri.resolve(GroupRootResource.GROUPS_PATH_V2 + "/"); when(uriInfo.getBaseUri()).thenReturn(baseUri); when(uriInfoStore.get()).thenReturn(uriInfo); subjectThreadState.bind(); diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksTest.java index 1d5586de5a..3e0a8fa3a5 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksTest.java @@ -52,31 +52,31 @@ public class ResourceLinksTest { @Test public void shouldCreateCorrectGroupSelfUrl() { String url = group(uriInfo).self("nobodies"); - assertEquals(BASE_URL + GroupV2Resource.GROUPS_PATH_V2 + "nobodies", url); + assertEquals(BASE_URL + GroupRootResource.GROUPS_PATH_V2 + "nobodies", url); } @Test public void shouldCreateCorrectGroupDeleteUrl() { String url = group(uriInfo).delete("nobodies"); - assertEquals(BASE_URL + GroupV2Resource.GROUPS_PATH_V2 + "nobodies", url); + assertEquals(BASE_URL + GroupRootResource.GROUPS_PATH_V2 + "nobodies", url); } @Test public void shouldCreateCorrectGroupUpdateUrl() { String url = group(uriInfo).update("nobodies"); - assertEquals(BASE_URL + GroupV2Resource.GROUPS_PATH_V2 + "nobodies", url); + assertEquals(BASE_URL + GroupRootResource.GROUPS_PATH_V2 + "nobodies", url); } // @Test // public void shouldCreateCorrectGroupCreateUrl() { // String url = ResourceLinks.groupCollection(uriInfo).create(); -// assertEquals(BASE_URL + GroupV2Resource.GROUPS_PATH_V2, url); +// assertEquals(BASE_URL + GroupRootResource.GROUPS_PATH_V2, url); // } // // @Test // public void shouldCreateCorrectGroupCollectionUrl() { // String url = ResourceLinks.groupCollection(uriInfo).self(); -// assertEquals(BASE_URL + GroupV2Resource.GROUPS_PATH_V2, url); +// assertEquals(BASE_URL + GroupRootResource.GROUPS_PATH_V2, url); // } @Before From 2daad8aab7928377ad448ac07548c08b655f702b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Fri, 22 Jun 2018 08:33:45 +0200 Subject: [PATCH 3/5] Use provider for group sub resources --- .../api/v2/resources/GroupRootResource.java | 12 +++--- .../v2/resources/GroupRootResourceTest.java | 38 ++++++++++--------- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupRootResource.java index 8909dcdd0c..f18df472a2 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupRootResource.java @@ -1,6 +1,7 @@ package sonia.scm.api.v2.resources; import javax.inject.Inject; +import javax.inject.Provider; import javax.ws.rs.Path; @Path(GroupRootResource.GROUPS_PATH_V2) @@ -8,22 +9,23 @@ public class GroupRootResource { public static final String GROUPS_PATH_V2 = "v2/groups/"; - private final GroupCollectionResource groupCollectionResource; - private final GroupResource groupResource; + private final Provider groupCollectionResource; + private final Provider groupResource; @Inject - public GroupRootResource(GroupCollectionResource groupCollectionResource, GroupResource groupResource) { + public GroupRootResource(Provider groupCollectionResource, + Provider groupResource) { this.groupCollectionResource = groupCollectionResource; this.groupResource = groupResource; } @Path("") public GroupCollectionResource getGroupCollectionResource() { - return groupCollectionResource; + return groupCollectionResource.get(); } @Path("{id}") public GroupResource getGroupResource() { - return groupResource; + return groupResource.get(); } } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java index 80693838b8..a29057ff31 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java @@ -45,36 +45,33 @@ public class GroupRootResourceTest { private Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); - @Mock - private GroupManager groupManager; @Mock private UriInfo uriInfo; @Mock private UriInfoStore uriInfoStore; - @InjectMocks - GroupDtoToGroupMapperImpl dtoToGroupMapper; - @InjectMocks - GroupToGroupDtoMapperImpl groupToDtoMapper; - @InjectMocks - GroupCollectionToDtoMapper groupCollectionToDtoMapper; + @Mock + private GroupManager groupManager; + @InjectMocks + private GroupDtoToGroupMapperImpl dtoToGroupMapper; + @InjectMocks + private GroupToGroupDtoMapperImpl groupToDtoMapper; + @InjectMocks + private GroupCollectionToDtoMapper groupCollectionToDtoMapper; - ArgumentCaptor groupCaptor = ArgumentCaptor.forClass(Group.class); + private ArgumentCaptor groupCaptor = ArgumentCaptor.forClass(Group.class); @Before public void prepareEnvironment() throws IOException, GroupException { initMocks(this); doNothing().when(groupManager).create(groupCaptor.capture()); - Group group = new Group(); - group.setName("admin"); - group.setCreationDate(0L); - group.setMembers(Collections.singletonList("user")); + Group group = createDummyGroup(); when(groupManager.get("admin")).thenReturn(group); GroupCollectionResource groupCollectionResource = new GroupCollectionResource(groupManager, dtoToGroupMapper, groupToDtoMapper, groupCollectionToDtoMapper); GroupResource groupResource = new GroupResource(groupManager, groupToDtoMapper); - GroupRootResource groupRootResource = new GroupRootResource(groupCollectionResource, groupResource); + GroupRootResource groupRootResource = new GroupRootResource(MockProvider.of(groupCollectionResource), MockProvider.of(groupResource)); dispatcher.getRegistry().addSingletonResource(groupRootResource); @@ -105,10 +102,7 @@ public class GroupRootResourceTest { @Test public void shouldGetGroup() throws URISyntaxException { - Group group = new Group(); - group.setName("admin"); - group.setCreationDate(0L); - group.setMembers(Collections.singletonList("user")); + Group group = createDummyGroup(); when(groupManager.get("admin")).thenReturn(group); MockHttpRequest request = MockHttpRequest.get("/" + GroupRootResource.GROUPS_PATH_V2 + "admin"); @@ -142,4 +136,12 @@ public class GroupRootResourceTest { assertEquals(2, createdGroup.getMembers().size()); assertEquals("user1", createdGroup.getMembers().get(0)); } + + private Group createDummyGroup() { + Group group = new Group(); + group.setName("admin"); + group.setCreationDate(0L); + group.setMembers(Collections.singletonList("user")); + return group; + } } From 9ec3833a979839a0ed50e958fc69b088c4cbbd8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Fri, 22 Jun 2018 10:15:35 +0200 Subject: [PATCH 4/5] Add overall count to collection results --- scm-core/src/main/java/sonia/scm/Manager.java | 12 +++--- .../src/main/java/sonia/scm/PageResult.java | 14 +++--- .../src/test/java/sonia/scm/ManagerTest.java | 43 +++++++++++-------- .../resources/GroupCollectionToDtoMapper.java | 6 +-- .../resources/UserCollectionToDtoMapper.java | 6 +-- .../GroupCollectionToDtoMapperTest.java | 20 +++++---- .../UserCollectionToDtoMapperTest.java | 20 +++++---- .../v2/resources/UserRootResourceTest.java | 4 +- 8 files changed, 68 insertions(+), 57 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/Manager.java b/scm-core/src/main/java/sonia/scm/Manager.java index bfebb01b9c..4067213ebd 100644 --- a/scm-core/src/main/java/sonia/scm/Manager.java +++ b/scm-core/src/main/java/sonia/scm/Manager.java @@ -33,8 +33,6 @@ package sonia.scm; -//~--- JDK imports ------------------------------------------------------------ - import sonia.scm.util.Util; import java.io.IOException; @@ -130,6 +128,8 @@ public interface Manager * Returns objects from the store divided into pages with the given page * size for the given page number (zero based) and sorted by the given * {@link java.util.Comparator}. + *

This default implementation reads all items, first, so you might want to adapt this + * whenever reading is expensive!

* * @param comparator to sort the returned objects * @param pageNumber the number of the page to be returned (zero based) @@ -144,9 +144,11 @@ public interface Manager checkArgument(pageSize > 0, "pageSize must be at least 1"); checkArgument(pageNumber >= 0, "pageNumber must be non-negative"); - Collection entities = getAll(comparator, pageNumber * pageSize, pageSize + 1); - boolean hasMore = entities.size() > pageSize; - return new PageResult<>(Util.createSubCollection(entities, 0, pageSize), hasMore); + Collection allEntities = getAll(comparator); + + Collection pagedEntities = Util.createSubCollection(allEntities, pageNumber * pageSize, pageSize); + + return new PageResult<>(pagedEntities, allEntities.size()); } } diff --git a/scm-core/src/main/java/sonia/scm/PageResult.java b/scm-core/src/main/java/sonia/scm/PageResult.java index 47ef08c4fc..b4000107b3 100644 --- a/scm-core/src/main/java/sonia/scm/PageResult.java +++ b/scm-core/src/main/java/sonia/scm/PageResult.java @@ -5,16 +5,16 @@ import java.util.Collections; /** * This represents the result of a page request. Contains the results for - * the page and a flag whether there are more pages or not. + * the page and the overall count of all elements. */ public class PageResult { private final Collection entities; - private final boolean hasMore; + private final int overallCount; - public PageResult(Collection entities, boolean hasMore) { + public PageResult(Collection entities, int overallCount) { this.entities = entities; - this.hasMore = hasMore; + this.overallCount = overallCount; } /** @@ -25,9 +25,9 @@ public class PageResult { } /** - * If this is true, there are more pages (that is, more entities). + * The overall count of all available elements. */ - public boolean hasMore() { - return hasMore; + public int getOverallCount() { + return overallCount; } } diff --git a/scm-core/src/test/java/sonia/scm/ManagerTest.java b/scm-core/src/test/java/sonia/scm/ManagerTest.java index f54ce6d11c..68f64b7212 100644 --- a/scm-core/src/test/java/sonia/scm/ManagerTest.java +++ b/scm-core/src/test/java/sonia/scm/ManagerTest.java @@ -4,15 +4,17 @@ import org.junit.Test; import org.mockito.Mock; import java.io.IOException; -import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.Comparator; +import java.util.stream.IntStream; -import static org.junit.Assert.*; +import static java.util.stream.Collectors.toList; +import static org.junit.Assert.assertEquals; public class ManagerTest { + private int givenItemCount = 0; + private Manager manager = new Manager() { @Override public void refresh(ModelObject object) throws IOException { @@ -26,12 +28,12 @@ public class ManagerTest { @Override public Collection getAll() { - return null; + return IntStream.range(0, givenItemCount).boxed().collect(toList()); } @Override public Collection getAll(Comparator comparator) { - return null; + return getAll(); } @Override @@ -41,13 +43,7 @@ public class ManagerTest { @Override public Collection getAll(Comparator comparator, int start, int limit) { - if (start == 0 && (limit == 3) || (limit == 5)) { - return Arrays.asList(1, 2, 3); - } else if (start == 0 && limit == 6) { - return Collections.emptyList(); - } else { - return Arrays.asList(3); - } + return null; } @Override @@ -85,28 +81,37 @@ public class ManagerTest { @Test public void getsNoPage() { + givenItemCount = 0; PageResult singlePage = manager.getPage(comparator, 0, 5); - assertFalse(singlePage.hasMore()); assertEquals(0, singlePage.getEntities().size()); + assertEquals(givenItemCount, singlePage.getOverallCount()); } @Test - public void getsSinglePage() { - + public void getsSinglePageWithoutEnoughItems() { + givenItemCount = 3; PageResult singlePage = manager.getPage(comparator, 0, 4); - assertFalse(singlePage.hasMore()); assertEquals(3, singlePage.getEntities().size() ); + assertEquals(givenItemCount, singlePage.getOverallCount()); + } + + @Test + public void getsSinglePageWithExactCountOfItems() { + givenItemCount = 3; + PageResult singlePage = manager.getPage(comparator, 0, 3); + assertEquals(3, singlePage.getEntities().size() ); + assertEquals(givenItemCount, singlePage.getOverallCount()); } @Test public void getsTwoPages() { - + givenItemCount = 3; PageResult page1 = manager.getPage(comparator, 0, 2); - assertTrue(page1.hasMore()); assertEquals(2, page1.getEntities().size()); + assertEquals(givenItemCount, page1.getOverallCount()); PageResult page2 = manager.getPage(comparator, 1, 2); - assertFalse(page2.hasMore()); assertEquals(1, page2.getEntities().size()); + assertEquals(givenItemCount, page2.getOverallCount()); } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapper.java index a6ecba1ab8..915573e5b0 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapper.java @@ -11,13 +11,13 @@ import sonia.scm.group.GroupPermissions; import javax.inject.Inject; import java.util.EnumSet; import java.util.List; -import java.util.stream.Collectors; import static com.damnhandy.uri.template.UriTemplate.fromTemplate; import static de.otto.edison.hal.Embedded.embeddedBuilder; import static de.otto.edison.hal.Link.link; import static de.otto.edison.hal.Links.linkingTo; import static de.otto.edison.hal.paging.NumberedPaging.zeroBasedNumberedPaging; +import static java.util.stream.Collectors.toList; import static sonia.scm.api.v2.resources.ResourceLinks.groupCollection; public class GroupCollectionToDtoMapper { @@ -32,8 +32,8 @@ public class GroupCollectionToDtoMapper { } public GroupCollectionDto map(int pageNumber, int pageSize, PageResult pageResult) { - NumberedPaging paging = zeroBasedNumberedPaging(pageNumber, pageSize, pageResult.hasMore()); - List dtos = pageResult.getEntities().stream().map(user -> groupToDtoMapper.map(user)).collect(Collectors.toList()); + NumberedPaging paging = zeroBasedNumberedPaging(pageNumber, pageSize, pageResult.getOverallCount()); + List dtos = pageResult.getEntities().stream().map(groupToDtoMapper::map).collect(toList()); GroupCollectionDto groupCollectionDto = new GroupCollectionDto( createLinks(paging), diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserCollectionToDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserCollectionToDtoMapper.java index e3edff91cd..fd0d66660b 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserCollectionToDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserCollectionToDtoMapper.java @@ -12,13 +12,13 @@ import javax.inject.Inject; import javax.ws.rs.core.UriInfo; import java.util.EnumSet; import java.util.List; -import java.util.stream.Collectors; import static com.damnhandy.uri.template.UriTemplate.fromTemplate; import static de.otto.edison.hal.Embedded.embeddedBuilder; import static de.otto.edison.hal.Link.link; import static de.otto.edison.hal.Links.linkingTo; import static de.otto.edison.hal.paging.NumberedPaging.zeroBasedNumberedPaging; +import static java.util.stream.Collectors.toList; import static sonia.scm.api.v2.resources.ResourceLinks.userCollection; public class UserCollectionToDtoMapper { @@ -37,8 +37,8 @@ public class UserCollectionToDtoMapper { } public UserCollectionDto map(int pageNumber, int pageSize, PageResult pageResult) { - NumberedPaging paging = zeroBasedNumberedPaging(pageNumber, pageSize, pageResult.hasMore()); - List dtos = pageResult.getEntities().stream().map(userToDtoMapper::map).collect(Collectors.toList()); + NumberedPaging paging = zeroBasedNumberedPaging(pageNumber, pageSize, pageResult.getOverallCount()); + List dtos = pageResult.getEntities().stream().map(userToDtoMapper::map).collect(toList()); UserCollectionDto userCollectionDto = new UserCollectionDto( createLinks(uriInfoStore.get(), paging), diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapperTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapperTest.java index 302affb299..6abb8f5049 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapperTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapperTest.java @@ -54,35 +54,37 @@ public class GroupCollectionToDtoMapperTest { @Test public void shouldSetPageNumber() { - PageResult pageResult = mockPageResult(true, "nobodies"); + PageResult pageResult = mockPageResult("nobodies"); GroupCollectionDto groupCollectionDto = mapper.map(1, 1, pageResult); assertEquals(1, groupCollectionDto.getPage()); } @Test public void shouldHaveSelfLink() { - PageResult pageResult = mockPageResult(true, "nobodies"); + PageResult pageResult = mockPageResult("nobodies"); GroupCollectionDto groupCollectionDto = mapper.map(1, 1, pageResult); assertTrue(groupCollectionDto.getLinks().getLinkBy("self").get().getHref().startsWith(expectedBaseUri.toString())); } @Test public void shouldCreateNextPageLink_whenHasMore() { - PageResult pageResult = mockPageResult(true, "nobodies"); + PageResult intermediate = mockPageResult("nobodies"); + PageResult pageResult = new PageResult<>(intermediate.getEntities(), 2); + GroupCollectionDto groupCollectionDto = mapper.map(1, 1, pageResult); assertTrue(groupCollectionDto.getLinks().getLinkBy("next").get().getHref().contains("page=2")); } @Test public void shouldNotCreateNextPageLink_whenNoMore() { - PageResult pageResult = mockPageResult(false, "nobodies"); + PageResult pageResult = mockPageResult("nobodies"); GroupCollectionDto groupCollectionDto = mapper.map(1, 1, pageResult); assertFalse(groupCollectionDto.getLinks().stream().anyMatch(link -> link.getHref().contains("page=2"))); } @Test public void shouldHaveCreateLink_whenHasPermission() { - PageResult pageResult = mockPageResult(false, "nobodies"); + PageResult pageResult = mockPageResult("nobodies"); when(subject.isPermitted("group:create")).thenReturn(true); GroupCollectionDto groupCollectionDto = mapper.map(1, 1, pageResult); @@ -92,7 +94,7 @@ public class GroupCollectionToDtoMapperTest { @Test public void shouldNotHaveCreateLink_whenHasNoPermission() { - PageResult pageResult = mockPageResult(false, "nobodies"); + PageResult pageResult = mockPageResult("nobodies"); when(subject.isPermitted("group:create")).thenReturn(false); GroupCollectionDto groupCollectionDto = mapper.map(1, 1, pageResult); @@ -102,7 +104,7 @@ public class GroupCollectionToDtoMapperTest { @Test public void shouldMapGroups() { - PageResult pageResult = mockPageResult(false, "nobodies", "bosses"); + PageResult pageResult = mockPageResult("nobodies", "bosses"); GroupCollectionDto groupCollectionDto = mapper.map(1, 2, pageResult); List groups = groupCollectionDto.getEmbedded().getItemsBy("groups"); assertEquals(2, groups.size()); @@ -110,9 +112,9 @@ public class GroupCollectionToDtoMapperTest { assertEquals("bosses", ((GroupDto) groups.get(1)).getName()); } - private PageResult mockPageResult(boolean hasMore, String... groupNames) { + private PageResult mockPageResult(String... groupNames) { Collection groups = Arrays.stream(groupNames).map(this::mockGroupWithDto).collect(toList()); - return new PageResult<>(groups, hasMore); + return new PageResult<>(groups, groups.size()); } private Group mockGroupWithDto(String groupName) { diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserCollectionToDtoMapperTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserCollectionToDtoMapperTest.java index 48d7359eac..3af96071cc 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserCollectionToDtoMapperTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserCollectionToDtoMapperTest.java @@ -62,35 +62,37 @@ public class UserCollectionToDtoMapperTest { @Test public void shouldSetPageNumber() { - PageResult pageResult = mockPageResult(true, "Hannes"); + PageResult pageResult = mockPageResult("Hannes"); UserCollectionDto userCollectionDto = mapper.map(1, 1, pageResult); assertEquals(1, userCollectionDto.getPage()); } @Test public void shouldHaveSelfLink() { - PageResult pageResult = mockPageResult(true, "Hannes"); + PageResult pageResult = mockPageResult("Hannes"); UserCollectionDto userCollectionDto = mapper.map(1, 1, pageResult); assertTrue(userCollectionDto.getLinks().getLinkBy("self").get().getHref().startsWith(expectedBaseUri.toString())); } @Test public void shouldCreateNextPageLink_whenHasMore() { - PageResult pageResult = mockPageResult(true, "Hannes"); + PageResult intermediate = mockPageResult("Hannes"); + PageResult pageResult = new PageResult<>(intermediate.getEntities(), 2); + UserCollectionDto userCollectionDto = mapper.map(1, 1, pageResult); assertTrue(userCollectionDto.getLinks().getLinkBy("next").get().getHref().contains("page=2")); } @Test public void shouldNotCreateNextPageLink_whenNoMore() { - PageResult pageResult = mockPageResult(false, "Hannes"); + PageResult pageResult = mockPageResult("Hannes"); UserCollectionDto userCollectionDto = mapper.map(1, 1, pageResult); assertFalse(userCollectionDto.getLinks().stream().anyMatch(link -> link.getHref().contains("page=2"))); } @Test public void shouldHaveCreateLink_whenHasPermission() { - PageResult pageResult = mockPageResult(false, "Hannes"); + PageResult pageResult = mockPageResult("Hannes"); when(subject.isPermitted("user:create")).thenReturn(true); UserCollectionDto userCollectionDto = mapper.map(1, 1, pageResult); @@ -100,7 +102,7 @@ public class UserCollectionToDtoMapperTest { @Test public void shouldNotHaveCreateLink_whenHasNoPermission() { - PageResult pageResult = mockPageResult(false, "Hannes"); + PageResult pageResult = mockPageResult("Hannes"); when(subject.isPermitted("user:create")).thenReturn(false); UserCollectionDto userCollectionDto = mapper.map(1, 1, pageResult); @@ -110,7 +112,7 @@ public class UserCollectionToDtoMapperTest { @Test public void shouldMapUsers() { - PageResult pageResult = mockPageResult(false, "Hannes", "Wurst"); + PageResult pageResult = mockPageResult("Hannes", "Wurst"); UserCollectionDto userCollectionDto = mapper.map(1, 2, pageResult); List users = userCollectionDto.getEmbedded().getItemsBy("users"); assertEquals(2, users.size()); @@ -118,9 +120,9 @@ public class UserCollectionToDtoMapperTest { assertEquals("Wurst", ((UserDto) users.get(1)).getName()); } - private PageResult mockPageResult(boolean hasMore, String... userNames) { + private PageResult mockPageResult(String... userNames) { Collection users = Arrays.stream(userNames).map(this::mockUserWithDto).collect(toList()); - return new PageResult<>(users, hasMore); + return new PageResult<>(users, users.size()); } private User mockUserWithDto(String userName) { diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserRootResourceTest.java index 93f0499f14..cdbde92739 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserRootResourceTest.java @@ -26,8 +26,8 @@ import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; -import java.util.Collections; +import static java.util.Collections.singletonList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -70,7 +70,7 @@ public class UserRootResourceTest { public void prepareEnvironment() throws IOException, UserException { initMocks(this); User dummyUser = createDummyUser(); - when(userManager.getPage(any(), eq(0), eq(10))).thenReturn(new PageResult<>(Collections.singletonList(dummyUser), true)); + when(userManager.getPage(any(), eq(0), eq(10))).thenReturn(new PageResult<>(singletonList(dummyUser), 1)); when(userManager.get("Neo")).thenReturn(dummyUser); doNothing().when(userManager).create(userCaptor.capture()); From da0cb2a5a40ba34de56092735edb1615b0987f3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Fri, 22 Jun 2018 10:42:02 +0200 Subject: [PATCH 5/5] Move page object creation to PageResult class --- scm-core/src/main/java/sonia/scm/Manager.java | 13 +------------ scm-core/src/main/java/sonia/scm/PageResult.java | 12 ++++++++++++ .../resources/GroupCollectionToDtoMapperTest.java | 11 +++++++---- .../v2/resources/UserCollectionToDtoMapperTest.java | 12 +++++++----- 4 files changed, 27 insertions(+), 21 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/Manager.java b/scm-core/src/main/java/sonia/scm/Manager.java index 4067213ebd..79155b56a2 100644 --- a/scm-core/src/main/java/sonia/scm/Manager.java +++ b/scm-core/src/main/java/sonia/scm/Manager.java @@ -33,14 +33,10 @@ package sonia.scm; -import sonia.scm.util.Util; - import java.io.IOException; import java.util.Collection; import java.util.Comparator; -import static com.google.common.base.Preconditions.checkArgument; - /** * Base interface for all manager classes. * @@ -141,14 +137,7 @@ public interface Manager * empty page result is returned. */ default PageResult getPage(Comparator comparator, int pageNumber, int pageSize) { - checkArgument(pageSize > 0, "pageSize must be at least 1"); - checkArgument(pageNumber >= 0, "pageNumber must be non-negative"); - - Collection allEntities = getAll(comparator); - - Collection pagedEntities = Util.createSubCollection(allEntities, pageNumber * pageSize, pageSize); - - return new PageResult<>(pagedEntities, allEntities.size()); + return PageResult.createPage(getAll(comparator), pageNumber, pageSize); } } diff --git a/scm-core/src/main/java/sonia/scm/PageResult.java b/scm-core/src/main/java/sonia/scm/PageResult.java index b4000107b3..983a4e5dd1 100644 --- a/scm-core/src/main/java/sonia/scm/PageResult.java +++ b/scm-core/src/main/java/sonia/scm/PageResult.java @@ -3,6 +3,9 @@ package sonia.scm; import java.util.Collection; import java.util.Collections; +import static com.google.common.base.Preconditions.checkArgument; +import static sonia.scm.util.Util.createSubCollection; + /** * This represents the result of a page request. Contains the results for * the page and the overall count of all elements. @@ -12,6 +15,15 @@ public class PageResult { private final Collection entities; private final int overallCount; + public static PageResult createPage(Collection allEntities, int pageNumber, int pageSize) { + checkArgument(pageSize > 0, "pageSize must be at least 1"); + checkArgument(pageNumber >= 0, "pageNumber must be non-negative"); + + Collection pagedEntities = createSubCollection(allEntities, pageNumber * pageSize, pageSize); + + return new PageResult<>(pagedEntities, allEntities.size()); + } + public PageResult(Collection entities, int overallCount) { this.entities = entities; this.overallCount = overallCount; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapperTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapperTest.java index 6abb8f5049..e987df3b29 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapperTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupCollectionToDtoMapperTest.java @@ -24,6 +24,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static sonia.scm.PageResult.createPage; public class GroupCollectionToDtoMapperTest { @@ -68,9 +69,7 @@ public class GroupCollectionToDtoMapperTest { @Test public void shouldCreateNextPageLink_whenHasMore() { - PageResult intermediate = mockPageResult("nobodies"); - PageResult pageResult = new PageResult<>(intermediate.getEntities(), 2); - + PageResult pageResult = createPage(createGroups("nobodies", "bosses"), 0, 1); GroupCollectionDto groupCollectionDto = mapper.map(1, 1, pageResult); assertTrue(groupCollectionDto.getLinks().getLinkBy("next").get().getHref().contains("page=2")); } @@ -113,10 +112,14 @@ public class GroupCollectionToDtoMapperTest { } private PageResult mockPageResult(String... groupNames) { - Collection groups = Arrays.stream(groupNames).map(this::mockGroupWithDto).collect(toList()); + Collection groups = createGroups(groupNames); return new PageResult<>(groups, groups.size()); } + private List createGroups(String... groupNames) { + return Arrays.stream(groupNames).map(this::mockGroupWithDto).collect(toList()); + } + private Group mockGroupWithDto(String groupName) { Group group = new Group(); group.setName(groupName); diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserCollectionToDtoMapperTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserCollectionToDtoMapperTest.java index 3af96071cc..0f62f1023e 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserCollectionToDtoMapperTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserCollectionToDtoMapperTest.java @@ -16,7 +16,6 @@ import javax.ws.rs.core.UriInfo; import java.net.URI; import java.net.URISyntaxException; import java.util.Arrays; -import java.util.Collection; import java.util.List; import static java.util.stream.Collectors.toList; @@ -25,6 +24,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; +import static sonia.scm.PageResult.createPage; public class UserCollectionToDtoMapperTest { @@ -76,8 +76,7 @@ public class UserCollectionToDtoMapperTest { @Test public void shouldCreateNextPageLink_whenHasMore() { - PageResult intermediate = mockPageResult("Hannes"); - PageResult pageResult = new PageResult<>(intermediate.getEntities(), 2); + PageResult pageResult = createPage(createUsers("Hannes", "Karl"), 0, 1); UserCollectionDto userCollectionDto = mapper.map(1, 1, pageResult); assertTrue(userCollectionDto.getLinks().getLinkBy("next").get().getHref().contains("page=2")); @@ -121,8 +120,11 @@ public class UserCollectionToDtoMapperTest { } private PageResult mockPageResult(String... userNames) { - Collection users = Arrays.stream(userNames).map(this::mockUserWithDto).collect(toList()); - return new PageResult<>(users, users.size()); + return createPage(createUsers(userNames), 0, userNames.length); + } + + private List createUsers(String... userNames) { + return Arrays.stream(userNames).map(this::mockUserWithDto).collect(toList()); } private User mockUserWithDto(String userName) {