diff --git a/jabgui/build.gradle.kts b/jabgui/build.gradle.kts index 1066e1dd851..9363d779a2e 100644 --- a/jabgui/build.gradle.kts +++ b/jabgui/build.gradle.kts @@ -23,6 +23,8 @@ dependencies { implementation("org.openjfx:javafx-swing") implementation("org.openjfx:javafx-web") + implementation(project(":jabsrv")) + implementation("com.pixelduke:fxthemes") // From JavaFX25 onwards diff --git a/jabgui/src/main/java/module-info.java b/jabgui/src/main/java/module-info.java index 552f3404317..7d19bbd6f66 100644 --- a/jabgui/src/main/java/module-info.java +++ b/jabgui/src/main/java/module-info.java @@ -1,6 +1,8 @@ open module org.jabref { requires org.jabref.jablib; + requires org.jabref.jabsrv; + // Swing requires java.desktop; diff --git a/jabgui/src/main/java/org/jabref/gui/JabRefGUI.java b/jabgui/src/main/java/org/jabref/gui/JabRefGUI.java index 761fd2b0473..2535d372d00 100644 --- a/jabgui/src/main/java/org/jabref/gui/JabRefGUI.java +++ b/jabgui/src/main/java/org/jabref/gui/JabRefGUI.java @@ -28,6 +28,7 @@ import org.jabref.gui.util.DirectoryMonitor; import org.jabref.gui.util.UiTaskExecutor; import org.jabref.gui.util.WebViewStore; +import org.jabref.http.manager.HttpServerManager; import org.jabref.logic.UiCommand; import org.jabref.logic.ai.AiService; import org.jabref.logic.citation.SearchCitationsRelationsService; @@ -80,6 +81,7 @@ public class JabRefGUI extends Application { private static JabRefFrame mainFrame; private static RemoteListenerServerManager remoteListenerServerManager; + private static HttpServerManager httpServerManager; private Stage mainStage; @@ -157,7 +159,10 @@ public void initialize() { IndexManager.clearOldSearchIndices(); JabRefGUI.remoteListenerServerManager = new RemoteListenerServerManager(); - Injector.setModelOrService(RemoteListenerServerManager.class, remoteListenerServerManager); + Injector.setModelOrService(RemoteListenerServerManager.class, JabRefGUI.remoteListenerServerManager); + + JabRefGUI.httpServerManager = new HttpServerManager(); + Injector.setModelOrService(HttpServerManager.class, JabRefGUI.httpServerManager); JabRefGUI.stateManager = new StateManager(); Injector.setModelOrService(StateManager.class, stateManager); @@ -396,6 +401,7 @@ private boolean upperRightIsInBounds(CoreGuiPreferences coreGuiPreferences) { // Background tasks public void startBackgroundTasks() { RemotePreferences remotePreferences = preferences.getRemotePreferences(); + if (remotePreferences.useRemoteServer()) { remoteListenerServerManager.openAndStart( new CLIMessageHandler( @@ -403,6 +409,10 @@ public void startBackgroundTasks() { preferences), remotePreferences.getPort()); } + + if (remotePreferences.enableHttpServer()) { + httpServerManager.start(stateManager.getOpenDatabases(), remotePreferences.getHttpServerUri()); + } } @Override @@ -413,14 +423,25 @@ public void stop() { } catch (Exception e) { LOGGER.error("Unable to close AI service", e); } + LOGGER.trace("Closing OpenOffice connection"); OOBibBaseConnect.closeOfficeConnection(); + + LOGGER.trace("Shutting down remote server manager"); + remoteListenerServerManager.stop(); + + LOGGER.trace("Shutting down http server manager"); + httpServerManager.stop(); + LOGGER.trace("Stopping background tasks"); stopBackgroundTasks(); + LOGGER.trace("Shutting down thread pools"); shutdownThreadPools(); + LOGGER.trace("Closing citations and relations search service"); citationsAndRelationsSearchService.close(); + LOGGER.trace("Finished stop"); } diff --git a/jabgui/src/main/java/org/jabref/gui/preferences/general/GeneralTab.java b/jabgui/src/main/java/org/jabref/gui/preferences/general/GeneralTab.java index 9f8f0003c70..c041d866707 100644 --- a/jabgui/src/main/java/org/jabref/gui/preferences/general/GeneralTab.java +++ b/jabgui/src/main/java/org/jabref/gui/preferences/general/GeneralTab.java @@ -57,6 +57,7 @@ public class GeneralTab extends AbstractPreferenceTabView i @FXML private TextField backupDirectory; @FXML private CheckBox remoteServer; @FXML private TextField remotePort; + @FXML private CheckBox enableHttpServer; @FXML private Button remoteHelp; @Inject private FileUpdateMonitor fileUpdateMonitor; @Inject private BibEntryTypesManager entryTypesManager; @@ -149,6 +150,8 @@ public void initialize() { remoteServer.selectedProperty().bindBidirectional(viewModel.remoteServerProperty()); remotePort.textProperty().bindBidirectional(viewModel.remotePortProperty()); remotePort.disableProperty().bind(remoteServer.selectedProperty().not()); + + enableHttpServer.selectedProperty().bindBidirectional(viewModel.enableHttpServerProperty()); } @FXML diff --git a/jabgui/src/main/java/org/jabref/gui/preferences/general/GeneralTabViewModel.java b/jabgui/src/main/java/org/jabref/gui/preferences/general/GeneralTabViewModel.java index 087cbed3b0a..9a2a6483ac6 100644 --- a/jabgui/src/main/java/org/jabref/gui/preferences/general/GeneralTabViewModel.java +++ b/jabgui/src/main/java/org/jabref/gui/preferences/general/GeneralTabViewModel.java @@ -1,6 +1,7 @@ package org.jabref.gui.preferences.general; import java.io.IOException; +import java.net.URI; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; @@ -17,9 +18,11 @@ import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.collections.FXCollections; +import javafx.collections.ObservableList; import javafx.scene.control.SpinnerValueFactory; import org.jabref.gui.DialogService; +import org.jabref.gui.StateManager; import org.jabref.gui.WorkspacePreferences; import org.jabref.gui.desktop.os.NativeDesktop; import org.jabref.gui.frame.UiMessageHandler; @@ -30,6 +33,7 @@ import org.jabref.gui.theme.ThemeTypes; import org.jabref.gui.util.DirectoryDialogConfiguration; import org.jabref.gui.util.FileDialogConfiguration; +import org.jabref.http.manager.HttpServerManager; import org.jabref.logic.FilePreferences; import org.jabref.logic.LibraryPreferences; import org.jabref.logic.l10n.Language; @@ -39,6 +43,7 @@ import org.jabref.logic.remote.RemoteUtil; import org.jabref.logic.remote.server.RemoteListenerServerManager; import org.jabref.logic.util.StandardFileType; +import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.database.BibDatabaseMode; import org.jabref.model.strings.StringUtil; import org.jabref.model.util.FileUpdateMonitor; @@ -49,12 +54,16 @@ import de.saxsys.mvvmfx.utils.validation.ValidationMessage; import de.saxsys.mvvmfx.utils.validation.ValidationStatus; import de.saxsys.mvvmfx.utils.validation.Validator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class GeneralTabViewModel implements PreferenceTabViewModel { protected static SpinnerValueFactory fontSizeValueFactory = new SpinnerValueFactory.IntegerSpinnerValueFactory(9, Integer.MAX_VALUE); + private static final Logger LOGGER = LoggerFactory.getLogger(GeneralTabViewModel.class); + private final ReadOnlyListProperty languagesListProperty = new ReadOnlyListWrapper<>(FXCollections.observableArrayList(Language.getSorted())); private final ObjectProperty selectedLanguageProperty = new SimpleObjectProperty<>(); @@ -101,9 +110,11 @@ public class GeneralTabViewModel implements PreferenceTabViewModel { private final BooleanProperty remoteServerProperty = new SimpleBooleanProperty(); private final StringProperty remotePortProperty = new SimpleStringProperty(""); private final Validator remotePortValidator; - private final FileUpdateMonitor fileUpdateMonitor; + private final BooleanProperty enableHttpServerProperty = new SimpleBooleanProperty(); private final TrustStoreManager trustStoreManager; + private final FileUpdateMonitor fileUpdateMonitor; + public GeneralTabViewModel(DialogService dialogService, GuiPreferences preferences, FileUpdateMonitor fileUpdateMonitor) { this.dialogService = dialogService; this.preferences = preferences; @@ -197,6 +208,8 @@ public void setValues() { remoteServerProperty.setValue(remotePreferences.useRemoteServer()); remotePortProperty.setValue(String.valueOf(remotePreferences.getPort())); + + enableHttpServerProperty.setValue(remotePreferences.enableHttpServer()); } @Override @@ -251,8 +264,8 @@ public void storeSettings() { UiMessageHandler uiMessageHandler = Injector.instantiateModelOrService(UiMessageHandler.class); RemoteListenerServerManager remoteListenerServerManager = Injector.instantiateModelOrService(RemoteListenerServerManager.class); - remoteListenerServerManager.stop(); // stop in all cases, because the port might have changed - + // stop in all cases, because the port might have changed + remoteListenerServerManager.stop(); if (remoteServerProperty.getValue()) { remotePreferences.setUseRemoteServer(true); remoteListenerServerManager.openAndStart( @@ -260,18 +273,22 @@ public void storeSettings() { remotePreferences.getPort()); } else { remotePreferences.setUseRemoteServer(false); + remoteListenerServerManager.stop(); } - trustStoreManager.flush(); - if (remoteServerProperty.getValue()) { - remotePreferences.setUseRemoteServer(true); - remoteListenerServerManager.openAndStart( - new CLIMessageHandler(uiMessageHandler, preferences), - remotePreferences.getPort()); + HttpServerManager httpServerManager = Injector.instantiateModelOrService(HttpServerManager.class); + // stop in all cases, because the port might have changed + httpServerManager.stop(); + if (enableHttpServerProperty.getValue()) { + remotePreferences.setEnableHttpServer(true); + ObservableList openDatabases = Injector.instantiateModelOrService(StateManager.class).getOpenDatabases(); + URI uri = remotePreferences.getHttpServerUri(); + httpServerManager.start(openDatabases, uri); } else { - remotePreferences.setUseRemoteServer(false); - remoteListenerServerManager.stop(); + remotePreferences.setEnableHttpServer(false); + httpServerManager.stop(); } + trustStoreManager.flush(); } @@ -421,6 +438,10 @@ public StringProperty remotePortProperty() { return remotePortProperty; } + public BooleanProperty enableHttpServerProperty() { + return enableHttpServerProperty; + } + public void openBrowser() { String url = "https://themes.jabref.org"; try { diff --git a/jabgui/src/main/resources/org/jabref/gui/preferences/general/GeneralTab.fxml b/jabgui/src/main/resources/org/jabref/gui/preferences/general/GeneralTab.fxml index 924cd2a7504..9f88b842a99 100644 --- a/jabgui/src/main/resources/org/jabref/gui/preferences/general/GeneralTab.fxml +++ b/jabgui/src/main/resources/org/jabref/gui/preferences/general/GeneralTab.fxml @@ -82,6 +82,9 @@