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);
+ }
+
+}