From 39751747c3a45b7cc52b177efd1b462dee8596b3 Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Mon, 19 Oct 2020 13:59:35 +0200 Subject: [PATCH] Update App.java, LogEntry.java, and 5 more files... --- src/main/java/it/cavallium/App.java | 11 ++++ src/main/java/it/cavallium/LogEntry.java | 65 +++++++++++++++++++ src/main/java/it/cavallium/LogService.java | 14 ++++ .../java/it/cavallium/LogServiceImpl.java | 31 +++++++++ .../java/it/cavallium/PrimaryController.java | 10 +++ .../it/cavallium/TransferServiceImpl.java | 2 + src/main/resources/it/cavallium/primary.fxml | 2 +- 7 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 src/main/java/it/cavallium/LogEntry.java create mode 100644 src/main/java/it/cavallium/LogService.java create mode 100644 src/main/java/it/cavallium/LogServiceImpl.java diff --git a/src/main/java/it/cavallium/App.java b/src/main/java/it/cavallium/App.java index 0615b20..232b180 100644 --- a/src/main/java/it/cavallium/App.java +++ b/src/main/java/it/cavallium/App.java @@ -12,6 +12,7 @@ import javafx.scene.Scene; import javafx.stage.Stage; import java.io.IOException; +import org.slf4j.event.Level; /** * JavaFX App @@ -22,6 +23,7 @@ public class App extends Application { private static TdClusterManager clusterManager; private static TransferService transferService; + private static LogService logService; private static Scene scene; @@ -29,6 +31,10 @@ public class App extends Application { public void start(Stage stage) throws IOException, CantLoadLibrary { Init.start(); clusterManager = new TdClusterManager(null, null, Vertx.vertx(), null); + + logService = new LogServiceImpl(); + logService.append(Level.INFO, "Initializing"); + transferService = new TransferServiceImpl(clusterManager); transferService.setApiId(94575); @@ -37,6 +43,7 @@ public class App extends Application { scene = new Scene(loadFXML("primary"), 800, 600); stage.setScene(scene); stage.show(); + logService.append(Level.INFO, "Initialized"); } @Override @@ -61,4 +68,8 @@ public class App extends Application { public static TransferService getTransferService() { return transferService; } + + public static LogService getLogService() { + return logService; + } } \ No newline at end of file diff --git a/src/main/java/it/cavallium/LogEntry.java b/src/main/java/it/cavallium/LogEntry.java new file mode 100644 index 0000000..0b0bd2a --- /dev/null +++ b/src/main/java/it/cavallium/LogEntry.java @@ -0,0 +1,65 @@ +package it.cavallium; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Objects; +import java.util.StringJoiner; +import org.slf4j.event.Level; + +public class LogEntry { + private final long time; + private final Level level; + private final String text; + + public LogEntry(long time, Level level, String text) { + this.time = time; + this.level = level; + this.text = text; + } + + public Level getLevel() { + return level; + } + + public long getTime() { + return time; + } + + public String getText() { + return text; + } + + @Override + public String toString() { + return LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault()).toString() + " [" + level + "] " + text; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + LogEntry logEntry = (LogEntry) o; + + if (time != logEntry.time) { + return false; + } + if (level != logEntry.level) { + return false; + } + return Objects.equals(text, logEntry.text); + } + + @Override + public int hashCode() { + int result = (int) (time ^ (time >>> 32)); + result = 31 * result + (level != null ? level.hashCode() : 0); + result = 31 * result + (text != null ? text.hashCode() : 0); + return result; + } +} diff --git a/src/main/java/it/cavallium/LogService.java b/src/main/java/it/cavallium/LogService.java new file mode 100644 index 0000000..d03ffaf --- /dev/null +++ b/src/main/java/it/cavallium/LogService.java @@ -0,0 +1,14 @@ +package it.cavallium; + +import java.util.List; +import org.slf4j.event.Level; +import reactor.core.publisher.Flux; + +public interface LogService { + + Flux listenUpdates(); + + void append(Level level, String message); + + int getMaxSize(); +} diff --git a/src/main/java/it/cavallium/LogServiceImpl.java b/src/main/java/it/cavallium/LogServiceImpl.java new file mode 100644 index 0000000..1624714 --- /dev/null +++ b/src/main/java/it/cavallium/LogServiceImpl.java @@ -0,0 +1,31 @@ +package it.cavallium; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import org.slf4j.event.Level; +import reactor.core.publisher.Flux; +import reactor.core.publisher.ReplayProcessor; + +public class LogServiceImpl implements LogService { + + private static final int SIZE = 1000; + + private ReplayProcessor logs = ReplayProcessor.create(SIZE); + + @Override + public Flux listenUpdates() { + return logs.hide(); + } + + @Override + public void append(Level level, String message) { + logs.onNext(new LogEntry(System.currentTimeMillis(), level, message)); + } + + @Override + public int getMaxSize() { + return SIZE; + } +} diff --git a/src/main/java/it/cavallium/PrimaryController.java b/src/main/java/it/cavallium/PrimaryController.java index a860a5d..8c3fdde 100644 --- a/src/main/java/it/cavallium/PrimaryController.java +++ b/src/main/java/it/cavallium/PrimaryController.java @@ -33,6 +33,7 @@ public class PrimaryController { @FXML private ListView userbotsList; @FXML private ComboBox sourceGroupCombo; @FXML private ComboBox destGroupCombo; + @FXML private ListView log; @FXML protected void initialize() { @@ -55,6 +56,15 @@ public class PrimaryController { for (BaseChatInfo destSupergroups : App.getTransferService().getAdminSupergroups(false, true)) { destItems.add(destSupergroups); } + + App.getLogService().listenUpdates().subscribeOn(Schedulers.boundedElastic()).flatMap(logString -> MonoFxUtils.runLater(() -> { + if (log.getItems().size() >= App.getLogService().getMaxSize()) { + log.getItems().remove(0); + } + log.getItems().add(logString); + log.scrollTo(logString); + return Mono.empty(); + })).subscribe(); } private void disableClicks() { diff --git a/src/main/java/it/cavallium/TransferServiceImpl.java b/src/main/java/it/cavallium/TransferServiceImpl.java index 810d274..710f092 100644 --- a/src/main/java/it/cavallium/TransferServiceImpl.java +++ b/src/main/java/it/cavallium/TransferServiceImpl.java @@ -29,7 +29,9 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collectors; +import org.apache.logging.log4j.LogManager; import org.reactivestreams.Publisher; +import org.slf4j.LoggerFactory; import org.warp.commonutils.error.InitializationException; import reactor.core.publisher.EmitterProcessor; import reactor.core.publisher.Flux; diff --git a/src/main/resources/it/cavallium/primary.fxml b/src/main/resources/it/cavallium/primary.fxml index aaeac70..451f748 100644 --- a/src/main/resources/it/cavallium/primary.fxml +++ b/src/main/resources/it/cavallium/primary.fxml @@ -127,7 +127,7 @@
- +