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 0472b8dcf5..31ff497080 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 @@ -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; 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 new file mode 100644 index 0000000000..4ac369f7ee --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java @@ -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(); + } + } +} 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 ca77b3e0f2..94d9bd7dfb 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 @@ -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(); } 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 7a416bc675..9d7706c9d7 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 @@ -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());