public void createTransferMapping()

in data-resource-management-service/drms-graph-impl/drms-api/src/main/java/org/apache/airavata/drms/api/handlers/StorageServiceHandler.java [198:328]


    public void createTransferMapping(CreateTransferMappingRequest request, StreamObserver<CreateTransferMappingResponse> responseObserver) {
        try {
            AuthenticatedUser authenticatedUser = request.getAuthToken().getAuthenticatedUser();
            AnyStorage sourceStorage = request.getTransferMapping().getSourceStorage();
            AnyStorage destinationStorage = request.getTransferMapping().getDestinationStorage();
            TransferScope scope = request.getTransferMapping().getTransferScope();
            Map<String, Object> properties = new HashMap<>();
            Map<String, Object> props = new HashMap<>();
            props.put("tenantId", authenticatedUser.getTenantId());
            props.put("owner", authenticatedUser.getUsername());
            properties.put("tenantId", authenticatedUser.getTenantId());
            properties.put("username", authenticatedUser.getUsername());
            properties.put("owner", authenticatedUser.getUsername());
            List<TransferMapping> transferMappings = new ArrayList<>();

            if (scope.equals(TransferScope.GLOBAL)) {
                props.put("scope", TransferScope.GLOBAL.name());
            } else {
                props.put("scope", TransferScope.USER.name());
            }

            if (sourceStorage.getSshStorage() != null && !sourceStorage.getSshStorage().getStorageId().isEmpty() &&
                    destinationStorage.getSshStorage() == null || destinationStorage.getSshStorage().getStorageId().isEmpty()) {
                String sourceId = sourceStorage.getSshStorage().getStorageId();
                properties.put("srcStorageId", sourceId);
                props.put("srcStorageId", sourceId);
                String messageId = authenticatedUser.getUsername() + "_" + sourceId;
                String entityId = Utils.getId(messageId);
                properties.put("props", props);
                properties.put("entityId", entityId);
                props.put("entityId", entityId);
                if (hasAccess(authenticatedUser.getUsername(), authenticatedUser.getTenantId(), sourceId)) {
                    String query = " Match (u:User), (srcSp:Storage) where " +
                            " u.username=$username AND u.tenantId=$tenantId AND " +
                            "srcSp.storageId=$srcStorageId AND " +
                            "srcSp.tenantId = $tenantId " +
                            " Merge (u)-[:HAS_TRANSFER_MAPPING]->(tm:TransferMapping{entityId:$entityId, tenantId:$tenantId, " +
                            "srcStorageId:$srcStorageId," +
                            "owner:$owner}) set tm += $props" +
                            " Merge (tm)<-[:TRANSFER_OUT]-(srcSp)" +
                            " return (tm)";
                    this.neo4JConnector.runTransactionalQuery(properties, query);

                    String searchQuery = " Match (srcStr:Storage)-[:TRANSFER_OUT]->(tm:TransferMapping)" +
                            " where " +
                            " tm.entityId=$entityId AND tm.tenantId=$tenantId return srcStr, tm";
                    List<Record> records = this.neo4JConnector.searchNodes(properties, searchQuery);
                    if (!records.isEmpty()) {
                        transferMappings = TransferMappingDeserializer.deserializeListExceptDestinationStorage(records);
                    }
                }

            } else {
                String sourceId = null;

                if (sourceStorage.getSshStorage() == null || sourceStorage.getSshStorage().getStorageId().isEmpty()) {
                    String query = " Match (srcStr:Storage)-[:TRANSFER_OUT]->(tm:TransferMapping) where tm.tenantId=$tenantId AND tm.scope='GLOBAL' " +
                            " AND srcStr.tenantId=$tenantId return srcStr, tm";
                    List<Record> sourceRecords = this.neo4JConnector.searchNodes(properties, query);
                    List<TransferMapping> sourceTransfers = TransferMappingDeserializer.deserializeListExceptDestinationStorage(sourceRecords);
                    if (sourceTransfers.isEmpty()) {
                        String msg = "Errored while creating transfer mapping; Message: Cannot find global source storage ";
                        logger.error("Errored while creating transfer mapping; Message: Cannot find global source storage ");
                        responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
                        return;
                    }
                    TransferMapping transferMapping = sourceTransfers.get(0);
                    sourceId = getStorageId(transferMapping.getSourceStorage());

                } else {
                    sourceId = getStorageId(sourceStorage);
                }

                String destinationId = getStorageId(destinationStorage);
                props.put("srcStorageId", sourceId);
                props.put("dstStorageId", destinationId);
                String messageId = authenticatedUser.getUsername() + "_" + sourceId + "_" + destinationId;
                String entityId = Utils.getId(messageId);
                properties.put("props", props);
                properties.put("tenantId", authenticatedUser.getTenantId());
                properties.put("entityId", entityId);
                properties.put("username", authenticatedUser.getUsername());
                properties.put("srcStorageId", sourceId);
                properties.put("dstStorageId", destinationId);
                properties.put("owner", authenticatedUser.getUsername());
                properties.put("entityId", entityId);
                props.put("entityId", entityId);

                if (hasAccess(authenticatedUser.getUsername(), authenticatedUser.getTenantId(), sourceId) &&
                        hasAccess(authenticatedUser.getUsername(), authenticatedUser.getTenantId(), destinationId)) {
                    String query = " Match (u:User), (srcSp:Storage), (dstSp:Storage) where " +
                            " u.username=$username AND u.tenantId=$tenantId AND " +
                            "srcSp.storageId=$srcStorageId AND " +
                            "srcSp.tenantId = $tenantId AND dstSp.storageId=$dstStorageId " +
                            "AND dstSp.tenantId =$tenantId " +
                            " Merge (u)-[:HAS_TRANSFER_MAPPING]->(tm:TransferMapping{entityId:$entityId, tenantId:$tenantId, " +
                            "srcStorageId:$srcStorageId," +
                            "dstStorageId:$dstStorageId,owner:$owner}) set tm += $props" +
                            " Merge (tm)<-[:TRANSFER_OUT]-(srcSp)" +
                            " Merge (tm)-[:TRANSFER_IN]->(dstSp) return (tm)";
                    this.neo4JConnector.runTransactionalQuery(properties, query);

                    String searchQuery = " Match (srcStr:Storage)-[:TRANSFER_OUT]->(tm:TransferMapping)" +
                            "-[:TRANSFER_IN]->(dstStr:Storage)  where " +
                            " tm.entityId=$entityId AND tm.tenantId=$tenantId return srcStr,  dstStr,  tm";
                    List<Record> records = this.neo4JConnector.searchNodes(properties, searchQuery);
                    if (!records.isEmpty()) {
                        transferMappings = TransferMappingDeserializer.deserializeList(records);
                    }
                }
            }

            if (!transferMappings.isEmpty()) {
                CreateTransferMappingResponse response = CreateTransferMappingResponse
                        .newBuilder()
                        .setTransferMapping(transferMappings.get(0))
                        .build();
                responseObserver.onNext(response);
                responseObserver.onCompleted();
            } else {
                String msg = "Errored while creating transfer mapping; Message:";
                logger.error("Errored while creating transfer mapping; Message:");
                responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
            }
        } catch (Exception e) {
            String msg = "Errored while creating transfer mapping; Message:" + e.getMessage();
            logger.error("Errored while creating transfer mapping; Message: {}", e.getMessage(), e);
            responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
        }

    }