class PrepareTraceabilityCheckProcessActionHandler extends ActionHandler {

    @Override
    public ItemStatus execute(WorkerParameters param, HandlerIO handler)
        throws ProcessingException {

        final ItemStatus itemStatus = new ItemStatus(HANDLER_ID);

        // 1- Get the TRACEABILITY operation to check
        LogbookOperation operationToCheck;
        try (LogbookOperationsClient logbookOperationsClient = logbookOperationsClientFactory.getClient()) {

            RequestResponseOK requestResponseOK =
                RequestResponseOK.getFromJsonNode(logbookOperationsClient
                    .selectOperation(
                        JsonHandler.getFromString(param.getMapParameters().get(WorkerParameterName.logbookRequest))));

            List<ObjectNode> foundOperation = requestResponseOK.getResults();
            if (foundOperation == null || foundOperation.isEmpty() || foundOperation.size() > 1) {
                itemStatus.increment(StatusCode.KO);
                return itemStatus;
            }

            operationToCheck = new LogbookOperation(foundOperation.get(0));
            String operationType = (String) operationToCheck.get(LogbookMongoDbName.eventTypeProcess.getDbname());

            // check if it a traceability operation
            if (!LogbookTypeProcess.TRACEABILITY.equals(LogbookTypeProcess.valueOf(operationType))) {
                itemStatus.increment(StatusCode.KO);
                return itemStatus;
            }
        } catch (InvalidParseOperationException | LogbookClientException | IllegalArgumentException e) {
            LOGGER.error(e.getMessage(), e);
            itemStatus.increment(StatusCode.FATAL);
            return itemStatus;
        }

        Response response = null;
        // 2- TRACEABILITY operation found, so extract the ZIP file to start checking process
        try (WorkspaceClient workspaceClient = handler.getWorkspaceClientFactory().getClient();
            StorageClient storageClient = storageClientFactory.getClient()) {

            // Create TraceabilityEvent instance
            String evDetData = operationToCheck.getString(LogbookMongoDbName.eventDetailData.getDbname());
            JsonNode eventDetail = JsonHandler.getFromString(evDetData);

            TraceabilityEvent traceabilityEvent =
                JsonHandler.getFromJsonNode(eventDetail, TraceabilityEvent.class);
            String fileName = traceabilityEvent.getFileName();

            // 1- get zip file

            DataCategory dataCategory = getDataCategory(traceabilityEvent);

            response =
                storageClient.getContainerAsync(VitamConfiguration.getDefaultStrategy(), fileName, dataCategory,
                    AccessLogUtils.getNoLogAccessLog());

            // Idempotency - we check if a folder exist
            if (workspaceClient.isExistingContainer(param.getContainerName())) {
                try {
                    workspaceClient.deleteContainer(param.getContainerName(), true);
                    LOGGER.warn("Container was already existing, step is being replayed");
                } catch (ContentAddressableStorageNotFoundException e) {
                    LOGGER.warn("The container could not be deleted", e);
                }
            }

            // 2- unzip file
            handler.unzipInputStreamOnWorkspace(param.getContainerName(),
                SedaConstants.TRACEABILITY_OPERATION_DIRECTORY, CommonMediaType.ZIP,
                response.readEntity(InputStream.class), false);

            // 3- Add Output result : eventDetailData
            extractTraceabilityOperationDetails(handler, traceabilityEvent);

            itemStatus.increment(StatusCode.OK);

        } catch (StorageServerClientException | StorageNotFoundException | ContentAddressableStorageException | InvalidParseOperationException e) {
            LOGGER.error(e.getMessage(), e);
            itemStatus.increment(StatusCode.FATAL);
        } finally {
            DefaultClient.staticConsumeAnyEntityAndClose(response);
        }

        return new ItemStatus(HANDLER_ID).setItemsStatus(HANDLER_ID, itemStatus);
    }

    public  PrepareTraceabilityCheckProcessActionHandler();
    public  PrepareTraceabilityCheckProcessActionHandler(
        LogbookOperationsClientFactory logbookOperationsClientFactory,
        StorageClientFactory storageClientFactory);

}