Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 63 additions & 0 deletions src/main/java/com/github/jasminb/jsonapi/JSONAPIParser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.github.jasminb.jsonapi;

import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class JSONAPIParser {
private final ObjectMapper objectMapper;

public JSONAPIParser(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}

public MetaData toMetaData(JsonNode jsonNode) {
if (jsonNode == null || jsonNode.isNull() || !jsonNode.isObject()) {
return null;
}
// ???: is there a way to do this without objectMapper?
JavaType type = objectMapper.getTypeFactory().constructMapType(HashMap.class, String.class, Object.class);

Map<String, Object> map = objectMapper.convertValue(jsonNode, type);
return new MetaData(map, jsonNode, objectMapper);
}

public LinksData toLinksData(JsonNode jsonNode) {

if (jsonNode == null || jsonNode.isNull() || !jsonNode.isObject()) {
return null;
}
Map<String, LinkData> map = new HashMap<>();

Iterator<Map.Entry<String, JsonNode>> entryIterator = jsonNode.fields();

while (entryIterator.hasNext()) {
Map.Entry<String, JsonNode> entry = entryIterator.next();

LinkData linkData = toLinkData(entry.getValue());
if (linkData != null) {

map.put(entry.getKey(), linkData);
}
}

return new LinksData(map);
}

public LinkData toLinkData(JsonNode jsonNode) {
if (jsonNode.isObject()) {
String href = jsonNode.get(JSONAPISpecConstants.HREF).asText();
if (href != null && !href.isEmpty()) {
MetaData metaData = toMetaData(jsonNode.get(JSONAPISpecConstants.META));
return new LinkData(href, metaData);
}
} else if (jsonNode.isTextual()) {
return new LinkData(jsonNode.asText());
}
return null;
}
}
28 changes: 28 additions & 0 deletions src/main/java/com/github/jasminb/jsonapi/JsonApiDocument.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.github.jasminb.jsonapi;

/**
* Class which can represent additional non-payload data of a (non-error) JSON API response.
*
* Currently that means 'links'.
*
* @param <T> Either single POJO, or List of POJOs for collection responses.
*/
public class JsonApiDocument<T> {

private final T data;

private final LinksData links;

public JsonApiDocument(T data, LinksData links) {
this.data = data;
this.links = links;
}

public T getData() {
return data;
}

public LinksData getLinks() {
return links;
}
}
35 changes: 35 additions & 0 deletions src/main/java/com/github/jasminb/jsonapi/LinkData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.github.jasminb.jsonapi;

/**
* Class representing the value of of a link, which can be either a plain string URL, or an object with an 'href' and an
* optional 'meta' field:
*
* "links" : { "self" : "/foo" , .. }
*
* or
*
* "links" : { "self" : { "href" : "/foo", "meta" : {} } , .. }
*
* @see <a href="http://jsonapi.org/format/#document-links">JSON API Spec: links section</a>
*/
public class LinkData {
private final String href;
private final MetaData metaData;

public LinkData(String href) {
this(href, null);
}

public LinkData(String href, MetaData metaData) {
this.href = href;
this.metaData = metaData;
}

public String getHref() {
return href;
}

public MetaData getMetaData() {
return metaData;
}
}
22 changes: 22 additions & 0 deletions src/main/java/com/github/jasminb/jsonapi/LinksData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.github.jasminb.jsonapi;

import java.util.Map;

/**
* Simple Map container for the moment, for type-safety and readability.
*/
public class LinksData {
private final Map<String, LinkData> map;

public LinksData(Map<String, LinkData> map) {
this.map = map;
}

public boolean containsKey(String key) {
return map.containsKey(key);
}

public LinkData getLink(String key) {
return map.get(key);
}
}
33 changes: 33 additions & 0 deletions src/main/java/com/github/jasminb/jsonapi/MetaData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.github.jasminb.jsonapi;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.Map;

/**
* Simple Map container for the moment, for type-safety and readability.
*/
public class MetaData {
private final Map<String, Object> map;
private final JsonNode jsonNode;
private final ObjectMapper objectMapper;

public MetaData(Map<String, Object> map, JsonNode jsonNode, ObjectMapper objectMapper) {
this.map = map;
this.jsonNode = jsonNode;
this.objectMapper = objectMapper;
}

public Object get(String key) {
return map.get(key);
}

public boolean containsKey(String key) {
return map.containsKey(key);
}

public <T> T as(Class<T> clazz) {
return objectMapper.convertValue(jsonNode, clazz);
}
}
Loading