diff --git a/scm-core/src/main/java/sonia/scm/api/v2/resources/LinkAppender.java b/scm-core/src/main/java/sonia/scm/api/v2/resources/LinkAppender.java index dbf1ff3ff6..d3864dc798 100644 --- a/scm-core/src/main/java/sonia/scm/api/v2/resources/LinkAppender.java +++ b/scm-core/src/main/java/sonia/scm/api/v2/resources/LinkAppender.java @@ -15,4 +15,33 @@ public interface LinkAppender { * @param href link uri */ void appendOne(String rel, String href); + + /** + * Returns a builder which is able to append an array of links to the resource. + * + * @param rel name of link relation + * @return multi link builder + */ + LinkArrayBuilder arrayBuilder(String rel); + + + /** + * Builder for link arrays. + */ + interface LinkArrayBuilder { + + /** + * Append an link to the array. + * + * @param name name of link + * @param href link target + * @return {@code this} + */ + LinkArrayBuilder append(String name, String href); + + /** + * Builds the array and appends the it to the json response. + */ + void build(); + } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/EdisonLinkAppender.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/EdisonLinkAppender.java index 66c35080b5..c4e699cb58 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/EdisonLinkAppender.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/EdisonLinkAppender.java @@ -3,6 +3,9 @@ package sonia.scm.api.v2.resources; import de.otto.edison.hal.Link; import de.otto.edison.hal.Links; +import java.util.ArrayList; +import java.util.List; + class EdisonLinkAppender implements LinkAppender { private final Links.Builder builder; @@ -15,4 +18,32 @@ class EdisonLinkAppender implements LinkAppender { public void appendOne(String rel, String href) { builder.single(Link.link(rel, href)); } + + @Override + public LinkArrayBuilder arrayBuilder(String rel) { + return new EdisonLinkArrayBuilder(builder, rel); + } + + private static class EdisonLinkArrayBuilder implements LinkArrayBuilder { + + private final Links.Builder builder; + private final String rel; + private final List linkArray = new ArrayList<>(); + + private EdisonLinkArrayBuilder(Links.Builder builder, String rel) { + this.builder = builder; + this.rel = rel; + } + + @Override + public LinkArrayBuilder append(String name, String href) { + linkArray.add(Link.linkBuilder(rel, href).withName(name).build()); + return this; + } + + @Override + public void build() { + builder.array(linkArray); + } + } } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/EdisonLinkAppenderTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/EdisonLinkAppenderTest.java new file mode 100644 index 0000000000..e97415cc09 --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/EdisonLinkAppenderTest.java @@ -0,0 +1,43 @@ +package sonia.scm.api.v2.resources; + +import de.otto.edison.hal.Link; +import de.otto.edison.hal.Links; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static de.otto.edison.hal.Links.linkingTo; +import static org.assertj.core.api.Assertions.assertThat; + +class EdisonLinkAppenderTest { + + private Links.Builder builder; + private EdisonLinkAppender appender; + + @BeforeEach + void prepare() { + builder = linkingTo(); + appender = new EdisonLinkAppender(builder); + } + + @Test + void shouldAppendOneLink() { + appender.appendOne("self", "https://scm.hitchhiker.com"); + + Links links = builder.build(); + assertThat(links.getLinkBy("self").get().getHref()).isEqualTo("https://scm.hitchhiker.com"); + } + + @Test + void shouldAppendMultipleLinks() { + appender.arrayBuilder("items") + .append("one", "http://one") + .append("two", "http://two") + .build(); + + List items = builder.build().getLinksBy("items"); + assertThat(items).hasSize(2); + } + +}