use of io.crnk.core.engine.document.Relationship in project crnk-framework by crnk-project.
the class ClientDocumentMapper method newResourceMapper.
@Override
protected ResourceMapper newResourceMapper(final DocumentMapperUtil util, boolean client, ObjectMapper objectMapper) {
return new ResourceMapper(util, client, objectMapper, null) {
@Override
protected void setRelationship(Resource resource, ResourceField field, Object entity, ResourceInformation resourceInformation, QueryAdapter queryAdapter, ResourceMappingConfig mappingConfig) {
// we also include relationship data if it is not null and not a
// unloaded proxy
boolean includeRelation = true;
Object relationshipId = null;
if (field.hasIdField()) {
Object relationshipValue = field.getIdAccessor().getValue(entity);
ResourceInformation oppositeInformation = resourceRegistry.getEntry(field.getOppositeResourceType()).getResourceInformation();
if (relationshipValue instanceof Collection) {
List ids = new ArrayList();
for (Object elem : (Collection<?>) relationshipValue) {
ids.add(oppositeInformation.toResourceIdentifier(elem));
}
relationshipId = ids;
} else if (relationshipValue != null) {
relationshipId = oppositeInformation.toResourceIdentifier(relationshipValue);
}
includeRelation = relationshipId != null || field.getSerializeType() != SerializeType.LAZY;
} else {
Object relationshipValue = field.getAccessor().getValue(entity);
if (relationshipValue instanceof ObjectProxy) {
includeRelation = ((ObjectProxy) relationshipValue).isLoaded();
} else {
// TODO for fieldSets handling in the future the lazy
// handling must be different
includeRelation = relationshipValue != null || field.getSerializeType() != SerializeType.LAZY && !field.isCollection();
}
if (relationshipValue != null && includeRelation) {
if (relationshipValue instanceof Collection) {
relationshipId = util.toResourceIds((Collection<?>) relationshipValue);
} else {
relationshipId = util.toResourceId(relationshipValue);
}
}
}
if (includeRelation) {
Relationship relationship = new Relationship();
relationship.setData(Nullable.of((Object) relationshipId));
resource.getRelationships().put(field.getJsonName(), relationship);
}
}
};
}
use of io.crnk.core.engine.document.Relationship in project crnk-framework by crnk-project.
the class IncludeLookupSetterInheritanceTest method testPolymorhRelationship.
@Test
public void testPolymorhRelationship() throws Exception {
QuerySpec querySpec = new QuerySpec(Task.class);
querySpec.includeRelation(Arrays.asList("includedProjects"));
Task task = new Task();
task.setId(1L);
Document document = mapper.toDocument(toResponse(task), toAdapter(querySpec));
Resource taskResource = document.getSingleData().get();
Relationship relationship = taskResource.getRelationships().get("includedProjects");
assertNotNull(relationship);
List<ResourceIdentifier> projects = relationship.getCollectionData().get();
assertEquals(2, projects.size());
List<Resource> included = document.getIncluded();
assertEquals(2, included.size());
Assert.assertEquals("projects", included.get(1).getType());
Assert.assertEquals("fancy-projects", included.get(0).getType());
}
use of io.crnk.core.engine.document.Relationship in project crnk-framework by crnk-project.
the class DependencyOrderStrategyTest method addOneDependency.
private void addOneDependency(Operation op1, Operation op2, String relationshipName) {
Resource resource1 = op1.getValue();
Resource resource2 = op2.getValue();
Relationship relationship = resource1.getRelationships().get(relationshipName);
if (relationship == null) {
relationship = new Relationship();
resource1.getRelationships().put(relationshipName, relationship);
}
ResourceIdentifier resourceId = new ResourceIdentifier(resource2.getId(), resource2.getType());
relationship.setData(Nullable.of((Object) resourceId));
}
use of io.crnk.core.engine.document.Relationship in project crnk-framework by crnk-project.
the class DependencyOrderStrategyTest method addUnitializedDependency.
private void addUnitializedDependency(Operation op, String relationshipName) {
Resource resource1 = op.getValue();
Relationship relationship = resource1.getRelationships().get(relationshipName);
if (relationship == null) {
relationship = new Relationship();
resource1.getRelationships().put(relationshipName, relationship);
}
relationship.setData(Nullable.empty());
}
Aggregations