Search in sources :

Example 31 with Resource

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;
}
Also used : ResourceIdentifier(io.crnk.core.engine.document.ResourceIdentifier) Resource(io.crnk.core.engine.document.Resource)

Example 32 with Resource

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;
}
Also used : Resource(io.crnk.core.engine.document.Resource) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet)

Example 33 with Resource

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());
    }
}
Also used : Relationship(io.crnk.core.engine.document.Relationship) Resource(io.crnk.core.engine.document.Resource) JsonNode(com.fasterxml.jackson.databind.JsonNode)

Example 34 with Resource

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);
}
Also used : Serializable(java.io.Serializable) Resource(io.crnk.core.engine.document.Resource) ArrayList(java.util.ArrayList) Document(io.crnk.core.engine.document.Document) RegistryEntry(io.crnk.core.engine.registry.RegistryEntry) RelationshipRepositoryAdapter(io.crnk.core.engine.internal.repository.RelationshipRepositoryAdapter) JsonApiResponse(io.crnk.core.repository.response.JsonApiResponse) Response(io.crnk.core.engine.dispatcher.Response) ResourceField(io.crnk.core.engine.information.resource.ResourceField) ResourceIdentifier(io.crnk.core.engine.document.ResourceIdentifier) ResourceRepositoryAdapter(io.crnk.core.engine.internal.repository.ResourceRepositoryAdapter) PathIds(io.crnk.core.engine.internal.dispatcher.path.PathIds) JsonApiResponse(io.crnk.core.repository.response.JsonApiResponse) ResourceModificationFilter(io.crnk.core.engine.filter.ResourceModificationFilter)

Example 35 with Resource

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);
}
Also used : JsonApiResponse(io.crnk.core.repository.response.JsonApiResponse) Response(io.crnk.core.engine.dispatcher.Response) ResourceRepositoryAdapter(io.crnk.core.engine.internal.repository.ResourceRepositoryAdapter) Resource(io.crnk.core.engine.document.Resource) JsonApiResponse(io.crnk.core.repository.response.JsonApiResponse) Document(io.crnk.core.engine.document.Document) RegistryEntry(io.crnk.core.engine.registry.RegistryEntry)

Aggregations

Resource (io.crnk.core.engine.document.Resource)130 Document (io.crnk.core.engine.document.Document)86 Test (org.junit.Test)85 Relationship (io.crnk.core.engine.document.Relationship)48 Response (io.crnk.core.engine.dispatcher.Response)43 QuerySpec (io.crnk.core.queryspec.QuerySpec)43 ResourceIdentifier (io.crnk.core.engine.document.ResourceIdentifier)42 JsonPath (io.crnk.core.engine.internal.dispatcher.path.JsonPath)41 BaseControllerTest (io.crnk.core.engine.internal.dispatcher.controller.BaseControllerTest)37 Task (io.crnk.core.mock.models.Task)32 ResourcePost (io.crnk.core.engine.internal.dispatcher.controller.ResourcePost)31 Project (io.crnk.core.mock.models.Project)24 JsonApiResponse (io.crnk.core.repository.response.JsonApiResponse)17 LazyTask (io.crnk.core.mock.models.LazyTask)15 ResourceInformation (io.crnk.core.engine.information.resource.ResourceInformation)14 ResourcePatch (io.crnk.core.engine.internal.dispatcher.controller.ResourcePatch)14 RelationIdTestResource (io.crnk.core.mock.models.RelationIdTestResource)13 ResourceField (io.crnk.core.engine.information.resource.ResourceField)12 RegistryEntry (io.crnk.core.engine.registry.RegistryEntry)11 ResourceRepositoryAdapter (io.crnk.core.engine.internal.repository.ResourceRepositoryAdapter)10