extends LinkEnricher api to append link arrays to the response

This commit is contained in:
Sebastian Sdorra
2019-01-03 11:18:22 +01:00
parent 7821b68d9c
commit 5f80f5c4af
3 changed files with 103 additions and 0 deletions

View File

@@ -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();
}
}

View File

@@ -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<Link> 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);
}
}
}

View File

@@ -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<Link> items = builder.build().getLinksBy("items");
assertThat(items).hasSize(2);
}
}