Search in sources :

Example 1 with MetaInformation

use of io.crnk.core.resource.meta.MetaInformation in project crnk-framework by crnk-project.

the class SecurityRepositoryFilter method filterMeta.

@Override
public <T> MetaInformation filterMeta(RepositoryFilterContext context, Iterable<T> resources, RepositoryMetaFilterChain chain) {
    MetaInformation metaInformation = chain.doFilter(context, resources);
    if (metaInformation instanceof ResourcePermissionInformation) {
        ResourcePermissionInformation permissionInformation = (ResourcePermissionInformation) metaInformation;
        QueryAdapter queryAdapter = context.getRequest().getQueryAdapter();
        Class<?> resourceClass = queryAdapter.getResourceInformation().getResourceClass();
        permissionInformation.setResourcePermission(module.getResourcePermission(resourceClass));
    }
    return metaInformation;
}
Also used : ResourcePermissionInformation(io.crnk.security.ResourcePermissionInformation) QueryAdapter(io.crnk.core.engine.query.QueryAdapter) MetaInformation(io.crnk.core.resource.meta.MetaInformation)

Example 2 with MetaInformation

use of io.crnk.core.resource.meta.MetaInformation in project crnk-framework by crnk-project.

the class ResponseRepositoryAdapter method getResponse.

protected JsonApiResponse getResponse(Object repository, Object result, RepositoryRequestSpec requestSpec) {
    if (result instanceof JsonApiResponse) {
        return (JsonApiResponse) result;
    }
    Iterable<?> resources;
    boolean isCollection = result instanceof Iterable;
    if (isCollection) {
        resources = (Iterable<?>) result;
    } else {
        resources = Collections.singletonList(result);
    }
    Iterable<?> filteredResult = filterResult(resources, requestSpec);
    MetaInformation metaInformation = getMetaInformation(repository, resources, requestSpec);
    LinksInformation linksInformation = getLinksInformation(repository, resources, requestSpec);
    Object resultEntity;
    if (isCollection) {
        resultEntity = filteredResult;
    } else {
        Iterator<?> iterator = filteredResult.iterator();
        if (iterator.hasNext()) {
            resultEntity = iterator.next();
            PreconditionUtil.assertFalse("expected unique result", iterator.hasNext());
        } else {
            resultEntity = null;
        }
    }
    return new JsonApiResponse().setEntity(resultEntity).setLinksInformation(linksInformation).setMetaInformation(metaInformation);
}
Also used : MetaInformation(io.crnk.core.resource.meta.MetaInformation) DefaultPagedLinksInformation(io.crnk.core.resource.links.DefaultPagedLinksInformation) LinksInformation(io.crnk.core.resource.links.LinksInformation) PagedLinksInformation(io.crnk.core.resource.links.PagedLinksInformation) JsonApiResponse(io.crnk.core.repository.response.JsonApiResponse)

Example 3 with MetaInformation

use of io.crnk.core.resource.meta.MetaInformation in project crnk-framework by crnk-project.

the class InMemoryEvaluator method eval.

public <T> void eval(Iterable<T> resources, QuerySpec querySpec, ResourceList<T> resultList) {
    Iterator<T> iterator = resources.iterator();
    while (iterator.hasNext()) {
        resultList.add(iterator.next());
    }
    // filter
    if (!querySpec.getFilters().isEmpty()) {
        FilterSpec filterSpec = FilterSpec.and(querySpec.getFilters());
        applyFilter(resultList, filterSpec);
    }
    long totalCount = resultList.size();
    // sort
    applySorting(resultList, querySpec.getSort());
    // offset/limit
    applyPaging(resultList, querySpec);
    // set page information
    if (querySpec.getLimit() != null || querySpec.getOffset() != 0) {
        MetaInformation meta = resultList.getMeta();
        if (meta instanceof PagedMetaInformation) {
            PagedMetaInformation pagedMeta = (PagedMetaInformation) meta;
            pagedMeta.setTotalResourceCount(totalCount);
        }
        if (meta instanceof HasMoreResourcesMetaInformation) {
            HasMoreResourcesMetaInformation pagedMeta = (HasMoreResourcesMetaInformation) meta;
            pagedMeta.setHasMoreResources(totalCount > querySpec.getOffset() + querySpec.getLimit());
        }
    }
}
Also used : PagedMetaInformation(io.crnk.core.resource.meta.PagedMetaInformation) HasMoreResourcesMetaInformation(io.crnk.core.resource.meta.HasMoreResourcesMetaInformation) MetaInformation(io.crnk.core.resource.meta.MetaInformation) PagedMetaInformation(io.crnk.core.resource.meta.PagedMetaInformation) HasMoreResourcesMetaInformation(io.crnk.core.resource.meta.HasMoreResourcesMetaInformation)

Example 4 with MetaInformation

use of io.crnk.core.resource.meta.MetaInformation in project crnk-framework by crnk-project.

the class JpaEntityRepository method findAll.

@Override
public ResourceList<T> findAll(QuerySpec querySpec) {
    Class<?> entityClass = repositoryConfig.getEntityClass();
    QuerySpec filteredQuerySpec = filterQuerySpec(querySpec);
    JpaQueryFactory queryFactory = module.getQueryFactory();
    JpaQuery<?> query = queryFactory.query(entityClass);
    query.setPrivateData(new JpaRequestContext(this, querySpec));
    ComputedAttributeRegistry computedAttributesRegistry = queryFactory.getComputedAttributes();
    Set<String> computedAttrs = computedAttributesRegistry.getForType(entityClass);
    JpaRepositoryUtils.prepareQuery(query, filteredQuerySpec, computedAttrs);
    query = filterQuery(filteredQuerySpec, query);
    JpaQueryExecutor<?> executor = query.buildExecutor();
    boolean fetchNext = isNextFetched(filteredQuerySpec);
    boolean fetchTotal = isTotalFetched(filteredQuerySpec);
    JpaRepositoryUtils.prepareExecutor(executor, filteredQuerySpec, fetchRelations(null));
    if (fetchNext) {
        executor.setLimit(executor.getLimit() + 1);
    }
    executor = filterExecutor(filteredQuerySpec, executor);
    List<Tuple> tuples = executor.getResultTuples();
    Boolean hasNext = null;
    if (fetchNext) {
        hasNext = tuples.size() == querySpec.getLimit() + 1;
        if (hasNext) {
            tuples = tuples.subList(0, querySpec.getLimit().intValue());
        }
    }
    tuples = filterTuples(filteredQuerySpec, tuples);
    ResourceList<T> resources = repositoryConfig.newResultList();
    MetaInformation metaInfo = resources.getMeta();
    fillResourceList(tuples, resources);
    resources = filterResults(filteredQuerySpec, resources);
    if (fetchTotal) {
        long totalRowCount = executor.getTotalRowCount();
        ((PagedMetaInformation) metaInfo).setTotalResourceCount(totalRowCount);
    }
    if (fetchNext) {
        ((HasMoreResourcesMetaInformation) metaInfo).setHasMoreResources(hasNext);
    }
    return resources;
}
Also used : HasMoreResourcesMetaInformation(io.crnk.core.resource.meta.HasMoreResourcesMetaInformation) MetaInformation(io.crnk.core.resource.meta.MetaInformation) PagedMetaInformation(io.crnk.core.resource.meta.PagedMetaInformation) HasMoreResourcesMetaInformation(io.crnk.core.resource.meta.HasMoreResourcesMetaInformation) JpaRequestContext(io.crnk.jpa.internal.JpaRequestContext) PagedMetaInformation(io.crnk.core.resource.meta.PagedMetaInformation) QuerySpec(io.crnk.core.queryspec.QuerySpec)

Example 5 with MetaInformation

use of io.crnk.core.resource.meta.MetaInformation in project crnk-framework by crnk-project.

the class JpaRelationshipRepository method findTargets.

@Override
public MultivaluedMap<I, T> findTargets(Iterable<I> sourceIds, String fieldName, QuerySpec querySpec) {
    List<I> sourceIdLists = new ArrayList<>();
    for (I sourceId : sourceIds) {
        sourceIdLists.add(sourceId);
    }
    if (querySpec.getLimit() != null && sourceIdLists.size() > 1) {
        throw new UnsupportedOperationException("page limit not supported for bulk inclusions");
    }
    // support paging for non-bulk requests
    boolean singleRequest = sourceIdLists.size() == 1;
    boolean pagedSingleRequest = singleRequest && querySpec.getLimit() != null;
    boolean fetchNext = pagedSingleRequest && isNextFetched(querySpec);
    QuerySpec bulkQuerySpec = querySpec.duplicate();
    QuerySpec filteredQuerySpec = filterQuerySpec(bulkQuerySpec);
    JpaQueryFactory queryFactory = module.getQueryFactory();
    JpaQuery<?> query = queryFactory.query(sourceEntityClass, fieldName, sourceIdLists);
    query.setPrivateData(new JpaRequestContext(this, querySpec));
    query.addParentIdSelection();
    query = filterQuery(filteredQuerySpec, query);
    Class<?> entityClass = repositoryConfig.getEntityClass();
    ComputedAttributeRegistry computedAttributesRegistry = queryFactory.getComputedAttributes();
    Set<String> computedAttrs = computedAttributesRegistry.getForType(entityClass);
    JpaRepositoryUtils.prepareQuery(query, filteredQuerySpec, computedAttrs);
    JpaQueryExecutor<?> executor = query.buildExecutor();
    JpaRepositoryUtils.prepareExecutor(executor, filteredQuerySpec, fetchRelations(fieldName));
    executor = filterExecutor(filteredQuerySpec, executor);
    if (fetchNext) {
        executor.setLimit(executor.getLimit() + 1);
    }
    List<Tuple> tuples = executor.getResultTuples();
    Boolean hasNext = null;
    if (fetchNext) {
        hasNext = tuples.size() == querySpec.getLimit() + 1;
        if (hasNext) {
            tuples = tuples.subList(0, querySpec.getLimit().intValue());
        }
    }
    tuples = filterTuples(bulkQuerySpec, tuples);
    MultivaluedMap<I, T> map = mapTuples(tuples);
    if (singleRequest) {
        I sourceId = sourceIdLists.get(0);
        ResourceList<T> iterable;
        if (map.containsKey(sourceId)) {
            iterable = (ResourceList<T>) map.getList(sourceId);
        } else {
            iterable = repositoryConfig.newResultList();
            map.set(sourceId, iterable);
        }
        if (pagedSingleRequest) {
            MetaInformation metaInfo = iterable.getMeta();
            boolean fetchTotal = isTotalFetched(filteredQuerySpec);
            if (fetchTotal) {
                long totalRowCount = executor.getTotalRowCount();
                ((PagedMetaInformation) metaInfo).setTotalResourceCount(totalRowCount);
            }
            if (fetchNext) {
                ((HasMoreResourcesMetaInformation) metaInfo).setHasMoreResources(hasNext);
            }
        }
    }
    return map;
}
Also used : ComputedAttributeRegistry(io.crnk.jpa.query.ComputedAttributeRegistry) HasMoreResourcesMetaInformation(io.crnk.core.resource.meta.HasMoreResourcesMetaInformation) JpaQueryFactory(io.crnk.jpa.query.JpaQueryFactory) ArrayList(java.util.ArrayList) MetaInformation(io.crnk.core.resource.meta.MetaInformation) PagedMetaInformation(io.crnk.core.resource.meta.PagedMetaInformation) HasMoreResourcesMetaInformation(io.crnk.core.resource.meta.HasMoreResourcesMetaInformation) JpaRequestContext(io.crnk.jpa.internal.JpaRequestContext) PagedMetaInformation(io.crnk.core.resource.meta.PagedMetaInformation) QuerySpec(io.crnk.core.queryspec.QuerySpec) Tuple(io.crnk.jpa.query.Tuple)

Aggregations

MetaInformation (io.crnk.core.resource.meta.MetaInformation)5 HasMoreResourcesMetaInformation (io.crnk.core.resource.meta.HasMoreResourcesMetaInformation)3 PagedMetaInformation (io.crnk.core.resource.meta.PagedMetaInformation)3 QuerySpec (io.crnk.core.queryspec.QuerySpec)2 JpaRequestContext (io.crnk.jpa.internal.JpaRequestContext)2 QueryAdapter (io.crnk.core.engine.query.QueryAdapter)1 JsonApiResponse (io.crnk.core.repository.response.JsonApiResponse)1 DefaultPagedLinksInformation (io.crnk.core.resource.links.DefaultPagedLinksInformation)1 LinksInformation (io.crnk.core.resource.links.LinksInformation)1 PagedLinksInformation (io.crnk.core.resource.links.PagedLinksInformation)1 ComputedAttributeRegistry (io.crnk.jpa.query.ComputedAttributeRegistry)1 JpaQueryFactory (io.crnk.jpa.query.JpaQueryFactory)1 Tuple (io.crnk.jpa.query.Tuple)1 ResourcePermissionInformation (io.crnk.security.ResourcePermissionInformation)1 ArrayList (java.util.ArrayList)1