From 8591e09894abfddde84b0fedc515bce4276e4f80 Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Sat, 14 Sep 2019 11:03:57 +0200 Subject: [PATCH 01/27] Try to fix log4j --- build.gradle | 26 ++++++------ src/main/java/module-info.java | 1 + .../logging/ApplicationInsightsAppender.java | 28 ++++++++----- .../org/jabref/gui/logging/GuiAppender.java | 41 ++++++++----------- src/main/resources/log4j2.xml | 6 +-- 5 files changed, 50 insertions(+), 52 deletions(-) diff --git a/build.gradle b/build.gradle index ca879487f64..237a8313bb0 100644 --- a/build.gradle +++ b/build.gradle @@ -12,9 +12,7 @@ buildscript { repositories { mavenLocal() jcenter() - maven { - url 'https://oss.sonatype.org/content/groups/public' - } + maven { url 'https://oss.sonatype.org/content/groups/public' } } } @@ -95,9 +93,8 @@ sourceSets { repositories { mavenLocal() jcenter() - maven { - url 'https://oss.sonatype.org/content/groups/public' - } + maven { url 'https://oss.sonatype.org/content/groups/public' } + maven { url 'https://repository.apache.org/snapshots' } } configurations { @@ -174,12 +171,11 @@ dependencies { compile 'org.jsoup:jsoup:1.12.1' compile 'com.mashape.unirest:unirest-java:1.4.9' - // >1.8.0-beta is required for java 9 compatibility compile 'org.slf4j:slf4j-api:2.0.0-alpha0' - compile 'org.apache.logging.log4j:log4j-slf4j18-impl:2.12.1' - compile 'org.apache.logging.log4j:log4j-jcl:2.12.1' - compile 'org.apache.logging.log4j:log4j-api:2.12.1' - compile 'org.apache.logging.log4j:log4j-core:2.12.1' + compile 'org.apache.logging.log4j:log4j-jcl:3.0.0-SNAPSHOT' + compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j18-impl', version: '3.0.0-SNAPSHOT' + compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '3.0.0-SNAPSHOT' + compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '3.0.0-SNAPSHOT' compile 'de.undercouch:citeproc-java:1.0.1' @@ -203,7 +199,9 @@ dependencies { */ compile group: 'com.microsoft.azure', name: 'applicationinsights-core', version: '2.4.1' - compile group: 'com.microsoft.azure', name: 'applicationinsights-logging-log4j2', version: '2.4.1' + compile (group: 'com.microsoft.azure', name: 'applicationinsights-logging-log4j2', version: '2.4.1') { + exclude module: "log4j-core" + } testCompile 'junit:junit:4.12' testImplementation 'org.junit.jupiter:junit-jupiter:5.5.2' @@ -211,8 +209,8 @@ dependencies { testCompile 'org.junit.platform:junit-platform-launcher:1.5.2' testCompile 'net.bytebuddy:byte-buddy-parent:1.10.1' - testRuntime 'org.apache.logging.log4j:log4j-core:2.12.0' - testRuntime 'org.apache.logging.log4j:log4j-jul:2.12.1' + testRuntime group: 'org.apache.logging.log4j', name: 'log4j-core', version: '3.0.0-SNAPSHOT' + testRuntime group: 'org.apache.logging.log4j', name: 'log4j-jul', version: '3.0.0-SNAPSHOT' testCompile 'org.mockito:mockito-core:3.0.0' //testCompile 'com.github.tomakehurst:wiremock:2.24.1' testCompile ('org.reflections:reflections:0.9.11') { diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 315e4bec469..331914e2d4c 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -41,6 +41,7 @@ requires org.slf4j; requires org.apache.logging.log4j; requires org.apache.logging.log4j.core; + requires org.apache.logging.log4j.plugins; requires applicationinsights.logging.log4j2; // Preferences and XML diff --git a/src/main/java/org/jabref/gui/logging/ApplicationInsightsAppender.java b/src/main/java/org/jabref/gui/logging/ApplicationInsightsAppender.java index 2f82d8f76ea..1c5a744a8b1 100644 --- a/src/main/java/org/jabref/gui/logging/ApplicationInsightsAppender.java +++ b/src/main/java/org/jabref/gui/logging/ApplicationInsightsAppender.java @@ -10,23 +10,21 @@ import org.apache.logging.log4j.core.Filter; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.appender.AbstractAppender; -import org.apache.logging.log4j.core.config.plugins.Plugin; -import org.apache.logging.log4j.core.config.plugins.PluginAttribute; -import org.apache.logging.log4j.core.config.plugins.PluginElement; -import org.apache.logging.log4j.core.config.plugins.PluginFactory; +import org.apache.logging.log4j.core.config.Property; +import org.apache.logging.log4j.plugins.Plugin; +import org.apache.logging.log4j.plugins.PluginBuilderFactory; @Plugin(name = "OurApplicationInsightsAppender", category = "Core", elementType = "appender", printObject = true) @SuppressWarnings("unused") // class is indirectly constructed by log4j public class ApplicationInsightsAppender extends AbstractAppender { - private ApplicationInsightsAppender(String name, Filter filter) { - super(name, filter, null); + private ApplicationInsightsAppender(String name, Filter filter, boolean ignoreExceptions, Property[] properties) { + super(name, filter, null, ignoreExceptions, properties); } - @PluginFactory - public static ApplicationInsightsAppender createAppender(@PluginAttribute("name") String name, - @PluginElement("Filters") Filter filter) { - return new ApplicationInsightsAppender(name, filter); + @PluginBuilderFactory + public static > B newBuilder() { + return new Builder().asBuilder(); } /** @@ -51,4 +49,14 @@ public void append(LogEvent rawEvent) { Globals.getTelemetryClient().ifPresent(client -> client.track(telemetry)); } + + public static class Builder> extends AbstractAppender.Builder + implements org.apache.logging.log4j.plugins.util.Builder { + + @Override + public ApplicationInsightsAppender build() { + return new ApplicationInsightsAppender(this.getName(), this.getFilter(), this.isIgnoreExceptions(), this.getPropertyArray()); + } + } + } diff --git a/src/main/java/org/jabref/gui/logging/GuiAppender.java b/src/main/java/org/jabref/gui/logging/GuiAppender.java index 4d5956b94c5..57762ac25ae 100644 --- a/src/main/java/org/jabref/gui/logging/GuiAppender.java +++ b/src/main/java/org/jabref/gui/logging/GuiAppender.java @@ -1,43 +1,27 @@ package org.jabref.gui.logging; -import java.io.Serializable; - import org.jabref.gui.util.DefaultTaskExecutor; import org.jabref.logic.logging.LogMessages; import org.apache.logging.log4j.core.Filter; -import org.apache.logging.log4j.core.Layout; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.appender.AbstractAppender; -import org.apache.logging.log4j.core.config.plugins.Plugin; -import org.apache.logging.log4j.core.config.plugins.PluginAttribute; -import org.apache.logging.log4j.core.config.plugins.PluginElement; -import org.apache.logging.log4j.core.config.plugins.PluginFactory; +import org.apache.logging.log4j.core.config.Property; import org.apache.logging.log4j.core.impl.MutableLogEvent; -import org.apache.logging.log4j.core.layout.PatternLayout; +import org.apache.logging.log4j.plugins.Plugin; +import org.apache.logging.log4j.plugins.PluginBuilderFactory; @Plugin(name = "GuiAppender", category = "Core", elementType = "appender", printObject = true) @SuppressWarnings("unused") // class is indirectly constructed by log4j public class GuiAppender extends AbstractAppender { - private GuiAppender(String name, Filter filter, Layout layout) { - super(name, filter, layout); + private GuiAppender(String name, Filter filter, boolean ignoreExceptions, Property[] properties) { + super(name, filter, null, ignoreExceptions, properties); } - @PluginFactory - public static GuiAppender createAppender(@PluginAttribute("name") String name, - @PluginElement("Layout") Layout layout, - @PluginElement("Filters") Filter filter) { - - if (name == null) { - LOGGER.error("No name provided for GuiAppender"); - return null; - } - - if (layout == null) { - layout = PatternLayout.createDefaultLayout(); - } - return new GuiAppender(name, filter, layout); + @PluginBuilderFactory + public static > B newBuilder() { + return new ApplicationInsightsAppender.Builder().asBuilder(); } /** @@ -50,4 +34,13 @@ public void append(LogEvent event) { copy.initFrom(event); DefaultTaskExecutor.runInJavaFXThread(() -> LogMessages.getInstance().add(copy)); } + + public static class Builder> extends AbstractAppender.Builder + implements org.apache.logging.log4j.plugins.util.Builder { + + @Override + public GuiAppender build() { + return new GuiAppender(this.getName(), this.getFilter(), this.isIgnoreExceptions(), this.getPropertyArray()); + } + } } diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml index 872f79582cf..f9e6c0bf60b 100644 --- a/src/main/resources/log4j2.xml +++ b/src/main/resources/log4j2.xml @@ -1,12 +1,10 @@ - + - - - + From e4dfbbbad2c24929cd8f1f97aff5edde5cd806ad Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Sun, 15 Sep 2019 21:31:55 +0200 Subject: [PATCH 02/27] Try to add annotationProcessor statment --- build.gradle | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 237a8313bb0..a158be67255 100644 --- a/build.gradle +++ b/build.gradle @@ -174,8 +174,9 @@ dependencies { compile 'org.slf4j:slf4j-api:2.0.0-alpha0' compile 'org.apache.logging.log4j:log4j-jcl:3.0.0-SNAPSHOT' compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j18-impl', version: '3.0.0-SNAPSHOT' - compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '3.0.0-SNAPSHOT' - compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '3.0.0-SNAPSHOT' + implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '3.0.0-SNAPSHOT' + annotationProcessor group: 'org.apache.logging.log4j', name: 'log4j-core', version: '3.0.0-SNAPSHOT' + compileOnly group: 'org.apache.logging.log4j', name: 'log4j-core', version: '3.0.0-SNAPSHOT' compile 'de.undercouch:citeproc-java:1.0.1' From ac712efbc653e151ad651e1c3f707ee0c4830f67 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2019 07:13:39 +0000 Subject: [PATCH 03/27] Bump com.github.ben-manes.versions from 0.24.0 to 0.25.0 Bumps com.github.ben-manes.versions from 0.24.0 to 0.25.0. Signed-off-by: dependabot-preview[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ca879487f64..4be83b2514b 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ plugins { id "com.simonharrer.modernizer" version '1.8.0-1' id 'me.champeau.gradle.jmh' version '0.4.8' //id 'net.ltgt.errorprone' version '0.8.1' - id 'com.github.ben-manes.versions' version '0.24.0' + id 'com.github.ben-manes.versions' version '0.25.0' id 'org.javamodularity.moduleplugin' version '1.5.0' id 'org.openjfx.javafxplugin' version '0.0.8' id 'org.beryx.jlink' version '2.15.1' From d6c9cb36d01545c01509177485b09e40a761b1b9 Mon Sep 17 00:00:00 2001 From: Galileo Sartor Date: Wed, 11 Sep 2019 16:01:08 +0200 Subject: [PATCH 04/27] Remove unnecessary stage-packages Update custom plugin --- snap/plugins/x_gradle.py | 40 ++++++++++++++++++++++++++-------------- snap/snapcraft.yaml | 5 ++--- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/snap/plugins/x_gradle.py b/snap/plugins/x_gradle.py index 899d6567712..bb1850d472a 100644 --- a/snap/plugins/x_gradle.py +++ b/snap/plugins/x_gradle.py @@ -28,7 +28,12 @@ - gradle-options: (list of strings) Flags to pass to the build using the gradle semantics for parameters. - The 'jar' option is always passed in as the last parameter. + The 'jar' option is always passed in as the last parameter, if not disabled. + + - gradle-build-jar: + (bool; default: True) + Use this flag to disable building a jar, for example if using the java11 + modular system packages. - gradle-output-dir: (string; default: 'build/libs') @@ -103,6 +108,7 @@ def schema(cls): "items": {"type": "string"}, "default": [], } + schema["properties"]["gradle-build-jar"] = {"type": "boolean", "default": True} schema["properties"]["gradle-output-dir"] = { "type": "string", "default": "build/libs", @@ -131,7 +137,11 @@ def get_pull_properties(cls): def get_build_properties(cls): # Inform Snapcraft of the properties associated with building. If these # change in the YAML Snapcraft will consider the build step dirty. - return super().get_build_properties() + ["gradle-options", "gradle-output-dir"] + return super().get_build_properties() + [ + "gradle-options", + "gradle-build-jar", + "gradle-output-dir", + ] @property def _gradle_tar(self): @@ -206,22 +216,24 @@ def build(self): self.run( gradle_cmd + self._get_proxy_options() - + self.options.gradle_options, + + self.options.gradle_options + + (["jar"] if self.options.gradle_build_jar else []), rootdir=self.builddir, ) src = os.path.join(self.builddir, self.options.gradle_output_dir) - basedir = "jabref" - # jarfiles = glob(os.path.join(src, "*.jar")) - # warfiles = glob(os.path.join(src, "*.war")) - - # if len(jarfiles) > 0: - # basedir = "jar" - # elif len(warfiles) > 0: - # basedir = "war" - # jarfiles = warfiles - # else: - # raise RuntimeError("Could not find any built jar files for part") + basedir = "java" + if self.options.gradle_build_jar: + jarfiles = glob(os.path.join(src, "*.jar")) + warfiles = glob(os.path.join(src, "*.war")) + + if len(jarfiles) > 0: + basedir = "jar" + elif len(warfiles) > 0: + basedir = "war" + jarfiles = warfiles + else: + raise RuntimeError("Could not find any built jar files for part") file_utils.link_or_copy_tree( src, diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index b62d2d571e3..40bd861dcd8 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -14,7 +14,7 @@ architectures: apps: jabref: - command: desktop-launch $SNAP/jabref/bin/JabRefMain + command: desktop-launch $SNAP/java/bin/JabRefMain environment: _JAVA_OPTIONS: "-Duser.home=$SNAP_USER_DATA" XDG_DATA_DIRS: $SNAP/share:$XDG_DATA_DIRS @@ -52,11 +52,10 @@ parts: source: . source-type: git stage-packages: - - openjdk-11-jre - - openjfx - x11-utils gradle-options: [jlink, -xtest] gradle-output-dir: 'build/image' + gradle-build-jar: false desktop-gnome-platform: source: https://github.com/ubuntu/snapcraft-desktop-helpers.git source-subdir: gtk From 3f62e2cf3ec5210d93024685c9779f8fa1de2a7a Mon Sep 17 00:00:00 2001 From: Galileo Sartor Date: Mon, 16 Sep 2019 11:28:14 +0200 Subject: [PATCH 05/27] Remove duplicate java libraries --- snap/plugins/x_gradle.py | 5 +++- snap/snapcraft.yaml | 50 +++++++++++++--------------------------- 2 files changed, 20 insertions(+), 35 deletions(-) diff --git a/snap/plugins/x_gradle.py b/snap/plugins/x_gradle.py index bb1850d472a..24c47ccd10f 100644 --- a/snap/plugins/x_gradle.py +++ b/snap/plugins/x_gradle.py @@ -177,7 +177,8 @@ def _setup_base_tools(self, base): version=version, base=base, valid_versions=valid_versions ) - self.stage_packages.append("openjdk-{}-jre-headless".format(version)) + if self.options.gradle_build_jar: + self.stage_packages.append("openjdk-{}-jre-headless".format(version)) self.build_packages.append("openjdk-{}-jdk-headless".format(version)) self.build_packages.append("ca-certificates-java") self._java_version = version @@ -250,6 +251,8 @@ def _create_symlinks(self): raise errors.PluginBaseError( part_name=self.name, base=self.project.info.get_build_base() ) + if not self.options.gradle_build_jar: + return os.makedirs(os.path.join(self.installdir, "bin"), exist_ok=True) java_bin = glob( diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 40bd861dcd8..7b679bb9ed2 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -1,7 +1,7 @@ name: jabref -version: "git" -version-script: cat build.gradle | grep "^version =" | cut -d'"' -f2 -#icon: snap/gui/jabref.png +adopt-info: jabref +icon: snap/gui/jabref.png +license: MIT summary: Bibliography manager description: JabRef is an open source bibliography reference manager. The native file format used by JabRef is BibTeX, the standard LaTeX bibliography format. @@ -14,11 +14,10 @@ architectures: apps: jabref: - command: desktop-launch $SNAP/java/bin/JabRefMain + command: java/bin/JabRefMain + extensions: [gnome-3-28] environment: _JAVA_OPTIONS: "-Duser.home=$SNAP_USER_DATA" - XDG_DATA_DIRS: $SNAP/share:$XDG_DATA_DIRS - GSETTINGS_SCHEMA_DIR: $SNAP/share/glib-2.0/schemas plugs: - desktop - desktop-legacy @@ -28,23 +27,6 @@ apps: - opengl - network-bind - removable-media - - gnome-3-28-1804 - -plugs: - gnome-3-28-1804: - interface: content - target: gnome-platform - default-provider: gnome-3-28-1804:gnome-3-28-1804 - content: gnome-3-28-1804 - gtk-3-themes: - interface: content - target: $SNAP/data-dir/themes - default-provider: gtk-common-themes:gtk-3-themes - icon-themes: - interface: content - target: $SNAP/data-dir/icons - default-provider: gtk-common-themes:icon-themes - parts: jabref: @@ -53,17 +35,17 @@ parts: source-type: git stage-packages: - x11-utils + override-pull: | + snapcraftctl pull + snapcraftctl set-version "$(cat build.gradle | grep "^version =" | cut -d'"' -f2)" gradle-options: [jlink, -xtest] gradle-output-dir: 'build/image' gradle-build-jar: false - desktop-gnome-platform: - source: https://github.com/ubuntu/snapcraft-desktop-helpers.git - source-subdir: gtk - plugin: make - make-parameters: ["FLAVOR=gtk3"] - build-packages: - - build-essential - - libgtk-3-dev - override-build: | - snapcraftctl build - mkdir -pv $SNAPCRAFT_PART_INSTALL/gnome-platform + cleanup: + after: [jabref] + plugin: nil + build-snaps: [ gnome-3-28-1804 ] + override-prime: | + set -eux + cd /snap/gnome-3-28-1804/current + find . -type f,l -exec rm -f $SNAPCRAFT_PRIME/{} \; \ No newline at end of file From d7f05a4e10ac5793ef7bcb0146a4c4715c300b9e Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Mon, 16 Sep 2019 15:46:01 +0200 Subject: [PATCH 06/27] Fix logger --- build.gradle | 5 +- src/main/java/module-info.java | 2 + .../logging/ApplicationInsightsAppender.java | 1 - .../logging/ApplicationInsightsLogEvent.java | 130 ++++++++++++++++++ .../org/jabref/gui/logging/GuiAppender.java | 4 +- 5 files changed, 135 insertions(+), 7 deletions(-) create mode 100644 src/main/java/org/jabref/gui/logging/ApplicationInsightsLogEvent.java diff --git a/build.gradle b/build.gradle index a158be67255..be9a31014f4 100644 --- a/build.gradle +++ b/build.gradle @@ -175,8 +175,8 @@ dependencies { compile 'org.apache.logging.log4j:log4j-jcl:3.0.0-SNAPSHOT' compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j18-impl', version: '3.0.0-SNAPSHOT' implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '3.0.0-SNAPSHOT' + compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '3.0.0-SNAPSHOT' annotationProcessor group: 'org.apache.logging.log4j', name: 'log4j-core', version: '3.0.0-SNAPSHOT' - compileOnly group: 'org.apache.logging.log4j', name: 'log4j-core', version: '3.0.0-SNAPSHOT' compile 'de.undercouch:citeproc-java:1.0.1' @@ -371,9 +371,6 @@ task generateModsSource(type: XjcTask) { tasks.withType(JavaCompile) { // use UTF-8 options.encoding = 'UTF-8' - - // ignore annotation processor from log4j2 - options.compilerArgs += '-proc:none' } compileJava { diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 331914e2d4c..cda194f58c4 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -43,6 +43,8 @@ requires org.apache.logging.log4j.core; requires org.apache.logging.log4j.plugins; requires applicationinsights.logging.log4j2; + provides org.apache.logging.log4j.plugins.processor.PluginService + with org.jabref.gui.logging.plugins.Log4jPlugins; // Preferences and XML requires java.prefs; diff --git a/src/main/java/org/jabref/gui/logging/ApplicationInsightsAppender.java b/src/main/java/org/jabref/gui/logging/ApplicationInsightsAppender.java index 1c5a744a8b1..557c75a309b 100644 --- a/src/main/java/org/jabref/gui/logging/ApplicationInsightsAppender.java +++ b/src/main/java/org/jabref/gui/logging/ApplicationInsightsAppender.java @@ -3,7 +3,6 @@ import org.jabref.Globals; import org.jabref.logic.logging.LogMessages; -import com.microsoft.applicationinsights.log4j.v2.internal.ApplicationInsightsLogEvent; import com.microsoft.applicationinsights.telemetry.ExceptionTelemetry; import com.microsoft.applicationinsights.telemetry.Telemetry; import com.microsoft.applicationinsights.telemetry.TraceTelemetry; diff --git a/src/main/java/org/jabref/gui/logging/ApplicationInsightsLogEvent.java b/src/main/java/org/jabref/gui/logging/ApplicationInsightsLogEvent.java new file mode 100644 index 00000000000..7bc27dbabae --- /dev/null +++ b/src/main/java/org/jabref/gui/logging/ApplicationInsightsLogEvent.java @@ -0,0 +1,130 @@ +package org.jabref.gui.logging; + +/* + * ApplicationInsights-Java + * Copyright (c) Microsoft Corporation + * All rights reserved. + * + * MIT License + * Permission is hereby granted, free of charge, to any person obtaining a copy of this + * software and associated documentation files (the ""Software""), to deal in the Software + * without restriction, including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, and to permit + * persons to whom the Software is furnished to do so, subject to the following conditions: + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. + * THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE + * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +import java.util.HashMap; +import java.util.Map; + +import com.microsoft.applicationinsights.internal.common.ApplicationInsightsEvent; +import com.microsoft.applicationinsights.internal.logger.InternalLogger; +import com.microsoft.applicationinsights.telemetry.SeverityLevel; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.spi.StandardLevel; + +// TODO: Remove this copy as soon as the one included in AI is compatible with log4j 3 +public final class ApplicationInsightsLogEvent extends ApplicationInsightsEvent { + + private LogEvent logEvent; + + public ApplicationInsightsLogEvent(LogEvent logEvent) { + this.logEvent = logEvent; + } + + @Override + public String getMessage() { + String message = this.logEvent.getMessage() != null ? + this.logEvent.getMessage().getFormattedMessage() : + "Log4j Trace"; + + return message; + } + + @Override + public boolean isException() { + return this.logEvent.getThrown() != null; + } + + @Override + public Exception getException() { + Exception exception = null; + + if (isException()) { + Throwable throwable = this.logEvent.getThrown(); + exception = throwable instanceof Exception ? (Exception) throwable : new Exception(throwable); + } + + return exception; + } + + @Override + public Map getCustomParameters() { + + Map metaData = new HashMap(); + + metaData.put("SourceType", "Log4j"); + + addLogEventProperty("LoggerName", logEvent.getLoggerName(), metaData); + addLogEventProperty("LoggingLevel", logEvent.getLevel() != null ? logEvent.getLevel().name() : null, metaData); + addLogEventProperty("ThreadName", logEvent.getThreadName(), metaData); + addLogEventProperty("TimeStamp", getFormattedDate(logEvent.getTimeMillis()), metaData); + + if (isException()) { + addLogEventProperty("Logger Message", getMessage(), metaData); + } + + if (logEvent.isIncludeLocation()) { + StackTraceElement stackTraceElement = logEvent.getSource(); + + addLogEventProperty("ClassName", stackTraceElement.getClassName(), metaData); + addLogEventProperty("FileName", stackTraceElement.getFileName(), metaData); + addLogEventProperty("MethodName", stackTraceElement.getMethodName(), metaData); + addLogEventProperty("LineNumber", String.valueOf(stackTraceElement.getLineNumber()), metaData); + } + + for (Map.Entry entry : logEvent.getContextData().toMap().entrySet()) { + addLogEventProperty(entry.getKey(), entry.getValue(), metaData); + } + + // TODO: Username, domain and identity should be included as in .NET version. + // TODO: Should check, seems that it is not included in Log4j2. + + return metaData; + } + + @Override + public SeverityLevel getNormalizedSeverityLevel() { + int log4jLevelAsInt = logEvent.getLevel().intLevel(); + + switch (StandardLevel.getStandardLevel(log4jLevelAsInt)) { + case FATAL: + return SeverityLevel.Critical; + + case ERROR: + return SeverityLevel.Error; + + case WARN: + return SeverityLevel.Warning; + + case INFO: + return SeverityLevel.Information; + + case TRACE: + case DEBUG: + case ALL: + return SeverityLevel.Verbose; + + default: + InternalLogger.INSTANCE.error("Unknown Log4j v2 option, %d, using TRACE level as default", log4jLevelAsInt); + return SeverityLevel.Verbose; + } + } +} diff --git a/src/main/java/org/jabref/gui/logging/GuiAppender.java b/src/main/java/org/jabref/gui/logging/GuiAppender.java index 57762ac25ae..0596c857739 100644 --- a/src/main/java/org/jabref/gui/logging/GuiAppender.java +++ b/src/main/java/org/jabref/gui/logging/GuiAppender.java @@ -20,8 +20,8 @@ private GuiAppender(String name, Filter filter, boolean ignoreExceptions, Proper } @PluginBuilderFactory - public static > B newBuilder() { - return new ApplicationInsightsAppender.Builder().asBuilder(); + public static > B newBuilder() { + return new GuiAppender.Builder().asBuilder(); } /** From 3a578912b1a92ea2df6d7b85950f7bc2aca381de Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Mon, 16 Sep 2019 18:58:42 +0200 Subject: [PATCH 07/27] Pin snapshot versions --- build.gradle | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index be9a31014f4..f44f049d186 100644 --- a/build.gradle +++ b/build.gradle @@ -172,11 +172,11 @@ dependencies { compile 'com.mashape.unirest:unirest-java:1.4.9' compile 'org.slf4j:slf4j-api:2.0.0-alpha0' - compile 'org.apache.logging.log4j:log4j-jcl:3.0.0-SNAPSHOT' - compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j18-impl', version: '3.0.0-SNAPSHOT' - implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '3.0.0-SNAPSHOT' - compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '3.0.0-SNAPSHOT' - annotationProcessor group: 'org.apache.logging.log4j', name: 'log4j-core', version: '3.0.0-SNAPSHOT' + compile group: 'org.apache.logging.log4j', name: 'log4j-jcl', version: '3.0.0-20190915.182410-364' + compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j18-impl', version: '3.0.0-20190915.182922-250' + implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '3.0.0-20190915.182113-372' + compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '3.0.0-20190915.182215-368' + annotationProcessor group: 'org.apache.logging.log4j', name: 'log4j-core', version: '3.0.0-20190915.182215-368' compile 'de.undercouch:citeproc-java:1.0.1' @@ -210,8 +210,8 @@ dependencies { testCompile 'org.junit.platform:junit-platform-launcher:1.5.2' testCompile 'net.bytebuddy:byte-buddy-parent:1.10.1' - testRuntime group: 'org.apache.logging.log4j', name: 'log4j-core', version: '3.0.0-SNAPSHOT' - testRuntime group: 'org.apache.logging.log4j', name: 'log4j-jul', version: '3.0.0-SNAPSHOT' + testRuntime group: 'org.apache.logging.log4j', name: 'log4j-core', version: '3.0.0-20190915.182215-368' + testRuntime group: 'org.apache.logging.log4j', name: 'log4j-jul', version: '3.0.0-20190915.182552-364' testCompile 'org.mockito:mockito-core:3.0.0' //testCompile 'com.github.tomakehurst:wiremock:2.24.1' testCompile ('org.reflections:reflections:0.9.11') { From 9a60d7451486854e2938e6620e748b8c7bcc4d23 Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Mon, 16 Sep 2019 19:54:30 +0200 Subject: [PATCH 08/27] Remove module exports for JabRef --- src/main/java/module-info.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 315e4bec469..4cb1a4e229e 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -1,17 +1,4 @@ open module org.jabref { - exports org.jabref; - - exports org.jabref.gui; - exports org.jabref.gui.logging; - exports org.jabref.gui.maintable; - exports org.jabref.gui.specialfields; - - exports org.jabref.model.database; - - exports org.jabref.logic; - exports org.jabref.logic.citationstyle; - exports org.jabref.logic.search; - // Swing requires java.desktop; From 1bec5efd35491af6bc413eccf7593ba0ed4679f3 Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Mon, 16 Sep 2019 21:22:18 +0200 Subject: [PATCH 09/27] Use binding to update global state manager (#5325) --- CHANGELOG.md | 8 +- build.gradle | 1 + src/main/java/org/jabref/gui/JabRefFrame.java | 123 +++++++++--------- .../org/jabref/gui/groups/GroupTreeView.java | 27 ++-- .../jabref/gui/groups/GroupTreeViewModel.java | 4 +- 5 files changed, 86 insertions(+), 77 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c96ac04290c..df11540ff6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,8 +17,12 @@ We refer to [GitHub issues](https://github.com/JabRef/jabref/issues) by using `# ### Fixed -- Inherit fields from cross-referenced entries as specified by biblatex [#5045](https://github.com/JabRef/jabref/issues/5045) -- We fixed an issue where it was no longer possible to connect to LibreOffice [#5261](https://github.com/JabRef/jabref/issues/5261) +- Inherit fields from cross-referenced entries as specified by biblatex. [#5045](https://github.com/JabRef/jabref/issues/5045) +- We fixed an issue where it was no longer possible to connect to LibreOffice. [#5261](https://github.com/JabRef/jabref/issues/5261) +- The "All entries group" is no longer shown when no library is open. +- The group panel is now properly updated when switching between libraries (or when closing/opening one). [#3142](https://github.com/JabRef/jabref/issues/3142) +- We fixed an error where the number of matched entries shown in the group pane was not updated correctly. [#4441](https://github.com/JabRef/jabref/issues/4441) +- We fixed an error mentioning "javafx.controls/com.sun.javafx.scene.control" that was thrown when interacting with the toolbar. ### Removed diff --git a/build.gradle b/build.gradle index 9eafaae3208..36124837e1d 100644 --- a/build.gradle +++ b/build.gradle @@ -392,6 +392,7 @@ run { '--add-exports', 'org.controlsfx.controls/impl.org.controlsfx.skin=org.jabref', '--add-opens', 'javafx.controls/javafx.scene.control=org.jabref', '--add-opens', 'org.controlsfx.controls/org.controlsfx.control.textfield=org.jabref', + '--add-opens', 'javafx.controls/com.sun.javafx.scene.control=org.jabref', // Not sure why we need to restate the controlfx exports // Taken from here: https://github.com/controlsfx/controlsfx/blob/9.0.0/build.gradle#L1 "--add-exports", "javafx.graphics/com.sun.javafx.scene=org.controlsfx.controls", diff --git a/src/main/java/org/jabref/gui/JabRefFrame.java b/src/main/java/org/jabref/gui/JabRefFrame.java index 371989f91bf..ae00ada1df4 100644 --- a/src/main/java/org/jabref/gui/JabRefFrame.java +++ b/src/main/java/org/jabref/gui/JabRefFrame.java @@ -163,65 +163,8 @@ public JabRefFrame(Stage mainStage) { this.undoManager = Globals.undoManager; } - public void init() { - sidePaneManager = new SidePaneManager(Globals.prefs, this); - sidePane = sidePaneManager.getPane(); - - tabbedPane = new TabPane(); - tabbedPane.setTabDragPolicy(TabPane.TabDragPolicy.REORDER); - - initLayout(); - - initKeyBindings(); - - initDragAndDrop(); - - //setBounds(GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds()); - //WindowLocation pw = new WindowLocation(this, JabRefPreferences.POS_X, JabRefPreferences.POS_Y, JabRefPreferences.SIZE_X, - // JabRefPreferences.SIZE_Y); - //pw.displayWindowAtStoredLocation(); - - /* - * The following state listener makes sure focus is registered with the - * correct database when the user switches tabs. Without this, - * cut/paste/copy operations would some times occur in the wrong tab. - */ - EasyBind.subscribe(tabbedPane.getSelectionModel().selectedItemProperty(), e -> { - if (e == null) { - stateManager.activeDatabaseProperty().setValue(Optional.empty()); - return; - } - - BasePanel currentBasePanel = getCurrentBasePanel(); - if (currentBasePanel == null) { - return; - } - - // Poor-mans binding to global state - stateManager.activeDatabaseProperty().setValue(Optional.of(currentBasePanel.getBibDatabaseContext())); - stateManager.setSelectedEntries(currentBasePanel.getSelectedEntries()); - - // Update search query - String content = ""; - Optional currentSearchQuery = currentBasePanel.getCurrentSearchQuery(); - if (currentSearchQuery.isPresent()) { - content = currentSearchQuery.get().getQuery(); - } - globalSearchBar.setSearchTerm(content); - - // groupSidePane.getToggleCommand().setSelected(sidePaneManager.isComponentVisible(GroupSidePane.class)); - //previewToggle.setSelected(Globals.prefs.getPreviewPreferences().isPreviewPanelEnabled()); - //generalFetcher.getToggleCommand().setSelected(sidePaneManager.isComponentVisible(WebSearchPane.class)); - //openOfficePanel.getToggleCommand().setSelected(sidePaneManager.isComponentVisible(OpenOfficeSidePanel.class)); - - setWindowTitle(); - // Update search autocompleter with information for the correct database: - currentBasePanel.updateSearchManager(); - - currentBasePanel.getUndoManager().postUndoRedoEvent(); - currentBasePanel.getMainTable().requestFocus(); - }); - initShowTrackingNotification(); + private static BasePanel getBasePanel(Tab tab) { + return (BasePanel) tab.getContent(); } public void initDragAndDrop() { @@ -612,6 +555,66 @@ public void showBasePanel(BasePanel bp) { tabbedPane.getSelectionModel().select(getTab(bp)); } + public void init() { + sidePaneManager = new SidePaneManager(Globals.prefs, this); + sidePane = sidePaneManager.getPane(); + + tabbedPane = new TabPane(); + tabbedPane.setTabDragPolicy(TabPane.TabDragPolicy.REORDER); + + initLayout(); + + initKeyBindings(); + + initDragAndDrop(); + + //setBounds(GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds()); + //WindowLocation pw = new WindowLocation(this, JabRefPreferences.POS_X, JabRefPreferences.POS_Y, JabRefPreferences.SIZE_X, + // JabRefPreferences.SIZE_Y); + //pw.displayWindowAtStoredLocation(); + + // Bind global state + stateManager.activeDatabaseProperty().bind( + EasyBind.map(tabbedPane.getSelectionModel().selectedItemProperty(), + tab -> Optional.ofNullable(tab).map(JabRefFrame::getBasePanel).map(BasePanel::getBibDatabaseContext))); + /* + * The following state listener makes sure focus is registered with the + * correct database when the user switches tabs. Without this, + * cut/paste/copy operations would some times occur in the wrong tab. + */ + EasyBind.subscribe(tabbedPane.getSelectionModel().selectedItemProperty(), tab -> { + if (tab == null) { + return; + } + + BasePanel newBasePanel = getBasePanel(tab); + + // Poor-mans binding to global state + stateManager.setSelectedEntries(newBasePanel.getSelectedEntries()); + + // Update search query + String content = ""; + Optional currentSearchQuery = newBasePanel.getCurrentSearchQuery(); + if (currentSearchQuery.isPresent()) { + content = currentSearchQuery.get().getQuery(); + } + globalSearchBar.setSearchTerm(content); + + // groupSidePane.getToggleCommand().setSelected(sidePaneManager.isComponentVisible(GroupSidePane.class)); + //previewToggle.setSelected(Globals.prefs.getPreviewPreferences().isPreviewPanelEnabled()); + //generalFetcher.getToggleCommand().setSelected(sidePaneManager.isComponentVisible(WebSearchPane.class)); + //openOfficePanel.getToggleCommand().setSelected(sidePaneManager.isComponentVisible(OpenOfficeSidePanel.class)); + + setWindowTitle(); + // Update search autocompleter with information for the correct database: + newBasePanel.updateSearchManager(); + + newBasePanel.getUndoManager().postUndoRedoEvent(); + newBasePanel.getMainTable().requestFocus(); + }); + initShowTrackingNotification(); + } + /** * Returns the currently viewed BasePanel. */ @@ -619,7 +622,7 @@ public BasePanel getCurrentBasePanel() { if ((tabbedPane == null) || (tabbedPane.getSelectionModel().getSelectedItem() == null)) { return null; } - return (BasePanel) tabbedPane.getSelectionModel().getSelectedItem().getContent(); + return getBasePanel(tabbedPane.getSelectionModel().getSelectedItem()); } /** diff --git a/src/main/java/org/jabref/gui/groups/GroupTreeView.java b/src/main/java/org/jabref/gui/groups/GroupTreeView.java index 62a2a1299dc..c9686d9ab4f 100644 --- a/src/main/java/org/jabref/gui/groups/GroupTreeView.java +++ b/src/main/java/org/jabref/gui/groups/GroupTreeView.java @@ -6,15 +6,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; -import java.util.function.Consumer; import java.util.stream.Collectors; import javax.inject.Inject; import javafx.beans.property.ObjectProperty; -import javafx.collections.ObservableList; import javafx.css.PseudoClass; -import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.ContextMenu; import javafx.scene.control.Control; @@ -84,13 +81,10 @@ public void initialize() { dragExpansionHandler = new DragExpansionHandler(); // Set-up bindings - Consumer> updateSelectedGroups = - (newSelectedGroups) -> newSelectedGroups.forEach(this::selectNode); - BindingsHelper.bindContentBidirectional( groupTree.getSelectionModel().getSelectedItems(), viewModel.selectedGroupsProperty(), - updateSelectedGroups, + (newSelectedGroups) -> newSelectedGroups.forEach(this::selectNode), this::updateSelection ); @@ -104,11 +98,17 @@ public void initialize() { groupTree.rootProperty().bind( EasyBind.map(viewModel.rootGroupProperty(), - group -> new RecursiveTreeItem<>( - group, - GroupNodeViewModel::getChildren, - GroupNodeViewModel::expandedProperty, - viewModel.filterPredicateProperty()))); + group -> { + if (group == null) { + return null; + } else { + return new RecursiveTreeItem<>( + group, + GroupNodeViewModel::getChildren, + GroupNodeViewModel::expandedProperty, + viewModel.filterPredicateProperty()); + } + })); // Icon and group name mainColumn.setCellValueFactory(cellData -> cellData.getValue().valueProperty()); @@ -343,7 +343,8 @@ private ContextMenu createContextMenuForGroup(GroupNodeViewModel group) { return menu; } - public void addNewGroup(ActionEvent actionEvent) { + @FXML + private void addNewGroup() { viewModel.addNewGroupToRoot(); } diff --git a/src/main/java/org/jabref/gui/groups/GroupTreeViewModel.java b/src/main/java/org/jabref/gui/groups/GroupTreeViewModel.java index bccddf297e5..feb3a90e23a 100644 --- a/src/main/java/org/jabref/gui/groups/GroupTreeViewModel.java +++ b/src/main/java/org/jabref/gui/groups/GroupTreeViewModel.java @@ -126,12 +126,12 @@ private void onActiveDatabaseChanged(Optional newDatabase) { .orElse(GroupNodeViewModel.getAllEntriesGroup(newDatabase.get(), stateManager, taskExecutor, localDragboard)); rootGroup.setValue(newRoot); - this.selectedGroups.setAll( + selectedGroups.setAll( stateManager.getSelectedGroup(newDatabase.get()).stream() .map(selectedGroup -> new GroupNodeViewModel(newDatabase.get(), stateManager, taskExecutor, selectedGroup, localDragboard)) .collect(Collectors.toList())); } else { - rootGroup.setValue(GroupNodeViewModel.getAllEntriesGroup(new BibDatabaseContext(), stateManager, taskExecutor, localDragboard)); + rootGroup.setValue(null); } currentDatabase = newDatabase; From a01ea2001f8e03db0e37d97df75683ad3b47ce45 Mon Sep 17 00:00:00 2001 From: Carl Christian Snethlage <50491877+calixtus@users.noreply.github.com> Date: Tue, 17 Sep 2019 12:36:44 +0200 Subject: [PATCH 10/27] Conversion of preferences/exportsorting, import, maintable and entryeditor to mvvm (#5315) * Initial, Fix double list, setValues to Background, Templates and ExportSort * Fixes in ExportSorting * Fixes, Cleanups, EntryEditorTab, TableTab * Added ImportTab * Fixes wrong encoding * Reverse encoding fix * Checkstyle * Checkstyle * Fixed l10n, fixes checkstyle-config * Fixes after review * Cleanup missed superflous viewModel-casts and lambda-bodies * Don't set values using background task --- config/checkstyle/checkstyle.xml | 2 +- config/checkstyle/suppressions.xml | 2 +- src/main/java/module-info.java | 3 + .../jabref/gui/SaveOrderConfigDisplay.fxml | 76 +++-- .../gui/SaveOrderConfigDisplayView.java | 47 ++- .../gui/SaveOrderConfigDisplayViewModel.java | 4 +- .../java/org/jabref/gui/icon/IconTheme.java | 4 + .../LibraryPropertiesDialogView.java | 10 +- .../AbstractPreferenceTabView.java | 4 +- .../jabref/gui/preferences/AdvancedTab.fxml | 92 +++--- .../gui/preferences/AdvancedTabView.java | 37 ++- .../gui/preferences/AdvancedTabViewModel.java | 2 - .../gui/preferences/EntryEditorPrefsTab.java | 292 ------------------ .../gui/preferences/EntryEditorTab.fxml | 67 ++++ .../gui/preferences/EntryEditorTabView.java | 65 ++++ .../preferences/EntryEditorTabViewModel.java | 178 +++++++++++ .../preferences/ExportSortingPrefsTab.java | 57 ---- .../gui/preferences/ExportSortingTabView.java | 52 ++++ .../jabref/gui/preferences/ExternalTab.fxml | 188 ++++++----- .../gui/preferences/ExternalTabView.java | 55 ++-- .../gui/preferences/ExternalTabViewModel.java | 2 - .../org/jabref/gui/preferences/FileTab.fxml | 105 +++---- .../jabref/gui/preferences/FileTabView.java | 51 ++- .../gui/preferences/FileTabViewModel.java | 1 - .../jabref/gui/preferences/GeneralTab.fxml | 126 ++++---- .../gui/preferences/GeneralTabView.java | 49 ++- .../gui/preferences/GeneralTabViewModel.java | 1 - .../org/jabref/gui/preferences/GroupsTab.fxml | 50 +-- .../jabref/gui/preferences/GroupsTabView.java | 19 +- .../gui/preferences/GroupsTabViewModel.java | 1 - .../gui/preferences/ImportSettingsTab.java | 89 ------ .../org/jabref/gui/preferences/ImportTab.fxml | 34 ++ .../jabref/gui/preferences/ImportTabView.java | 35 +++ .../gui/preferences/ImportTabViewModel.java | 58 ++++ .../gui/preferences/NameFormatterTabView.java | 32 +- .../NameFormatterTabViewModel.java | 1 - .../gui/preferences/PreferencesDialog.fxml | 66 ++-- .../preferences/PreferencesDialogView.java | 31 +- .../PreferencesDialogViewModel.java | 65 ++-- .../jabref/gui/preferences/PreviewTab.fxml | 121 ++++---- .../gui/preferences/PreviewTabView.java | 90 +++--- .../gui/preferences/PreviewTabViewModel.java | 2 - .../preferences/ShowPreferencesAction.java | 2 +- .../gui/preferences/TableColumnsTab.fxml | 6 +- .../gui/preferences/TableColumnsTabView.java | 60 ++-- .../preferences/TableColumnsTabViewModel.java | 16 +- .../jabref/gui/preferences/TablePrefsTab.java | 140 --------- .../org/jabref/gui/preferences/TableTab.fxml | 29 ++ .../jabref/gui/preferences/TableTabView.java | 46 +++ .../gui/preferences/TableTabViewModel.java | 102 ++++++ .../gui/preferences/XmpPrivacyTabView.java | 48 +-- .../preferences/XmpPrivacyTabViewModel.java | 2 - .../java/org/jabref/gui/util/FieldsUtil.java | 20 ++ .../jabref/preferences/JabRefPreferences.java | 4 +- src/main/resources/l10n/JabRef_en.properties | 25 +- 55 files changed, 1403 insertions(+), 1363 deletions(-) delete mode 100644 src/main/java/org/jabref/gui/preferences/EntryEditorPrefsTab.java create mode 100644 src/main/java/org/jabref/gui/preferences/EntryEditorTab.fxml create mode 100644 src/main/java/org/jabref/gui/preferences/EntryEditorTabView.java create mode 100644 src/main/java/org/jabref/gui/preferences/EntryEditorTabViewModel.java delete mode 100644 src/main/java/org/jabref/gui/preferences/ExportSortingPrefsTab.java create mode 100644 src/main/java/org/jabref/gui/preferences/ExportSortingTabView.java delete mode 100644 src/main/java/org/jabref/gui/preferences/ImportSettingsTab.java create mode 100644 src/main/java/org/jabref/gui/preferences/ImportTab.fxml create mode 100644 src/main/java/org/jabref/gui/preferences/ImportTabView.java create mode 100644 src/main/java/org/jabref/gui/preferences/ImportTabViewModel.java delete mode 100644 src/main/java/org/jabref/gui/preferences/TablePrefsTab.java create mode 100644 src/main/java/org/jabref/gui/preferences/TableTab.fxml create mode 100644 src/main/java/org/jabref/gui/preferences/TableTabView.java create mode 100644 src/main/java/org/jabref/gui/preferences/TableTabViewModel.java diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml index 0010f4128fc..046936eb127 100644 --- a/config/checkstyle/checkstyle.xml +++ b/config/checkstyle/checkstyle.xml @@ -1,7 +1,7 @@ + "http://www.checkstyle.org/dtds/configuration_1_3.dtd"> diff --git a/config/checkstyle/suppressions.xml b/config/checkstyle/suppressions.xml index 71943814250..65babae5cb6 100644 --- a/config/checkstyle/suppressions.xml +++ b/config/checkstyle/suppressions.xml @@ -2,7 +2,7 @@ + "http://www.checkstyle.org/dtds/suppressions_1_1.dtd"> diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 09c8fb16846..d008a5d597c 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -62,4 +62,7 @@ requires antlr.runtime; requires commons.lang3; requires xmpbox; + requires de.saxsys.mvvmfx.validation; + requires richtextfx; + requires unirest.java; } diff --git a/src/main/java/org/jabref/gui/SaveOrderConfigDisplay.fxml b/src/main/java/org/jabref/gui/SaveOrderConfigDisplay.fxml index 14c2655be95..64fac7cdc94 100644 --- a/src/main/java/org/jabref/gui/SaveOrderConfigDisplay.fxml +++ b/src/main/java/org/jabref/gui/SaveOrderConfigDisplay.fxml @@ -8,35 +8,53 @@ - - - - - - - - - - - - - - + + + - + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/org/jabref/gui/SaveOrderConfigDisplayView.java b/src/main/java/org/jabref/gui/SaveOrderConfigDisplayView.java index 2c4ef4c5f6f..15679bc9ac2 100644 --- a/src/main/java/org/jabref/gui/SaveOrderConfigDisplayView.java +++ b/src/main/java/org/jabref/gui/SaveOrderConfigDisplayView.java @@ -7,8 +7,10 @@ import javafx.scene.control.ComboBox; import javafx.scene.control.RadioButton; import javafx.scene.control.ToggleGroup; -import javafx.scene.layout.GridPane; +import javafx.scene.layout.VBox; +import org.jabref.gui.util.FieldsUtil; +import org.jabref.gui.util.ViewModelListCellFactory; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.field.Field; import org.jabref.model.metadata.SaveOrderConfig; @@ -16,17 +18,15 @@ import com.airhacks.afterburner.views.ViewLoader; -public class SaveOrderConfigDisplayView extends GridPane { - - private final SaveOrderConfig config; +public class SaveOrderConfigDisplayView extends VBox { @FXML private ToggleGroup saveOrderToggleGroup; - @FXML private ComboBox savePriSort; - @FXML private ComboBox saveSecSort; - @FXML private ComboBox saveTerSort; @FXML private RadioButton exportInSpecifiedOrder; @FXML private RadioButton exportInTableOrder; @FXML private RadioButton exportInOriginalOrder; + @FXML private ComboBox savePriSort; + @FXML private ComboBox saveSecSort; + @FXML private ComboBox saveTerSort; @FXML private CheckBox savePriDesc; @FXML private CheckBox saveSecDesc; @FXML private CheckBox saveTerDesc; @@ -34,9 +34,7 @@ public class SaveOrderConfigDisplayView extends GridPane { private SaveOrderConfigDisplayViewModel viewModel; - public SaveOrderConfigDisplayView(SaveOrderConfig config) { - this.config = config; - + public SaveOrderConfigDisplayView() { ViewLoader.view(this) .root(this) .load(); @@ -45,19 +43,32 @@ public SaveOrderConfigDisplayView(SaveOrderConfig config) { @FXML private void initialize() { - viewModel = new SaveOrderConfigDisplayViewModel(config, preferencesService); + viewModel = new SaveOrderConfigDisplayViewModel(preferencesService); - exportInSpecifiedOrder.selectedProperty().bindBidirectional(viewModel.saveInSpecifiedOrderProperty()); - exportInTableOrder.selectedProperty().bindBidirectional(viewModel.saveInTableOrderProperty()); exportInOriginalOrder.selectedProperty().bindBidirectional(viewModel.saveInOriginalProperty()); + exportInTableOrder.selectedProperty().bindBidirectional(viewModel.saveInTableOrderProperty()); + exportInSpecifiedOrder.selectedProperty().bindBidirectional(viewModel.saveInSpecifiedOrderProperty()); + new ViewModelListCellFactory() + .withText(FieldsUtil::getNameWithType) + .install(savePriSort); savePriSort.itemsProperty().bindBidirectional(viewModel.priSortFieldsProperty()); - saveSecSort.itemsProperty().bindBidirectional(viewModel.secSortFieldsProperty()); - saveTerSort.itemsProperty().bindBidirectional(viewModel.terSortFieldsProperty()); - savePriSort.valueProperty().bindBidirectional(viewModel.savePriSortSelectedValueProperty()); + savePriSort.setConverter(FieldsUtil.fieldStringConverter); + + new ViewModelListCellFactory() + .withText(FieldsUtil::getNameWithType) + .install(saveSecSort); + saveSecSort.itemsProperty().bindBidirectional(viewModel.secSortFieldsProperty()); saveSecSort.valueProperty().bindBidirectional(viewModel.saveSecSortSelectedValueProperty()); + saveSecSort.setConverter(FieldsUtil.fieldStringConverter); + + new ViewModelListCellFactory() + .withText(FieldsUtil::getNameWithType) + .install(saveTerSort); + saveTerSort.itemsProperty().bindBidirectional(viewModel.terSortFieldsProperty()); saveTerSort.valueProperty().bindBidirectional(viewModel.saveTerSortSelectedValueProperty()); + saveTerSort.setConverter(FieldsUtil.fieldStringConverter); savePriDesc.selectedProperty().bindBidirectional(viewModel.savePriDescPropertySelected()); saveSecDesc.selectedProperty().bindBidirectional(viewModel.saveSecDescPropertySelected()); @@ -65,6 +76,10 @@ private void initialize() { } + public void setValues(SaveOrderConfig config) { + viewModel.setSaveOrderConfig(config); + } + public void changeExportDescriptionToSave() { exportInOriginalOrder.setText(Localization.lang("Save entries in their original order")); exportInSpecifiedOrder.setText(Localization.lang("Save entries ordered as specified")); diff --git a/src/main/java/org/jabref/gui/SaveOrderConfigDisplayViewModel.java b/src/main/java/org/jabref/gui/SaveOrderConfigDisplayViewModel.java index cc06c9e8cd9..89ef04f1c25 100644 --- a/src/main/java/org/jabref/gui/SaveOrderConfigDisplayViewModel.java +++ b/src/main/java/org/jabref/gui/SaveOrderConfigDisplayViewModel.java @@ -37,15 +37,13 @@ public class SaveOrderConfigDisplayViewModel { private final PreferencesService prefs; - public SaveOrderConfigDisplayViewModel(SaveOrderConfig config, PreferencesService prefs) { + public SaveOrderConfigDisplayViewModel(PreferencesService prefs) { this.prefs = prefs; Set fieldNames = FieldFactory.getCommonFields(); priSortFieldsProperty.addAll(fieldNames); secSortFieldsProperty.addAll(fieldNames); terSortFieldsProperty.addAll(fieldNames); - - setSaveOrderConfig(config); } public ListProperty priSortFieldsProperty() { diff --git a/src/main/java/org/jabref/gui/icon/IconTheme.java b/src/main/java/org/jabref/gui/icon/IconTheme.java index 98b9a2074e8..40682452586 100644 --- a/src/main/java/org/jabref/gui/icon/IconTheme.java +++ b/src/main/java/org/jabref/gui/icon/IconTheme.java @@ -271,6 +271,10 @@ public enum JabRefIcons implements JabRefIcon { PREVIOUS_UP(MaterialDesignIcon.CHEVRON_UP), NEXT_RIGHT(MaterialDesignIcon.CHEVRON_RIGHT), NEXT_DOWN(MaterialDesignIcon.CHEVRON_DOWN), + LIST_MOVE_LEFT(MaterialDesignIcon.CHEVRON_LEFT), + LIST_MOVE_UP(MaterialDesignIcon.CHEVRON_UP), + LIST_MOVE_RIGHT(MaterialDesignIcon.CHEVRON_RIGHT), + LIST_MOVE_DOWN(MaterialDesignIcon.CHEVRON_DOWN), FIT_WIDTH(MaterialDesignIcon.ARROW_EXPAND_ALL), FIT_SINGLE_PAGE(MaterialDesignIcon.NOTE), ZOOM_OUT(MaterialDesignIcon.MAGNIFY_MINUS), diff --git a/src/main/java/org/jabref/gui/libraryproperties/LibraryPropertiesDialogView.java b/src/main/java/org/jabref/gui/libraryproperties/LibraryPropertiesDialogView.java index b4c2a0a4694..42197cbc5a0 100644 --- a/src/main/java/org/jabref/gui/libraryproperties/LibraryPropertiesDialogView.java +++ b/src/main/java/org/jabref/gui/libraryproperties/LibraryPropertiesDialogView.java @@ -79,14 +79,9 @@ private void initialize() { encoding.disableProperty().bind(viewModel.encodingDisableProperty()); protect.disableProperty().bind(viewModel.protectDisableProperty()); + saveOrderConfigDisplayView = new SaveOrderConfigDisplayView(); Optional storedSaveOrderConfig = panel.getBibDatabaseContext().getMetaData().getSaveOrderConfig(); - if (storedSaveOrderConfig.isPresent()) { - saveOrderConfigDisplayView = new SaveOrderConfigDisplayView(storedSaveOrderConfig.get()); - oldSaveOrderConfig = storedSaveOrderConfig.get(); - } else { - oldSaveOrderConfig = preferencesService.loadExportSaveOrder(); - saveOrderConfigDisplayView = new SaveOrderConfigDisplayView(preferencesService.loadExportSaveOrder()); - } + oldSaveOrderConfig = storedSaveOrderConfig.orElseGet(preferencesService::loadExportSaveOrder); saveOrderConfigDisplayView.changeExportDescriptionToSave(); fieldFormatterCleanupsPanel = new FieldFormatterCleanupsPanel(Localization.lang("Enable save actions"), @@ -103,6 +98,7 @@ private void initialize() { private void setValues() { fieldFormatterCleanupsPanel.setValues(panel.getBibDatabaseContext().getMetaData()); + saveOrderConfigDisplayView.setValues(oldSaveOrderConfig); } @FXML diff --git a/src/main/java/org/jabref/gui/preferences/AbstractPreferenceTabView.java b/src/main/java/org/jabref/gui/preferences/AbstractPreferenceTabView.java index b957082890b..cf8b4e69c4c 100644 --- a/src/main/java/org/jabref/gui/preferences/AbstractPreferenceTabView.java +++ b/src/main/java/org/jabref/gui/preferences/AbstractPreferenceTabView.java @@ -11,12 +11,12 @@ import org.jabref.gui.util.TaskExecutor; import org.jabref.preferences.JabRefPreferences; -public abstract class AbstractPreferenceTabView extends VBox implements PreferencesTab { +public abstract class AbstractPreferenceTabView extends VBox implements PreferencesTab { @Inject protected TaskExecutor taskExecutor; @Inject protected DialogService dialogService; - protected PreferenceTabViewModel viewModel; + protected T viewModel; protected JabRefPreferences preferences; diff --git a/src/main/java/org/jabref/gui/preferences/AdvancedTab.fxml b/src/main/java/org/jabref/gui/preferences/AdvancedTab.fxml index 7c9886d84fb..a98ac76d508 100644 --- a/src/main/java/org/jabref/gui/preferences/AdvancedTab.fxml +++ b/src/main/java/org/jabref/gui/preferences/AdvancedTab.fxml @@ -13,53 +13,53 @@ - -