Skip to content

Commit 5579f10

Browse files
author
Gregory Fernandez
committed
Requested fields on super resource type are now taken into account.
* Update DocumentMapperUtil.getRequestedFields to read requested fields on super type. * Add test case.
1 parent 931accc commit 5579f10

File tree

6 files changed

+140
-3
lines changed

6 files changed

+140
-3
lines changed

crnk-core/src/main/java/io/crnk/core/engine/internal/document/mapper/DocumentMapperUtil.java

+13-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.fasterxml.jackson.annotation.JsonInclude.Include;
1313
import com.fasterxml.jackson.databind.ObjectMapper;
1414
import com.fasterxml.jackson.databind.node.ObjectNode;
15+
1516
import io.crnk.core.boot.CrnkProperties;
1617
import io.crnk.core.engine.document.Resource;
1718
import io.crnk.core.engine.document.ResourceIdentifier;
@@ -63,7 +64,12 @@ public DocumentMapperUtil(ResourceRegistry resourceRegistry, ObjectMapper object
6364
protected static List<ResourceField> getRequestedFields(ResourceInformation resourceInformation, QueryAdapter queryAdapter,
6465
List<ResourceField> fields, boolean relation) {
6566
Map<String, Set<PathSpec>> includedFieldsSet = queryAdapter != null ? queryAdapter.getIncludedFields() : null;
66-
Set<PathSpec> includedFields = includedFieldsSet != null ? includedFieldsSet.get(resourceInformation.getResourceType()) : null;
67+
final Set<PathSpec> includedFields = new HashSet<>();
68+
69+
if (includedFieldsSet != null) {
70+
addIfNotNull(includedFields, includedFieldsSet.get(resourceInformation.getResourceType()));
71+
addIfNotNull(includedFields, includedFieldsSet.get(resourceInformation.getSuperResourceType()));
72+
}
6773
if (noResourceIncludedFieldsSpecified(includedFields)) {
6874
return fields;
6975
}
@@ -72,6 +78,12 @@ protected static List<ResourceField> getRequestedFields(ResourceInformation reso
7278
}
7379
}
7480

81+
private static <T> void addIfNotNull(Set<T> set, Collection<T> collection) {
82+
if (collection != null) {
83+
set.addAll(collection);
84+
}
85+
}
86+
7587
private static List<ResourceField> computeRequestedFields(Set<PathSpec> includedFields, boolean relation,
7688
QueryAdapter queryAdapter, ResourceInformation resourceInformation, List<ResourceField> fields) {
7789

crnk-core/src/test/java/io/crnk/core/CoreTestModule.java

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import io.crnk.core.mock.repository.RelationIdTestRepository;
1515
import io.crnk.core.mock.repository.RelationshipBehaviorTestRepository;
1616
import io.crnk.core.mock.repository.ScheduleRepositoryImpl;
17+
import io.crnk.core.mock.repository.SuperTaskRepository;
1718
import io.crnk.core.mock.repository.TaskRepository;
1819
import io.crnk.core.mock.repository.TaskToProjectRepository;
1920
import io.crnk.core.mock.repository.TaskWithLookupRepository;
@@ -38,6 +39,7 @@ public void setupModule(ModuleContext context) {
3839
context.addRepository(new ProjectToTaskRepository());
3940
context.addRepository(new ProjectPolymorphicRepository());
4041
context.addRepository(new ScheduleRepositoryImpl());
42+
context.addRepository(new SuperTaskRepository());
4143
context.addRepository(new ThingRepository());
4244
context.addRepository(new TaskRepository());
4345
context.addRepository(new TaskToProjectRepository());

crnk-core/src/test/java/io/crnk/core/engine/internal/document/mapper/DocumentMapperTest.java

+32-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.crnk.core.engine.internal.document.mapper;
22

3-
import java.net.URI;
43
import java.time.OffsetDateTime;
54
import java.util.ArrayList;
65
import java.util.Arrays;
@@ -17,7 +16,6 @@
1716
import com.fasterxml.jackson.databind.JsonNode;
1817
import com.fasterxml.jackson.databind.ObjectWriter;
1918
import com.fasterxml.jackson.databind.node.ObjectNode;
20-
import com.fasterxml.jackson.databind.node.TextNode;
2119
import io.crnk.core.engine.document.Document;
2220
import io.crnk.core.engine.document.ErrorData;
2321
import io.crnk.core.engine.document.Relationship;
@@ -27,6 +25,8 @@
2725
import io.crnk.core.mock.models.LazyTask;
2826
import io.crnk.core.mock.models.Project;
2927
import io.crnk.core.mock.models.Schedule;
28+
import io.crnk.core.mock.models.SpecialTask;
29+
import io.crnk.core.mock.models.SuperTask;
3030
import io.crnk.core.mock.models.Task;
3131
import io.crnk.core.queryspec.PathSpec;
3232
import io.crnk.core.queryspec.QuerySpec;
@@ -648,6 +648,29 @@ public void testAttributesSelection() {
648648
Assert.assertEquals("sample category", resource.getAttributes().get("category").asText());
649649
}
650650

651+
@Test
652+
public void testSupertypeAttributesSelection() {
653+
SpecialTask task = createSpecialTask(2, "sample task");
654+
task.setEnd("next month");
655+
JsonApiResponse response = new JsonApiResponse();
656+
response.setEntity(task);
657+
658+
QuerySpec querySpec = new QuerySpec(SpecialTask.class);
659+
querySpec.includeField(PathSpec.of("end"));
660+
final QuerySpec superQuerySpec = new QuerySpec(SuperTask.class);
661+
superQuerySpec.includeField(PathSpec.of("name"));
662+
querySpec.setNestedSpecs(Collections.singletonList(superQuerySpec));
663+
664+
Document document = mapper.toDocument(response, toAdapter(querySpec), mappingConfig).get();
665+
Resource resource = document.getSingleData().get();
666+
Assert.assertEquals("2", resource.getId());
667+
Assert.assertEquals("specialTask", resource.getType());
668+
Assert.assertNull(resource.getAttributes().get("category"));
669+
Assert.assertNull(resource.getAttributes().get("recurring"));
670+
Assert.assertEquals("sample task", resource.getAttributes().get("name").asText());
671+
Assert.assertEquals("next month", resource.getAttributes().get("end").asText());
672+
}
673+
651674
@Test
652675
public void testAttributesOrdering() {
653676
Task task = createTask(3, "sample task");
@@ -690,6 +713,13 @@ private LazyTask createLazyTask(long id) {
690713
return task;
691714
}
692715

716+
private SpecialTask createSpecialTask(long id, String name) {
717+
SpecialTask task = new SpecialTask();
718+
task.setId(id);
719+
task.setName(name);
720+
return task;
721+
}
722+
693723
public static class TestLinksInformation implements LinksInformation {
694724

695725
public Link value;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package io.crnk.core.mock.models;
2+
3+
import io.crnk.core.resource.annotations.JsonApiResource;
4+
5+
@JsonApiResource(type = "specialTask", resourcePath = "superTasks")
6+
public class SpecialTask extends SuperTask {
7+
8+
private boolean recurring;
9+
10+
private String end;
11+
12+
public boolean isRecurring() {
13+
return recurring;
14+
}
15+
16+
public void setRecurring(final boolean recurring) {
17+
this.recurring = recurring;
18+
}
19+
20+
public String getEnd() {
21+
return end;
22+
}
23+
24+
public void setEnd(final String end) {
25+
this.end = end;
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.crnk.core.mock.models;
2+
3+
import io.crnk.core.resource.annotations.JsonApiId;
4+
import io.crnk.core.resource.annotations.JsonApiResource;
5+
6+
@JsonApiResource(type = "superTasks", subTypes = SpecialTask.class)
7+
public abstract class SuperTask {
8+
9+
@JsonApiId
10+
private Long id;
11+
12+
private String name;
13+
14+
private String category;
15+
16+
public Long getId() {
17+
return id;
18+
}
19+
20+
public SuperTask setId(Long id) {
21+
this.id = id;
22+
return this;
23+
}
24+
25+
public String getName() {
26+
return name;
27+
}
28+
29+
public void setName(@SuppressWarnings("SameParameterValue") String name) {
30+
this.name = name;
31+
}
32+
33+
public String getCategory() {
34+
return category;
35+
}
36+
37+
public void setCategory(final String category) {
38+
this.category = category;
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package io.crnk.core.mock.repository;
2+
3+
import java.util.HashSet;
4+
import java.util.Set;
5+
6+
import io.crnk.core.mock.models.SpecialTask;
7+
import io.crnk.core.mock.models.SuperTask;
8+
import io.crnk.core.queryspec.QuerySpec;
9+
import io.crnk.core.repository.ReadOnlyResourceRepositoryBase;
10+
import io.crnk.core.resource.list.ResourceList;
11+
12+
public class SuperTaskRepository extends ReadOnlyResourceRepositoryBase<SuperTask, Long> {
13+
14+
private Set<SpecialTask> tasks = new HashSet<>();
15+
16+
private long nextId = 0;
17+
18+
public SuperTaskRepository() {
19+
super(SuperTask.class);
20+
}
21+
22+
@Override
23+
public ResourceList<SuperTask> findAll(final QuerySpec querySpec) {
24+
return null;
25+
}
26+
}

0 commit comments

Comments
 (0)