package ctbrec.ui.action; import ctbrec.GlobalThreadPool; import ctbrec.Model; import ctbrec.recorder.Recorder; import ctbrec.ui.action.StopRecordingAction; import ctbrec.ui.controls.Dialogs; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; import java.util.stream.Collectors; import javafx.application.Platform; import javafx.scene.control.Button; import lombok.extern.slf4j.Slf4j; @Slf4j public class CheckModelAccountAction { private Button b; private Recorder recorder; private String buttonText; public CheckModelAccountAction(Button b, Recorder recorder) { this.b = b; this.recorder = recorder; buttonText = b.getText(); } public void execute(Predicate filter) { b.setDisable(true); Runnable checker = () -> { ArrayList deletedAccounts = new ArrayList(); try { checkModelAccounts(filter, deletedAccounts); } finally { showResult(deletedAccounts); } }; GlobalThreadPool.submit((Runnable)checker); } private void showResult(List deletedAccounts) { Platform.runLater(() -> { b.setDisable(false); b.setText(this.buttonText); if (!deletedAccounts.isEmpty()) { StringBuilder sb = new StringBuilder(); for (Model deletedModel : deletedAccounts) { Object name = deletedModel.getDisplayName() + " ".repeat(30); name = ((String)name).substring(0, 30); sb.append((String)name).append(' ').append('(').append(deletedModel.getUrl()).append(')').append('\n'); } boolean remove = Dialogs.showExpandedConfirmDialog("Deleted Accounts", "Accounts list:", sb.toString(), "The following accounts seem to have been deleted. Do you want to remove them?", b.getScene()); if (remove) { new StopRecordingAction(b, deletedAccounts, recorder).execute(); } } }); } private void checkModelAccounts(Predicate filter, List deletedAccounts) { List models = recorder.getModels().stream().filter(filter).collect(Collectors.toList()); int total = models.size(); for (int i = 0; i < total; ++i) { int counter = i + 1; Platform.runLater(() -> b.setText(buttonText + " " + counter + "/" + total)); Model modelToCheck = (Model)models.get(i); try { if (modelToCheck.exists()) continue; deletedAccounts.add(modelToCheck); continue; } catch (IOException e) { log.warn("Couldn't check, if model account still exists", (Throwable)e); } } } }