Abstraction for LinkBuilder

This commit is contained in:
René Pfeuffer
2018-06-14 09:26:41 +02:00
parent d2e2123cb4
commit 51579b2e55
4 changed files with 90 additions and 23 deletions

View File

@@ -14,6 +14,8 @@ import java.util.stream.Collectors;
import static de.otto.edison.hal.Link.link;
import static de.otto.edison.hal.Links.linkingTo;
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 {
@@ -22,17 +24,12 @@ public abstract class GroupToGroupDtoMapper extends BaseMapper {
@AfterMapping
void appendLinks(Group group, @MappingTarget GroupDto target, @Context UriInfo uriInfo) {
LinkBuilder groupLinkBuilder = new LinkBuilder(uriInfo, GroupV2Resource.class, GroupSubResource.class);
Links.Builder linksBuilder = linkingTo()
.self(groupLinkBuilder.method("getGroupSubResource").parameters(target.getName()).method("get").parameters().href());
Links.Builder linksBuilder = linkingTo().self(group(uriInfo).self(target.getName()));
if (GroupPermissions.delete(group).isPermitted()) {
linksBuilder
.single(link("delete", groupLinkBuilder.method("getGroupSubResource").parameters(target.getName()).method("delete").parameters().href()));
linksBuilder.single(link("delete", group(uriInfo).delete(target.getName())));
}
if (GroupPermissions.modify(group).isPermitted()) {
linksBuilder
.single(link("update", groupLinkBuilder.method("getGroupSubResource").parameters(target.getName()).method("update").parameters().href()));
linksBuilder.single(link("update", group(uriInfo).update(target.getName())));
}
target.add(linksBuilder.build());
}
@@ -44,9 +41,7 @@ public abstract class GroupToGroupDtoMapper extends BaseMapper {
}
private MemberDto createMember(String name, UriInfo uriInfo) {
LinkBuilder userLinkBuilder = new LinkBuilder(uriInfo, UserV2Resource.class, UserSubResource.class);
Links.Builder linksBuilder = linkingTo()
.self(userLinkBuilder.method("getUserSubResource").parameters(name).method("get").parameters().href());
Links.Builder linksBuilder = linkingTo().self(user(uriInfo).self(name));
MemberDto memberDto = new MemberDto(name);
memberDto.add(linksBuilder.build());
return memberDto;

View File

@@ -0,0 +1,77 @@
package sonia.scm.api.v2.resources;
import javax.ws.rs.core.UriInfo;
class ResourceLinks {
private ResourceLinks() {
}
static GroupLinks group(UriInfo uriInfo) {
return new GroupLinks(uriInfo);
}
static class GroupLinks {
private final LinkBuilder groupLinkBuilder;
private GroupLinks(UriInfo uriInfo) {
groupLinkBuilder = new LinkBuilder(uriInfo, GroupV2Resource.class, GroupSubResource.class);
}
String self(String name) {
return groupLinkBuilder.method("getGroupSubResource").parameters(name).method("get").parameters().href();
}
String delete(String name) {
return groupLinkBuilder.method("getGroupSubResource").parameters(name).method("delete").parameters().href();
}
public String update(String name) {
return groupLinkBuilder.method("getGroupSubResource").parameters(name).method("update").parameters().href();
}
}
static UserLinks user(UriInfo uriInfo) {
return new UserLinks(uriInfo);
}
static class UserLinks {
private final LinkBuilder userLinkBuilder;
private UserLinks(UriInfo uriInfo) {
userLinkBuilder = new LinkBuilder(uriInfo, UserV2Resource.class, UserSubResource.class);
}
String self(String name) {
return userLinkBuilder.method("getUserSubResource").parameters(name).method("get").parameters().href();
}
String delete(String name) {
return userLinkBuilder.method("getUserSubResource").parameters(name).method("delete").parameters().href();
}
public String update(String name) {
return userLinkBuilder.method("getUserSubResource").parameters(name).method("update").parameters().href();
}
}
static UserCollectionLinks userCollection(UriInfo uriInfo) {
return new UserCollectionLinks(uriInfo);
}
static class UserCollectionLinks {
private final LinkBuilder collectionLinkBuilder;
private UserCollectionLinks(UriInfo uriInfo) {
collectionLinkBuilder = new LinkBuilder(uriInfo, UserV2Resource.class, UserCollectionResource.class);
}
String self() {
return collectionLinkBuilder.method("getUserCollectionResource").parameters().method("getAll").parameters().href();
}
public String create() {
return collectionLinkBuilder.method("getUserCollectionResource").parameters().method("create").parameters().href();
}
}
}

View File

@@ -19,6 +19,7 @@ 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 sonia.scm.api.v2.resources.ResourceLinks.userCollection;
public class UserCollectionToDtoMapper {
@@ -42,16 +43,14 @@ public class UserCollectionToDtoMapper {
}
private static Links createLinks(UriInfo uriInfo, NumberedPaging page) {
LinkBuilder collectionLinkBuilder = new LinkBuilder(uriInfo, UserV2Resource.class, UserCollectionResource.class);
String baseUrl = collectionLinkBuilder.method("getUserCollectionResource").parameters().method("create").parameters().href();
String baseUrl = userCollection(uriInfo).self();
Links.Builder linksBuilder = linkingTo()
.with(page.links(
fromTemplate(baseUrl + "{?page,pageSize}"),
EnumSet.allOf(PagingRel.class)));
if (UserPermissions.create().isPermitted()) {
linksBuilder
.single(link("create", collectionLinkBuilder. method("getUserCollectionResource").parameters().method("create").parameters().href()));
linksBuilder.single(link("create", userCollection(uriInfo).create()));
}
return linksBuilder.build();
}

View File

@@ -13,6 +13,7 @@ import javax.ws.rs.core.UriInfo;
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;
@Mapper
public abstract class UserToUserDtoMapper extends BaseMapper {
@@ -26,17 +27,12 @@ public abstract class UserToUserDtoMapper extends BaseMapper {
@AfterMapping
void appendLinks(User user, @MappingTarget UserDto target, @Context UriInfo uriInfo) {
LinkBuilder userLinkBuilder = new LinkBuilder(uriInfo, UserV2Resource.class, UserSubResource.class);
Links.Builder linksBuilder = linkingTo()
.self(userLinkBuilder.method("getUserSubResource").parameters(target.getName()).method("get").parameters().href());
Links.Builder linksBuilder = linkingTo().self(user(uriInfo).self(target.getName()));
if (UserPermissions.delete(user).isPermitted()) {
linksBuilder
.single(link("delete", userLinkBuilder.method("getUserSubResource").parameters(target.getName()).method("delete").parameters().href()));
linksBuilder.single(link("delete", user(uriInfo).delete(target.getName())));
}
if (UserPermissions.modify(user).isPermitted()) {
linksBuilder
.single(link("update", userLinkBuilder.method("getUserSubResource").parameters(target.getName()).method("update").parameters().href()));
linksBuilder.single(link("update", user(uriInfo).update(target.getName())));
}
target.add(
linksBuilder.build());