class StoreObjectGroupActionPlugin extends StoreObjectActionHandler {

    @Override
    public List<ItemStatus> executeList(WorkerParameters params, HandlerIO handlerIO) {

        checkMandatoryParameters(params);

        final List<ItemStatus> itemStatusList = new ArrayList<>();
        final List<Map<String, ItemStatus>> itemStatusByObjectList = new ArrayList<>();

        try {
            checkMandatoryIOParameter(handlerIO);

            Set<String> strategies = new LinkedHashSet<>();
            Map<String, String> strategiesByObjectId = new HashMap<>();
            ListValuedMap<String, String> workspaceObjectURIsByStrategies = new ArrayListValuedHashMap<>();
            ListValuedMap<String, String> objectNamesByStrategies = new ArrayListValuedHashMap<>();
            List<MapOfObjects> mapOfObjectsList = new ArrayList<>();

            // get list of object group's objects
            for (String objectName : params.getObjectNameList()) {
                MapOfObjects mapOfObjects = getMapOfObjectsIdsAndUris(params.getContainerName(), objectName, handlerIO);
                Map<String, ItemStatus> itemStatusByObject = new HashMap<>();
                for (final Map.Entry<String, String> objectGuid : mapOfObjects.getBinaryObjectsToStore()
                    .entrySet()) {
                    itemStatusByObject.put(objectGuid.getKey(), new ItemStatus(STORING_OBJECT_TASK_ID));
                    String strategyId = mapOfObjects.getObjectStorageInfos().get(objectGuid.getKey()).get("strategyId").asText();
                    strategies.add(strategyId);
                    workspaceObjectURIsByStrategies.put(strategyId, SIP + objectGuid.getValue());
                    objectNamesByStrategies.put(strategyId, objectGuid.getKey());
                    strategiesByObjectId.put(objectGuid.getKey(), strategyId);
                }

                itemStatusByObjectList.add(itemStatusByObject);
                itemStatusList.add(new ItemStatus(STORING_OBJECT_TASK_ID));
                mapOfObjectsList.add(mapOfObjects);

                // get list of object uris
                if (LOGGER.isDebugEnabled()) {
                    LOGGER.debug("Pre OG: {}", JsonHandler.prettyPrint(mapOfObjects.getJsonOG()));
                }
            }

            if (objectNamesByStrategies.values().isEmpty()) {
                return Arrays.asList(new ItemStatus(STORING_OBJECT_TASK_ID)
                    .setItemsStatus(STORING_OBJECT_TASK_ID, new ItemStatus().increment(StatusCode.OK)));
            }

            Map<String, BulkObjectStoreResponse> resultByStrategy = new LinkedHashMap<>();

            for (String strategy : strategies) {

                List<String> workspaceObjectURIs = workspaceObjectURIsByStrategies.get(strategy);
                List<String> objectNames = objectNamesByStrategies.get(strategy);

                // store objects
                BulkObjectStoreRequest bulkObjectStoreRequest = new BulkObjectStoreRequest(params.getContainerName(),
                        workspaceObjectURIs, DataCategory.OBJECT, objectNames);
                BulkObjectStoreResponse result = storeObjects(strategy, bulkObjectStoreRequest);
                resultByStrategy.put(strategy, result);
            }

            // update sub task itemStatus
            updateSubTasksAndTasksFromStorageInfos(resultByStrategy, itemStatusByObjectList, itemStatusList);

            // separate by strategy
            storeStorageInfos(mapOfObjectsList, resultByStrategy, strategiesByObjectId);


            for (int i = 0; i < mapOfObjectsList.size(); i++) {
                handlerIO.transferJsonToWorkspace(IngestWorkflowConstants.OBJECT_GROUP_FOLDER,
                    params.getObjectNameList().get(i),
                    mapOfObjectsList.get(i).getJsonOG(), false, false);
            }

        } catch (final ProcessingException e) {
            LOGGER.error(params.getObjectName(), e);
            return Arrays.asList(new ItemStatus(STORING_OBJECT_TASK_ID)
                .setItemsStatus(STORING_OBJECT_TASK_ID, new ItemStatus().increment(StatusCode.FATAL)));
        } catch (StorageClientException e) {
            LOGGER.error(e);
            return Arrays.asList(new ItemStatus(STORING_OBJECT_TASK_ID)
                .setItemsStatus(STORING_OBJECT_TASK_ID, new ItemStatus().increment(StatusCode.FATAL)));
        }

        return getFinalResult(itemStatusList);
    }

    public  StoreObjectGroupActionPlugin();
    public  StoreObjectGroupActionPlugin(StorageClientFactory storageClientFactory);

}