From 687545b886feb48478a3b2d2a8d9d20c2813691e Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Sun, 23 Nov 2025 20:06:30 +0100 Subject: [PATCH 1/3] Introduce PlausibilityComparatorFactory --- .../threewaymerge/FieldRowViewModel.java | 30 ++++++++----------- jablib/src/main/java/module-info.java | 1 + .../EntryTypePlausibilityComparator.java | 19 ++++++++++++ .../FieldValuePlausibilityComparator.java | 8 +++-- .../PlausibilityComparatorFactory.java | 24 +++++++++++++++ .../YearFieldValuePlausibilityComparator.java | 9 ++++-- .../model/entry/field/FieldProperty.java | 5 ++-- .../model/entry/field/StandardField.java | 6 ++-- 8 files changed, 75 insertions(+), 27 deletions(-) create mode 100644 jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/EntryTypePlausibilityComparator.java rename jablib/src/main/java/org/jabref/logic/bibtex/comparator/{ => plausibility}/FieldValuePlausibilityComparator.java (58%) create mode 100644 jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/PlausibilityComparatorFactory.java rename jablib/src/main/java/org/jabref/logic/bibtex/comparator/{ => plausibility}/YearFieldValuePlausibilityComparator.java (91%) diff --git a/jabgui/src/main/java/org/jabref/gui/mergeentries/threewaymerge/FieldRowViewModel.java b/jabgui/src/main/java/org/jabref/gui/mergeentries/threewaymerge/FieldRowViewModel.java index aa9a7c6ffc1..7536ec9beaa 100644 --- a/jabgui/src/main/java/org/jabref/gui/mergeentries/threewaymerge/FieldRowViewModel.java +++ b/jabgui/src/main/java/org/jabref/gui/mergeentries/threewaymerge/FieldRowViewModel.java @@ -16,16 +16,13 @@ import org.jabref.gui.mergeentries.threewaymerge.fieldsmerger.FieldMerger; import org.jabref.gui.mergeentries.threewaymerge.fieldsmerger.FieldMergerFactory; -import org.jabref.logic.bibtex.comparator.ComparisonResult; -import org.jabref.logic.bibtex.comparator.YearFieldValuePlausibilityComparator; +import org.jabref.logic.bibtex.comparator.plausibility.PlausibilityComparatorFactory; import org.jabref.logic.util.strings.StringUtil; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.FieldTextMapper; import org.jabref.model.entry.field.InternalField; -import org.jabref.model.entry.field.StandardField; import org.jabref.model.entry.types.EntryTypeFactory; -import org.jabref.model.entry.types.StandardEntryType; import com.tobiasdiez.easybind.EasyBind; import org.slf4j.Logger; @@ -131,19 +128,18 @@ public void autoSelectBetterValue() { String leftValue = getLeftFieldValue(); String rightValue = getRightFieldValue(); - if (StandardField.YEAR == field) { - YearFieldValuePlausibilityComparator comparator = new YearFieldValuePlausibilityComparator(); - ComparisonResult comparison = comparator.compare(leftValue, rightValue); - if (ComparisonResult.RIGHT_BETTER == comparison) { - selectRightValue(); - } else if (ComparisonResult.LEFT_BETTER == comparison) { - selectLeftValue(); - } - } else if (InternalField.TYPE_HEADER == field) { - if (leftValue.equalsIgnoreCase(StandardEntryType.Misc.getName())) { - selectRightValue(); - } - } + PlausibilityComparatorFactory.INSTANCE + .getPlausibilityComparator(field) + .map(comparator -> comparator.compare(leftValue, rightValue)) + .ifPresent(result -> { + switch (result) { + case RIGHT_BETTER -> + selectRightValue(); + case LEFT_BETTER -> + selectLeftValue(); + default -> { /* nothing */ } + } + }); } public void selectNonEmptyValue() { diff --git a/jablib/src/main/java/module-info.java b/jablib/src/main/java/module-info.java index 67112a8e227..71c0551f650 100644 --- a/jablib/src/main/java/module-info.java +++ b/jablib/src/main/java/module-info.java @@ -120,6 +120,7 @@ exports org.jabref.logic.git.merge.planning; exports org.jabref.logic.git.merge.execution; exports org.jabref.model.sciteTallies; + exports org.jabref.logic.bibtex.comparator.plausibility; requires java.base; diff --git a/jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/EntryTypePlausibilityComparator.java b/jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/EntryTypePlausibilityComparator.java new file mode 100644 index 00000000000..2ca85ec2207 --- /dev/null +++ b/jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/EntryTypePlausibilityComparator.java @@ -0,0 +1,19 @@ +package org.jabref.logic.bibtex.comparator.plausibility; + +import org.jabref.logic.bibtex.comparator.ComparisonResult; +import org.jabref.model.entry.types.StandardEntryType; + +public class EntryTypePlausibilityComparator implements FieldValuePlausibilityComparator { + + // Only the factory may instantiate this + EntryTypePlausibilityComparator() { + } + + @Override + public ComparisonResult compare(String leftValue, String rightValue) { + if (leftValue.equalsIgnoreCase(StandardEntryType.Misc.getName())) { + return ComparisonResult.RIGHT_BETTER; + } + return ComparisonResult.UNDETERMINED; + } +} diff --git a/jablib/src/main/java/org/jabref/logic/bibtex/comparator/FieldValuePlausibilityComparator.java b/jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/FieldValuePlausibilityComparator.java similarity index 58% rename from jablib/src/main/java/org/jabref/logic/bibtex/comparator/FieldValuePlausibilityComparator.java rename to jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/FieldValuePlausibilityComparator.java index 0ddca78d10f..80ed7695ad7 100644 --- a/jablib/src/main/java/org/jabref/logic/bibtex/comparator/FieldValuePlausibilityComparator.java +++ b/jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/FieldValuePlausibilityComparator.java @@ -1,6 +1,8 @@ -package org.jabref.logic.bibtex.comparator; +package org.jabref.logic.bibtex.comparator.plausibility; -public abstract class FieldValuePlausibilityComparator { +import org.jabref.logic.bibtex.comparator.ComparisonResult; + +public interface FieldValuePlausibilityComparator { /** * Compares the plausibility of two field values. * @@ -8,5 +10,5 @@ public abstract class FieldValuePlausibilityComparator { * @param rightValue value from the fetcher (or existing record) * @return ComparisonResult indicating which field is more plausible: RIGHT_BETTER, LEFT_BETTER, or UNDETERMINED */ - public abstract ComparisonResult compare(String leftValue, String rightValue); + ComparisonResult compare(String leftValue, String rightValue); } diff --git a/jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/PlausibilityComparatorFactory.java b/jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/PlausibilityComparatorFactory.java new file mode 100644 index 00000000000..bb3bc3d3419 --- /dev/null +++ b/jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/PlausibilityComparatorFactory.java @@ -0,0 +1,24 @@ +package org.jabref.logic.bibtex.comparator.plausibility; + +import java.util.Optional; + +import org.jabref.model.entry.field.Field; +import org.jabref.model.entry.field.FieldProperty; +import org.jabref.model.entry.field.InternalField; + +public enum PlausibilityComparatorFactory { + + // Single instance ensured by Java compiler + INSTANCE; + + public Optional getPlausibilityComparator(Field field) { + // Similar code as [org.jabref.gui.fieldeditors.FieldEditors.getForField] + if (field.getProperties().contains(FieldProperty.YEAR)) { + return Optional.of(new YearFieldValuePlausibilityComparator()); + } + if (InternalField.TYPE_HEADER == field) { + return Optional.of(new EntryTypePlausibilityComparator()); + } + return Optional.empty(); + } +} diff --git a/jablib/src/main/java/org/jabref/logic/bibtex/comparator/YearFieldValuePlausibilityComparator.java b/jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/YearFieldValuePlausibilityComparator.java similarity index 91% rename from jablib/src/main/java/org/jabref/logic/bibtex/comparator/YearFieldValuePlausibilityComparator.java rename to jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/YearFieldValuePlausibilityComparator.java index 11d6e1b8c7a..70b6ff410f1 100644 --- a/jablib/src/main/java/org/jabref/logic/bibtex/comparator/YearFieldValuePlausibilityComparator.java +++ b/jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/YearFieldValuePlausibilityComparator.java @@ -1,17 +1,22 @@ -package org.jabref.logic.bibtex.comparator; +package org.jabref.logic.bibtex.comparator.plausibility; import java.time.Year; import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.jabref.logic.bibtex.comparator.ComparisonResult; import org.jabref.logic.integrity.YearChecker; import org.jabref.logic.util.strings.StringUtil; -public class YearFieldValuePlausibilityComparator extends FieldValuePlausibilityComparator { +public class YearFieldValuePlausibilityComparator implements FieldValuePlausibilityComparator { private static final Pattern YEAR_PATTERN = Pattern.compile("(\\d{4})"); + // Only the factor may instantiate this + YearFieldValuePlausibilityComparator() { + } + /** * Compares the plausibility of two field values. * diff --git a/jablib/src/main/java/org/jabref/model/entry/field/FieldProperty.java b/jablib/src/main/java/org/jabref/model/entry/field/FieldProperty.java index 7dad6ca1faf..cf329e2d4d6 100644 --- a/jablib/src/main/java/org/jabref/model/entry/field/FieldProperty.java +++ b/jablib/src/main/java/org/jabref/model/entry/field/FieldProperty.java @@ -23,8 +23,6 @@ public enum FieldProperty { MONTH, - YEARDIVISION, - MULTILINE_TEXT, NUMERIC, PAGINATION, @@ -36,5 +34,8 @@ public enum FieldProperty { // Field content should be treated as data VERBATIM, + // Contains a year value + YEAR, + YES_NO } diff --git a/jablib/src/main/java/org/jabref/model/entry/field/StandardField.java b/jablib/src/main/java/org/jabref/model/entry/field/StandardField.java index 5b7c3cad725..4a69201fb16 100644 --- a/jablib/src/main/java/org/jabref/model/entry/field/StandardField.java +++ b/jablib/src/main/java/org/jabref/model/entry/field/StandardField.java @@ -126,9 +126,9 @@ public enum StandardField implements Field { VERSION("version"), VOLUME("volume", FieldProperty.NUMERIC), VOLUMES("volumes", FieldProperty.NUMERIC), - YEAR("year", FieldProperty.NUMERIC), - YEARDIVISION("yeardivision", FieldProperty.YEARDIVISION), - YEARFILED("yearfiled"), + YEAR("year", FieldProperty.NUMERIC, FieldProperty.YEAR), + YEARDIVISION("yeardivision"), + YEARFILED("yearfiled", FieldProperty.NUMERIC, FieldProperty.YEAR), MR_NUMBER("mrnumber"), ZBL_NUMBER("zbl"), // needed for fetcher XDATA("xdata", FieldProperty.MULTIPLE_ENTRY_LINK), From 531655adf7d69116743321aadab6b7c652b70ae1 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 24 Nov 2025 21:23:30 +0100 Subject: [PATCH 2/3] Update jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/EntryTypePlausibilityComparator.java Co-authored-by: Christoph --- .../plausibility/EntryTypePlausibilityComparator.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/EntryTypePlausibilityComparator.java b/jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/EntryTypePlausibilityComparator.java index 2ca85ec2207..385da9ef238 100644 --- a/jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/EntryTypePlausibilityComparator.java +++ b/jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/EntryTypePlausibilityComparator.java @@ -2,7 +2,9 @@ import org.jabref.logic.bibtex.comparator.ComparisonResult; import org.jabref.model.entry.types.StandardEntryType; - +/** +* If the left entry type is misc then prefer the the right value +**/ public class EntryTypePlausibilityComparator implements FieldValuePlausibilityComparator { // Only the factory may instantiate this From 2d1aac0b861bcc9226b33df70afd7f83a62e88c5 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Mon, 24 Nov 2025 21:24:21 +0100 Subject: [PATCH 3/3] Use Markdown comments --- .../plausibility/EntryTypePlausibilityComparator.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/EntryTypePlausibilityComparator.java b/jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/EntryTypePlausibilityComparator.java index 385da9ef238..2974d0fee86 100644 --- a/jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/EntryTypePlausibilityComparator.java +++ b/jablib/src/main/java/org/jabref/logic/bibtex/comparator/plausibility/EntryTypePlausibilityComparator.java @@ -2,9 +2,8 @@ import org.jabref.logic.bibtex.comparator.ComparisonResult; import org.jabref.model.entry.types.StandardEntryType; -/** -* If the left entry type is misc then prefer the the right value -**/ + +/// If the left entry type is misc then prefer the the right value public class EntryTypePlausibilityComparator implements FieldValuePlausibilityComparator { // Only the factory may instantiate this