class AbstractGraphComputePlugin extends ActionHandler {

    @Override
    public List<ItemStatus> executeList(WorkerParameters workerParameters, HandlerIO handler) {

        final ItemStatus itemStatus = new ItemStatus(getPluginKeyName());

        List<ItemStatus> aggregateItemStatus = new ArrayList<>();
        List<String> items = workerParameters.getObjectNameList();
        // Transform to Set? (Remove duplicates)
        Set<String> ids = new HashSet<>(items);

        int initialSize = ids.size();
        int finalSize = 0;
        GraphComputeResponse graphComputeResponse = null;
        try (MetaDataClient metaDataClient = metaDataClientFactory.getClient()) {
            graphComputeResponse = metaDataClient.computeGraph(getGraphComputeAction(), ids);

            switch (getGraphComputeAction()) {
                case UNIT:
                    finalSize = graphComputeResponse.getUnitCount();
                    break;
                case OBJECTGROUP:
                    finalSize = graphComputeResponse.getGotCount();
                    break;
                default:
                    throw new IllegalStateException("Unexpected graph compute action " + getGraphComputeAction());
            }

        } catch (VitamClientException e) {
            LOGGER.error("Processing exception", e);
            itemStatus.increment(StatusCode.FATAL);
        } finally {
            handler.setCurrentObjectId(null);
        }

        int fatal = Math.abs(initialSize - finalSize);

        // The ko should be not blocking
        if (0 == fatal) {
            itemStatus.increment(StatusCode.OK, finalSize);
        } else {
            if (null != graphComputeResponse && !Strings.isNullOrEmpty(graphComputeResponse.getErrorMessage())) {
                ObjectNode infoNode = JsonHandler.createObjectNode();
                infoNode.put(SedaConstants.EV_DET_TECH_DATA, graphComputeResponse.getErrorMessage());
                itemStatus.setEvDetailData(JsonHandler.unprettyPrint(infoNode));
            }

            // When fatal occurs, we have the index from where we restart workflow distribution after resolving FATAL cause
            itemStatus.increment(StatusCode.OK, finalSize).increment(StatusCode.FATAL, fatal);
        }
        aggregateItemStatus.add(new ItemStatus(getPluginKeyName()).setItemsStatus(getPluginKeyName(), itemStatus));
        return aggregateItemStatus;
    }

    public  AbstractGraphComputePlugin();
    @VisibleForTesting public  AbstractGraphComputePlugin(MetaDataClientFactory metaDataClientFactory);

}