Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions jabgui/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions jabgui/src/main/java/module-info.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
open module org.jabref {
requires org.jabref.jablib;

requires org.jabref.jabsrv;

// Swing
requires java.desktop;

Expand Down
23 changes: 22 additions & 1 deletion jabgui/src/main/java/org/jabref/gui/JabRefGUI.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -80,6 +81,7 @@ public class JabRefGUI extends Application {
private static JabRefFrame mainFrame;

private static RemoteListenerServerManager remoteListenerServerManager;
private static HttpServerManager httpServerManager;

private Stage mainStage;

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -396,13 +401,18 @@ private boolean upperRightIsInBounds(CoreGuiPreferences coreGuiPreferences) {
// Background tasks
public void startBackgroundTasks() {
RemotePreferences remotePreferences = preferences.getRemotePreferences();

if (remotePreferences.useRemoteServer()) {
remoteListenerServerManager.openAndStart(
new CLIMessageHandler(
mainFrame,
preferences),
remotePreferences.getPort());
}

if (remotePreferences.enableHttpServer()) {
httpServerManager.start(stateManager.getOpenDatabases(), remotePreferences.getHttpServerUri());
}
}

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ public class GeneralTab extends AbstractPreferenceTabView<GeneralTabViewModel> 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;
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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<Integer> fontSizeValueFactory =
new SpinnerValueFactory.IntegerSpinnerValueFactory(9, Integer.MAX_VALUE);

private static final Logger LOGGER = LoggerFactory.getLogger(GeneralTabViewModel.class);

private final ReadOnlyListProperty<Language> languagesListProperty =
new ReadOnlyListWrapper<>(FXCollections.observableArrayList(Language.getSorted()));
private final ObjectProperty<Language> selectedLanguageProperty = new SimpleObjectProperty<>();
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -197,6 +208,8 @@ public void setValues() {

remoteServerProperty.setValue(remotePreferences.useRemoteServer());
remotePortProperty.setValue(String.valueOf(remotePreferences.getPort()));

enableHttpServerProperty.setValue(remotePreferences.enableHttpServer());
}

@Override
Expand Down Expand Up @@ -251,27 +264,31 @@ 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(
new CLIMessageHandler(uiMessageHandler, preferences),
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<BibDatabaseContext> 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();
}

Expand Down Expand Up @@ -421,6 +438,10 @@ public StringProperty remotePortProperty() {
return remotePortProperty;
}

public BooleanProperty enableHttpServerProperty() {
return enableHttpServerProperty;
}

public void openBrowser() {
String url = "https://themes.jabref.org";
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,9 @@
<Button fx:id="remoteHelp" prefWidth="20.0" />
</HBox>

<Label styleClass="sectionHeader" text="%HTTP Server" />
<CheckBox fx:id="enableHttpServer" text="%Enable HTTP Server (e.g., for JabMap)" />

<Label styleClass="sectionHeader" text="%Libraries"/>
<GridPane hgap="10.0" vgap="4.0">
<columnConstraints>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,7 @@ public class JabRefCliPreferences implements CliPreferences {
// Remote
private static final String USE_REMOTE_SERVER = "useRemoteServer";
private static final String REMOTE_SERVER_PORT = "remoteServerPort";
private static final String ENABLE_HTTP_SERVER = "enableHttpServer";

private static final String AI_ENABLED = "aiEnabled";
private static final String AI_AUTO_GENERATE_EMBEDDINGS = "aiAutoGenerateEmbeddings";
Expand Down Expand Up @@ -637,6 +638,7 @@ public JabRefCliPreferences() {

defaults.put(USE_REMOTE_SERVER, Boolean.TRUE);
defaults.put(REMOTE_SERVER_PORT, 6050);
defaults.put(ENABLE_HTTP_SERVER, Boolean.FALSE);

defaults.put(EXTERNAL_JOURNAL_LISTS, "");
defaults.put(USE_AMS_FJOURNAL, true);
Expand Down Expand Up @@ -1247,10 +1249,12 @@ public RemotePreferences getRemotePreferences() {

remotePreferences = new RemotePreferences(
getInt(REMOTE_SERVER_PORT),
getBoolean(USE_REMOTE_SERVER));
getBoolean(USE_REMOTE_SERVER),
getBoolean(ENABLE_HTTP_SERVER));

EasyBind.listen(remotePreferences.portProperty(), (_, _, newValue) -> putInt(REMOTE_SERVER_PORT, newValue));
EasyBind.listen(remotePreferences.useRemoteServerProperty(), (_, _, newValue) -> putBoolean(USE_REMOTE_SERVER, newValue));
EasyBind.listen(remotePreferences.enableHttpServerProperty(), (_, _, newValue) -> putBoolean(ENABLE_HTTP_SERVER, newValue));

return remotePreferences;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,33 @@
package org.jabref.logic.remote;

import java.net.InetAddress;
import java.net.URI;
import java.net.UnknownHostException;

import javafx.beans.property.BooleanProperty;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleIntegerProperty;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Place for handling the preferences for the remote communication
*/
public class RemotePreferences {

private static final Logger LOGGER = LoggerFactory.getLogger(RemotePreferences.class);

private final IntegerProperty port;
private final BooleanProperty useRemoteServer;

public RemotePreferences(int port, boolean useRemoteServer) {
private final BooleanProperty enableHttpServer;

public RemotePreferences(int port, boolean useRemoteServer, boolean enableHttpServer) {
this.port = new SimpleIntegerProperty(port);
this.useRemoteServer = new SimpleBooleanProperty(useRemoteServer);
this.enableHttpServer = new SimpleBooleanProperty(enableHttpServer);
}

public int getPort() {
Expand All @@ -33,6 +42,10 @@ public void setPort(int port) {
this.port.setValue(port);
}

public boolean isDifferentPort(int otherPort) {
return getPort() != otherPort;
}

public boolean useRemoteServer() {
return useRemoteServer.getValue();
}
Expand All @@ -45,14 +58,29 @@ public void setUseRemoteServer(boolean useRemoteServer) {
this.useRemoteServer.setValue(useRemoteServer);
}

public boolean isDifferentPort(int otherPort) {
return getPort() != otherPort;
public boolean enableHttpServer() {
return enableHttpServer.getValue();
}

public BooleanProperty enableHttpServerProperty() {
return enableHttpServer;
}

/**
* Gets the IP address where the remote server is listening.
*/
public void setEnableHttpServer(boolean enableHttpServer) {
this.enableHttpServer.setValue(enableHttpServer);
}

/// Gets the IP address where both the remote server and the http server are listening.
public static InetAddress getIpAddress() throws UnknownHostException {
return InetAddress.getByName("localhost");
}

public URI getHttpServerUri() {
try {
return URI.create("http://" + RemotePreferences.getIpAddress().getHostAddress() + ":23119");
} catch (UnknownHostException e) {
LOGGER.error("Could not create HTTP server URI. Falling back to default.", e);
return URI.create("http://localhost:23119");
}
}
}
Loading