use of io.crnk.core.engine.document.Resource in project crnk-framework by crnk-project.
the class IncludeLookupSetter method mergeResource.
private Resource mergeResource(Object targetEntity, QueryAdapter queryAdapter, Map<ResourceIdentifier, Resource> resourceMap, Map<ResourceIdentifier, Object> entityMap, ResourceMappingConfig resourceMappingConfig) {
Resource targetResource = resourceMapper.toData(targetEntity, queryAdapter, resourceMappingConfig);
ResourceIdentifier targetId = targetResource.toIdentifier();
if (!resourceMap.containsKey(targetId)) {
resourceMap.put(targetId, targetResource);
} else {
// TODO consider merging
targetResource = resourceMap.get(targetId);
}
if (!(targetEntity instanceof Resource)) {
entityMap.put(targetId, targetEntity);
}
return targetResource;
}
use of io.crnk.core.engine.document.Resource in project crnk-framework by crnk-project.
the class IncludeLookupSetter method lookupRelatedResource.
/**
* Loads all related resources for the given resources and relationship
* field. It updates the relationship data of the source resources
* accordingly and returns the loaded resources for potential inclusion in
* the result resource.
*/
@SuppressWarnings("unchecked")
private Set<Resource> lookupRelatedResource(Collection<Resource> sourceResources, ResourceField relationshipField, QueryAdapter queryAdapter, RepositoryMethodParameterProvider parameterProvider, Map<ResourceIdentifier, Resource> resourceMap, Map<ResourceIdentifier, Object> entityMap, ResourceMappingConfig resourceMappingConfig) {
if (sourceResources.isEmpty()) {
return Collections.emptySet();
}
// directly load where relationship data is available
Collection<Resource> sourceResourcesWithData = new ArrayList<>();
Collection<Resource> sourceResourcesWithoutData = new ArrayList<>();
for (Resource sourceResource : sourceResources) {
boolean present = sourceResource.getRelationships().get(relationshipField.getJsonName()).getData().isPresent();
if (present) {
sourceResourcesWithData.add(sourceResource);
} else {
sourceResourcesWithoutData.add(sourceResource);
}
}
Set<Resource> relatedResources = new HashSet<>();
if (!sourceResourcesWithData.isEmpty()) {
relatedResources.addAll(lookupRelatedResourcesWithId(sourceResourcesWithData, relationshipField, queryAdapter, parameterProvider, resourceMap, entityMap, resourceMappingConfig));
}
if (!sourceResourcesWithoutData.isEmpty()) {
relatedResources.addAll(lookupRelatedResourceWithRelationship(sourceResourcesWithoutData, relationshipField, queryAdapter, parameterProvider, resourceMap, entityMap, resourceMappingConfig));
}
return relatedResources;
}
use of io.crnk.core.engine.document.Resource in project crnk-framework by crnk-project.
the class RawResourceFieldAccessor method getValue.
@Override
public Object getValue(Object objResource) {
Resource resource = (Resource) objResource;
switch(fieldType) {
case ID:
return resource.getId();
case ATTRIBUTE:
JsonNode jsonNode = resource.getAttributes().get(fieldName);
return toObject(jsonNode);
case RELATIONSHIP:
Map<String, Relationship> relationships = resource.getRelationships();
Relationship relationship = relationships.get(fieldName);
if (relationship != null && relationship.getData().isPresent()) {
return relationship.getData().get();
}
return null;
case META_INFORMATION:
return toObject(resource.getMeta());
default:
PreconditionUtil.assertEquals("invalid type", fieldType, ResourceFieldType.LINKS_INFORMATION);
return toObject(resource.getLinks());
}
}
use of io.crnk.core.engine.document.Resource in project crnk-framework by crnk-project.
the class FieldResourcePost method handle.
@Override
public Response handle(JsonPath jsonPath, QueryAdapter queryAdapter, RepositoryMethodParameterProvider parameterProvider, Document requestDocument) {
RegistryEntry endpointRegistryEntry = getRegistryEntry(jsonPath);
Resource resourceBody = getRequestBody(requestDocument, jsonPath, HttpMethod.POST);
PathIds resourceIds = jsonPath.getIds();
RegistryEntry bodyRegistryEntry = resourceRegistry.getEntry(resourceBody.getType());
Serializable castedResourceId = getResourceId(resourceIds, endpointRegistryEntry);
ResourceField relationshipField = endpointRegistryEntry.getResourceInformation().findRelationshipFieldByName(jsonPath.getElementName());
verifyFieldNotNull(relationshipField, jsonPath.getElementName());
Class<?> baseRelationshipFieldClass = relationshipField.getType();
RegistryEntry relationshipRegistryEntry = resourceRegistry.getEntry(relationshipField.getOppositeResourceType());
String relationshipResourceType = relationshipField.getOppositeResourceType();
verifyTypes(HttpMethod.POST, relationshipRegistryEntry, bodyRegistryEntry);
Object newResource = buildNewResource(relationshipRegistryEntry, resourceBody, relationshipResourceType);
setAttributes(resourceBody, newResource, relationshipRegistryEntry.getResourceInformation());
ResourceRepositoryAdapter resourceRepository = relationshipRegistryEntry.getResourceRepository(parameterProvider);
Document savedResourceResponse = documentMapper.toDocument(resourceRepository.create(newResource, queryAdapter), queryAdapter, parameterProvider);
setRelations(newResource, bodyRegistryEntry, resourceBody, queryAdapter, parameterProvider, false);
ResourceIdentifier resourceId1 = savedResourceResponse.getSingleData().get();
RelationshipRepositoryAdapter relationshipRepositoryForClass = endpointRegistryEntry.getRelationshipRepository(relationshipField, parameterProvider);
@SuppressWarnings("unchecked") JsonApiResponse parent = endpointRegistryEntry.getResourceRepository(parameterProvider).findOne(castedResourceId, queryAdapter);
if (Iterable.class.isAssignableFrom(baseRelationshipFieldClass)) {
List<ResourceIdentifier> resourceIdList = Collections.singletonList(resourceId1);
for (ResourceModificationFilter filter : modificationFilters) {
resourceIdList = filter.modifyManyRelationship(parent.getEntity(), relationshipField, ResourceRelationshipModificationType.ADD, resourceIdList);
}
List<Serializable> parsedIds = new ArrayList<>();
for (ResourceIdentifier resourceId : resourceIdList) {
parsedIds.add(relationshipRegistryEntry.getResourceInformation().parseIdString(resourceId.getId()));
}
// noinspection unchecked
relationshipRepositoryForClass.addRelations(parent.getEntity(), parsedIds, relationshipField, queryAdapter);
} else {
// noinspection unchecked
for (ResourceModificationFilter filter : modificationFilters) {
resourceId1 = filter.modifyOneRelationship(parent.getEntity(), relationshipField, resourceId1);
}
Serializable parseId = relationshipRegistryEntry.getResourceInformation().parseIdString(resourceId1.getId());
relationshipRepositoryForClass.setRelation(parent.getEntity(), parseId, relationshipField, queryAdapter);
}
return new Response(savedResourceResponse, HttpStatus.CREATED_201);
}
use of io.crnk.core.engine.document.Resource in project crnk-framework by crnk-project.
the class ResourcePost method handle.
@Override
public Response handle(JsonPath jsonPath, QueryAdapter queryAdapter, RepositoryMethodParameterProvider parameterProvider, Document requestDocument) {
RegistryEntry endpointRegistryEntry = getRegistryEntry(jsonPath);
Resource resourceBody = getRequestBody(requestDocument, jsonPath, HttpMethod.POST);
RegistryEntry bodyRegistryEntry = resourceRegistry.getEntry(resourceBody.getType());
verifyTypes(HttpMethod.POST, endpointRegistryEntry, bodyRegistryEntry);
ResourceRepositoryAdapter resourceRepository = endpointRegistryEntry.getResourceRepository(parameterProvider);
JsonApiResponse apiResponse;
if (Resource.class.equals(resourceRepository.getResourceClass())) {
apiResponse = resourceRepository.create(resourceBody, queryAdapter);
} else {
Object newResource = newResource(bodyRegistryEntry.getResourceInformation(), resourceBody);
setId(resourceBody, newResource, bodyRegistryEntry.getResourceInformation());
setAttributes(resourceBody, newResource, bodyRegistryEntry.getResourceInformation());
setRelations(newResource, bodyRegistryEntry, resourceBody, queryAdapter, parameterProvider, false);
apiResponse = resourceRepository.create(newResource, queryAdapter);
}
if (apiResponse.getEntity() == null) {
throw new IllegalStateException("repository did not return the created resource");
}
Set<String> loadedRelationshipNames = getLoadedRelationshipNames(resourceBody);
Document responseDocument = documentMapper.toDocument(apiResponse, queryAdapter, parameterProvider, loadedRelationshipNames);
return new Response(responseDocument, HttpStatus.CREATED_201);
}
Aggregations