use of org.summerb.easycrud.api.dto.relations.Ref in project summerb by skarpushin.
the class DataSetLoaderImpl method populateBackReferencesMany2Many.
private void populateBackReferencesMany2Many(ManyToManyRefToReferenceesMap manyToManyRefs, DataSet dataSet) {
for (Entry<Ref, Map<Object, List<HasId>>> refToReferenceeListPair : manyToManyRefs.entrySet()) {
DataTable sourceTable = dataSet.get(refToReferenceeListPair.getKey().getFromEntity());
@SuppressWarnings("deprecation") RowIdToBackReferencesMap backRefs = sourceTable.getBackRefs();
for (Entry<Object, List<HasId>> referencerToReferencesListPair : refToReferenceeListPair.getValue().entrySet()) {
Object referencerId = referencerToReferencesListPair.getKey();
RefToReferencedObjectsIdsMap refToObjsMap = backRefs.get(referencerId);
if (refToObjsMap == null) {
backRefs.put(referencerId, refToObjsMap = new RefToReferencedObjectsIdsMap());
}
String refName = refToReferenceeListPair.getKey().getName();
Set<Object> referenceeIdsList = refToObjsMap.get(refName);
if (referenceeIdsList == null) {
refToObjsMap.put(refName, referenceeIdsList = new HashSet<>());
}
Set referenceeIds = EasyCrudDtoUtils.enumerateIds(referencerToReferencesListPair.getValue());
referenceeIdsList.addAll(referenceeIds);
}
}
}
use of org.summerb.easycrud.api.dto.relations.Ref in project summerb by skarpushin.
the class DataSetLoaderImpl method enumerateOutgoingReferences.
/**
* @param scanForReferences
* dataSet to scan for Many2one & One2one referenced objects
* @param checkForExistence
* data set that contains already loaded objects so that we can skip
* loading these objects again
* @param references
* references to use
* @return map entityTypeCode to list of ids of these entities to be loaded
*/
private Map<String, Set<Object>> enumerateOutgoingReferences(DataSet scanForReferences, DataSet checkForExistence, Ref[] references) {
Map<String, Set<Object>> ret = new HashMap<>();
for (DataTable table : scanForReferences.getTables().values()) {
List<Ref> outgoingRefs = enumOutgoingRefsToTableOrNull(references, table.getName());
if (outgoingRefs == null) {
continue;
}
for (Object rowObj : table.getRows().values()) {
HasId row = (HasId) rowObj;
PropertyAccessor propertyAccessor = PropertyAccessorFactory.forBeanPropertyAccess(row);
for (Ref ref : outgoingRefs) {
Object referencedId = null;
try {
referencedId = propertyAccessor.getPropertyValue(ref.getFromField());
} catch (Throwable t) {
throw new RuntimeException("Failed to read property " + ref.getFromField() + " from " + row, t);
}
if (referencedId == null) {
continue;
}
if (checkForExistence.get(ref.getToEntity()).find(referencedId) != null) {
// that one is already loaded, skip
continue;
}
Set<Object> referencedIds = ret.get(ref.getToEntity());
if (referencedIds == null) {
ret.put(ref.getToEntity(), referencedIds = new HashSet<>());
}
referencedIds.add(referencedId);
}
}
}
return ret;
}
use of org.summerb.easycrud.api.dto.relations.Ref in project summerb by skarpushin.
the class ReferencesRegistryPreconfiguredAbstract method initialize.
private void initialize() {
Multimap<String, Ref> refsBySourceNameLocal = discoverRefsBySources();
Preconditions.checkState(refsBySourceNameLocal != null);
Map<String, Ref> refsByNameLocal = new HashMap<>();
for (Ref ref : refsBySourceNameLocal.values()) {
Ref previous = refsByNameLocal.put(ref.getName(), ref);
if (previous != null) {
throw new RuntimeException("Duplicate reference name not allowed " + ref.getName());
}
}
Multimap<String, Ref> refsByAliasLocal = discoverAliases();
Preconditions.checkState(refsByAliasLocal != null);
refsBySourceName = refsBySourceNameLocal;
refsByName = refsByNameLocal;
refsByAlias = refsByAliasLocal;
}
use of org.summerb.easycrud.api.dto.relations.Ref in project summerb by skarpushin.
the class DomLoaderImpl method discoverDomFields.
protected List<Pair<Ref, PropertyDescriptor>> discoverDomFields(Class<?> clazz, Map<String, Ref> refs) {
try {
Preconditions.checkArgument(clazz != null, "clazz must not be null");
Preconditions.checkArgument(refs != null && refs.size() > 0, "refsToResolve must not be null");
List<Pair<Ref, PropertyDescriptor>> ret = new ArrayList<>();
PropertyDescriptor[] srcProps = BeanUtils.getPropertyDescriptors(clazz);
for (PropertyDescriptor pd : srcProps) {
Method writeMethod = pd.getWriteMethod();
if (writeMethod == null) {
continue;
}
String targetRefName = tryResolveTargetRefName(pd, clazz);
if (targetRefName == null) {
continue;
}
// Search for applicable reference
Ref ref = refs.get(targetRefName);
if (ref == null) {
continue;
}
ret.add(Pair.of(ref, pd));
}
return ret;
} catch (Throwable t) {
throw new RuntimeException("Failed to resolve DOM fields", t);
}
}
use of org.summerb.easycrud.api.dto.relations.Ref in project summerb by skarpushin.
the class DomLoaderDeviceGatewayTest method testDiscoverDomFields.
@Test
public void testDiscoverDomFields() throws Exception {
DataSetLoader dataSetLoader = mock(DataSetLoader.class);
EasyCrudServiceResolver easyCrudServiceResolver = mock(EasyCrudServiceResolver.class);
DomLoaderImpl f = new DomLoaderImpl(dataSetLoader, easyCrudServiceResolver);
Map<String, Ref> refs = Collections.singletonMap(Refs.envDevices.getName(), Refs.envDevices);
List<Pair<Ref, PropertyDescriptor>> domFields = f.discoverDomFields(Env.class, refs);
assertNotNull(domFields);
assertEquals(1, domFields.size());
assertEquals("devices", domFields.get(0).getValue().getName());
}
Aggregations