From 0fb6541113ea1fba66182d37e1b84b967f47233b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 26 Jun 2018 08:16:37 +0200 Subject: [PATCH] Introduce adapter for resource classes and managers --- .../scm/api/v2/resources/GroupResource.java | 30 ++---------- .../v2/resources/ResourceManagerAdapter.java | 48 +++++++++++++++++++ .../scm/api/v2/resources/UserResource.java | 42 ++++------------ 3 files changed, 60 insertions(+), 60 deletions(-) create mode 100644 scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceManagerAdapter.java diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupResource.java index 1c44619798..4872b2ab27 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupResource.java @@ -3,7 +3,6 @@ package sonia.scm.api.v2.resources; import com.webcohesion.enunciate.metadata.rs.ResponseCode; import com.webcohesion.enunciate.metadata.rs.StatusCodes; import com.webcohesion.enunciate.metadata.rs.TypeHint; -import sonia.scm.api.rest.resources.AbstractManagerResource; import sonia.scm.group.Group; import sonia.scm.group.GroupException; import sonia.scm.group.GroupManager; @@ -17,21 +16,20 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; 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.util.Collection; @Produces(VndMediaType.GROUP) -public class GroupResource extends AbstractManagerResource { +public class GroupResource { private final GroupToGroupDtoMapper groupToGroupDtoMapper; + private final ResourceManagerAdapter adapter; @Inject public GroupResource(GroupManager manager, GroupToGroupDtoMapper groupToGroupDtoMapper) { - super(manager); this.groupToGroupDtoMapper = groupToGroupDtoMapper; + this.adapter = new ResourceManagerAdapter<>(manager); } @Path("") @@ -44,12 +42,7 @@ public class GroupResource extends AbstractManagerResource> createGenericEntity(Collection items) { - throw new UnsupportedOperationException(); - } - - @Override - protected String getId(Group item) { - return item.getName(); - } - - @Override - protected String getPathPart() { - throw new UnsupportedOperationException(); - } } 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 new file mode 100644 index 0000000000..98d922ba4f --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceManagerAdapter.java @@ -0,0 +1,48 @@ +package sonia.scm.api.v2.resources; + +import de.otto.edison.hal.HalRepresentation; +import sonia.scm.Manager; +import sonia.scm.ModelObject; +import sonia.scm.api.rest.resources.AbstractManagerResource; + +import javax.ws.rs.core.GenericEntity; +import javax.ws.rs.core.Response; +import java.util.Collection; +import java.util.function.Function; + +public class ResourceManagerAdapter extends AbstractManagerResource { + + public ResourceManagerAdapter(Manager manager) { + super(manager); + } + + public Response get(String id, Function mapper) { + T entity = manager.get(id); + if (entity == null) { + return Response.status(Response.Status.NOT_FOUND).build(); + } + D dto = mapper.apply(entity); + return Response.ok(dto).build(); + } + + public Response update(String id, D dto, Function mapper) { + T existingEntity = manager.get(id); + T changedEntity = mapper.apply(existingEntity); + return update(id, changedEntity); + } + + @Override + protected GenericEntity> createGenericEntity(Collection items) { + throw new UnsupportedOperationException(); + } + + @Override + protected String getId(T item) { + return item.getId(); + } + + @Override + protected String getPathPart() { + throw new UnsupportedOperationException(); + } +} 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 6a8845d17e..9b8cf2bc3e 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 @@ -3,7 +3,6 @@ package sonia.scm.api.v2.resources; import com.webcohesion.enunciate.metadata.rs.ResponseCode; import com.webcohesion.enunciate.metadata.rs.StatusCodes; import com.webcohesion.enunciate.metadata.rs.TypeHint; -import sonia.scm.api.rest.resources.AbstractManagerResource; import sonia.scm.user.User; import sonia.scm.user.UserException; import sonia.scm.user.UserManager; @@ -17,24 +16,23 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; 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.util.Collection; - @Produces(VndMediaType.USER) -public class UserResource extends AbstractManagerResource { +public class UserResource { private final UserDtoToUserMapper dtoToUserMapper; private final UserToUserDtoMapper userToDtoMapper; + private final ResourceManagerAdapter adapter; + @Inject public UserResource(UserDtoToUserMapper dtoToUserMapper, UserToUserDtoMapper userToDtoMapper, UserManager manager) { - super(manager); this.dtoToUserMapper = dtoToUserMapper; this.userToDtoMapper = userToDtoMapper; + this.adapter = new ResourceManagerAdapter<>(manager); } /** @@ -56,12 +54,7 @@ public class UserResource extends AbstractManagerResource { @ResponseCode(code = 500, condition = "internal server error") }) public Response get(@Context Request request, @Context UriInfo uriInfo, @PathParam("id") String id) { - User user = manager.get(id); - if (user == null) { - return Response.status(Response.Status.NOT_FOUND).build(); - } - UserDto userDto = userToDtoMapper.map(user); - return Response.ok(userDto).build(); + return adapter.get(id, userToDtoMapper::map); } /** @@ -80,11 +73,8 @@ public class UserResource extends AbstractManagerResource { @ResponseCode(code = 500, condition = "internal server error") }) @TypeHint(TypeHint.NO_CONTENT.class) - public Response update(@Context UriInfo uriInfo, - @PathParam("id") String name, UserDto userDto) { - String originalPassword = manager.get(name).getPassword(); - User user = dtoToUserMapper.map(userDto, originalPassword); - return update(name, user); + public Response update(@Context UriInfo uriInfo, @PathParam("id") String name, UserDto userDto) { + return adapter.update(name, userDto, existing -> dtoToUserMapper.map(userDto, existing.getPassword())); } /** @@ -103,23 +93,7 @@ public class UserResource extends AbstractManagerResource { @ResponseCode(code = 500, condition = "internal server error") }) @TypeHint(TypeHint.NO_CONTENT.class) - @Override public Response delete(@PathParam("id") String name) { - return super.delete(name); - } - - @Override - protected GenericEntity> createGenericEntity(Collection items) { - throw new UnsupportedOperationException(); - } - - @Override - protected String getId(User item) { - return item.getName(); - } - - @Override - protected String getPathPart() { - throw new UnsupportedOperationException(); + return adapter.delete(name); } }