From 00c3c5ca6611c240dedc8edcc67aaa1c03492908 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 26 Jun 2018 08:45:37 +0200 Subject: [PATCH] Use adapter for collection resources --- .../v2/resources/GroupCollectionResource.java | 42 ++++--------------- .../v2/resources/ResourceManagerAdapter.java | 18 ++++++++ .../v2/resources/UserCollectionResource.java | 39 +++-------------- 3 files changed, 32 insertions(+), 67 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 3f728fab5a..ab23658918 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 @@ -4,8 +4,6 @@ import com.webcohesion.enunciate.metadata.rs.ResponseCode; import com.webcohesion.enunciate.metadata.rs.ResponseHeader; import com.webcohesion.enunciate.metadata.rs.StatusCodes; import com.webcohesion.enunciate.metadata.rs.TypeHint; -import sonia.scm.PageResult; -import sonia.scm.api.rest.resources.AbstractManagerResource; import sonia.scm.group.Group; import sonia.scm.group.GroupException; import sonia.scm.group.GroupManager; @@ -20,27 +18,26 @@ import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; -import javax.ws.rs.core.GenericEntity; import javax.ws.rs.core.Request; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import java.io.IOException; -import java.net.URI; -import java.util.Collection; import static sonia.scm.api.v2.resources.ResourceLinks.group; @Produces(VndMediaType.GROUP_COLLECTION) -public class GroupCollectionResource extends AbstractManagerResource { +public class GroupCollectionResource { public static final int DEFAULT_PAGE_SIZE = 10; private final GroupDtoToGroupMapper dtoToGroupMapper; private final GroupCollectionToDtoMapper groupCollectionToDtoMapper; + private final ResourceManagerAdapter adapter; + @Inject public GroupCollectionResource(GroupManager manager, GroupDtoToGroupMapper dtoToGroupMapper, GroupCollectionToDtoMapper groupCollectionToDtoMapper) { - super(manager); this.dtoToGroupMapper = dtoToGroupMapper; this.groupCollectionToDtoMapper = groupCollectionToDtoMapper; + this.adapter = new ResourceManagerAdapter<>(manager); } /** @@ -50,7 +47,7 @@ public class GroupCollectionResource extends AbstractManagerResource pageResult = fetchPage(sortby, desc, page, pageSize); - - return Response.ok(groupCollectionToDtoMapper.map(page, pageSize, pageResult)).build(); + return adapter.getAll(page, pageSize, sortBy, desc, pageResult -> groupCollectionToDtoMapper.map(page, pageSize, pageResult)); } /** @@ -91,26 +85,6 @@ public class GroupCollectionResource extends AbstractManagerResource> createGenericEntity(Collection items) { - throw new UnsupportedOperationException(); - } - - @Override - protected String getId(Group item) { - return item.getName(); - } - - @Override - protected String getPathPart() { - throw new UnsupportedOperationException(); + return adapter.create(groupDto, () -> dtoToGroupMapper.map(groupDto), group -> group(uriInfo).self(group.getName())); } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceManagerAdapter.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceManagerAdapter.java index 98d922ba4f..7967c88b9e 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceManagerAdapter.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceManagerAdapter.java @@ -3,12 +3,16 @@ package sonia.scm.api.v2.resources; import de.otto.edison.hal.HalRepresentation; import sonia.scm.Manager; import sonia.scm.ModelObject; +import sonia.scm.PageResult; import sonia.scm.api.rest.resources.AbstractManagerResource; import javax.ws.rs.core.GenericEntity; import javax.ws.rs.core.Response; +import java.io.IOException; +import java.net.URI; import java.util.Collection; import java.util.function.Function; +import java.util.function.Supplier; public class ResourceManagerAdapter extends AbstractManagerResource { @@ -31,6 +35,20 @@ public class ResourceManagerAdapter, CollectionDto> mappger) { + PageResult pageResult = fetchPage(sortBy, desc, page, pageSize); + return Response.ok(mappger.apply(pageResult)).build(); + } + + public Response create(D dto, Supplier entitySupplyer, Function uriCreator) throws IOException, E { + if (dto == null) { + return Response.status(400).build(); + } + T entity = entitySupplyer.get(); + manager.create(entity); + return Response.created(URI.create(uriCreator.apply(entity))).build(); + } + @Override protected GenericEntity> createGenericEntity(Collection items) { throw new UnsupportedOperationException(); 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 e52e546a30..af45fadd4b 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 @@ -5,8 +5,6 @@ import com.webcohesion.enunciate.metadata.rs.ResponseHeader; import com.webcohesion.enunciate.metadata.rs.ResponseHeaders; import com.webcohesion.enunciate.metadata.rs.StatusCodes; import com.webcohesion.enunciate.metadata.rs.TypeHint; -import sonia.scm.PageResult; -import sonia.scm.api.rest.resources.AbstractManagerResource; import sonia.scm.user.User; import sonia.scm.user.UserException; import sonia.scm.user.UserManager; @@ -20,29 +18,28 @@ import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; -import javax.ws.rs.core.GenericEntity; import javax.ws.rs.core.Request; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import java.io.IOException; -import java.net.URI; -import java.util.Collection; import static sonia.scm.api.v2.resources.ResourceLinks.user; @Produces(VndMediaType.USER_COLLECTION) -public class UserCollectionResource extends AbstractManagerResource { +public class UserCollectionResource { private static final int DEFAULT_PAGE_SIZE = 10; private final UserDtoToUserMapper dtoToUserMapper; private final UserCollectionToDtoMapper userCollectionToDtoMapper; + private final ResourceManagerAdapter adapter; + @Inject public UserCollectionResource(UserManager manager, UserDtoToUserMapper dtoToUserMapper, UserCollectionToDtoMapper userCollectionToDtoMapper) { - super(manager); this.dtoToUserMapper = dtoToUserMapper; this.userCollectionToDtoMapper = userCollectionToDtoMapper; + this.adapter = new ResourceManagerAdapter<>(manager); } /** @@ -64,16 +61,12 @@ public class UserCollectionResource extends AbstractManagerResource pageResult = fetchPage(sortBy, desc, page, pageSize); - - return Response.ok(userCollectionToDtoMapper.map(page, pageSize, pageResult)).build(); + return adapter.getAll(page, pageSize, sortBy, desc, pageResult -> userCollectionToDtoMapper.map(page, pageSize, pageResult)); } /** @@ -94,26 +87,6 @@ public class UserCollectionResource extends AbstractManagerResource> createGenericEntity(Collection items) { - throw new UnsupportedOperationException(); - } - - @Override - protected String getId(User item) { - return item.getName(); - } - - @Override - protected String getPathPart() { - throw new UnsupportedOperationException(); + return adapter.create(userDto, () -> dtoToUserMapper.map(userDto, ""), user -> user(uriInfo).self(user.getName())); } }