From 41ffd75d48a00eb8ac33fc246d16f77a4cc9df02 Mon Sep 17 00:00:00 2001 From: 0xb00bface <0xboobface@gmail.com> Date: Sun, 12 Nov 2023 15:30:23 +0100 Subject: [PATCH] Add lifecycle listener to Help server to open the browser once the server is ready --- .../src/main/java/ctbrec/docs/DocServer.java | 22 +++++++++-- .../src/main/java/ctbrec/ui/tabs/HelpTab.java | 38 ++++++++++++------- 2 files changed, 43 insertions(+), 17 deletions(-) diff --git a/client/src/main/java/ctbrec/docs/DocServer.java b/client/src/main/java/ctbrec/docs/DocServer.java index b1e7cfb6..898e74ab 100644 --- a/client/src/main/java/ctbrec/docs/DocServer.java +++ b/client/src/main/java/ctbrec/docs/DocServer.java @@ -4,17 +4,17 @@ import ctbrec.servlet.AbstractDocServlet; import ctbrec.servlet.MarkdownServlet; import ctbrec.servlet.SearchServlet; import ctbrec.servlet.StaticFileServlet; +import lombok.extern.slf4j.Slf4j; import org.eclipse.jetty.server.*; import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.servlet.ServletHandler; import org.eclipse.jetty.servlet.ServletHolder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.eclipse.jetty.util.component.LifeCycle; import java.net.BindException; +@Slf4j public class DocServer { - private static final Logger LOG = LoggerFactory.getLogger(DocServer.class); private static volatile boolean started = false; @@ -22,7 +22,15 @@ public class DocServer { } public static synchronized void start() throws Exception { + start(() -> { + }); + } + + public static synchronized void start(Runnable callback) throws Exception { + log.info("DocServer.start"); if (started) { + log.info("if started"); + callback.run(); return; } @@ -53,12 +61,18 @@ public class DocServer { holder = new ServletHolder(staticFileServlet); handler.addServletWithMapping(holder, "/static/*"); + server.addLifeCycleListener(new LifeCycle.Listener() { + @Override + public void lifeCycleStarted(LifeCycle event) { + callback.run(); + } + }); try { server.start(); server.join(); } catch (BindException e) { - LOG.error("Port {} is already in use", http.getPort(), e); + log.error("Port {} is already in use", http.getPort(), e); } } } diff --git a/client/src/main/java/ctbrec/ui/tabs/HelpTab.java b/client/src/main/java/ctbrec/ui/tabs/HelpTab.java index 8eb7a10e..6760b706 100644 --- a/client/src/main/java/ctbrec/ui/tabs/HelpTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/HelpTab.java @@ -1,19 +1,19 @@ package ctbrec.ui.tabs; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import ctbrec.docs.DocServer; import ctbrec.ui.DesktopIntegration; +import javafx.application.Platform; import javafx.geometry.Insets; import javafx.scene.control.Button; import javafx.scene.control.Tab; import javafx.scene.layout.BorderPane; +import lombok.extern.slf4j.Slf4j; +import java.util.concurrent.atomic.AtomicBoolean; + +@Slf4j public class HelpTab extends Tab { - private static final Logger LOG = LoggerFactory.getLogger(HelpTab.class); - public HelpTab() { setClosable(true); setText("Help"); @@ -23,15 +23,27 @@ public class HelpTab extends Tab { var layout = new BorderPane(openHelp); BorderPane.setMargin(openHelp, new Insets(20)); setContent(layout); + AtomicBoolean started = new AtomicBoolean(false); openHelp.setOnAction(e -> { - new Thread(() -> { - try { - DocServer.start(); - } catch (Exception ex) { - LOG.error("Couldn't start documentation server", ex); + synchronized (started) { + if (!started.get()) { + new Thread(() -> { + try { + DocServer.start(() -> + Platform.runLater(() -> { + started.set(true); + DesktopIntegration.open("http://localhost:5689/docs/index.md"); + }) + ); + } catch (Exception ex) { + log.error("Couldn't start documentation server", ex); + } + }).start(); + } else { + DesktopIntegration.open("http://localhost:5689/docs/index.md"); + } + } } - }).start(); - DesktopIntegration.open("http://localhost:5689/docs/index.md"); - }); + ); } }