diff --git a/.travis.yml b/.travis.yml index ebdaab3..7bfd29a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,3 +5,6 @@ addons: apt: packages: - oracle-java8-installer +cache: + directories: + - $HOME/.m2 \ No newline at end of file diff --git a/pom.xml b/pom.xml index c3a47ce..1868ed3 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ black.door hate - v1r1t0 + v1r2t0 @@ -23,7 +23,13 @@ com.fasterxml.jackson.core jackson-databind - 2.6.4 + 2.7.0 + + + + com.damnhandy + handy-uri-templates + 2.1.3 junit diff --git a/src/main/java/black/door/hate/HalLink.java b/src/main/java/black/door/hate/HalLink.java index 8f89c78..80ebf6b 100644 --- a/src/main/java/black/door/hate/HalLink.java +++ b/src/main/java/black/door/hate/HalLink.java @@ -1,33 +1,136 @@ package black.door.hate; +import com.damnhandy.uri.template.UriTemplate; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; -import lombok.Builder; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import lombok.Getter; import lombok.NonNull; +import lombok.SneakyThrows; import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; +import java.util.Objects; /** * Created by nfischer on 12/8/2015. */ -@Builder @Getter @JsonInclude(JsonInclude.Include.NON_NULL) public class HalLink implements LinkOrResource{ - @NonNull - private URI href; - private Boolean templated; - private String type; - private URL deprecation; - private String name; - private URI profile; - private String title; - private String hreflang; + private @NonNull final String href; + private final Boolean templated; + private final String type; + private final URL deprecation; + private final String name; + private final URI profile; + private final String title; + private final String hreflang; + + @java.beans.ConstructorProperties({"href", "templated", "type", "deprecation", "name", "profile", "title", "hreflang"}) + HalLink(String href, Boolean templated, String type, URL deprecation, String name, URI profile, String title, String hreflang) { + this.href = href; + this.templated = templated; + this.type = type; + this.deprecation = deprecation; + this.name = name; + this.profile = profile; + this.title = title; + this.hreflang = hreflang; + } + + + public static HalLinkBuilder builder() { + return new HalLinkBuilder(); + } + + @JsonIgnore + @SneakyThrows(URISyntaxException.class) + public URI getHrefAsUri(){ + return new URI(href); + } + + @JsonIgnore + public UriTemplate getHrefAsTemplate(){ + return UriTemplate.fromTemplate(href); + } @Override public HalLink asLink() { return this; } + + @Override + @SneakyThrows(JsonProcessingException.class) + public String toString(){ + return new ObjectMapper().writeValueAsString(this); + } + + public static class HalLinkBuilder { + private String href; + private Boolean templated; + private String type; + private URL deprecation; + private String name; + private URI profile; + private String title; + private String hreflang; + + HalLinkBuilder() { + } + + public HalLink.HalLinkBuilder href(UriTemplate href) { + this.href = href.expandPartial(); + templated = true; + return this; + } + + public HalLink.HalLinkBuilder href(URI href) { + this.href = href.toASCIIString(); + if(Objects.equals(templated, true)) + templated = null; + return this; + } + + public HalLink.HalLinkBuilder type(String type) { + this.type = type; + return this; + } + + public HalLink.HalLinkBuilder deprecation(URL deprecation) { + this.deprecation = deprecation; + return this; + } + + public HalLink.HalLinkBuilder name(String name) { + this.name = name; + return this; + } + + public HalLink.HalLinkBuilder profile(URI profile) { + this.profile = profile; + return this; + } + + public HalLink.HalLinkBuilder title(String title) { + this.title = title; + return this; + } + + public HalLink.HalLinkBuilder hreflang(String hreflang) { + this.hreflang = hreflang; + return this; + } + + public HalLink build() { + return new HalLink(href, templated, type, deprecation, name, profile, title, hreflang); + } + + public String toString() { + return "black.door.hate.HalLink.HalLinkBuilder(href=" + this.href + ", templated=" + this.templated + ", type=" + this.type + ", deprecation=" + this.deprecation + ", name=" + this.name + ", profile=" + this.profile + ", title=" + this.title + ", hreflang=" + this.hreflang + ")"; + } + } } diff --git a/src/main/java/black/door/hate/HalRepresentation.java b/src/main/java/black/door/hate/HalRepresentation.java index 81e5da2..55b819f 100644 --- a/src/main/java/black/door/hate/HalRepresentation.java +++ b/src/main/java/black/door/hate/HalRepresentation.java @@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import lombok.Getter; +import lombok.SneakyThrows; import java.io.IOException; import java.net.URI; @@ -58,17 +59,14 @@ public class HalRepresentation implements java.io.Serializable { this.properties = properties; } + public String serialize() throws JsonProcessingException { return WRITER.writeValueAsString(this); } + @SneakyThrows(JsonProcessingException.class) public String toString(){ - try { - return serialize(); - } catch (JsonProcessingException e) { - e.printStackTrace(); - return null; - } + return serialize(); } public static HalRepresentationBuilder paginated( diff --git a/src/test/java/black/door/hate/HalRepresentationTest.java b/src/test/java/black/door/hate/HalRepresentationTest.java index c5915fe..b8916df 100644 --- a/src/test/java/black/door/hate/HalRepresentationTest.java +++ b/src/test/java/black/door/hate/HalRepresentationTest.java @@ -73,7 +73,17 @@ public void testPagination() throws Exception{ assertEquals(20, rep.getMultiEmbedded().get("orders").size()); assertEquals("/orders/20", rep.getMultiEmbedded().get("orders").get(0).asEmbedded().getLinks().get("self").asLink() - .getHref().toASCIIString()); + .getHref()); + } + + @Test + public void testLinkToString() throws JsonProcessingException { + Order o = new Order(1, 1, "USD", "status", new Basket(2), new Customer(3)); + + HalLink link = o.asLink(); + System.out.println(link.toString()); + assertTrue(link.toString().length() > 0); + assertTrue(o.asEmbedded().serialize().contains(link.toString())); } @Test