diff --git a/core/src/main/java/moe/banana/jsonapi2/ArrayDocument.java b/core/src/main/java/moe/banana/jsonapi2/ArrayDocument.java index 1828646..2ecf7c1 100644 --- a/core/src/main/java/moe/banana/jsonapi2/ArrayDocument.java +++ b/core/src/main/java/moe/banana/jsonapi2/ArrayDocument.java @@ -31,6 +31,19 @@ public boolean remove(Object o) { return false; } + @Override + public T find(ResourceIdentifier resourceIdentifier) { + for (DATA resource : data) { + if (resource.getId().equals(resourceIdentifier.getId()) && + resource.getType().equals(resourceIdentifier.getType())) { + //noinspection unchecked + return (T) resource; + } + } + + return super.find(resourceIdentifier); + } + @Override public boolean containsAll(Collection c) { return data.containsAll(c); diff --git a/core/src/main/java/moe/banana/jsonapi2/ObjectDocument.java b/core/src/main/java/moe/banana/jsonapi2/ObjectDocument.java index ae70d19..6779752 100644 --- a/core/src/main/java/moe/banana/jsonapi2/ObjectDocument.java +++ b/core/src/main/java/moe/banana/jsonapi2/ObjectDocument.java @@ -46,6 +46,18 @@ public boolean hasData() { return hasData; } + @Override + public T find(ResourceIdentifier resourceIdentifier) { + if (data != null && + data.getId().equals(resourceIdentifier.getId()) && + data.getType().equals(resourceIdentifier.getType())) { + //noinspection unchecked + return (T) data; + } + + return super.find(resourceIdentifier); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/core/src/test/java/moe/banana/jsonapi2/DocumentTest.java b/core/src/test/java/moe/banana/jsonapi2/DocumentTest.java index cb4cd2e..af2fc96 100644 --- a/core/src/test/java/moe/banana/jsonapi2/DocumentTest.java +++ b/core/src/test/java/moe/banana/jsonapi2/DocumentTest.java @@ -40,6 +40,14 @@ public void deserialize_object() throws Exception { assertOnArticle1(document.
asObjectDocument().get()); } + @Test + public void find_in_object_document_data() throws Exception { + ObjectDocument document = (ObjectDocument) getDocumentAdapter(Article.class) + .fromJson(TestUtil.fromResource("/single.json")); + + assertOnArticle1((Article) document.find(new ResourceIdentifier("articles", "1"))); + } + @Test public void deserialize_object_null() throws Exception { Document document = getDocumentAdapter(Article.class) @@ -203,6 +211,15 @@ public void deserialize_array_to_array_typed_document() throws Exception { assertOnArticle1(arrayDocument.get(0)); } + @Test + public void deserialize_refences_to_data_objects_in_array_document() throws Exception { + Moshi moshi = TestUtil.moshi(Article.class, Comment.class); + JsonAdapter adapter = moshi.adapter(Types.newParameterizedType(ArrayDocument.class, Article.class)); + ArrayDocument
arrayDocument = ((ArrayDocument
) adapter.fromJson(TestUtil.fromResource("/multiple_compound.json"))); + + assertOnArticle1((Article) arrayDocument.find(new ResourceIdentifier("articles", "1"))); + } + @Test public void serialize_null() { ObjectDocument document = new ObjectDocument(); diff --git a/core/src/test/java/moe/banana/jsonapi2/model/Comment.java b/core/src/test/java/moe/banana/jsonapi2/model/Comment.java index 906e1e9..69a8392 100644 --- a/core/src/test/java/moe/banana/jsonapi2/model/Comment.java +++ b/core/src/test/java/moe/banana/jsonapi2/model/Comment.java @@ -8,6 +8,7 @@ public class Comment extends Resource { private String body; private HasOne author; + private HasOne
article; public String getBody() { return body; @@ -24,4 +25,12 @@ public HasOne getAuthor() { public void setAuthor(HasOne author) { this.author = author; } + + public HasOne
getArticle() { + return this.article; + } + + public void setArticle(HasOne
article) { + this.article = article; + } } diff --git a/core/src/test/resources/multiple_compound.json b/core/src/test/resources/multiple_compound.json index a139bcf..6288515 100644 --- a/core/src/test/resources/multiple_compound.json +++ b/core/src/test/resources/multiple_compound.json @@ -97,4 +97,4 @@ "cache_hit": true } }] -} \ No newline at end of file +}