public void getTransferStateSummary()

in api/service/src/main/java/org/apache/airavata/mft/api/handler/MFTApiHandler.java [156:236]


    public void getTransferStateSummary(TransferStateApiRequest request, StreamObserver<TransferStateSummaryResponse> responseObserver) {
        try {

            TransferStateSummaryResponse.Builder stateBuilder = TransferStateSummaryResponse.newBuilder().setPercentage(0);

            List<TransferState> transferStates = mftConsulClient.getTransferStates(request.getTransferId());
            List<TransferState> mainTransferStatus = transferStates.stream().filter(st -> st.getChildId() == null)
                    .sorted((st1, st2) -> Long.compare(st2.getUpdateTimeMils(), st1.getUpdateTimeMils()))
                    .collect(Collectors.toList());

            Optional<TransferApiRequest> processedTransferOp = mftConsulClient.getProcessedTransfer(request.getTransferId());

            if (processedTransferOp.isPresent()) {

                Set<String> completedFiles = new HashSet<>();
                Set<String> failedFiles = new HashSet<>();
                transferStates.stream().filter(st -> st.getChildId() != null).forEach(st -> {
                    if (st.getState().equals("COMPLETED")) {
                        completedFiles.add(st.getChildId());
                    } else if (st.getState().equals("FAILED")) {
                        failedFiles.add(st.getChildId());
                    }
                });

                Set<String> pendingFiles = processedTransferOp.get().getEndpointPathsList()
                        .stream().map(ep -> mftConsulClient.getEndpointPathHash(ep))
                        .filter(key -> !completedFiles.contains(key) && !failedFiles.contains(key)).collect(Collectors.toSet());

                stateBuilder.addAllCompleted(completedFiles);
                stateBuilder.addAllFailed(failedFiles);
                stateBuilder.addAllProcessing(pendingFiles);

                if (!pendingFiles.isEmpty()) {
                    stateBuilder.setState("IN PROGRESS");
                    stateBuilder.setPercentage((completedFiles.size() + failedFiles.size()) * 1.0 /
                            (completedFiles.size() + failedFiles.size() + pendingFiles.size()));
                    stateBuilder.setDescription("Transfer is in progress");

                } else {
                    if (!failedFiles.isEmpty() && !completedFiles.isEmpty()) {
                        stateBuilder.setState("PARTIAL FAILURE");
                        stateBuilder.setDescription("Some file transfers failed");
                        stateBuilder.setPercentage((completedFiles.size() + failedFiles.size()) * 1.0 /
                                (completedFiles.size() + failedFiles.size() + pendingFiles.size()));
                    } else if (!failedFiles.isEmpty()) {
                        stateBuilder.setState("FAILED");
                        stateBuilder.setDescription("All file transfers failed");
                        stateBuilder.setPercentage((completedFiles.size() + failedFiles.size()) * 1.0 /
                                (completedFiles.size() + failedFiles.size() + pendingFiles.size()));
                    } else if (!completedFiles.isEmpty()) {
                        stateBuilder.setState("COMPLETED");
                        stateBuilder.setDescription("All file transfers completed");
                        stateBuilder.setPercentage((completedFiles.size() + failedFiles.size()) * 1.0 /
                                (completedFiles.size() + failedFiles.size() + pendingFiles.size()));
                    }
                }

                responseObserver.onNext(stateBuilder.build());
                responseObserver.onCompleted();

            } else if (!mainTransferStatus.isEmpty()){
                stateBuilder.setState(mainTransferStatus.get(0).getState());
                stateBuilder.setPercentage(0);
                stateBuilder.setDescription(mainTransferStatus.get(0).getDescription());

                responseObserver.onNext(stateBuilder.build());
                responseObserver.onCompleted();

            } else {
                logger.error("There is processed transfer with id {}", request.getTransferId());
                responseObserver.onError(Status.NOT_FOUND
                        .withDescription("There is no processed transfer with id " + request.getTransferId())
                        .asRuntimeException());
            }
        } catch (Exception e) {
            logger.error("Error in fetching transfer state", e);
            responseObserver.onError(Status.INTERNAL
                    .withDescription("Failed to retrieve transfer state. " + e.getMessage())
                    .asException());
        }
    }