forked from j62/ctbrec
1
0
Fork 0

Add lifecycle listener to Help server to open the browser once the server is ready

This commit is contained in:
0xb00bface 2023-11-12 15:30:23 +01:00
parent 6b1d8eedec
commit 41ffd75d48
2 changed files with 43 additions and 17 deletions

View File

@ -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);
}
}
}

View File

@ -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");
});
);
}
}