/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE file at the root of the source * tree and available online at * * https://github.com/keeps/roda */ package org.roda.core.common.monitor; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; import org.apache.commons.lang3.StringUtils; public class TransferUpdateStatus { private static TransferUpdateStatus status; private static boolean isUpdatingBaseStatus; private static Set<String> isUpdatingFolderStatus; private TransferUpdateStatus() { // do nothing } public static TransferUpdateStatus getInstance() { if (status == null) { status = new TransferUpdateStatus(); isUpdatingBaseStatus = false; isUpdatingFolderStatus = new HashSet<>(); } return status; } public boolean isUpdatingStatus(Optional<String> folderRelativePath) { boolean ret = false; if (isUpdatingBaseStatus || !folderRelativePath.isPresent()) { ret = isUpdatingBaseStatus; } else { String relativePath = folderRelativePath.get(); if (isUpdatingFolderStatus.contains(relativePath)) { ret = true; } else { // check ancestors List<String> split = new ArrayList<>(Arrays.asList(relativePath.split("/"))); while (split.size() > 1 && !ret) { split.remove(split.size() - 1); String ancestorRelativePath = StringUtils.join(split, "/"); ret = isUpdatingFolderStatus.contains(ancestorRelativePath); } } } return ret; } public void setUpdatingStatus(Optional<String> folderRelativePath, boolean isUpdatingStatus) { if (folderRelativePath.isPresent()) { if (isUpdatingStatus) { isUpdatingFolderStatus.add(folderRelativePath.get()); } else { isUpdatingFolderStatus.remove(folderRelativePath.get()); } } else { TransferUpdateStatus.isUpdatingBaseStatus = isUpdatingStatus; } } }