class StorageDistributionImpl implements StorageDistribution {

    @Override
    public CloseableIterator<ObjectEntry> listContainerObjects(String strategyId, DataCategory category)
        throws StorageException {
        ParametersChecker.checkParameter(STRATEGY_ID_IS_MANDATORY, strategyId);
        ParametersChecker.checkParameter(CATEGORY_IS_MANDATORY, category);
        final StorageStrategy storageStrategy = STRATEGY_PROVIDER.getStorageStrategy(strategyId);
        if (storageStrategy != null) {
            final List<OfferReference> offerReferenceList = getOfferListFromHotStrategy(storageStrategy);

            // Get referent offer
            Optional<OfferReference> offerReference = offerReferenceList
                .stream()
                .filter(OfferReference::isReferent)
                .findFirst();

            if (!offerReference.isPresent()) {
                // Try to take a not referent offer
                offerReference = offerReferenceList
                    .stream()
                    .findFirst();
            }

            if (!offerReference.isPresent()) {
                LOGGER.error("No offer found");
                throw new StorageTechnicalException("No offer found");
            }

            return listContainerObjectsForOffer(category, offerReference.get().getId(), false);
        }
        LOGGER.error(VitamCodeHelper.getLogMessage(VitamCode.STORAGE_STRATEGY_NOT_FOUND));
        throw new StorageNotFoundException(VitamCodeHelper.getLogMessage(VitamCode.STORAGE_STRATEGY_NOT_FOUND));
    }

    public  StorageDistributionImpl(StorageConfiguration configuration, StorageLog storageLogService);
    @VisibleForTesting  StorageDistributionImpl(WorkspaceClientFactory workspaceClientFactory, DigestType digestType,
        StorageLog storageLogService,
        ExecutorService batchExecutorService, int batchDigestComputationTimeout,
        BulkStorageDistribution bulkStorageDistribution);

}