package com.github.otbproject.otbproject.web;
import com.github.otbproject.otbproject.App;
import com.github.otbproject.otbproject.config.Configs;
import com.github.otbproject.otbproject.config.WebConfig;
import com.github.otbproject.otbproject.fs.FSUtil;
import com.github.otbproject.otbproject.util.version.AddonReleaseData;
import com.github.otbproject.otbproject.util.version.Version;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.webapp.WebAppContext;
import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.Optional;
public class WebInterface {
private WebInterface() {}
public static void start() {
if (Configs.getWebConfig().get(WebConfig::isUpdateChecking)) {
checkForNewVersion();
}
startInterface(Configs.getWebConfig().get(WebConfig::getPortNumber), Configs.getWebConfig().get(WebConfig::getIpBinding));
}
public static void checkForNewVersion() {
Version current = WebVersion.lookupCurrent().orElse(Version.create(0, 0, Version.Type.RELEASE));
File path = new File(warPath(current));
if (App.VERSION.type == Version.Type.SNAPSHOT) {
App.logger.warn("You are running a dev build of OTB. Please grab the latest build of the web interface and place in \"" +
FSUtil.webDir() + File.separator + "\" as \"web-interface-" + WebVersion.latest() +
".war\". Releases will automatically download the latest version of the web interface for you");
} else {
Optional<AddonReleaseData> optional = WebVersion.getReleaseData().stream()
.filter(addonReleaseData -> App.VERSION.compareTo(addonReleaseData.getMinimumAppVersion()) >= 0)
.max(((o1, o2) -> o1.getVersion().compareTo(o2.getVersion())));
if (optional.isPresent()) {
AddonReleaseData latestReleaseData = optional.get();
if (!path.exists()
|| (Configs.getWebConfig().get(WebConfig::isAutoUpdating)
&& (current.compareTo(latestReleaseData.getVersion()) < 0))) {
WarDownload.downloadRelease(latestReleaseData);
}
}
}
}
private static void startInterface(int port, String address) {
Version current = WebVersion.lookupCurrent().orElse(Version.create(0, 0, Version.Type.RELEASE));
App.logger.info("Starting web interface version " + current);
Server server = new Server();
ServerConnector http = new ServerConnector(server);
http.setHost(address);
http.setPort(port);
server.addConnector(http);
WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/");
webapp.setWar(warPath(current));
server.setHandler(webapp);
try {
server.start();
} catch (Exception e) {
App.logger.catching(e);
}
}
static String warPath(Version version) {
return FSUtil.webDir() + File.separator + "web-interface-" + version + ".war";
}
public static void openInBrowser() {
if (Desktop.isDesktopSupported()) {
try {
Desktop.getDesktop().browse(URI.create("http://127.0.0.1:" + Configs.getWebConfig().get(WebConfig::getPortNumber)));
} catch (IOException e) {
App.logger.catching(e);
}
} else {
App.logger.warn("Unable to open web interface in browser - desktop not supported");
}
}
}