From 2e07d9b690df9395a52fca80f22ecd56dbbecc84 Mon Sep 17 00:00:00 2001 From: Stefan Kolb Date: Tue, 21 Apr 2020 21:27:42 +0200 Subject: [PATCH 01/19] ioebnfgoeoignboieg --- src/main/java/org/jabref/logic/integrity/IntegrityCheck.java | 2 +- src/main/java/org/jabref/logic/integrity/IntegrityMessage.java | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java b/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java index eb3c08c5279..db2401810b3 100644 --- a/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java +++ b/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java @@ -34,7 +34,7 @@ public IntegrityCheck(BibDatabaseContext bibDatabaseContext, this.allowIntegerEdition = allowIntegerEdition; } - public List checkDatabase() { + List checkDatabase() { List result = new ArrayList<>(); for (BibEntry entry : bibDatabaseContext.getDatabase().getEntries()) { diff --git a/src/main/java/org/jabref/logic/integrity/IntegrityMessage.java b/src/main/java/org/jabref/logic/integrity/IntegrityMessage.java index 53c0944be0a..94d9d262e4c 100644 --- a/src/main/java/org/jabref/logic/integrity/IntegrityMessage.java +++ b/src/main/java/org/jabref/logic/integrity/IntegrityMessage.java @@ -6,9 +6,7 @@ import org.jabref.model.entry.field.Field; public final class IntegrityMessage implements Cloneable { - private final BibEntry entry; - private final Field field; private final String message; From c3724a8cbb92cf64370d7ba7c7266a7ae4eb5fe6 Mon Sep 17 00:00:00 2001 From: Stefan Kufer Date: Tue, 21 Apr 2020 22:11:13 +0200 Subject: [PATCH 02/19] asdf --- .../integrity/ASCIICharacterChecker.java | 1 - .../logic/integrity/BibStringChecker.java | 2 - .../integrity/BibTeXEntryTypeChecker.java | 1 - .../logic/integrity/BibtexKeyChecker.java | 3 +- .../BibtexKeyDuplicationChecker.java | 1 - .../integrity/BibtexkeyDeviationChecker.java | 3 +- .../org/jabref/logic/integrity/Checker.java | 10 +++ .../logic/integrity/EntryLinkChecker.java | 5 +- .../jabref/logic/integrity/FieldChecker.java | 4 +- .../logic/integrity/HTMLCharacterChecker.java | 1 - .../logic/integrity/IntegrityCheck.java | 81 ++++++++++++------- .../JournalInAbbreviationListChecker.java | 3 +- .../logic/integrity/NoBibtexFieldChecker.java | 1 - .../jabref/logic/integrity/TypeChecker.java | 3 +- 14 files changed, 72 insertions(+), 47 deletions(-) create mode 100644 src/main/java/org/jabref/logic/integrity/Checker.java diff --git a/src/main/java/org/jabref/logic/integrity/ASCIICharacterChecker.java b/src/main/java/org/jabref/logic/integrity/ASCIICharacterChecker.java index 34988fe7495..1e136fe30a9 100644 --- a/src/main/java/org/jabref/logic/integrity/ASCIICharacterChecker.java +++ b/src/main/java/org/jabref/logic/integrity/ASCIICharacterChecker.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.Map; -import org.jabref.logic.integrity.IntegrityCheck.Checker; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.Field; diff --git a/src/main/java/org/jabref/logic/integrity/BibStringChecker.java b/src/main/java/org/jabref/logic/integrity/BibStringChecker.java index b1550da0cdc..1f6eeb92512 100644 --- a/src/main/java/org/jabref/logic/integrity/BibStringChecker.java +++ b/src/main/java/org/jabref/logic/integrity/BibStringChecker.java @@ -6,7 +6,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.jabref.logic.integrity.IntegrityCheck.Checker; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.Field; @@ -17,7 +16,6 @@ public class BibStringChecker implements Checker { // Detect # if it doesn't have a \ in front of it or if it starts the string private static final Pattern UNESCAPED_HASH = Pattern.compile("(? check(BibEntry entry) { Optional author = entry.getField(StandardField.AUTHOR); Optional title = entry.getField(StandardField.TITLE); Optional year = entry.getField(StandardField.YEAR); - if (!author.isPresent() || !title.isPresent() || !year.isPresent()) { + if (author.isEmpty() || title.isEmpty() || year.isEmpty()) { return Collections.emptyList(); } diff --git a/src/main/java/org/jabref/logic/integrity/BibtexKeyDuplicationChecker.java b/src/main/java/org/jabref/logic/integrity/BibtexKeyDuplicationChecker.java index 7112653709e..052e17e074d 100644 --- a/src/main/java/org/jabref/logic/integrity/BibtexKeyDuplicationChecker.java +++ b/src/main/java/org/jabref/logic/integrity/BibtexKeyDuplicationChecker.java @@ -5,7 +5,6 @@ import java.util.Objects; import java.util.Optional; -import org.jabref.logic.integrity.IntegrityCheck.Checker; import org.jabref.logic.l10n.Localization; import org.jabref.model.database.BibDatabase; import org.jabref.model.entry.BibEntry; diff --git a/src/main/java/org/jabref/logic/integrity/BibtexkeyDeviationChecker.java b/src/main/java/org/jabref/logic/integrity/BibtexkeyDeviationChecker.java index 3865e62bb38..6e4eb768e30 100644 --- a/src/main/java/org/jabref/logic/integrity/BibtexkeyDeviationChecker.java +++ b/src/main/java/org/jabref/logic/integrity/BibtexkeyDeviationChecker.java @@ -7,7 +7,6 @@ import org.jabref.logic.bibtexkeypattern.BibtexKeyGenerator; import org.jabref.logic.bibtexkeypattern.BibtexKeyPatternPreferences; -import org.jabref.logic.integrity.IntegrityCheck.Checker; import org.jabref.logic.l10n.Localization; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; @@ -26,7 +25,7 @@ public BibtexkeyDeviationChecker(BibDatabaseContext bibDatabaseContext, BibtexKe @Override public List check(BibEntry entry) { Optional valuekey = entry.getCiteKeyOptional(); - if (!valuekey.isPresent()) { + if (valuekey.isEmpty()) { return Collections.emptyList(); } diff --git a/src/main/java/org/jabref/logic/integrity/Checker.java b/src/main/java/org/jabref/logic/integrity/Checker.java new file mode 100644 index 00000000000..d9e9b9f7312 --- /dev/null +++ b/src/main/java/org/jabref/logic/integrity/Checker.java @@ -0,0 +1,10 @@ +package org.jabref.logic.integrity; + +import org.jabref.model.entry.BibEntry; + +import java.util.List; + +@FunctionalInterface +public interface Checker { + List check(BibEntry entry); +} diff --git a/src/main/java/org/jabref/logic/integrity/EntryLinkChecker.java b/src/main/java/org/jabref/logic/integrity/EntryLinkChecker.java index a1197beb7cb..9bfc3c22392 100644 --- a/src/main/java/org/jabref/logic/integrity/EntryLinkChecker.java +++ b/src/main/java/org/jabref/logic/integrity/EntryLinkChecker.java @@ -7,7 +7,6 @@ import java.util.Objects; import java.util.Set; -import org.jabref.logic.integrity.IntegrityCheck.Checker; import org.jabref.logic.l10n.Localization; import org.jabref.model.database.BibDatabase; import org.jabref.model.entry.BibEntry; @@ -28,14 +27,14 @@ public List check(BibEntry entry) { for (Entry field : entry.getFieldMap().entrySet()) { Set properties = field.getKey().getProperties(); if (properties.contains(FieldProperty.SINGLE_ENTRY_LINK)) { - if (!database.getEntryByKey(field.getValue()).isPresent()) { + if (database.getEntryByKey(field.getValue()).isEmpty()) { result.add(new IntegrityMessage(Localization.lang("Referenced BibTeX key does not exist"), entry, field.getKey())); } } else if (properties.contains(FieldProperty.MULTIPLE_ENTRY_LINK)) { List keys = new ArrayList<>(Arrays.asList(field.getValue().split(","))); for (String key : keys) { - if (!database.getEntryByKey(key).isPresent()) { + if (database.getEntryByKey(key).isEmpty()) { result.add(new IntegrityMessage( Localization.lang("Referenced BibTeX key does not exist") + ": " + key, entry, field.getKey())); diff --git a/src/main/java/org/jabref/logic/integrity/FieldChecker.java b/src/main/java/org/jabref/logic/integrity/FieldChecker.java index 9416bdabe42..83db698ca69 100644 --- a/src/main/java/org/jabref/logic/integrity/FieldChecker.java +++ b/src/main/java/org/jabref/logic/integrity/FieldChecker.java @@ -9,7 +9,7 @@ import org.jabref.model.entry.field.Field; import org.jabref.model.util.OptionalUtil; -public class FieldChecker implements IntegrityCheck.Checker { +public class FieldChecker implements Checker { protected final Field field; private final ValueChecker checker; @@ -21,7 +21,7 @@ public FieldChecker(Field field, ValueChecker checker) { @Override public List check(BibEntry entry) { Optional value = entry.getField(field); - if (!value.isPresent()) { + if (value.isEmpty()) { return Collections.emptyList(); } diff --git a/src/main/java/org/jabref/logic/integrity/HTMLCharacterChecker.java b/src/main/java/org/jabref/logic/integrity/HTMLCharacterChecker.java index bf590d654ee..4ffd96aa19a 100644 --- a/src/main/java/org/jabref/logic/integrity/HTMLCharacterChecker.java +++ b/src/main/java/org/jabref/logic/integrity/HTMLCharacterChecker.java @@ -6,7 +6,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.jabref.logic.integrity.IntegrityCheck.Checker; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.Field; diff --git a/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java b/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java index db2401810b3..e317137b419 100644 --- a/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java +++ b/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java @@ -1,9 +1,5 @@ package org.jabref.logic.integrity; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - import org.jabref.logic.bibtexkeypattern.BibtexKeyPatternPreferences; import org.jabref.logic.journals.JournalAbbreviationRepository; import org.jabref.model.database.BibDatabaseContext; @@ -11,6 +7,10 @@ import org.jabref.model.entry.field.StandardField; import org.jabref.model.metadata.FilePreferences; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + public class IntegrityCheck { private final BibDatabaseContext bibDatabaseContext; @@ -19,6 +19,18 @@ public class IntegrityCheck { private final JournalAbbreviationRepository journalAbbreviationRepository; private final boolean enforceLegalKey; private final boolean allowIntegerEdition; + private ASCIICharacterChecker asciiCharacterChecker; + private NoBibtexFieldChecker noBibtexFieldChecker; + private BibTeXEntryTypeChecker bibTeXEntryTypeChecker; + private BibtexKeyChecker bibtexKeyChecker; + private TypeChecker typeChecker; + private BibStringChecker bibStringChecker; + private HTMLCharacterChecker htmlCharacterChecker; + private EntryLinkChecker entryLinkChecker; + private BibtexkeyDeviationChecker bibtexkeyDeviationChecker; + private BibtexKeyDuplicationChecker bibtexKeyDuplicationChecker; + private JournalInAbbreviationListChecker journalInAbbreviationListChecker; + private FieldCheckers fieldCheckers; public IntegrityCheck(BibDatabaseContext bibDatabaseContext, FilePreferences filePreferences, @@ -32,6 +44,32 @@ public IntegrityCheck(BibDatabaseContext bibDatabaseContext, this.journalAbbreviationRepository = Objects.requireNonNull(journalAbbreviationRepository); this.enforceLegalKey = enforceLegalKey; this.allowIntegerEdition = allowIntegerEdition; + initCheckers(bibDatabaseContext, bibtexKeyPatternPreferences, journalAbbreviationRepository); + } + + private void initCheckers(BibDatabaseContext bibDatabaseContext, BibtexKeyPatternPreferences bibtexKeyPatternPreferences, JournalAbbreviationRepository journalAbbreviationRepository) { + asciiCharacterChecker = new ASCIICharacterChecker(); + noBibtexFieldChecker = new NoBibtexFieldChecker(); + bibTeXEntryTypeChecker = new BibTeXEntryTypeChecker(); + bibtexKeyChecker = new BibtexKeyChecker(); + typeChecker = new TypeChecker(); + bibStringChecker = new BibStringChecker(); + htmlCharacterChecker = new HTMLCharacterChecker(); + entryLinkChecker = new EntryLinkChecker(bibDatabaseContext.getDatabase()); + bibtexkeyDeviationChecker = new BibtexkeyDeviationChecker(bibDatabaseContext, bibtexKeyPatternPreferences); + bibtexKeyDuplicationChecker = new BibtexKeyDuplicationChecker(bibDatabaseContext.getDatabase()); + + if (bibDatabaseContext.isBiblatexMode()) { + journalInAbbreviationListChecker = new JournalInAbbreviationListChecker(StandardField.JOURNALTITLE, journalAbbreviationRepository); + } else { + journalInAbbreviationListChecker = new JournalInAbbreviationListChecker(StandardField.JOURNAL, journalAbbreviationRepository); + } + + fieldCheckers = new FieldCheckers(bibDatabaseContext, + filePreferences, + journalAbbreviationRepository, + enforceLegalKey, + allowIntegerEdition); } List checkDatabase() { @@ -51,38 +89,27 @@ public List checkEntry(BibEntry entry) { return result; } - FieldCheckers fieldCheckers = new FieldCheckers(bibDatabaseContext, - filePreferences, - journalAbbreviationRepository, - enforceLegalKey, - allowIntegerEdition); for (FieldChecker checker : fieldCheckers.getAll()) { result.addAll(checker.check(entry)); } if (!bibDatabaseContext.isBiblatexMode()) { // BibTeX only checkers - result.addAll(new ASCIICharacterChecker().check(entry)); - result.addAll(new NoBibtexFieldChecker().check(entry)); - result.addAll(new BibTeXEntryTypeChecker().check(entry)); - result.addAll(new JournalInAbbreviationListChecker(StandardField.JOURNAL, journalAbbreviationRepository).check(entry)); - } else { - result.addAll(new JournalInAbbreviationListChecker(StandardField.JOURNALTITLE, journalAbbreviationRepository).check(entry)); + result.addAll(asciiCharacterChecker.check(entry)); + result.addAll(noBibtexFieldChecker.check(entry)); + result.addAll(bibTeXEntryTypeChecker.check(entry)); } - result.addAll(new BibtexKeyChecker().check(entry)); - result.addAll(new TypeChecker().check(entry)); - result.addAll(new BibStringChecker().check(entry)); - result.addAll(new HTMLCharacterChecker().check(entry)); - result.addAll(new EntryLinkChecker(bibDatabaseContext.getDatabase()).check(entry)); - result.addAll(new BibtexkeyDeviationChecker(bibDatabaseContext, bibtexKeyPatternPreferences).check(entry)); - result.addAll(new BibtexKeyDuplicationChecker(bibDatabaseContext.getDatabase()).check(entry)); + result.addAll(journalInAbbreviationListChecker.check(entry)); + result.addAll(bibtexKeyChecker.check(entry)); + result.addAll(typeChecker.check(entry)); + result.addAll(bibStringChecker.check(entry)); + result.addAll(htmlCharacterChecker.check(entry)); + result.addAll(entryLinkChecker.check(entry)); + result.addAll(bibtexkeyDeviationChecker.check(entry)); + result.addAll(bibtexKeyDuplicationChecker.check(entry)); + // TODO return result; } - - @FunctionalInterface - public interface Checker { - List check(BibEntry entry); - } } diff --git a/src/main/java/org/jabref/logic/integrity/JournalInAbbreviationListChecker.java b/src/main/java/org/jabref/logic/integrity/JournalInAbbreviationListChecker.java index cfb684537d5..360e8c22b6d 100644 --- a/src/main/java/org/jabref/logic/integrity/JournalInAbbreviationListChecker.java +++ b/src/main/java/org/jabref/logic/integrity/JournalInAbbreviationListChecker.java @@ -5,7 +5,6 @@ import java.util.Objects; import java.util.Optional; -import org.jabref.logic.integrity.IntegrityCheck.Checker; import org.jabref.logic.journals.JournalAbbreviationRepository; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; @@ -24,7 +23,7 @@ public JournalInAbbreviationListChecker(Field field, JournalAbbreviationReposito @Override public List check(BibEntry entry) { Optional value = entry.getField(field); - if (!value.isPresent()) { + if (value.isEmpty()) { return Collections.emptyList(); } diff --git a/src/main/java/org/jabref/logic/integrity/NoBibtexFieldChecker.java b/src/main/java/org/jabref/logic/integrity/NoBibtexFieldChecker.java index 8c3cc2b0198..6d8c937e8b2 100644 --- a/src/main/java/org/jabref/logic/integrity/NoBibtexFieldChecker.java +++ b/src/main/java/org/jabref/logic/integrity/NoBibtexFieldChecker.java @@ -4,7 +4,6 @@ import java.util.Set; import java.util.stream.Collectors; -import org.jabref.logic.integrity.IntegrityCheck.Checker; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.BibField; diff --git a/src/main/java/org/jabref/logic/integrity/TypeChecker.java b/src/main/java/org/jabref/logic/integrity/TypeChecker.java index 51e899f366c..5426d57e938 100644 --- a/src/main/java/org/jabref/logic/integrity/TypeChecker.java +++ b/src/main/java/org/jabref/logic/integrity/TypeChecker.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.Optional; -import org.jabref.logic.integrity.IntegrityCheck.Checker; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.StandardField; @@ -15,7 +14,7 @@ public class TypeChecker implements Checker { @Override public List check(BibEntry entry) { Optional value = entry.getField(StandardField.PAGES); - if (!value.isPresent()) { + if (value.isEmpty()) { return Collections.emptyList(); } From 1a7aa441132755f6c1dc2506c71a5d860c54dff3 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Tue, 21 Apr 2020 22:42:30 +0200 Subject: [PATCH 03/19] WIP: Add equals to DOI --- .../integrity/DoiDuplicationChecker.java | 37 +++++++++++++++++++ .../logic/integrity/IntegrityCheck.java | 4 +- .../jabref/model/entry/identifier/DOI.java | 25 ++++++++++++- .../model/entry/identifier/Identifier.java | 7 +++- .../model/entry/identifier/DOITest.java | 11 +++++- 5 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java diff --git a/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java b/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java new file mode 100644 index 00000000000..2a6b0c47b05 --- /dev/null +++ b/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java @@ -0,0 +1,37 @@ +package org.jabref.logic.integrity; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +import org.jabref.model.database.BibDatabase; + +import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.field.StandardField; + +public class DoiDuplicationChecker implements Checker { + + private final BibDatabase database; + private Map> errors; + + public DoiDuplicationChecker(BibDatabase database) { + this.database = Objects.requireNonNull(database); + } + + @Override + public List check(BibEntry entry) { + if (errors == null) { + errors = new HashMap<>(); + + BibEntry entry; + Optional field = entry.getField(StandardField.DOI).map(doi -> doi.toLowerCase(Locale.ENGLISH)); + + //database.getEntries() + } + return errors.getOrDefault(entry, Collections.emptyList()); + } +} diff --git a/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java b/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java index e317137b419..17add523118 100644 --- a/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java +++ b/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java @@ -31,6 +31,7 @@ public class IntegrityCheck { private BibtexKeyDuplicationChecker bibtexKeyDuplicationChecker; private JournalInAbbreviationListChecker journalInAbbreviationListChecker; private FieldCheckers fieldCheckers; + private DoiDuplicationChecker doiDuplicationChecker; public IntegrityCheck(BibDatabaseContext bibDatabaseContext, FilePreferences filePreferences, @@ -58,6 +59,7 @@ private void initCheckers(BibDatabaseContext bibDatabaseContext, BibtexKeyPatter entryLinkChecker = new EntryLinkChecker(bibDatabaseContext.getDatabase()); bibtexkeyDeviationChecker = new BibtexkeyDeviationChecker(bibDatabaseContext, bibtexKeyPatternPreferences); bibtexKeyDuplicationChecker = new BibtexKeyDuplicationChecker(bibDatabaseContext.getDatabase()); + doiDuplicationChecker = new DoiDuplicationChecker(bibDatabaseContext.getDatabase()); if (bibDatabaseContext.isBiblatexMode()) { journalInAbbreviationListChecker = new JournalInAbbreviationListChecker(StandardField.JOURNALTITLE, journalAbbreviationRepository); @@ -108,7 +110,7 @@ public List checkEntry(BibEntry entry) { result.addAll(entryLinkChecker.check(entry)); result.addAll(bibtexkeyDeviationChecker.check(entry)); result.addAll(bibtexKeyDuplicationChecker.check(entry)); - // TODO + result.addAll(doiDuplicationChecker.check(entry)); return result; } diff --git a/src/main/java/org/jabref/model/entry/identifier/DOI.java b/src/main/java/org/jabref/model/entry/identifier/DOI.java index c11a614cc18..765710d390d 100644 --- a/src/main/java/org/jabref/model/entry/identifier/DOI.java +++ b/src/main/java/org/jabref/model/entry/identifier/DOI.java @@ -14,7 +14,8 @@ import org.slf4j.LoggerFactory; /** - * Class for working with Digital object identifiers (DOIs) and Short DOIs + * Class for working with Digital object identifiers + * (DOIs) and Short DOIs */ public class DOI implements Identifier { private static final Logger LOGGER = LoggerFactory.getLogger(DOI.class); @@ -117,7 +118,7 @@ public DOI(String doi) { /** * Creates an Optional<DOI> from various schemes including URL, URN, and plain DOIs. - * + *

* Useful for suppressing the IllegalArgumentException of the Constructor and checking for * Optional.isPresent() instead. * @@ -227,4 +228,24 @@ public Field getDefaultField() { public String getNormalized() { return doi; } + + /** + * DOIs are case-insensitive. Thus, 10.1109/cloud.2017.89 equals 10.1109/CLOUD.2017.89 + */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + DOI doi1 = (DOI) o; + return doi.equalsIgnoreCase(doi1.doi); + } + + @Override + public int hashCode() { + return Objects.hash(doi); + } } diff --git a/src/main/java/org/jabref/model/entry/identifier/Identifier.java b/src/main/java/org/jabref/model/entry/identifier/Identifier.java index 5207c29523a..3a921bfdf6c 100644 --- a/src/main/java/org/jabref/model/entry/identifier/Identifier.java +++ b/src/main/java/org/jabref/model/entry/identifier/Identifier.java @@ -7,9 +7,12 @@ public interface Identifier { - Field getDefaultField(); - + /** + * Returns the identifier. + */ String getNormalized(); + Field getDefaultField(); + Optional getExternalURI(); } diff --git a/src/test/java/org/jabref/model/entry/identifier/DOITest.java b/src/test/java/org/jabref/model/entry/identifier/DOITest.java index 44af0ec70a2..03cb93085f1 100644 --- a/src/test/java/org/jabref/model/entry/identifier/DOITest.java +++ b/src/test/java/org/jabref/model/entry/identifier/DOITest.java @@ -5,7 +5,9 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; public class DOITest { @@ -228,11 +230,16 @@ public void parseShortDOIWithWhiteSpace() { @Test public void isShortDoiShouldReturnTrueWhenItIsShortDoi() { - assertEquals(true, new DOI("10/abcde").isShortDoi()); + assertTrue(new DOI("10/abcde").isShortDoi()); } @Test public void isShortDoiShouldReturnFalseWhenItIsDoi() { - assertEquals(false, new DOI("10.1006/jmbi.1998.2354").isShortDoi()); + assertFalse(new DOI("10.1006/jmbi.1998.2354").isShortDoi()); + } + + @Test + public void equalsWorksFor2017Doi() { + assertTrue(new DOI("10.1109/cloud.2017.89").equals(new DOI("10.1109/CLOUD.2017.89"))); } } From a1b0fbc8193977420e8401b750e3667e5b7de74c Mon Sep 17 00:00:00 2001 From: Stefan Kolb Date: Tue, 21 Apr 2020 23:28:00 +0200 Subject: [PATCH 04/19] rbrbbrbr --- .../integrity/DoiDuplicationChecker.java | 28 +++++++++++++------ ...tyChecker.java => DoiValidityChecker.java} | 3 +- .../jabref/logic/integrity/FieldCheckers.java | 2 +- .../jabref/model/entry/identifier/DOI.java | 7 +++-- 4 files changed, 26 insertions(+), 14 deletions(-) rename src/main/java/org/jabref/logic/integrity/{DOIValidityChecker.java => DoiValidityChecker.java} (90%) diff --git a/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java b/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java index 2a6b0c47b05..69063532631 100644 --- a/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java +++ b/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java @@ -1,20 +1,24 @@ package org.jabref.logic.integrity; +import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Objects; -import java.util.Optional; -import org.jabref.model.database.BibDatabase; +import javafx.collections.ObservableList; +import org.jabref.logic.l10n.Localization; +import org.jabref.model.database.BibDatabase; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.StandardField; +import org.jabref.model.entry.identifier.DOI; -public class DoiDuplicationChecker implements Checker { +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +public class DoiDuplicationChecker implements Checker { private final BibDatabase database; private Map> errors; @@ -27,10 +31,18 @@ public List check(BibEntry entry) { if (errors == null) { errors = new HashMap<>(); - BibEntry entry; - Optional field = entry.getField(StandardField.DOI).map(doi -> doi.toLowerCase(Locale.ENGLISH)); - - //database.getEntries() + ObservableList bibEntries = database.getEntries(); + BiMap> duplicateMap = HashBiMap.create(bibEntries.size()); + bibEntries.stream().filter(item -> item.hasField(StandardField.DOI)).forEach(item -> { + duplicateMap.computeIfAbsent(item.getDOI().get(), doi -> new ArrayList<>()).add(item); + }); + + BiMap, DOI> invertedMap = duplicateMap.inverse(); + invertedMap.keySet().stream().filter(list -> list.size() > 1).forEach(itemList -> itemList.forEach(item -> { + // TODO add entries that have the same DOI, better error message, oder flatMap + IntegrityMessage errorMessage = new IntegrityMessage(Localization.lang("Duplicate DOI"), item, StandardField.DOI); + errors.put(item, List.of(errorMessage)); + })); } return errors.getOrDefault(entry, Collections.emptyList()); } diff --git a/src/main/java/org/jabref/logic/integrity/DOIValidityChecker.java b/src/main/java/org/jabref/logic/integrity/DoiValidityChecker.java similarity index 90% rename from src/main/java/org/jabref/logic/integrity/DOIValidityChecker.java rename to src/main/java/org/jabref/logic/integrity/DoiValidityChecker.java index 09c144a087f..a78c8b4d0ea 100644 --- a/src/main/java/org/jabref/logic/integrity/DOIValidityChecker.java +++ b/src/main/java/org/jabref/logic/integrity/DoiValidityChecker.java @@ -6,8 +6,7 @@ import org.jabref.model.entry.identifier.DOI; import org.jabref.model.strings.StringUtil; -public class DOIValidityChecker implements ValueChecker { - +public class DoiValidityChecker implements ValueChecker { @Override public Optional checkValue(String value) { if (StringUtil.isBlank(value)) { diff --git a/src/main/java/org/jabref/logic/integrity/FieldCheckers.java b/src/main/java/org/jabref/logic/integrity/FieldCheckers.java index c1aa8df913b..519bdb5a049 100644 --- a/src/main/java/org/jabref/logic/integrity/FieldCheckers.java +++ b/src/main/java/org/jabref/logic/integrity/FieldCheckers.java @@ -40,7 +40,7 @@ private static Multimap getAllMap(BibDatabaseContext databa fieldCheckers.put(StandardField.BOOKTITLE, new BooktitleChecker()); fieldCheckers.put(StandardField.TITLE, new BracketChecker()); fieldCheckers.put(StandardField.TITLE, new TitleChecker(databaseContext)); - fieldCheckers.put(StandardField.DOI, new DOIValidityChecker()); + fieldCheckers.put(StandardField.DOI, new DoiValidityChecker()); fieldCheckers.put(StandardField.EDITION, new EditionChecker(databaseContext, allowIntegerEdition)); fieldCheckers.put(StandardField.FILE, new FileChecker(databaseContext, filePreferences)); fieldCheckers.put(StandardField.HOWPUBLISHED, new HowPublishedChecker(databaseContext)); diff --git a/src/main/java/org/jabref/model/entry/identifier/DOI.java b/src/main/java/org/jabref/model/entry/identifier/DOI.java index 765710d390d..742d4460430 100644 --- a/src/main/java/org/jabref/model/entry/identifier/DOI.java +++ b/src/main/java/org/jabref/model/entry/identifier/DOI.java @@ -2,6 +2,7 @@ import java.net.URI; import java.net.URISyntaxException; +import java.util.Locale; import java.util.Objects; import java.util.Optional; import java.util.regex.Matcher; @@ -240,12 +241,12 @@ public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) { return false; } - DOI doi1 = (DOI) o; - return doi.equalsIgnoreCase(doi1.doi); + DOI other = (DOI) o; + return doi.equalsIgnoreCase(other.doi); } @Override public int hashCode() { - return Objects.hash(doi); + return Objects.hash(doi.toLowerCase(Locale.ENGLISH)); } } From 9b46f8597fa16a1d03f9cd73d11b196844a336a3 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Tue, 21 Apr 2020 23:47:17 +0200 Subject: [PATCH 05/19] Flatmap --- .../logic/integrity/DoiDuplicationChecker.java | 12 +++++++----- src/main/resources/l10n/JabRef_en.properties | 1 + 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java b/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java index 69063532631..2f014437d53 100644 --- a/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java +++ b/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java @@ -38,11 +38,13 @@ public List check(BibEntry entry) { }); BiMap, DOI> invertedMap = duplicateMap.inverse(); - invertedMap.keySet().stream().filter(list -> list.size() > 1).forEach(itemList -> itemList.forEach(item -> { - // TODO add entries that have the same DOI, better error message, oder flatMap - IntegrityMessage errorMessage = new IntegrityMessage(Localization.lang("Duplicate DOI"), item, StandardField.DOI); - errors.put(item, List.of(errorMessage)); - })); + invertedMap.keySet().stream() + .filter(list -> list.size() > 1) + .flatMap(list -> list.stream()) + .forEach(item -> { + IntegrityMessage errorMessage = new IntegrityMessage(Localization.lang("Unique DOI used in multiple entries"), item, StandardField.DOI); + errors.put(item, List.of(errorMessage)); + }); } return errors.getOrDefault(entry, Collections.emptyList()); } diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index 777acd7b11c..677ce8f239d 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -1305,6 +1305,7 @@ Copy\ title=Copy title Copy\ \\cite{BibTeX\ key}=Copy \\cite{BibTeX key} Copy\ BibTeX\ key\ and\ title=Copy BibTeX key and title Invalid\ DOI\:\ '%0'.=Invalid DOI: '%0'. +Unique\ DOI\ used\ in\ multiple\ entries.=Unique DOI used in multiple entries. should\ start\ with\ a\ name=should start with a name should\ end\ with\ a\ name=should end with a name unexpected\ closing\ curly\ bracket=unexpected closing curly bracket From ae89990cbc20b1caf105477e5ef500ec3fd44820 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Tue, 21 Apr 2020 23:55:30 +0200 Subject: [PATCH 06/19] Fix checkstyle --- src/main/java/org/jabref/logic/integrity/Checker.java | 4 ++-- .../java/org/jabref/logic/integrity/IntegrityCheck.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/jabref/logic/integrity/Checker.java b/src/main/java/org/jabref/logic/integrity/Checker.java index d9e9b9f7312..9fb70248001 100644 --- a/src/main/java/org/jabref/logic/integrity/Checker.java +++ b/src/main/java/org/jabref/logic/integrity/Checker.java @@ -1,9 +1,9 @@ package org.jabref.logic.integrity; -import org.jabref.model.entry.BibEntry; - import java.util.List; +import org.jabref.model.entry.BibEntry; + @FunctionalInterface public interface Checker { List check(BibEntry entry); diff --git a/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java b/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java index 17add523118..7d7c5784e5c 100644 --- a/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java +++ b/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java @@ -1,5 +1,9 @@ package org.jabref.logic.integrity; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + import org.jabref.logic.bibtexkeypattern.BibtexKeyPatternPreferences; import org.jabref.logic.journals.JournalAbbreviationRepository; import org.jabref.model.database.BibDatabaseContext; @@ -7,10 +11,6 @@ import org.jabref.model.entry.field.StandardField; import org.jabref.model.metadata.FilePreferences; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - public class IntegrityCheck { private final BibDatabaseContext bibDatabaseContext; From 006c24187326b2cf1ccf8d85e3122fd643a94095 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Wed, 22 Apr 2020 00:03:11 +0200 Subject: [PATCH 07/19] Remove obsolete . --- src/main/resources/l10n/JabRef_en.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index 677ce8f239d..37ff4d9b151 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -1305,7 +1305,7 @@ Copy\ title=Copy title Copy\ \\cite{BibTeX\ key}=Copy \\cite{BibTeX key} Copy\ BibTeX\ key\ and\ title=Copy BibTeX key and title Invalid\ DOI\:\ '%0'.=Invalid DOI: '%0'. -Unique\ DOI\ used\ in\ multiple\ entries.=Unique DOI used in multiple entries. +Unique\ DOI\ used\ in\ multiple\ entries=Unique DOI used in multiple entries should\ start\ with\ a\ name=should start with a name should\ end\ with\ a\ name=should end with a name unexpected\ closing\ curly\ bracket=unexpected closing curly bracket From b3e703bff6f3ba0960ad590e12839494e37f8896 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Wed, 22 Apr 2020 00:12:15 +0200 Subject: [PATCH 08/19] Add CHANGELOG.md entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d363c184f3..25d70d663c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve - We added support for basic markdown in custom formatted previews [#6194](https://github.com/JabRef/jabref/issues/6194) - We now show the number of items found and selected to import in the online search dialog. [#6248](https://github.com/JabRef/jabref/pull/6248) - We created a new install screen for macOS. [#5759](https://github.com/JabRef/jabref/issues/5759) +- We added a new integrity check for duplicate DOIs. [koppor#339](https://github.com/koppor/jabref/issues/339) ### Changed From 2c00e7de4615edf6e59f7d3ed925070d9676befc Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Wed, 22 Apr 2020 00:19:20 +0200 Subject: [PATCH 09/19] Fix tests by using "old school" for loop with appropriate Optional check --- .../integrity/DoiDuplicationChecker.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java b/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java index 2f014437d53..16c14fb1fa2 100644 --- a/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java +++ b/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java @@ -33,18 +33,18 @@ public List check(BibEntry entry) { ObservableList bibEntries = database.getEntries(); BiMap> duplicateMap = HashBiMap.create(bibEntries.size()); - bibEntries.stream().filter(item -> item.hasField(StandardField.DOI)).forEach(item -> { - duplicateMap.computeIfAbsent(item.getDOI().get(), doi -> new ArrayList<>()).add(item); - }); - - BiMap, DOI> invertedMap = duplicateMap.inverse(); - invertedMap.keySet().stream() - .filter(list -> list.size() > 1) - .flatMap(list -> list.stream()) - .forEach(item -> { - IntegrityMessage errorMessage = new IntegrityMessage(Localization.lang("Unique DOI used in multiple entries"), item, StandardField.DOI); - errors.put(item, List.of(errorMessage)); - }); + for (BibEntry bibEntry : bibEntries) { + bibEntry.getDOI().ifPresent(doi -> + duplicateMap.computeIfAbsent(doi, x -> new ArrayList<>()).add(bibEntry)); + } + + duplicateMap.inverse().keySet().stream() + .filter(list -> list.size() > 1) + .flatMap(list -> list.stream()) + .forEach(item -> { + IntegrityMessage errorMessage = new IntegrityMessage(Localization.lang("Unique DOI used in multiple entries"), item, StandardField.DOI); + errors.put(item, List.of(errorMessage)); + }); } return errors.getOrDefault(entry, Collections.emptyList()); } From fd7621db9cc87c2d2a82e8dfab3d8ee055a17a68 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Thu, 23 Apr 2020 05:52:59 +0200 Subject: [PATCH 10/19] Rearrange code (to make it more readable) --- .../integrity/DoiDuplicationChecker.java | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java b/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java index 16c14fb1fa2..892288b4b2c 100644 --- a/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java +++ b/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java @@ -24,28 +24,33 @@ public class DoiDuplicationChecker implements Checker { public DoiDuplicationChecker(BibDatabase database) { this.database = Objects.requireNonNull(database); + // There is no interface for the check of the complete database. + // A duplication check needs the knowledge of the **other** entries. + // The method "check" is called for each **entry**, thus walk through all entries only once + fillErrorMap(); } @Override public List check(BibEntry entry) { - if (errors == null) { - errors = new HashMap<>(); - - ObservableList bibEntries = database.getEntries(); - BiMap> duplicateMap = HashBiMap.create(bibEntries.size()); - for (BibEntry bibEntry : bibEntries) { - bibEntry.getDOI().ifPresent(doi -> - duplicateMap.computeIfAbsent(doi, x -> new ArrayList<>()).add(bibEntry)); - } - - duplicateMap.inverse().keySet().stream() - .filter(list -> list.size() > 1) - .flatMap(list -> list.stream()) - .forEach(item -> { - IntegrityMessage errorMessage = new IntegrityMessage(Localization.lang("Unique DOI used in multiple entries"), item, StandardField.DOI); - errors.put(item, List.of(errorMessage)); - }); - } return errors.getOrDefault(entry, Collections.emptyList()); } + + private void fillErrorMap() { + errors = new HashMap<>(); + + ObservableList bibEntries = database.getEntries(); + BiMap> duplicateMap = HashBiMap.create(bibEntries.size()); + for (BibEntry bibEntry : bibEntries) { + bibEntry.getDOI().ifPresent(doi -> + duplicateMap.computeIfAbsent(doi, x -> new ArrayList<>()).add(bibEntry)); + } + + duplicateMap.inverse().keySet().stream() + .filter(list -> list.size() > 1) + .flatMap(list -> list.stream()) + .forEach(item -> { + IntegrityMessage errorMessage = new IntegrityMessage(Localization.lang("Unique DOI used in multiple entries"), item, StandardField.DOI); + errors.put(item, List.of(errorMessage)); + }); + } } From 03dd2a0b59a63c17460a74cd12aa205edc628aad Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Thu, 23 Apr 2020 06:09:14 +0200 Subject: [PATCH 11/19] Create List of checkers at the contructor --- .../logic/integrity/IntegrityCheck.java | 94 ++++++------------- 1 file changed, 30 insertions(+), 64 deletions(-) diff --git a/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java b/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java index 7d7c5784e5c..ed040d09593 100644 --- a/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java +++ b/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java @@ -1,8 +1,8 @@ package org.jabref.logic.integrity; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; -import java.util.Objects; import org.jabref.logic.bibtexkeypattern.BibtexKeyPatternPreferences; import org.jabref.logic.journals.JournalAbbreviationRepository; @@ -14,24 +14,8 @@ public class IntegrityCheck { private final BibDatabaseContext bibDatabaseContext; - private final FilePreferences filePreferences; - private final BibtexKeyPatternPreferences bibtexKeyPatternPreferences; - private final JournalAbbreviationRepository journalAbbreviationRepository; - private final boolean enforceLegalKey; - private final boolean allowIntegerEdition; - private ASCIICharacterChecker asciiCharacterChecker; - private NoBibtexFieldChecker noBibtexFieldChecker; - private BibTeXEntryTypeChecker bibTeXEntryTypeChecker; - private BibtexKeyChecker bibtexKeyChecker; - private TypeChecker typeChecker; - private BibStringChecker bibStringChecker; - private HTMLCharacterChecker htmlCharacterChecker; - private EntryLinkChecker entryLinkChecker; - private BibtexkeyDeviationChecker bibtexkeyDeviationChecker; - private BibtexKeyDuplicationChecker bibtexKeyDuplicationChecker; - private JournalInAbbreviationListChecker journalInAbbreviationListChecker; - private FieldCheckers fieldCheckers; - private DoiDuplicationChecker doiDuplicationChecker; + private final FieldCheckers fieldCheckers; + private final List entryCheckers; public IntegrityCheck(BibDatabaseContext bibDatabaseContext, FilePreferences filePreferences, @@ -39,39 +23,35 @@ public IntegrityCheck(BibDatabaseContext bibDatabaseContext, JournalAbbreviationRepository journalAbbreviationRepository, boolean enforceLegalKey, boolean allowIntegerEdition) { - this.bibDatabaseContext = Objects.requireNonNull(bibDatabaseContext); - this.filePreferences = Objects.requireNonNull(filePreferences); - this.bibtexKeyPatternPreferences = Objects.requireNonNull(bibtexKeyPatternPreferences); - this.journalAbbreviationRepository = Objects.requireNonNull(journalAbbreviationRepository); - this.enforceLegalKey = enforceLegalKey; - this.allowIntegerEdition = allowIntegerEdition; - initCheckers(bibDatabaseContext, bibtexKeyPatternPreferences, journalAbbreviationRepository); - } - - private void initCheckers(BibDatabaseContext bibDatabaseContext, BibtexKeyPatternPreferences bibtexKeyPatternPreferences, JournalAbbreviationRepository journalAbbreviationRepository) { - asciiCharacterChecker = new ASCIICharacterChecker(); - noBibtexFieldChecker = new NoBibtexFieldChecker(); - bibTeXEntryTypeChecker = new BibTeXEntryTypeChecker(); - bibtexKeyChecker = new BibtexKeyChecker(); - typeChecker = new TypeChecker(); - bibStringChecker = new BibStringChecker(); - htmlCharacterChecker = new HTMLCharacterChecker(); - entryLinkChecker = new EntryLinkChecker(bibDatabaseContext.getDatabase()); - bibtexkeyDeviationChecker = new BibtexkeyDeviationChecker(bibDatabaseContext, bibtexKeyPatternPreferences); - bibtexKeyDuplicationChecker = new BibtexKeyDuplicationChecker(bibDatabaseContext.getDatabase()); - doiDuplicationChecker = new DoiDuplicationChecker(bibDatabaseContext.getDatabase()); - - if (bibDatabaseContext.isBiblatexMode()) { - journalInAbbreviationListChecker = new JournalInAbbreviationListChecker(StandardField.JOURNALTITLE, journalAbbreviationRepository); - } else { - journalInAbbreviationListChecker = new JournalInAbbreviationListChecker(StandardField.JOURNAL, journalAbbreviationRepository); - } + this.bibDatabaseContext = bibDatabaseContext; fieldCheckers = new FieldCheckers(bibDatabaseContext, filePreferences, journalAbbreviationRepository, enforceLegalKey, allowIntegerEdition); + + entryCheckers = Arrays.asList( + new BibtexKeyChecker(), + new TypeChecker(), + new BibStringChecker(), + new HTMLCharacterChecker(), + new EntryLinkChecker(bibDatabaseContext.getDatabase()), + new BibtexkeyDeviationChecker(bibDatabaseContext, bibtexKeyPatternPreferences), + new BibtexKeyDuplicationChecker(bibDatabaseContext.getDatabase()), + new DoiDuplicationChecker(bibDatabaseContext.getDatabase()) + ); + + if (!bibDatabaseContext.isBiblatexMode()) { + entryCheckers.add(new JournalInAbbreviationListChecker(StandardField.JOURNALTITLE, journalAbbreviationRepository)); + } else { + entryCheckers.addAll(List.of( + new JournalInAbbreviationListChecker(StandardField.JOURNAL, journalAbbreviationRepository), + new ASCIICharacterChecker(), + new NoBibtexFieldChecker(), + new BibTeXEntryTypeChecker()) + ); + } } List checkDatabase() { @@ -86,32 +66,18 @@ List checkDatabase() { public List checkEntry(BibEntry entry) { List result = new ArrayList<>(); - if (entry == null) { return result; } - for (FieldChecker checker : fieldCheckers.getAll()) { - result.addAll(checker.check(entry)); + for (FieldChecker fieldChecker : fieldCheckers.getAll()) { + result.addAll(fieldChecker.check(entry)); } - if (!bibDatabaseContext.isBiblatexMode()) { - // BibTeX only checkers - result.addAll(asciiCharacterChecker.check(entry)); - result.addAll(noBibtexFieldChecker.check(entry)); - result.addAll(bibTeXEntryTypeChecker.check(entry)); + for (Checker entryChecker : entryCheckers) { + result.addAll(entryChecker.check(entry)); } - result.addAll(journalInAbbreviationListChecker.check(entry)); - result.addAll(bibtexKeyChecker.check(entry)); - result.addAll(typeChecker.check(entry)); - result.addAll(bibStringChecker.check(entry)); - result.addAll(htmlCharacterChecker.check(entry)); - result.addAll(entryLinkChecker.check(entry)); - result.addAll(bibtexkeyDeviationChecker.check(entry)); - result.addAll(bibtexKeyDuplicationChecker.check(entry)); - result.addAll(doiDuplicationChecker.check(entry)); - return result; } } From 6f9b14812976b8b70abacada1c670dd318a307f3 Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Thu, 23 Apr 2020 06:10:04 +0200 Subject: [PATCH 12/19] Fix variable name --- .../java/org/jabref/logic/integrity/DoiDuplicationChecker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java b/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java index 892288b4b2c..dc314702bae 100644 --- a/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java +++ b/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java @@ -42,7 +42,7 @@ private void fillErrorMap() { BiMap> duplicateMap = HashBiMap.create(bibEntries.size()); for (BibEntry bibEntry : bibEntries) { bibEntry.getDOI().ifPresent(doi -> - duplicateMap.computeIfAbsent(doi, x -> new ArrayList<>()).add(bibEntry)); + duplicateMap.computeIfAbsent(doi, absentDoi -> new ArrayList<>()).add(bibEntry)); } duplicateMap.inverse().keySet().stream() From 2de185810040146b1d79a9074020f3d54471340c Mon Sep 17 00:00:00 2001 From: Jonas Moosmann Date: Thu, 23 Apr 2020 12:03:28 +0200 Subject: [PATCH 13/19] add new interface DatabaseChecker Co-authored-by: Oliver Kopp --- .../gui/integrity/IntegrityCheckAction.java | 1 + .../logic/integrity/DatabaseChecker.java | 9 +++++ .../integrity/DoiDuplicationChecker.java | 37 ++++--------------- .../logic/integrity/IntegrityCheck.java | 20 +++++++--- .../logic/integrity/IntegrityCheckTest.java | 8 ++-- 5 files changed, 36 insertions(+), 39 deletions(-) create mode 100644 src/main/java/org/jabref/logic/integrity/DatabaseChecker.java diff --git a/src/main/java/org/jabref/gui/integrity/IntegrityCheckAction.java b/src/main/java/org/jabref/gui/integrity/IntegrityCheckAction.java index a5a9fe324b6..f529cae19b1 100644 --- a/src/main/java/org/jabref/gui/integrity/IntegrityCheckAction.java +++ b/src/main/java/org/jabref/gui/integrity/IntegrityCheckAction.java @@ -54,6 +54,7 @@ protected List call() { List result = new ArrayList<>(); ObservableList entries = database.getDatabase().getEntries(); + result.addAll(check.checkDatabase(database.getDatabase())); for (int i = 0; i < entries.size(); i++) { if (isCancelled()) { break; diff --git a/src/main/java/org/jabref/logic/integrity/DatabaseChecker.java b/src/main/java/org/jabref/logic/integrity/DatabaseChecker.java new file mode 100644 index 00000000000..ac2a009269d --- /dev/null +++ b/src/main/java/org/jabref/logic/integrity/DatabaseChecker.java @@ -0,0 +1,9 @@ +package org.jabref.logic.integrity; + +import java.util.List; + +import org.jabref.model.database.BibDatabase; + +public interface DatabaseChecker { + List check(BibDatabase database); +} diff --git a/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java b/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java index dc314702bae..954d3322adb 100644 --- a/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java +++ b/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java @@ -1,11 +1,8 @@ package org.jabref.logic.integrity; import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.stream.Collectors; import javafx.collections.ObservableList; @@ -18,26 +15,10 @@ import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; -public class DoiDuplicationChecker implements Checker { - private final BibDatabase database; - private Map> errors; - - public DoiDuplicationChecker(BibDatabase database) { - this.database = Objects.requireNonNull(database); - // There is no interface for the check of the complete database. - // A duplication check needs the knowledge of the **other** entries. - // The method "check" is called for each **entry**, thus walk through all entries only once - fillErrorMap(); - } +public class DoiDuplicationChecker implements DatabaseChecker { @Override - public List check(BibEntry entry) { - return errors.getOrDefault(entry, Collections.emptyList()); - } - - private void fillErrorMap() { - errors = new HashMap<>(); - + public List check(BibDatabase database) { ObservableList bibEntries = database.getEntries(); BiMap> duplicateMap = HashBiMap.create(bibEntries.size()); for (BibEntry bibEntry : bibEntries) { @@ -45,12 +26,10 @@ private void fillErrorMap() { duplicateMap.computeIfAbsent(doi, absentDoi -> new ArrayList<>()).add(bibEntry)); } - duplicateMap.inverse().keySet().stream() - .filter(list -> list.size() > 1) - .flatMap(list -> list.stream()) - .forEach(item -> { - IntegrityMessage errorMessage = new IntegrityMessage(Localization.lang("Unique DOI used in multiple entries"), item, StandardField.DOI); - errors.put(item, List.of(errorMessage)); - }); + return duplicateMap.inverse().keySet().stream() + .filter(list -> list.size() > 1) + .flatMap(list -> list.stream()) + .map(item -> new IntegrityMessage(Localization.lang("Unique DOI used in multiple entries"), item, StandardField.DOI)) + .collect(Collectors.toList()); } } diff --git a/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java b/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java index ed040d09593..6fe47fc0608 100644 --- a/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java +++ b/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java @@ -6,6 +6,7 @@ import org.jabref.logic.bibtexkeypattern.BibtexKeyPatternPreferences; import org.jabref.logic.journals.JournalAbbreviationRepository; +import org.jabref.model.database.BibDatabase; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.StandardField; @@ -31,16 +32,15 @@ public IntegrityCheck(BibDatabaseContext bibDatabaseContext, enforceLegalKey, allowIntegerEdition); - entryCheckers = Arrays.asList( + entryCheckers = new ArrayList<>(List.of( new BibtexKeyChecker(), new TypeChecker(), new BibStringChecker(), new HTMLCharacterChecker(), new EntryLinkChecker(bibDatabaseContext.getDatabase()), new BibtexkeyDeviationChecker(bibDatabaseContext, bibtexKeyPatternPreferences), - new BibtexKeyDuplicationChecker(bibDatabaseContext.getDatabase()), - new DoiDuplicationChecker(bibDatabaseContext.getDatabase()) - ); + new BibtexKeyDuplicationChecker(bibDatabaseContext.getDatabase()) + )); if (!bibDatabaseContext.isBiblatexMode()) { entryCheckers.add(new JournalInAbbreviationListChecker(StandardField.JOURNALTITLE, journalAbbreviationRepository)); @@ -54,13 +54,17 @@ public IntegrityCheck(BibDatabaseContext bibDatabaseContext, } } - List checkDatabase() { + List executeAllCheckers() { List result = new ArrayList<>(); - for (BibEntry entry : bibDatabaseContext.getDatabase().getEntries()) { + BibDatabase database = bibDatabaseContext.getDatabase(); + + for (BibEntry entry : database.getEntries()) { result.addAll(checkEntry(entry)); } + result.addAll(checkDatabase(database)); + return result; } @@ -80,4 +84,8 @@ public List checkEntry(BibEntry entry) { return result; } + + public List checkDatabase(BibDatabase database) { + return new DoiDuplicationChecker().check(database); + } } diff --git a/src/test/java/org/jabref/logic/integrity/IntegrityCheckTest.java b/src/test/java/org/jabref/logic/integrity/IntegrityCheckTest.java index 6f2a4a62009..99d9d9a184e 100644 --- a/src/test/java/org/jabref/logic/integrity/IntegrityCheckTest.java +++ b/src/test/java/org/jabref/logic/integrity/IntegrityCheckTest.java @@ -369,7 +369,7 @@ void testEntryIsUnchangedAfterChecks() { mock(FilePreferences.class), createBibtexKeyPatternPreferences(), new JournalAbbreviationRepository(new Abbreviation("IEEE Software", "IEEE SW")), true, false) - .checkDatabase(); + .executeAllCheckers(); assertEquals(clonedEntry, entry); } @@ -409,7 +409,7 @@ private void assertWrong(BibDatabaseContext context) { mock(FilePreferences.class), createBibtexKeyPatternPreferences(), new JournalAbbreviationRepository(new Abbreviation("IEEE Software", "IEEE SW")), true, false) - .checkDatabase(); + .executeAllCheckers(); assertNotEquals(Collections.emptyList(), messages); } @@ -418,7 +418,7 @@ private void assertCorrect(BibDatabaseContext context) { mock(FilePreferences.class), createBibtexKeyPatternPreferences(), new JournalAbbreviationRepository(new Abbreviation("IEEE Software", "IEEE SW")), true, false - ).checkDatabase(); + ).executeAllCheckers(); assertEquals(Collections.emptyList(), messages); } @@ -428,7 +428,7 @@ private void assertCorrect(BibDatabaseContext context, boolean allowIntegerEditi createBibtexKeyPatternPreferences(), new JournalAbbreviationRepository(new Abbreviation("IEEE Software", "IEEE SW")), true, allowIntegerEdition - ).checkDatabase(); + ).executeAllCheckers(); assertEquals(Collections.emptyList(), messages); } From 4c9e687a0f2181704ba08f0eff9edbabe17a6971 Mon Sep 17 00:00:00 2001 From: Jonas Moosmann Date: Thu, 23 Apr 2020 12:07:48 +0200 Subject: [PATCH 14/19] Add FunctionalInterface annotation to DatabaseChecker Co-authored-by: Oliver Kopp --- src/main/java/org/jabref/logic/integrity/DatabaseChecker.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/jabref/logic/integrity/DatabaseChecker.java b/src/main/java/org/jabref/logic/integrity/DatabaseChecker.java index ac2a009269d..0f03cccce63 100644 --- a/src/main/java/org/jabref/logic/integrity/DatabaseChecker.java +++ b/src/main/java/org/jabref/logic/integrity/DatabaseChecker.java @@ -4,6 +4,7 @@ import org.jabref.model.database.BibDatabase; +@FunctionalInterface public interface DatabaseChecker { List check(BibDatabase database); } From 97b9cbed797fb1fea62f8f8f3c75ae4ed6dd6ffb Mon Sep 17 00:00:00 2001 From: Oliver Kopp Date: Thu, 23 Apr 2020 22:09:21 +0200 Subject: [PATCH 15/19] Move comments --- .../java/org/jabref/logic/integrity/BibStringChecker.java | 6 +++--- .../org/jabref/logic/integrity/HTMLCharacterChecker.java | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/jabref/logic/integrity/BibStringChecker.java b/src/main/java/org/jabref/logic/integrity/BibStringChecker.java index 1f6eeb92512..4bb7c6cc45f 100644 --- a/src/main/java/org/jabref/logic/integrity/BibStringChecker.java +++ b/src/main/java/org/jabref/logic/integrity/BibStringChecker.java @@ -11,14 +11,14 @@ import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.FieldProperty; +/** + * Checks, if there is an even number of unescaped # + */ public class BibStringChecker implements Checker { // Detect # if it doesn't have a \ in front of it or if it starts the string private static final Pattern UNESCAPED_HASH = Pattern.compile("(? check(BibEntry entry) { List results = new ArrayList<>(); diff --git a/src/main/java/org/jabref/logic/integrity/HTMLCharacterChecker.java b/src/main/java/org/jabref/logic/integrity/HTMLCharacterChecker.java index 4ffd96aa19a..caab0ab4425 100644 --- a/src/main/java/org/jabref/logic/integrity/HTMLCharacterChecker.java +++ b/src/main/java/org/jabref/logic/integrity/HTMLCharacterChecker.java @@ -11,13 +11,13 @@ import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.FieldProperty; +/** + * Checks, if there are any HTML encoded characters in nonverbatim fields. + */ public class HTMLCharacterChecker implements Checker { - // Detect any HTML encoded character, + // Detect any HTML encoded character private static final Pattern HTML_CHARACTER_PATTERN = Pattern.compile("&[#\\p{Alnum}]+;"); - /** - * Checks, if there are any HTML encoded characters in nonverbatim fields. - */ @Override public List check(BibEntry entry) { List results = new ArrayList<>(); From eaebdf53011881f70e4b81601f3140cf3f3c84de Mon Sep 17 00:00:00 2001 From: Jonas Moosmann Date: Fri, 15 May 2020 10:22:46 +0200 Subject: [PATCH 16/19] remove unused import --- src/main/java/org/jabref/logic/integrity/IntegrityCheck.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java b/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java index 6fe47fc0608..cbcc2e96e59 100644 --- a/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java +++ b/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java @@ -1,7 +1,6 @@ package org.jabref.logic.integrity; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import org.jabref.logic.bibtexkeypattern.BibtexKeyPatternPreferences; From 6597dc65a790517d9ae4308b707cd16fd9100b19 Mon Sep 17 00:00:00 2001 From: Jonas Moosmann Date: Fri, 15 May 2020 11:01:49 +0200 Subject: [PATCH 17/19] fix filename of DoiValidityCheckerTest --- ...OIValidityCheckerTest.java => DoiValidityCheckerTest.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename src/test/java/org/jabref/logic/integrity/{DOIValidityCheckerTest.java => DoiValidityCheckerTest.java} (89%) diff --git a/src/test/java/org/jabref/logic/integrity/DOIValidityCheckerTest.java b/src/test/java/org/jabref/logic/integrity/DoiValidityCheckerTest.java similarity index 89% rename from src/test/java/org/jabref/logic/integrity/DOIValidityCheckerTest.java rename to src/test/java/org/jabref/logic/integrity/DoiValidityCheckerTest.java index fd0893186c6..f2d74e4d5d8 100644 --- a/src/test/java/org/jabref/logic/integrity/DOIValidityCheckerTest.java +++ b/src/test/java/org/jabref/logic/integrity/DoiValidityCheckerTest.java @@ -7,9 +7,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; -public class DOIValidityCheckerTest { +class DoiValidityCheckerTest { - private final DOIValidityChecker checker = new DOIValidityChecker(); + private final DoiValidityChecker checker = new DoiValidityChecker(); @Test void doiAcceptsValidInput() { From de629d20f902c570dcd7402a93f66ce3eea644b9 Mon Sep 17 00:00:00 2001 From: Jonas Moosmann Date: Fri, 15 May 2020 11:08:00 +0200 Subject: [PATCH 18/19] fix condition --- src/main/java/org/jabref/logic/integrity/IntegrityCheck.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java b/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java index 6d239865f71..6da86e46052 100644 --- a/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java +++ b/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java @@ -39,7 +39,7 @@ public IntegrityCheck(BibDatabaseContext bibDatabaseContext, new BibtexKeyDuplicationChecker(bibDatabaseContext.getDatabase()) )); - if (!bibDatabaseContext.isBiblatexMode()) { + if (bibDatabaseContext.isBiblatexMode()) { entryCheckers.add(new JournalInAbbreviationListChecker(StandardField.JOURNALTITLE, journalAbbreviationRepository)); } else { entryCheckers.addAll(List.of( From 5a5046c32592a979659d1ece339f1fb6b727ee8c Mon Sep 17 00:00:00 2001 From: Jonas Moosmann Date: Fri, 15 May 2020 11:22:02 +0200 Subject: [PATCH 19/19] address comments --- .../org/jabref/logic/integrity/ASCIICharacterChecker.java | 2 +- .../java/org/jabref/logic/integrity/BibStringChecker.java | 2 +- .../jabref/logic/integrity/BibTeXEntryTypeChecker.java | 2 +- .../java/org/jabref/logic/integrity/BibtexKeyChecker.java | 2 +- .../logic/integrity/BibtexKeyDuplicationChecker.java | 2 +- .../jabref/logic/integrity/BibtexkeyDeviationChecker.java | 2 +- .../org/jabref/logic/integrity/DoiDuplicationChecker.java | 2 +- .../logic/integrity/{Checker.java => EntryChecker.java} | 2 +- .../java/org/jabref/logic/integrity/EntryLinkChecker.java | 2 +- .../java/org/jabref/logic/integrity/FieldChecker.java | 2 +- .../org/jabref/logic/integrity/HTMLCharacterChecker.java | 2 +- .../java/org/jabref/logic/integrity/IntegrityCheck.java | 6 +++--- .../logic/integrity/JournalInAbbreviationListChecker.java | 2 +- .../org/jabref/logic/integrity/NoBibtexFieldChecker.java | 2 +- src/main/java/org/jabref/logic/integrity/TypeChecker.java | 2 +- src/main/resources/l10n/JabRef_en.properties | 2 +- .../org/jabref/logic/integrity/IntegrityCheckTest.java | 8 ++++---- 17 files changed, 22 insertions(+), 22 deletions(-) rename src/main/java/org/jabref/logic/integrity/{Checker.java => EntryChecker.java} (84%) diff --git a/src/main/java/org/jabref/logic/integrity/ASCIICharacterChecker.java b/src/main/java/org/jabref/logic/integrity/ASCIICharacterChecker.java index 1e136fe30a9..4072b35b8b9 100644 --- a/src/main/java/org/jabref/logic/integrity/ASCIICharacterChecker.java +++ b/src/main/java/org/jabref/logic/integrity/ASCIICharacterChecker.java @@ -10,7 +10,7 @@ import com.google.common.base.CharMatcher; -public class ASCIICharacterChecker implements Checker { +public class ASCIICharacterChecker implements EntryChecker { /** * Detect any non ASCII encoded characters, e.g., umlauts or unicode in the fields diff --git a/src/main/java/org/jabref/logic/integrity/BibStringChecker.java b/src/main/java/org/jabref/logic/integrity/BibStringChecker.java index 4bb7c6cc45f..acae104f885 100644 --- a/src/main/java/org/jabref/logic/integrity/BibStringChecker.java +++ b/src/main/java/org/jabref/logic/integrity/BibStringChecker.java @@ -14,7 +14,7 @@ /** * Checks, if there is an even number of unescaped # */ -public class BibStringChecker implements Checker { +public class BibStringChecker implements EntryChecker { // Detect # if it doesn't have a \ in front of it or if it starts the string private static final Pattern UNESCAPED_HASH = Pattern.compile("(? check(BibEntry entry) { diff --git a/src/main/java/org/jabref/logic/integrity/BibtexKeyDuplicationChecker.java b/src/main/java/org/jabref/logic/integrity/BibtexKeyDuplicationChecker.java index 052e17e074d..7048fc51409 100644 --- a/src/main/java/org/jabref/logic/integrity/BibtexKeyDuplicationChecker.java +++ b/src/main/java/org/jabref/logic/integrity/BibtexKeyDuplicationChecker.java @@ -10,7 +10,7 @@ import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.StandardField; -public class BibtexKeyDuplicationChecker implements Checker { +public class BibtexKeyDuplicationChecker implements EntryChecker { private final BibDatabase database; diff --git a/src/main/java/org/jabref/logic/integrity/BibtexkeyDeviationChecker.java b/src/main/java/org/jabref/logic/integrity/BibtexkeyDeviationChecker.java index 0b82884f749..63098089203 100644 --- a/src/main/java/org/jabref/logic/integrity/BibtexkeyDeviationChecker.java +++ b/src/main/java/org/jabref/logic/integrity/BibtexkeyDeviationChecker.java @@ -12,7 +12,7 @@ import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.InternalField; -public class BibtexkeyDeviationChecker implements Checker { +public class BibtexkeyDeviationChecker implements EntryChecker { private final BibDatabaseContext bibDatabaseContext; private final BibtexKeyPatternPreferences bibtexKeyPatternPreferences; diff --git a/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java b/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java index 954d3322adb..41dfcdfba1a 100644 --- a/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java +++ b/src/main/java/org/jabref/logic/integrity/DoiDuplicationChecker.java @@ -29,7 +29,7 @@ public List check(BibDatabase database) { return duplicateMap.inverse().keySet().stream() .filter(list -> list.size() > 1) .flatMap(list -> list.stream()) - .map(item -> new IntegrityMessage(Localization.lang("Unique DOI used in multiple entries"), item, StandardField.DOI)) + .map(item -> new IntegrityMessage(Localization.lang("Same DOI used in multiple entries"), item, StandardField.DOI)) .collect(Collectors.toList()); } } diff --git a/src/main/java/org/jabref/logic/integrity/Checker.java b/src/main/java/org/jabref/logic/integrity/EntryChecker.java similarity index 84% rename from src/main/java/org/jabref/logic/integrity/Checker.java rename to src/main/java/org/jabref/logic/integrity/EntryChecker.java index 9fb70248001..bcbe0e79769 100644 --- a/src/main/java/org/jabref/logic/integrity/Checker.java +++ b/src/main/java/org/jabref/logic/integrity/EntryChecker.java @@ -5,6 +5,6 @@ import org.jabref.model.entry.BibEntry; @FunctionalInterface -public interface Checker { +public interface EntryChecker { List check(BibEntry entry); } diff --git a/src/main/java/org/jabref/logic/integrity/EntryLinkChecker.java b/src/main/java/org/jabref/logic/integrity/EntryLinkChecker.java index 4cc19dd5b61..7df582d309c 100644 --- a/src/main/java/org/jabref/logic/integrity/EntryLinkChecker.java +++ b/src/main/java/org/jabref/logic/integrity/EntryLinkChecker.java @@ -13,7 +13,7 @@ import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.FieldProperty; -public class EntryLinkChecker implements Checker { +public class EntryLinkChecker implements EntryChecker { private final BibDatabase database; diff --git a/src/main/java/org/jabref/logic/integrity/FieldChecker.java b/src/main/java/org/jabref/logic/integrity/FieldChecker.java index 83db698ca69..1e2fb707895 100644 --- a/src/main/java/org/jabref/logic/integrity/FieldChecker.java +++ b/src/main/java/org/jabref/logic/integrity/FieldChecker.java @@ -9,7 +9,7 @@ import org.jabref.model.entry.field.Field; import org.jabref.model.util.OptionalUtil; -public class FieldChecker implements Checker { +public class FieldChecker implements EntryChecker { protected final Field field; private final ValueChecker checker; diff --git a/src/main/java/org/jabref/logic/integrity/HTMLCharacterChecker.java b/src/main/java/org/jabref/logic/integrity/HTMLCharacterChecker.java index caab0ab4425..d80e30d3e01 100644 --- a/src/main/java/org/jabref/logic/integrity/HTMLCharacterChecker.java +++ b/src/main/java/org/jabref/logic/integrity/HTMLCharacterChecker.java @@ -14,7 +14,7 @@ /** * Checks, if there are any HTML encoded characters in nonverbatim fields. */ -public class HTMLCharacterChecker implements Checker { +public class HTMLCharacterChecker implements EntryChecker { // Detect any HTML encoded character private static final Pattern HTML_CHARACTER_PATTERN = Pattern.compile("&[#\\p{Alnum}]+;"); diff --git a/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java b/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java index 6da86e46052..631c87ba879 100644 --- a/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java +++ b/src/main/java/org/jabref/logic/integrity/IntegrityCheck.java @@ -15,7 +15,7 @@ public class IntegrityCheck { private final BibDatabaseContext bibDatabaseContext; private final FieldCheckers fieldCheckers; - private final List entryCheckers; + private final List entryCheckers; public IntegrityCheck(BibDatabaseContext bibDatabaseContext, FilePreferences filePreferences, @@ -51,7 +51,7 @@ public IntegrityCheck(BibDatabaseContext bibDatabaseContext, } } - List executeAllCheckers() { + List check() { List result = new ArrayList<>(); BibDatabase database = bibDatabaseContext.getDatabase(); @@ -75,7 +75,7 @@ public List checkEntry(BibEntry entry) { result.addAll(fieldChecker.check(entry)); } - for (Checker entryChecker : entryCheckers) { + for (EntryChecker entryChecker : entryCheckers) { result.addAll(entryChecker.check(entry)); } diff --git a/src/main/java/org/jabref/logic/integrity/JournalInAbbreviationListChecker.java b/src/main/java/org/jabref/logic/integrity/JournalInAbbreviationListChecker.java index 360e8c22b6d..d954debab44 100644 --- a/src/main/java/org/jabref/logic/integrity/JournalInAbbreviationListChecker.java +++ b/src/main/java/org/jabref/logic/integrity/JournalInAbbreviationListChecker.java @@ -10,7 +10,7 @@ import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.Field; -public class JournalInAbbreviationListChecker implements Checker { +public class JournalInAbbreviationListChecker implements EntryChecker { private final Field field; private final JournalAbbreviationRepository abbreviationRepository; diff --git a/src/main/java/org/jabref/logic/integrity/NoBibtexFieldChecker.java b/src/main/java/org/jabref/logic/integrity/NoBibtexFieldChecker.java index 6d8c937e8b2..c822a231a0a 100644 --- a/src/main/java/org/jabref/logic/integrity/NoBibtexFieldChecker.java +++ b/src/main/java/org/jabref/logic/integrity/NoBibtexFieldChecker.java @@ -15,7 +15,7 @@ /** * This checker checks whether the entry does not contain any field appearing only in biblatex (and not in BibTeX) */ -public class NoBibtexFieldChecker implements Checker { +public class NoBibtexFieldChecker implements EntryChecker { private Set getAllBiblatexOnlyFields() { Set allBibtexFields = BibtexEntryTypeDefinitions.ALL.stream().flatMap(type -> type.getAllFields().stream()).collect(Collectors.toSet()); diff --git a/src/main/java/org/jabref/logic/integrity/TypeChecker.java b/src/main/java/org/jabref/logic/integrity/TypeChecker.java index 5426d57e938..f26db2a0e06 100644 --- a/src/main/java/org/jabref/logic/integrity/TypeChecker.java +++ b/src/main/java/org/jabref/logic/integrity/TypeChecker.java @@ -9,7 +9,7 @@ import org.jabref.model.entry.field.StandardField; import org.jabref.model.entry.types.StandardEntryType; -public class TypeChecker implements Checker { +public class TypeChecker implements EntryChecker { @Override public List check(BibEntry entry) { diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index 7afaae6382f..d9e9532dd8a 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -1311,7 +1311,7 @@ Copy\ title=Copy title Copy\ \\cite{BibTeX\ key}=Copy \\cite{BibTeX key} Copy\ BibTeX\ key\ and\ title=Copy BibTeX key and title Invalid\ DOI\:\ '%0'.=Invalid DOI: '%0'. -Unique\ DOI\ used\ in\ multiple\ entries=Unique DOI used in multiple entries +Same\ DOI\ used\ in\ multiple\ entries=Same DOI used in multiple entries should\ start\ with\ a\ name=should start with a name should\ end\ with\ a\ name=should end with a name unexpected\ closing\ curly\ bracket=unexpected closing curly bracket diff --git a/src/test/java/org/jabref/logic/integrity/IntegrityCheckTest.java b/src/test/java/org/jabref/logic/integrity/IntegrityCheckTest.java index ccfaf29b74c..1c45d40a5f5 100644 --- a/src/test/java/org/jabref/logic/integrity/IntegrityCheckTest.java +++ b/src/test/java/org/jabref/logic/integrity/IntegrityCheckTest.java @@ -139,7 +139,7 @@ void testEntryIsUnchangedAfterChecks() { mock(FilePreferences.class), createBibtexKeyPatternPreferences(), JournalAbbreviationLoader.loadBuiltInRepository(), false) - .executeAllCheckers(); + .check(); assertEquals(clonedEntry, entry); } @@ -172,7 +172,7 @@ private void assertWrong(BibDatabaseContext context) { mock(FilePreferences.class), createBibtexKeyPatternPreferences(), JournalAbbreviationLoader.loadBuiltInRepository(), false) - .executeAllCheckers(); + .check(); assertNotEquals(Collections.emptyList(), messages); } @@ -181,7 +181,7 @@ private void assertCorrect(BibDatabaseContext context) { mock(FilePreferences.class), createBibtexKeyPatternPreferences(), JournalAbbreviationLoader.loadBuiltInRepository(), false - ).executeAllCheckers(); + ).check(); assertEquals(Collections.emptyList(), messages); } @@ -190,7 +190,7 @@ private void assertCorrect(BibDatabaseContext context, boolean allowIntegerEditi mock(FilePreferences.class), createBibtexKeyPatternPreferences(), JournalAbbreviationLoader.loadBuiltInRepository(), - allowIntegerEdition).executeAllCheckers(); + allowIntegerEdition).check(); assertEquals(Collections.emptyList(), messages); }