class StorageDistributionImpl implements StorageDistribution {

    @Override
    public StoredInfoResult storeDataInAllOffers(String strategyId, String objectId,
        ObjectDescription createObjectDescription, DataCategory category, String requester)
        throws StorageException {

        // Check input params
        Integer tenantId = ParameterHelper.getTenantParameter();
        checkStoreDataParams(createObjectDescription, strategyId, objectId, category);
        List<StorageOffer> storageOffers = getStorageOffers(strategyId);

        OffersToCopyIn offersToCopyIn = new OffersToCopyIn(storageOffers);
        final DataContext dataContext = new DataContext(objectId, category, requester, tenantId, strategyId);

        StorageLogbookParameters parameters =
            sendDataToOffersWithRetries(dataContext, offersToCopyIn, createObjectDescription);
        ///logging
        try {
            logStorage(tenantId, parameters);
        } catch (IOException e) {
            LOGGER.error(e);
        }

        // TODO P1 Handle Status result if different for offers
        return buildStoreDataResponse(objectId, category,
            parameters.getMapParameters().get(StorageLogbookParameterName.digest),
            strategyId, offersToCopyIn.getGlobalOfferResult());

    }

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

}