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