Search in sources :

Example 11 with Ref

use of org.summerb.easycrud.api.dto.relations.Ref in project summerb by skarpushin.

the class DataSetLoaderImpl method resolveReferencedObjects.

@Override
public void resolveReferencedObjects(DataSet dataSet, Ref... references) throws EntityNotFoundException, NotAuthorizedException {
    Preconditions.checkArgument(dataSet != null);
    Preconditions.checkArgument(references != null);
    DataSet nextDataSet = dataSet;
    while (nextDataSet != null) {
        DataSet curDataSet = nextDataSet;
        nextDataSet = null;
        DataSet newDataSet = new DataSet();
        Map<String, Set<Object>> idsToLoad = enumerateOutgoingReferences(curDataSet, dataSet, references);
        if (!idsToLoad.isEmpty()) {
            EntityTypeToObjectsMap loadObjects = loadObjectsByIds(idsToLoad);
            addAllObjects(loadObjects, dataSet);
            addAllObjects(loadObjects, newDataSet);
        }
        // Handle one2many
        Map<Ref, Set<Object>> oneToManyReferencesToLoad = enumerateOneToManyReferences(curDataSet, references);
        if (!oneToManyReferencesToLoad.isEmpty()) {
            EntityTypeToObjectsMap loadedOneToManyRefs = loadOneToManyReferences(oneToManyReferencesToLoad);
            addAllObjects(loadedOneToManyRefs, dataSet);
            addAllObjects(loadedOneToManyRefs, newDataSet);
            populateBackReferencesOne2Many(loadedOneToManyRefs, oneToManyReferencesToLoad, dataSet);
        }
        // Handle many2many
        Map<Ref, Set<Object>> manyToManyRefToReferencersIds = enumerateManyToManyReferences(curDataSet, references);
        if (!manyToManyRefToReferencersIds.isEmpty()) {
            ManyToManyRefToReferenceesMap loadedManyToManyRefs = loadManyToManyReferences(manyToManyRefToReferencersIds);
            addAllObjects(loadedManyToManyRefs, dataSet);
            addAllObjects(loadedManyToManyRefs, newDataSet);
            populateBackReferencesMany2Many(loadedManyToManyRefs, dataSet);
        }
        // next iteration
        if (!newDataSet.isEmpty()) {
            nextDataSet = newDataSet;
        }
    }
}
Also used : Ref(org.summerb.easycrud.api.dto.relations.Ref) HashSet(java.util.HashSet) Set(java.util.Set) DataSet(org.summerb.easycrud.api.dto.datapackage.DataSet) DataSet(org.summerb.easycrud.api.dto.datapackage.DataSet)

Example 12 with Ref

use of org.summerb.easycrud.api.dto.relations.Ref in project summerb by skarpushin.

the class EasyCrudRestControllerBase method resolveReferences.

protected void resolveReferences(List<String> referencesToResolve, CrudQueryResult<TId, TDto> ret, List<TDto> items) throws EntityNotFoundException, NotAuthorizedException {
    Preconditions.checkState(dataSetLoader != null, "DataSetLoader is required to resolve references");
    Preconditions.checkState(referencesRegistry != null, "referencesRegistry is required to resolve references");
    DataSet ds = new DataSet();
    DataTable<TId, TDto> table = new DataTable<>(service.getEntityTypeMessageCode());
    table.putAll(items);
    ds.getTables().put(table.getName(), table);
    List<Ref> references = referencesToResolve.stream().map(name -> referencesRegistry.getRefByName(name)).collect(Collectors.toList());
    Ref[] refsArr = (Ref[]) references.toArray(new Ref[references.size()]);
    dataSetLoader.resolveReferencedObjects(ds, refsArr);
    // now remove initial table from dataset because we don't want to
    // duplicate this. It's already populated to rows
    ds.getTables().remove(table.getName());
    // x. ret
    ret.setRefsResolved(references.stream().collect(Collectors.toMap(Ref::getName, Function.identity())));
    ret.setRefs(ds);
}
Also used : PathVariable(org.springframework.web.bind.annotation.PathVariable) Arrays(java.util.Arrays) RequestParam(org.springframework.web.bind.annotation.RequestParam) PaginatedList(org.summerb.easycrud.api.dto.PaginatedList) EasyCrudQueryParams(org.summerb.easycrud.mvc.model.EasyCrudQueryParams) DataTable(org.summerb.easycrud.api.dto.datapackage.DataTable) Autowired(org.springframework.beans.factory.annotation.Autowired) DataSetLoader(org.summerb.easycrud.api.relations.DataSetLoader) PermissionsResolverStrategy(org.summerb.easycrud.rest.permissions.PermissionsResolverStrategy) Ref(org.summerb.easycrud.api.dto.relations.Ref) ReferencesRegistry(org.summerb.easycrud.api.relations.ReferencesRegistry) Function(java.util.function.Function) InitializingBean(org.springframework.beans.factory.InitializingBean) RequestBody(org.springframework.web.bind.annotation.RequestBody) OrderBy(org.summerb.easycrud.api.query.OrderBy) PutMapping(org.springframework.web.bind.annotation.PutMapping) EntityNotFoundException(org.summerb.easycrud.api.exceptions.EntityNotFoundException) GenericFilterBean(org.springframework.web.filter.GenericFilterBean) NotAuthorizedException(org.summerb.security.api.exceptions.NotAuthorizedException) GetMapping(org.springframework.web.bind.annotation.GetMapping) FilteringParamsToQueryConverterImpl(org.summerb.easycrud.mvc.filter.FilteringParamsToQueryConverterImpl) QueryNarrowerStrategy(org.summerb.easycrud.rest.querynarrower.QueryNarrowerStrategy) DeleteMapping(org.springframework.web.bind.annotation.DeleteMapping) Query(org.summerb.easycrud.api.query.Query) MultipleItemsResult(org.summerb.easycrud.rest.dto.MultipleItemsResult) PostMapping(org.springframework.web.bind.annotation.PostMapping) SingleItemResult(org.summerb.easycrud.rest.dto.SingleItemResult) MediaType(org.springframework.http.MediaType) BeansException(org.springframework.beans.BeansException) HasId(org.summerb.easycrud.api.dto.HasId) Collectors(java.util.stream.Collectors) ApplicationContext(org.springframework.context.ApplicationContext) ApiIgnore(springfox.documentation.annotations.ApiIgnore) List(java.util.List) DataSet(org.summerb.easycrud.api.dto.datapackage.DataSet) CollectionUtils(org.springframework.util.CollectionUtils) PathVariablesMap(org.summerb.easycrud.rest.commonpathvars.PathVariablesMap) PagerParams(org.summerb.easycrud.api.dto.PagerParams) EasyCrudService(org.summerb.easycrud.api.EasyCrudService) CrudQueryResult(org.summerb.easycrud.rest.dto.CrudQueryResult) Preconditions(com.google.common.base.Preconditions) ApplicationContextAware(org.springframework.context.ApplicationContextAware) FilteringParamsToQueryConverter(org.summerb.easycrud.mvc.filter.FilteringParamsToQueryConverter) DataTable(org.summerb.easycrud.api.dto.datapackage.DataTable) Ref(org.summerb.easycrud.api.dto.relations.Ref) DataSet(org.summerb.easycrud.api.dto.datapackage.DataSet)

Example 13 with Ref

use of org.summerb.easycrud.api.dto.relations.Ref in project summerb by skarpushin.

the class ReferencesRegistryPreconfiguredAbstract method getRefByName.

@Override
public Ref getRefByName(String name) throws IllegalArgumentException {
    ensureInitialized();
    Ref ret = refsByName.get(name);
    Preconditions.checkArgument(ret != null, "There is not ref named as " + name);
    return ret;
}
Also used : Ref(org.summerb.easycrud.api.dto.relations.Ref)

Example 14 with Ref

use of org.summerb.easycrud.api.dto.relations.Ref in project summerb by skarpushin.

the class DomLoaderImpl method load.

/*
	 * (non-Javadoc)
	 * 
	 * @see ru.skarpushin.smarthome.devicesgate.services.envconfig.impl.DomLoader#
	 * load(java.lang.Class, java.util.Set,
	 * org.summerb.easycrud.api.dto.relations.Ref)
	 */
@Override
@SuppressWarnings({ "unchecked", "rawtypes" })
public <TId, TRowClass extends HasId<TId>, TDomClass extends TRowClass> List<TDomClass> load(Class<TDomClass> rootDomClass, Set<TId> ids, Ref... refsToResolve) {
    try {
        Preconditions.checkArgument(rootDomClass != null, "rootDomClass must not be empty");
        Preconditions.checkArgument(ids != null && ids.size() > 0, "List of ids must not be empty");
        // Resolve root row entity name (MessageCode)
        String dtoMessageCode = resolveDtoMessageCodeFromDomClass(rootDomClass);
        // Use DataSetLoader to load data
        List<HasId> loadedRoots = dataSetLoader.loadObjectsByIds((Set<Object>) ids, dtoMessageCode);
        DataSet ds = new DataSet();
        ds.get(dtoMessageCode).putAll(loadedRoots);
        boolean haveRefsToLoad = refsToResolve != null && refsToResolve.length > 0;
        if (haveRefsToLoad) {
            dataSetLoader.resolveReferencedObjects(ds, refsToResolve);
        }
        Map<String, Ref> refs = !haveRefsToLoad ? Collections.emptyMap() : Arrays.stream(refsToResolve).collect(Collectors.toMap(x -> x.getName(), x -> x));
        // Construct root Dom objects
        Collection<TRowClass> rootRows = ds.get(dtoMessageCode).getRows().values();
        // map of already converted entities
        Map<EntityAndId, HasId> cache = new HashMap<>();
        List<TDomClass> ret = rootRows.stream().map(mapDtoToDom(dtoMessageCode, rootDomClass, refs, ds, cache)).collect(Collectors.toList());
        return ret;
    } catch (Throwable t) {
        throw new RuntimeException("Failed to loadAndConvert DOM " + rootDomClass + " identified by " + ids, t);
    }
}
Also used : DataSet(org.summerb.easycrud.api.dto.datapackage.DataSet) HashMap(java.util.HashMap) HasId(org.summerb.easycrud.api.dto.HasId) Ref(org.summerb.easycrud.api.dto.relations.Ref)

Aggregations

Ref (org.summerb.easycrud.api.dto.relations.Ref)14 DataSet (org.summerb.easycrud.api.dto.datapackage.DataSet)9 HashSet (java.util.HashSet)7 Set (java.util.Set)7 HashMap (java.util.HashMap)6 HasId (org.summerb.easycrud.api.dto.HasId)6 ArrayList (java.util.ArrayList)5 List (java.util.List)4 PaginatedList (org.summerb.easycrud.api.dto.PaginatedList)4 LinkedList (java.util.LinkedList)3 EasyCrudService (org.summerb.easycrud.api.EasyCrudService)3 DataTable (org.summerb.easycrud.api.dto.datapackage.DataTable)3 PropertyAccessor (org.springframework.beans.PropertyAccessor)2 RefToReferencedObjectsIdsMap (org.summerb.easycrud.api.dto.datapackage.DataTable.RefToReferencedObjectsIdsMap)2 RowIdToBackReferencesMap (org.summerb.easycrud.api.dto.datapackage.DataTable.RowIdToBackReferencesMap)2 Query (org.summerb.easycrud.api.query.Query)2 DataSetLoader (org.summerb.easycrud.api.relations.DataSetLoader)2 Pair (org.summerb.utils.Pair)2 Preconditions (com.google.common.base.Preconditions)1 PropertyDescriptor (java.beans.PropertyDescriptor)1