Extract base class for collection mappers

This commit is contained in:
René Pfeuffer
2018-06-25 09:57:59 +02:00
parent f9a094e1b9
commit 2d32b24e48
10 changed files with 128 additions and 136 deletions

View File

@@ -1,11 +1,15 @@
package sonia.scm.api.v2.resources;
import de.otto.edison.hal.HalRepresentation;
import sonia.scm.ModelObject;
import sonia.scm.util.AssertUtil;
import java.time.Instant;
import java.util.Optional;
class BaseMapper {
abstract class BaseMapper<T extends ModelObject, D extends HalRepresentation> {
public abstract D map(T user);
Instant mapTime(Long epochMilli) {
AssertUtil.assertIsNotNull(epochMilli);

View File

@@ -0,0 +1,69 @@
package sonia.scm.api.v2.resources;
import de.otto.edison.hal.Embedded;
import de.otto.edison.hal.HalRepresentation;
import de.otto.edison.hal.Links;
import de.otto.edison.hal.paging.NumberedPaging;
import de.otto.edison.hal.paging.PagingRel;
import sonia.scm.ModelObject;
import sonia.scm.PageResult;
import javax.inject.Inject;
import java.util.EnumSet;
import java.util.List;
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;
abstract class BasicCollectionToDtoMapper<E extends ModelObject, D extends HalRepresentation> {
private final String collectionName;
private final BaseMapper<E, D> entityToDtoMapper;
@Inject
public BasicCollectionToDtoMapper(String collectionName, BaseMapper<E, D> entityToDtoMapper) {
this.collectionName = collectionName;
this.entityToDtoMapper = entityToDtoMapper;
}
public CollectionDto map(int pageNumber, int pageSize, PageResult<E> pageResult) {
NumberedPaging paging = zeroBasedNumberedPaging(pageNumber, pageSize, pageResult.getOverallCount());
List<D> dtos = pageResult.getEntities().stream().map(entityToDtoMapper::map).collect(toList());
CollectionDto collectionDto = new CollectionDto(
createLinks(paging),
embedDtos(dtos)
);
collectionDto.setPage(pageNumber);
return collectionDto;
}
private Links createLinks(NumberedPaging page) {
String baseUrl = createSelfLink();
Links.Builder linksBuilder = linkingTo()
.with(page.links(
fromTemplate(baseUrl + "{?page,pageSize}"),
EnumSet.allOf(PagingRel.class)));
if (isCreatePermitted()) {
linksBuilder.single(link("create", createCreateLink()));
}
return linksBuilder.build();
}
abstract boolean isCreatePermitted();
abstract String createCreateLink();
abstract String createSelfLink();
private Embedded embedDtos(List<D> dtos) {
return embeddedBuilder()
.with(collectionName, dtos)
.build();
}
}

View File

@@ -6,12 +6,12 @@ import de.otto.edison.hal.Links;
import lombok.Data;
@Data
public class UserCollectionDto extends HalRepresentation {
public class CollectionDto extends HalRepresentation {
private int page;
private int pageTotal;
public UserCollectionDto(Links links, Embedded embedded) {
public CollectionDto(Links links, Embedded embedded) {
super(links, embedded);
}
}

View File

@@ -1,17 +0,0 @@
package sonia.scm.api.v2.resources;
import de.otto.edison.hal.Embedded;
import de.otto.edison.hal.HalRepresentation;
import de.otto.edison.hal.Links;
import lombok.Data;
@Data
public class GroupCollectionDto extends HalRepresentation {
private int page;
private int pageTotal;
public GroupCollectionDto(Links links, Embedded embedded) {
super(links, embedded);
}
}

View File

@@ -1,64 +1,34 @@
package sonia.scm.api.v2.resources;
import de.otto.edison.hal.Embedded;
import de.otto.edison.hal.Links;
import de.otto.edison.hal.paging.NumberedPaging;
import de.otto.edison.hal.paging.PagingRel;
import sonia.scm.PageResult;
import sonia.scm.group.Group;
import sonia.scm.group.GroupPermissions;
import javax.inject.Inject;
import java.util.EnumSet;
import java.util.List;
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 {
public class GroupCollectionToDtoMapper extends BasicCollectionToDtoMapper<Group, GroupDto> {
private final GroupToGroupDtoMapper groupToDtoMapper;
private final UriInfoStore uriInfoStore;
@Inject
public GroupCollectionToDtoMapper(GroupToGroupDtoMapper groupToDtoMapper, UriInfoStore uriInfoStore) {
this.groupToDtoMapper = groupToDtoMapper;
super("groups", groupToDtoMapper);
this.uriInfoStore = uriInfoStore;
}
public GroupCollectionDto map(int pageNumber, int pageSize, PageResult<Group> pageResult) {
NumberedPaging paging = zeroBasedNumberedPaging(pageNumber, pageSize, pageResult.getOverallCount());
List<GroupDto> dtos = pageResult.getEntities().stream().map(groupToDtoMapper::map).collect(toList());
GroupCollectionDto groupCollectionDto = new GroupCollectionDto(
createLinks(paging),
embedDtos(dtos)
);
groupCollectionDto.setPage(pageNumber);
return groupCollectionDto;
@Override
String createCreateLink() {
return groupCollection(uriInfoStore.get()).create();
}
private Links createLinks(NumberedPaging page) {
String baseUrl = groupCollection(uriInfoStore.get()).self();
Links.Builder linksBuilder = linkingTo()
.with(page.links(
fromTemplate(baseUrl + "{?page,pageSize}"),
EnumSet.allOf(PagingRel.class)));
if (GroupPermissions.create().isPermitted()) {
linksBuilder.single(link("create", groupCollection(uriInfoStore.get()).create()));
}
return linksBuilder.build();
@Override
String createSelfLink() {
return groupCollection(uriInfoStore.get()).self();
}
private Embedded embedDtos(List<GroupDto> dtos) {
return embeddedBuilder()
.with("groups", dtos)
.build();
@Override
boolean isCreatePermitted() {
return GroupPermissions.create().isPermitted();
}
}

View File

@@ -17,13 +17,11 @@ import static sonia.scm.api.v2.resources.ResourceLinks.group;
import static sonia.scm.api.v2.resources.ResourceLinks.user;
@Mapper
public abstract class GroupToGroupDtoMapper extends BaseMapper {
public abstract class GroupToGroupDtoMapper extends BaseMapper<Group, GroupDto> {
@Inject
private UriInfoStore uriInfoStore;
public abstract GroupDto map(Group group);
@AfterMapping
void appendLinks(Group group, @MappingTarget GroupDto target) {
Links.Builder linksBuilder = linkingTo().self(group(uriInfoStore.get()).self(target.getName()));

View File

@@ -1,64 +1,34 @@
package sonia.scm.api.v2.resources;
import de.otto.edison.hal.Embedded;
import de.otto.edison.hal.Links;
import de.otto.edison.hal.paging.NumberedPaging;
import de.otto.edison.hal.paging.PagingRel;
import sonia.scm.PageResult;
import sonia.scm.user.User;
import sonia.scm.user.UserPermissions;
import javax.inject.Inject;
import java.util.EnumSet;
import java.util.List;
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 {
public class UserCollectionToDtoMapper extends BasicCollectionToDtoMapper<User, UserDto> {
private final UserToUserDtoMapper userToDtoMapper;
private final UriInfoStore uriInfoStore;
@Inject
public UserCollectionToDtoMapper(UserToUserDtoMapper userToDtoMapper, UriInfoStore uriInfoStore) {
this.userToDtoMapper = userToDtoMapper;
super("users", userToDtoMapper);
this.uriInfoStore = uriInfoStore;
}
public UserCollectionDto map(int pageNumber, int pageSize, PageResult<User> pageResult) {
NumberedPaging paging = zeroBasedNumberedPaging(pageNumber, pageSize, pageResult.getOverallCount());
List<UserDto> dtos = pageResult.getEntities().stream().map(userToDtoMapper::map).collect(toList());
UserCollectionDto userCollectionDto = new UserCollectionDto(
createLinks(paging),
embedDtos(dtos)
);
userCollectionDto.setPage(pageNumber);
return userCollectionDto;
@Override
String createCreateLink() {
return userCollection(uriInfoStore.get()).create();
}
private Links createLinks(NumberedPaging page) {
String baseUrl = userCollection(uriInfoStore.get()).self();
Links.Builder linksBuilder = linkingTo()
.with(page.links(
fromTemplate(baseUrl + "{?page,pageSize}"),
EnumSet.allOf(PagingRel.class)));
if (UserPermissions.create().isPermitted()) {
linksBuilder.single(link("create", userCollection(uriInfoStore.get()).create()));
}
return linksBuilder.build();
@Override
String createSelfLink() {
return userCollection(uriInfoStore.get()).self();
}
private Embedded embedDtos(List<UserDto> dtos) {
return embeddedBuilder()
.with("users", dtos)
.build();
@Override
boolean isCreatePermitted() {
return UserPermissions.create().isPermitted();
}
}

View File

@@ -15,13 +15,11 @@ import static de.otto.edison.hal.Links.linkingTo;
import static sonia.scm.api.v2.resources.ResourceLinks.user;
@Mapper
public abstract class UserToUserDtoMapper extends BaseMapper {
public abstract class UserToUserDtoMapper extends BaseMapper<User, UserDto> {
@Inject
private UriInfoStore uriInfoStore;
public abstract UserDto map(User user);
@AfterMapping
void removePassword(@MappingTarget UserDto target) {
target.setPassword(UserResource.DUMMY_PASSWORT);