Search in sources :

Example 6 with Ref

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);
        }
    }
}
Also used : DataTable(org.summerb.easycrud.api.dto.datapackage.DataTable) HashSet(java.util.HashSet) Set(java.util.Set) DataSet(org.summerb.easycrud.api.dto.datapackage.DataSet) RefToReferencedObjectsIdsMap(org.summerb.easycrud.api.dto.datapackage.DataTable.RefToReferencedObjectsIdsMap) HasId(org.summerb.easycrud.api.dto.HasId) Ref(org.summerb.easycrud.api.dto.relations.Ref) PaginatedList(org.summerb.easycrud.api.dto.PaginatedList) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) List(java.util.List) HashMap(java.util.HashMap) RowIdToBackReferencesMap(org.summerb.easycrud.api.dto.datapackage.DataTable.RowIdToBackReferencesMap) Map(java.util.Map) RefToReferencedObjectsIdsMap(org.summerb.easycrud.api.dto.datapackage.DataTable.RefToReferencedObjectsIdsMap) RowIdToBackReferencesMap(org.summerb.easycrud.api.dto.datapackage.DataTable.RowIdToBackReferencesMap) HashSet(java.util.HashSet)

Example 7 with Ref

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;
}
Also used : DataTable(org.summerb.easycrud.api.dto.datapackage.DataTable) HashSet(java.util.HashSet) Set(java.util.Set) DataSet(org.summerb.easycrud.api.dto.datapackage.DataSet) PropertyAccessor(org.springframework.beans.PropertyAccessor) HashMap(java.util.HashMap) HasId(org.summerb.easycrud.api.dto.HasId) Ref(org.summerb.easycrud.api.dto.relations.Ref) HashSet(java.util.HashSet)

Example 8 with Ref

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;
}
Also used : Ref(org.summerb.easycrud.api.dto.relations.Ref) HashMap(java.util.HashMap)

Example 9 with Ref

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);
    }
}
Also used : Ref(org.summerb.easycrud.api.dto.relations.Ref) PropertyDescriptor(java.beans.PropertyDescriptor) ArrayList(java.util.ArrayList) Method(java.lang.reflect.Method) Pair(org.summerb.utils.Pair)

Example 10 with Ref

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());
}
Also used : Ref(org.summerb.easycrud.api.dto.relations.Ref) EasyCrudServiceResolver(org.summerb.easycrud.api.EasyCrudServiceResolver) DataSetLoader(org.summerb.easycrud.api.relations.DataSetLoader) Pair(org.summerb.utils.Pair) Test(org.junit.Test)

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