public Collection loadAll()

in openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCacheStoreManager.java [526:660]


    public Collection<Object> loadAll(Collection<OpenJPAStateManager> sms, PCState state, int load,
        FetchConfiguration fetch, Object edata) {
        if (bypass(fetch, load)) {
            return super.loadAll(sms, state, load, fetch, edata);
        }

        Map<OpenJPAStateManager, BitSet> unloaded = null;
        List<OpenJPAStateManager> smList = null;
        Map<DataCache,List<OpenJPAStateManager>> caches = new HashMap<>();
        DataCache cache;
        DataCachePCData data;
        BitSet fields;

        for (OpenJPAStateManager sm : sms) {
            cache = _mgr.selectCache(sm);
            if (cache == null || sm.isEmbedded()) {
                unloaded = addUnloaded(sm, null, unloaded);
                continue;
            }

            if (sm.getManagedInstance() == null
                || load != FORCE_LOAD_NONE
                || sm.getPCState() == PCState.HOLLOW) {
                smList = caches.computeIfAbsent(cache, k -> new ArrayList<>());
                smList.add(sm);
            } else if (!cache.contains(sm.getObjectId()))
                unloaded = addUnloaded(sm, null, unloaded);
        }

    for(Entry<DataCache,List<OpenJPAStateManager>> entry : caches.entrySet()){
            cache = entry.getKey();
            smList = entry.getValue();
            List<Object> oidList = new ArrayList<>(smList.size());

            for (OpenJPAStateManager sm : smList) {
                oidList.add((OpenJPAId) sm.getObjectId());
            }

            Map<Object,DataCachePCData> dataMap = cache.getAll(oidList);

            for (OpenJPAStateManager sm : smList) {
                data = dataMap.get(sm.getObjectId());
                CacheStatistics stats = cache.getStatistics();
                if (sm.getManagedInstance() == null) {
                    if (data != null) {
                        //### the 'data.type' access here probably needs
                        //### to be addressed for bug 511
                        if (stats.isEnabled()) {
                            ((CacheStatisticsSPI) stats).newGet(data.getType(), true);
                        }
                        sm.initialize(data.getType(), state);
                        data.load(sm, fetch, edata);
                    } else {
                        unloaded = addUnloaded(sm, null, unloaded);
                        if (stats.isEnabled()) {
                            ((CacheStatisticsSPI)stats).newGet(sm.getMetaData().getDescribedType(), false);
                        }
                    }
                } else if (load != FORCE_LOAD_NONE
                        || sm.getPCState() == PCState.HOLLOW) {
                    data = cache.get(sm.getObjectId());
                    if (data != null) {
                        // load unloaded fields
                        fields = sm.getUnloaded(fetch);
                        data.load(sm, fields, fetch, edata);
                        if (fields.length() > 0){
                            unloaded = addUnloaded(sm, fields, unloaded);
                            if (stats.isEnabled()) {
                                ((CacheStatisticsSPI)stats).newGet(data.getType(), false);
                            }
                        }else{
                            if (stats.isEnabled()) {
                                ((CacheStatisticsSPI)stats).newGet(data.getType(), true);
                            }
                        }
                    } else{
                        unloaded = addUnloaded(sm, null, unloaded);
                        if (stats.isEnabled()) {
                            ((CacheStatisticsSPI)stats).newGet(sm.getMetaData().getDescribedType(), false);
                        }
                    }
                }
            }
        }

        if (unloaded == null)
            return Collections.emptyList();

        // load with delegate
        Collection<Object> failed = super.loadAll(unloaded.keySet(), state, load, fetch, edata);
        if (!_ctx.getPopulateDataCache())
            return failed;

        // for each loaded instance, merge loaded state into cached data

        boolean isNew;

        for(Map.Entry<OpenJPAStateManager, BitSet> entry : unloaded.entrySet()) {
            OpenJPAStateManager sm = entry.getKey();
            fields = entry.getValue();

            cache = _mgr.selectCache(sm);
            if (cache == null || sm.isEmbedded() || (failed != null
                && failed.contains(sm.getId())))
                continue;

            // make sure that we're not trying to cache an old version
            cache.writeLock();
            try {
                data = cache.get(sm.getObjectId());
                if (data != null && compareVersion(sm, sm.getVersion(),
                    data.getVersion()) == VERSION_EARLIER)
                    continue;

                isNew = data == null;
                if (isNew)
                    data = newPCData(sm, cache);
                if (fields == null)
                    data.store(sm);
                else
                    data.store(sm, fields);
                if (isNew)
                    cache.put(data);
                else
                    cache.update(data);
                CacheStatistics stats = cache.getStatistics();
                if (stats.isEnabled()) {
                    ((CacheStatisticsSPI)stats).newPut(data.getType());
                }
            } finally {
                cache.writeUnlock();
            }
        }
        return failed;
    }