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;
}
}
}
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);
}
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;
}
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);
}
}
Aggregations