From e56cea01578697b70fa645a11bb2e51cebefba50 Mon Sep 17 00:00:00 2001 From: guipmenezes Date: Fri, 4 Aug 2023 15:23:18 -0300 Subject: [PATCH 01/17] Add: implementing the ISSN Fetcher --- .../logic/importer/fetcher/IssnFetcher.java | 49 +++++++++++++++++++ .../jabref/model/entry/identifier/ISSN.java | 2 +- 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java diff --git a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java new file mode 100644 index 00000000000..1bd53ccf6d9 --- /dev/null +++ b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java @@ -0,0 +1,49 @@ +package org.jabref.logic.importer.fetcher; + +import java.net.URI; +import java.util.Optional; + +import org.jabref.logic.importer.FetcherException; +import org.jabref.logic.importer.IdBasedFetcher; +import org.jabref.logic.importer.IdFetcher; +import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.field.Field; +import org.jabref.model.entry.identifier.ISSN; +import org.jabref.model.entry.identifier.Identifier; + +public class IssnFetcher implements Identifier, IdBasedFetcher, IdFetcher { + @Override + public Optional performSearchById(String identifier) throws FetcherException { + return Optional.empty(); + } + + @Override + public Optional findIdentifier(BibEntry entry) throws FetcherException { + return Optional.empty(); + } + + @Override + public String getIdentifierName() { + return null; + } + + @Override + public String getName() { + return null; + } + + @Override + public String getNormalized() { + return null; + } + + @Override + public Field getDefaultField() { + return null; + } + + @Override + public Optional getExternalURI() { + return Optional.empty(); + } +} diff --git a/src/main/java/org/jabref/model/entry/identifier/ISSN.java b/src/main/java/org/jabref/model/entry/identifier/ISSN.java index 5063536eda9..ff7f2c98413 100644 --- a/src/main/java/org/jabref/model/entry/identifier/ISSN.java +++ b/src/main/java/org/jabref/model/entry/identifier/ISSN.java @@ -4,7 +4,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -public class ISSN { +public class ISSN implements Identifier { private static final Pattern ISSN_PATTERN = Pattern.compile("^\\d{4}-\\d{3}[\\dxX]$"); private static final Pattern ISSN_PATTERN_NODASH = Pattern.compile("^(\\d{4})(\\d{3}[\\dxX])$"); From a582067ccf60288d9ea17c953927ae6830ad59c7 Mon Sep 17 00:00:00 2001 From: guipmenezes Date: Fri, 4 Aug 2023 17:08:07 -0300 Subject: [PATCH 02/17] Add: implementing methods of IssnFetcher class --- .../logic/importer/fetcher/IssnFetcher.java | 29 +++++++++++++++---- .../jabref/model/entry/identifier/ISSN.java | 19 ++++++++++++ 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java index 1bd53ccf6d9..49d8987d744 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java @@ -1,6 +1,7 @@ package org.jabref.logic.importer.fetcher; import java.net.URI; +import java.net.URISyntaxException; import java.util.Optional; import org.jabref.logic.importer.FetcherException; @@ -8,13 +9,24 @@ import org.jabref.logic.importer.IdFetcher; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.Field; +import org.jabref.model.entry.field.StandardField; import org.jabref.model.entry.identifier.ISSN; import org.jabref.model.entry.identifier.Identifier; +import org.jabref.model.strings.StringUtil; public class IssnFetcher implements Identifier, IdBasedFetcher, IdFetcher { + + private static ISSN issnIdentifier; @Override public Optional performSearchById(String identifier) throws FetcherException { - return Optional.empty(); + if(StringUtil.isBlank(identifier)) { + return Optional.empty(); + } + Optional bibEntry = Optional.empty(); + + issnIdentifier = new ISSN(identifier); + return bibEntry; //temporary, thinking about the solution + } @Override @@ -24,26 +36,31 @@ public Optional findIdentifier(BibEntry entry) throws FetcherException { @Override public String getIdentifierName() { - return null; + return getName(); } @Override public String getName() { - return null; + return "ISSN"; } @Override public String getNormalized() { - return null; + return issnIdentifier.getNormalized(); } @Override public Field getDefaultField() { - return null; + return StandardField.ISSN; } @Override public Optional getExternalURI() { - return Optional.empty(); + try { + return Optional.of(new URI("https://doaj.org/api/v1/search/articles/" + getNormalized())); + } catch ( + URISyntaxException e) { + return Optional.empty(); + } } } diff --git a/src/main/java/org/jabref/model/entry/identifier/ISSN.java b/src/main/java/org/jabref/model/entry/identifier/ISSN.java index ff7f2c98413..1f60972408c 100644 --- a/src/main/java/org/jabref/model/entry/identifier/ISSN.java +++ b/src/main/java/org/jabref/model/entry/identifier/ISSN.java @@ -1,9 +1,13 @@ package org.jabref.model.entry.identifier; +import java.net.URI; import java.util.Objects; +import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.jabref.model.entry.field.Field; + public class ISSN implements Identifier { private static final Pattern ISSN_PATTERN = Pattern.compile("^\\d{4}-\\d{3}[\\dxX]$"); @@ -48,4 +52,19 @@ public boolean isValidChecksum() { } return ((((sum % 11) + control) - '0') == 11) || ((sum % 11) == 0); } + + @Override + public String getNormalized() { + return issnString; + } + + @Override + public Field getDefaultField() { + return null; + } + + @Override + public Optional getExternalURI() { + return Optional.empty(); + } } From 18ebb1e6595e2d6bbcd3c72547aaa3e45fe690ad Mon Sep 17 00:00:00 2001 From: guipmenezes Date: Mon, 7 Aug 2023 16:19:37 -0300 Subject: [PATCH 03/17] Substantially changes on IssnFetcher class --- .../logic/importer/fetcher/IssnFetcher.java | 32 ++++--------------- 1 file changed, 7 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java index 49d8987d744..8be7f2cc961 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java @@ -1,22 +1,23 @@ package org.jabref.logic.importer.fetcher; -import java.net.URI; -import java.net.URISyntaxException; import java.util.Optional; import org.jabref.logic.importer.FetcherException; import org.jabref.logic.importer.IdBasedFetcher; import org.jabref.logic.importer.IdFetcher; import org.jabref.model.entry.BibEntry; -import org.jabref.model.entry.field.Field; -import org.jabref.model.entry.field.StandardField; import org.jabref.model.entry.identifier.ISSN; -import org.jabref.model.entry.identifier.Identifier; import org.jabref.model.strings.StringUtil; -public class IssnFetcher implements Identifier, IdBasedFetcher, IdFetcher { +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +public class IssnFetcher implements IdBasedFetcher, IdFetcher { + + private static final Logger LOGGER = LoggerFactory.getLogger(IssnFetcher.class); private static ISSN issnIdentifier; + private static final String API_URL = "https://doaj.org/api/v1/search/articles/"; + @Override public Optional performSearchById(String identifier) throws FetcherException { if(StringUtil.isBlank(identifier)) { @@ -44,23 +45,4 @@ public String getName() { return "ISSN"; } - @Override - public String getNormalized() { - return issnIdentifier.getNormalized(); - } - - @Override - public Field getDefaultField() { - return StandardField.ISSN; - } - - @Override - public Optional getExternalURI() { - try { - return Optional.of(new URI("https://doaj.org/api/v1/search/articles/" + getNormalized())); - } catch ( - URISyntaxException e) { - return Optional.empty(); - } - } } From 7d87a318cc9df5c2e37b9197db32928067130ac2 Mon Sep 17 00:00:00 2001 From: guipmenezes Date: Mon, 7 Aug 2023 19:42:19 -0300 Subject: [PATCH 04/17] Substantial changes of IssnFetcher --- .../org/jabref/logic/importer/fetcher/IssnFetcher.java | 7 ++----- src/main/java/org/jabref/model/entry/identifier/ISSN.java | 3 ++- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java index 8be7f2cc961..dfae12aa7d1 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java @@ -15,18 +15,15 @@ public class IssnFetcher implements IdBasedFetcher, IdFetcher { private static final Logger LOGGER = LoggerFactory.getLogger(IssnFetcher.class); - private static ISSN issnIdentifier; - private static final String API_URL = "https://doaj.org/api/v1/search/articles/"; @Override public Optional performSearchById(String identifier) throws FetcherException { + if(StringUtil.isBlank(identifier)) { return Optional.empty(); } - Optional bibEntry = Optional.empty(); - issnIdentifier = new ISSN(identifier); - return bibEntry; //temporary, thinking about the solution + return Optional.empty(); } diff --git a/src/main/java/org/jabref/model/entry/identifier/ISSN.java b/src/main/java/org/jabref/model/entry/identifier/ISSN.java index 1f60972408c..7050a74687c 100644 --- a/src/main/java/org/jabref/model/entry/identifier/ISSN.java +++ b/src/main/java/org/jabref/model/entry/identifier/ISSN.java @@ -7,6 +7,7 @@ import java.util.regex.Pattern; import org.jabref.model.entry.field.Field; +import org.jabref.model.entry.field.StandardField; public class ISSN implements Identifier { @@ -60,7 +61,7 @@ public String getNormalized() { @Override public Field getDefaultField() { - return null; + return StandardField.ISSN; } @Override From 80925e6d0e6bc22dbbed66de7dc25815a6d8a6ed Mon Sep 17 00:00:00 2001 From: guipmenezes Date: Wed, 9 Aug 2023 21:16:49 -0300 Subject: [PATCH 05/17] Implementing the performSearchById method for IssnFetcher class --- .../logic/importer/fetcher/IssnFetcher.java | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java index dfae12aa7d1..62d6b2d4329 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java @@ -1,10 +1,12 @@ package org.jabref.logic.importer.fetcher; +import java.util.List; import java.util.Optional; import org.jabref.logic.importer.FetcherException; import org.jabref.logic.importer.IdBasedFetcher; import org.jabref.logic.importer.IdFetcher; +import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.identifier.ISSN; import org.jabref.model.strings.StringUtil; @@ -12,19 +14,39 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +/** + * Fetcher to generate the BibTex entry from an ISSN. + * The idea is to use the {@link DOAJFetcher} to do a request for a given ISSN number. + */ + public class IssnFetcher implements IdBasedFetcher, IdFetcher { private static final Logger LOGGER = LoggerFactory.getLogger(IssnFetcher.class); + private final DOAJFetcher doajFetcher; + private final ImportFormatPreferences importFormatPreferences; + + public IssnFetcher(ImportFormatPreferences importFormatPreferences) { + this.doajFetcher = new DOAJFetcher(importFormatPreferences); + this.importFormatPreferences = importFormatPreferences; + } @Override public Optional performSearchById(String identifier) throws FetcherException { - if(StringUtil.isBlank(identifier)) { + if (StringUtil.isBlank(identifier)) { return Optional.empty(); } - return Optional.empty(); + Optional bibEntry = Optional.empty(); + // need to create a queryString for ISSN + // take a look on arXiv API manual + List bibEntries = doajFetcher.performSearch(identifier); + for (BibEntry entry: bibEntries) { + bibEntry = Optional.ofNullable(bibEntries.get(0)); + } + + return bibEntry; } @Override @@ -41,5 +63,4 @@ public String getIdentifierName() { public String getName() { return "ISSN"; } - } From 479029f42db65a40ebafa0c8220288751d462d26 Mon Sep 17 00:00:00 2001 From: guipmenezes Date: Mon, 14 Aug 2023 20:51:12 -0300 Subject: [PATCH 06/17] Saving changes for branch updating --- .../java/org/jabref/logic/importer/fetcher/IssnFetcher.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java index 62d6b2d4329..455fecaaa75 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java @@ -39,8 +39,7 @@ public Optional performSearchById(String identifier) throws FetcherExc Optional bibEntry = Optional.empty(); - // need to create a queryString for ISSN - // take a look on arXiv API manual + // Aparently, to do a queryString in DOAJ, you only need to add issn:xxxx-xxxx after the base url List bibEntries = doajFetcher.performSearch(identifier); for (BibEntry entry: bibEntries) { bibEntry = Optional.ofNullable(bibEntries.get(0)); From 557f25b054d95bad3acd6b19a1ff33cc246b9151 Mon Sep 17 00:00:00 2001 From: guipmenezes Date: Tue, 15 Aug 2023 11:02:54 -0300 Subject: [PATCH 07/17] Started to implement the ISSN search logic --- .../logic/importer/fetcher/IssnFetcher.java | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java index 455fecaaa75..903d9e4a6c3 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java @@ -7,9 +7,9 @@ import org.jabref.logic.importer.IdBasedFetcher; import org.jabref.logic.importer.IdFetcher; import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.logic.integrity.ISSNChecker; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.identifier.ISSN; -import org.jabref.model.strings.StringUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,26 +23,36 @@ public class IssnFetcher implements IdBasedFetcher, IdFetcher { private static final Logger LOGGER = LoggerFactory.getLogger(IssnFetcher.class); private final DOAJFetcher doajFetcher; + private final String SEARCH_URL = "https://doaj.org/api/search/journals/"; + private final ISSNChecker issnChecker; private final ImportFormatPreferences importFormatPreferences; public IssnFetcher(ImportFormatPreferences importFormatPreferences) { - this.doajFetcher = new DOAJFetcher(importFormatPreferences); this.importFormatPreferences = importFormatPreferences; + this.doajFetcher = new DOAJFetcher(importFormatPreferences); + this.issnChecker = new ISSNChecker(); } @Override public Optional performSearchById(String identifier) throws FetcherException { - if (StringUtil.isBlank(identifier)) { + Optional checkedId = issnChecker.checkValue(identifier); + if (checkedId.isEmpty()) { + LOGGER.warn("Not a valid ISSN"); return Optional.empty(); } Optional bibEntry = Optional.empty(); - // Aparently, to do a queryString in DOAJ, you only need to add issn:xxxx-xxxx after the base url - List bibEntries = doajFetcher.performSearch(identifier); - for (BibEntry entry: bibEntries) { - bibEntry = Optional.ofNullable(bibEntries.get(0)); + String queryString = concatenateIssnWithId(identifier); + List bibEntries = doajFetcher.performSearch(queryString); + + if (!bibEntries.isEmpty()) { + for (int i = 0; i < bibEntries.size(); i++) { + bibEntry = Optional.ofNullable(bibEntries.get(0)); + } + } else { + LOGGER.warn("ISSN search failed, no results found"); } return bibEntry; @@ -50,6 +60,7 @@ public Optional performSearchById(String identifier) throws FetcherExc @Override public Optional findIdentifier(BibEntry entry) throws FetcherException { + // Need to create a getIssn() method in BibEntry that returns a Optional return Optional.empty(); } @@ -62,4 +73,8 @@ public String getIdentifierName() { public String getName() { return "ISSN"; } + + public String concatenateIssnWithId(String identifier) { + return "issn:" + identifier; + } } From e521a2fe23ada96af46c4e32235075885b7b26de Mon Sep 17 00:00:00 2001 From: guipmenezes Date: Wed, 16 Aug 2023 10:41:21 -0300 Subject: [PATCH 08/17] Refactor the performSearchById method --- .../logic/importer/fetcher/IssnFetcher.java | 24 ++++++------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java index 903d9e4a6c3..56487a5bad1 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java @@ -37,30 +37,20 @@ public IssnFetcher(ImportFormatPreferences importFormatPreferences) { public Optional performSearchById(String identifier) throws FetcherException { Optional checkedId = issnChecker.checkValue(identifier); - if (checkedId.isEmpty()) { - LOGGER.warn("Not a valid ISSN"); - return Optional.empty(); - } - - Optional bibEntry = Optional.empty(); + if (checkedId.isPresent()) { + String queryString = concatenateIssnWithId(identifier); + List bibEntries = doajFetcher.performSearch(queryString); - String queryString = concatenateIssnWithId(identifier); - List bibEntries = doajFetcher.performSearch(queryString); - - if (!bibEntries.isEmpty()) { - for (int i = 0; i < bibEntries.size(); i++) { - bibEntry = Optional.ofNullable(bibEntries.get(0)); - } + return bibEntries.stream().findFirst(); } else { - LOGGER.warn("ISSN search failed, no results found"); + LOGGER.warn("Not a valid ISSN"); + return Optional.empty(); } - - return bibEntry; } @Override public Optional findIdentifier(BibEntry entry) throws FetcherException { - // Need to create a getIssn() method in BibEntry that returns a Optional + // Need to create a getIssn() method in BibEntry that returns an Optional return Optional.empty(); } From 89269e8ac5773ccd37473f6517e85104b4115b6f Mon Sep 17 00:00:00 2001 From: guipmenezes Date: Wed, 16 Aug 2023 16:01:09 -0300 Subject: [PATCH 09/17] Add the IssnFetcher on WebFetcher class and add unit tests --- .../jabref/logic/importer/WebFetchers.java | 2 + .../logic/importer/fetcher/IssnFetcher.java | 3 +- .../importer/fetcher/IssnFetcherTest.java | 59 +++++++++++++++++++ 3 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java diff --git a/src/main/java/org/jabref/logic/importer/WebFetchers.java b/src/main/java/org/jabref/logic/importer/WebFetchers.java index 7038e270946..4e4ab915cc6 100644 --- a/src/main/java/org/jabref/logic/importer/WebFetchers.java +++ b/src/main/java/org/jabref/logic/importer/WebFetchers.java @@ -29,6 +29,7 @@ import org.jabref.logic.importer.fetcher.IEEE; import org.jabref.logic.importer.fetcher.INSPIREFetcher; import org.jabref.logic.importer.fetcher.IacrEprintFetcher; +import org.jabref.logic.importer.fetcher.IssnFetcher; import org.jabref.logic.importer.fetcher.LibraryOfCongress; import org.jabref.logic.importer.fetcher.MathSciNet; import org.jabref.logic.importer.fetcher.MedlineFetcher; @@ -134,6 +135,7 @@ public static SortedSet getIdBasedFetchers(ImportFormatPreferenc set.add(new IsbnFetcher(importFormatPreferences)); // .addRetryFetcher(new EbookDeIsbnFetcher(importFormatPreferences))); // .addRetryFetcher(new DoiToBibtexConverterComIsbnFetcher(importFormatPreferences))); + set.add(new IssnFetcher(importFormatPreferences)); set.add(new DiVA(importFormatPreferences)); set.add(new DoiFetcher(importFormatPreferences)); set.add(new MedlineFetcher()); diff --git a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java index 56487a5bad1..578fdc42456 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java @@ -23,7 +23,7 @@ public class IssnFetcher implements IdBasedFetcher, IdFetcher { private static final Logger LOGGER = LoggerFactory.getLogger(IssnFetcher.class); private final DOAJFetcher doajFetcher; - private final String SEARCH_URL = "https://doaj.org/api/search/journals/"; + // private final String SEARCH_URL = "https://doaj.org/api/search/journals/"; private final ISSNChecker issnChecker; private final ImportFormatPreferences importFormatPreferences; @@ -40,7 +40,6 @@ public Optional performSearchById(String identifier) throws FetcherExc if (checkedId.isPresent()) { String queryString = concatenateIssnWithId(identifier); List bibEntries = doajFetcher.performSearch(queryString); - return bibEntries.stream().findFirst(); } else { LOGGER.warn("Not a valid ISSN"); diff --git a/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java b/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java new file mode 100644 index 00000000000..08529615b3b --- /dev/null +++ b/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java @@ -0,0 +1,59 @@ +package org.jabref.logic.importer.fetcher; + +import java.util.Optional; + +import org.jabref.logic.importer.FetcherException; +import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.field.StandardField; +import org.jabref.testutils.category.FetcherTest; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; + +@FetcherTest +class IssnFetcherTest { + + private IssnFetcher fetcher; + private BibEntry bibEntry; + @BeforeEach + void setUp() { + fetcher = new IssnFetcher(mock(ImportFormatPreferences.class)); + + bibEntry = new BibEntry(BibEntry.DEFAULT_TYPE) + .withField(StandardField.ISSN, "2579-5341") + .withField(StandardField.TITLE, "Query: Jurnal Sistem Informasi") + .withField(StandardField.INSTITUTION, "Univesitas Islam Negeri Sumatera Utara, Fakultas Sains dan Teknologi, Program Studi Sistem Informasi") + .withField(StandardField.PUBLISHER, "Univesitas Islam Negeri Sumatera Utara") + .withField(StandardField.LANGUAGE, "ID"); + } + + @Test + void performSearchById() throws FetcherException { + Optional fetchedEntry = fetcher.performSearchById("1662-4548"); + assertEquals(Optional.of(bibEntry), fetchedEntry); + } + + @Test + void findIdentifier() { + } + + @Test + void getIdentifierName() { + assertEquals("ISSN", fetcher.getIdentifierName()); + } + + @Test + void getName() { + assertEquals("ISSN", fetcher.getName()); + } + + @Test + void concatenateIssnWithId() { + String modifiedIdentifier = fetcher.concatenateIssnWithId("2579-5341"); + assertEquals("issn:2579-5341", modifiedIdentifier); + } +} From d4300c351b62494b938d8a1d4dc882e7b1eedcf0 Mon Sep 17 00:00:00 2001 From: guipmenezes Date: Thu, 17 Aug 2023 17:16:26 -0300 Subject: [PATCH 10/17] Implement search based on the ISSN number --- .../ISSNIdentifierEditorViewModel.java | 24 +++++++++++++++++++ .../identifier/IdentifierEditor.java | 2 ++ .../logic/importer/fetcher/IssnFetcher.java | 2 +- .../importer/fetcher/IssnFetcherTest.java | 13 +++++++--- 4 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/jabref/gui/fieldeditors/identifier/ISSNIdentifierEditorViewModel.java diff --git a/src/main/java/org/jabref/gui/fieldeditors/identifier/ISSNIdentifierEditorViewModel.java b/src/main/java/org/jabref/gui/fieldeditors/identifier/ISSNIdentifierEditorViewModel.java new file mode 100644 index 00000000000..542563b994d --- /dev/null +++ b/src/main/java/org/jabref/gui/fieldeditors/identifier/ISSNIdentifierEditorViewModel.java @@ -0,0 +1,24 @@ +package org.jabref.gui.fieldeditors.identifier; + +import org.jabref.gui.DialogService; +import org.jabref.gui.JabRefGUI; +import org.jabref.gui.autocompleter.SuggestionProvider; +import org.jabref.gui.mergeentries.FetchAndMergeEntry; +import org.jabref.gui.util.TaskExecutor; +import org.jabref.logic.integrity.FieldCheckers; +import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.field.StandardField; +import org.jabref.model.entry.identifier.ISSN; +import org.jabref.preferences.PreferencesService; + +public class ISSNIdentifierEditorViewModel extends BaseIdentifierEditorViewModel { + public ISSNIdentifierEditorViewModel(SuggestionProvider suggestionProvider, FieldCheckers fieldCheckers, DialogService dialogService, TaskExecutor taskExecutor, PreferencesService preferences) { + super(StandardField.ISSN, suggestionProvider, fieldCheckers, dialogService, taskExecutor, preferences); + configure(true, false); + } + + @Override + public void fetchBibliographyInformation(BibEntry bibEntry) { + new FetchAndMergeEntry(JabRefGUI.getMainFrame().getCurrentLibraryTab(), taskExecutor, preferences, dialogService).fetchAndMerge(entry, field); + } +} diff --git a/src/main/java/org/jabref/gui/fieldeditors/identifier/IdentifierEditor.java b/src/main/java/org/jabref/gui/fieldeditors/identifier/IdentifierEditor.java index 8f9e67ff6d4..6b1416414c2 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/identifier/IdentifierEditor.java +++ b/src/main/java/org/jabref/gui/fieldeditors/identifier/IdentifierEditor.java @@ -45,6 +45,8 @@ public IdentifierEditor(Field field, this.viewModel = new ISBNIdentifierEditorViewModel(suggestionProvider, fieldCheckers, dialogService, taskExecutor, preferences); } else if (StandardField.EPRINT == field) { this.viewModel = new EprintIdentifierEditorViewModel(suggestionProvider, fieldCheckers, dialogService, taskExecutor, preferences); + } else if (StandardField.ISSN == field) { + this.viewModel = new ISSNIdentifierEditorViewModel(suggestionProvider, fieldCheckers, dialogService, taskExecutor, preferences); } else { throw new IllegalStateException(String.format("Unable to instantiate a view model for identifier field editor '%s'", field.getDisplayName())); } diff --git a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java index 578fdc42456..53932383f52 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java @@ -37,7 +37,7 @@ public IssnFetcher(ImportFormatPreferences importFormatPreferences) { public Optional performSearchById(String identifier) throws FetcherException { Optional checkedId = issnChecker.checkValue(identifier); - if (checkedId.isPresent()) { + if (checkedId.equals(Optional.empty())) { String queryString = concatenateIssnWithId(identifier); List bibEntries = doajFetcher.performSearch(queryString); return bibEntries.stream().findFirst(); diff --git a/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java b/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java index 08529615b3b..83969c86f2f 100644 --- a/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java +++ b/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java @@ -6,6 +6,8 @@ import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.StandardField; +import org.jabref.model.entry.types.StandardEntryType; +import org.jabref.preferences.BibEntryPreferences; import org.jabref.testutils.category.FetcherTest; import org.junit.jupiter.api.BeforeEach; @@ -13,6 +15,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; @FetcherTest class IssnFetcherTest { @@ -21,9 +24,13 @@ class IssnFetcherTest { private BibEntry bibEntry; @BeforeEach void setUp() { - fetcher = new IssnFetcher(mock(ImportFormatPreferences.class)); + ImportFormatPreferences importPrefs = mock(ImportFormatPreferences.class); + BibEntryPreferences bibEntryPrefs = mock(BibEntryPreferences.class); + when(importPrefs.bibEntryPreferences()).thenReturn(bibEntryPrefs); - bibEntry = new BibEntry(BibEntry.DEFAULT_TYPE) + fetcher = new IssnFetcher(importPrefs); + + bibEntry = new BibEntry(StandardEntryType.Article) .withField(StandardField.ISSN, "2579-5341") .withField(StandardField.TITLE, "Query: Jurnal Sistem Informasi") .withField(StandardField.INSTITUTION, "Univesitas Islam Negeri Sumatera Utara, Fakultas Sains dan Teknologi, Program Studi Sistem Informasi") @@ -33,7 +40,7 @@ void setUp() { @Test void performSearchById() throws FetcherException { - Optional fetchedEntry = fetcher.performSearchById("1662-4548"); + Optional fetchedEntry = fetcher.performSearchById("2579-5341"); assertEquals(Optional.of(bibEntry), fetchedEntry); } From 8926ce648d95e4b2097d872f04f5c8e727830b78 Mon Sep 17 00:00:00 2001 From: guipmenezes Date: Fri, 18 Aug 2023 13:01:19 -0300 Subject: [PATCH 11/17] Change the ISSN Checker validation of a valid checksum --- .../java/org/jabref/logic/importer/fetcher/IssnFetcher.java | 2 +- src/main/java/org/jabref/logic/integrity/ISSNChecker.java | 5 ++--- .../org/jabref/logic/importer/fetcher/IssnFetcherTest.java | 3 +-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java index 53932383f52..578fdc42456 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java @@ -37,7 +37,7 @@ public IssnFetcher(ImportFormatPreferences importFormatPreferences) { public Optional performSearchById(String identifier) throws FetcherException { Optional checkedId = issnChecker.checkValue(identifier); - if (checkedId.equals(Optional.empty())) { + if (checkedId.isPresent()) { String queryString = concatenateIssnWithId(identifier); List bibEntries = doajFetcher.performSearch(queryString); return bibEntries.stream().findFirst(); diff --git a/src/main/java/org/jabref/logic/integrity/ISSNChecker.java b/src/main/java/org/jabref/logic/integrity/ISSNChecker.java index 23502ec9e8a..3e9df1dd563 100644 --- a/src/main/java/org/jabref/logic/integrity/ISSNChecker.java +++ b/src/main/java/org/jabref/logic/integrity/ISSNChecker.java @@ -22,10 +22,9 @@ public Optional checkValue(String value) { return Optional.of(Localization.lang("incorrect format")); } - if (issn.isValidChecksum()) { - return Optional.empty(); - } else { + if (!issn.isValidChecksum()) { return Optional.of(Localization.lang("incorrect control digit")); } + return Optional.of(issnString); } } diff --git a/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java b/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java index 83969c86f2f..1a898ba5427 100644 --- a/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java +++ b/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java @@ -6,7 +6,6 @@ import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.StandardField; -import org.jabref.model.entry.types.StandardEntryType; import org.jabref.preferences.BibEntryPreferences; import org.jabref.testutils.category.FetcherTest; @@ -30,7 +29,7 @@ void setUp() { fetcher = new IssnFetcher(importPrefs); - bibEntry = new BibEntry(StandardEntryType.Article) + bibEntry = new BibEntry(BibEntry.DEFAULT_TYPE) .withField(StandardField.ISSN, "2579-5341") .withField(StandardField.TITLE, "Query: Jurnal Sistem Informasi") .withField(StandardField.INSTITUTION, "Univesitas Islam Negeri Sumatera Utara, Fakultas Sains dan Teknologi, Program Studi Sistem Informasi") From b74f5d1b235ba344359c9ddffdba1d4ad87afa95 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Wed, 1 Nov 2023 18:08:39 +0100 Subject: [PATCH 12/17] refactor to use exiting journal info fetcher --- .../ISSNIdentifierEditorViewModel.java | 20 ++++++-- .../identifier/IdentifierEditor.java | 31 +++++++----- .../jabref/logic/importer/WebFetchers.java | 5 +- .../logic/importer/fetcher/DOAJFetcher.java | 11 ++--- .../logic/importer/fetcher/IssnFetcher.java | 47 +++++-------------- .../fetcher/JournalInformationFetcher.java | 2 +- .../fetcher/isbntobibtex/IsbnFetcher.java | 3 +- .../importer/fetcher/IssnFetcherTest.java | 24 ++-------- 8 files changed, 62 insertions(+), 81 deletions(-) diff --git a/src/main/java/org/jabref/gui/fieldeditors/identifier/ISSNIdentifierEditorViewModel.java b/src/main/java/org/jabref/gui/fieldeditors/identifier/ISSNIdentifierEditorViewModel.java index 542563b994d..fe69864e4f2 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/identifier/ISSNIdentifierEditorViewModel.java +++ b/src/main/java/org/jabref/gui/fieldeditors/identifier/ISSNIdentifierEditorViewModel.java @@ -1,24 +1,36 @@ package org.jabref.gui.fieldeditors.identifier; +import javax.swing.undo.UndoManager; + import org.jabref.gui.DialogService; -import org.jabref.gui.JabRefGUI; +import org.jabref.gui.StateManager; import org.jabref.gui.autocompleter.SuggestionProvider; import org.jabref.gui.mergeentries.FetchAndMergeEntry; import org.jabref.gui.util.TaskExecutor; import org.jabref.logic.integrity.FieldCheckers; +import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.StandardField; import org.jabref.model.entry.identifier.ISSN; import org.jabref.preferences.PreferencesService; public class ISSNIdentifierEditorViewModel extends BaseIdentifierEditorViewModel { - public ISSNIdentifierEditorViewModel(SuggestionProvider suggestionProvider, FieldCheckers fieldCheckers, DialogService dialogService, TaskExecutor taskExecutor, PreferencesService preferences) { - super(StandardField.ISSN, suggestionProvider, fieldCheckers, dialogService, taskExecutor, preferences); + private final StateManager stateManager; + private final UndoManager undoManager; + + public ISSNIdentifierEditorViewModel(SuggestionProvider suggestionProvider, FieldCheckers fieldCheckers, DialogService dialogService, TaskExecutor taskExecutor, PreferencesService preferences, UndoManager undoManager, StateManager stateManager) { + super(StandardField.ISBN, suggestionProvider, fieldCheckers, dialogService, taskExecutor, preferences, undoManager); + this.undoManager = undoManager; + this.stateManager = stateManager; configure(true, false); } @Override public void fetchBibliographyInformation(BibEntry bibEntry) { - new FetchAndMergeEntry(JabRefGUI.getMainFrame().getCurrentLibraryTab(), taskExecutor, preferences, dialogService).fetchAndMerge(entry, field); + stateManager.getActiveDatabase().ifPresentOrElse( + databaseContext -> new FetchAndMergeEntry(databaseContext, taskExecutor, preferences, dialogService, undoManager) + .fetchAndMerge(entry, field), + () -> dialogService.notify(Localization.lang("No library selected")) + ); } } diff --git a/src/main/java/org/jabref/gui/fieldeditors/identifier/IdentifierEditor.java b/src/main/java/org/jabref/gui/fieldeditors/identifier/IdentifierEditor.java index a02b3c1bce6..e45bc2f6384 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/identifier/IdentifierEditor.java +++ b/src/main/java/org/jabref/gui/fieldeditors/identifier/IdentifierEditor.java @@ -23,13 +23,17 @@ import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.Field; -import org.jabref.model.entry.field.StandardField; import org.jabref.preferences.PreferencesService; import com.airhacks.afterburner.injection.Injector; import com.airhacks.afterburner.views.ViewLoader; import jakarta.inject.Inject; +import static org.jabref.model.entry.field.StandardField.DOI; +import static org.jabref.model.entry.field.StandardField.EPRINT; +import static org.jabref.model.entry.field.StandardField.ISBN; +import static org.jabref.model.entry.field.StandardField.ISSN; + public class IdentifierEditor extends HBox implements FieldEditorFX { @FXML private BaseIdentifierEditorViewModel viewModel; @@ -53,16 +57,19 @@ public IdentifierEditor(Field field, // but we need the injected vars to create the viewmodels. Injector.registerExistingAndInject(this); - if (StandardField.DOI == field) { - this.viewModel = new DoiIdentifierEditorViewModel(suggestionProvider, fieldCheckers, dialogService, taskExecutor, preferencesService, undoManager, stateManager); - } else if (StandardField.ISBN == field) { - this.viewModel = new ISBNIdentifierEditorViewModel(suggestionProvider, fieldCheckers, dialogService, taskExecutor, preferencesService, undoManager, stateManager); - } else if (StandardField.EPRINT == field) { - this.viewModel = new EprintIdentifierEditorViewModel(suggestionProvider, fieldCheckers, dialogService, taskExecutor, preferences); - } else if (StandardField.ISSN == field) { - this.viewModel = new ISSNIdentifierEditorViewModel(suggestionProvider, fieldCheckers, dialogService, taskExecutor, preferences); - } else { - throw new IllegalStateException(String.format("Unable to instantiate a view model for identifier field editor '%s'", field.getDisplayName())); + switch (field) { + case DOI -> + this.viewModel = new DoiIdentifierEditorViewModel(suggestionProvider, fieldCheckers, dialogService, taskExecutor, preferencesService, undoManager, stateManager); + case ISBN -> + this.viewModel = new ISBNIdentifierEditorViewModel(suggestionProvider, fieldCheckers, dialogService, taskExecutor, preferencesService, undoManager, stateManager); + case EPRINT -> + this.viewModel = new EprintIdentifierEditorViewModel(suggestionProvider, fieldCheckers, dialogService, taskExecutor, preferencesService, undoManager); + case ISSN -> + this.viewModel = new ISSNIdentifierEditorViewModel(suggestionProvider, fieldCheckers, dialogService, taskExecutor, preferencesService, undoManager, stateManager); + case null, default -> { + assert field != null; + throw new IllegalStateException(String.format("Unable to instantiate a view model for identifier field editor '%s'", field.getDisplayName())); + } } ViewLoader.view(this) @@ -76,7 +83,7 @@ public IdentifierEditor(Field field, lookupIdentifierButton.setTooltip( new Tooltip(Localization.lang("Look up %0", field.getDisplayName()))); - if (field.equals(StandardField.DOI)) { + if (field.equals(DOI)) { textArea.initContextMenu(EditorMenus.getDOIMenu(textArea, dialogService, preferencesService)); } else { textArea.initContextMenu(new DefaultMenu(textArea)); diff --git a/src/main/java/org/jabref/logic/importer/WebFetchers.java b/src/main/java/org/jabref/logic/importer/WebFetchers.java index 0d5fac72f23..5c3551fd36c 100644 --- a/src/main/java/org/jabref/logic/importer/WebFetchers.java +++ b/src/main/java/org/jabref/logic/importer/WebFetchers.java @@ -28,6 +28,7 @@ import org.jabref.logic.importer.fetcher.IEEE; import org.jabref.logic.importer.fetcher.INSPIREFetcher; import org.jabref.logic.importer.fetcher.IacrEprintFetcher; +import org.jabref.logic.importer.fetcher.IssnFetcher; import org.jabref.logic.importer.fetcher.LOBIDFetcher; import org.jabref.logic.importer.fetcher.LibraryOfCongress; import org.jabref.logic.importer.fetcher.MathSciNet; @@ -135,7 +136,6 @@ public static SortedSet getIdBasedFetchers(ImportFormatPreferenc set.add(new IsbnFetcher(importFormatPreferences)); // .addRetryFetcher(new EbookDeIsbnFetcher(importFormatPreferences))); // .addRetryFetcher(new DoiToBibtexConverterComIsbnFetcher(importFormatPreferences))); - set.add(new IssnFetcher(importFormatPreferences)); set.add(new DiVA(importFormatPreferences)); set.add(new DoiFetcher(importFormatPreferences)); set.add(new MedlineFetcher()); @@ -163,7 +163,8 @@ public static SortedSet getEntryBasedFetchers(ImporterPrefere set.add(new AstrophysicsDataSystem(importFormatPreferences, importerPreferences)); set.add(new DoiFetcher(importFormatPreferences)); set.add(new IsbnFetcher(importFormatPreferences)); - // .addRetryFetcher(new EbookDeIsbnFetcher(importFormatPreferences))); + set.add(new IssnFetcher()); + // .addRetryFetcher(new EbookDeIsbnFetcher(importFormatPreferences))); // .addRetryFetcher(new DoiToBibtexConverterComIsbnFetcher(importFormatPreferences))); set.add(new MathSciNet(importFormatPreferences)); set.add(new CrossRef()); diff --git a/src/main/java/org/jabref/logic/importer/fetcher/DOAJFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/DOAJFetcher.java index 815996d311f..8898c730253 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/DOAJFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/DOAJFetcher.java @@ -55,10 +55,10 @@ public DOAJFetcher(ImportFormatPreferences preferences) { */ public static BibEntry parseBibJSONtoBibtex(JSONObject bibJsonEntry, Character keywordSeparator) { // Fields that are directly accessible at the top level BibJson object - Field[] singleFields = {StandardField.YEAR, StandardField.TITLE, StandardField.ABSTRACT, StandardField.MONTH}; + List singleFields = List.of(StandardField.YEAR, StandardField.TITLE, StandardField.ABSTRACT, StandardField.MONTH); // Fields that are accessible in the journal part of the BibJson object - Field[] journalSingleFields = {StandardField.PUBLISHER, StandardField.NUMBER, StandardField.VOLUME}; + List journalSingleFields = List.of(StandardField.PUBLISHER, StandardField.NUMBER, StandardField.VOLUME); BibEntry entry = new BibEntry(StandardEntryType.Article); @@ -155,13 +155,10 @@ public static BibEntry parseBibJSONtoBibtex(JSONObject bibJsonEntry, Character k return entry; } - public static URIBuilder addPath(URIBuilder base, String subPath) { + public static void addPath(URIBuilder base, String subPath) { // slightly altered version based on https://gist.github.com/enginer/230e2dc2f1d213a825d5 - if (StringUtil.isBlank(subPath) || "/".equals(subPath)) { - return base; - } else { + if (!StringUtil.isBlank(subPath) && !"/".equals(subPath)) { base.setPath(appendSegmentToPath(base.getPath(), subPath)); - return base; } } diff --git a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java index 578fdc42456..866a11a5164 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java @@ -1,15 +1,15 @@ package org.jabref.logic.importer.fetcher; +import java.util.Collections; import java.util.List; import java.util.Optional; +import org.jabref.logic.importer.EntryBasedFetcher; import org.jabref.logic.importer.FetcherException; -import org.jabref.logic.importer.IdBasedFetcher; -import org.jabref.logic.importer.IdFetcher; -import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.integrity.ISSNChecker; +import org.jabref.logic.journals.JournalInformation; import org.jabref.model.entry.BibEntry; -import org.jabref.model.entry.identifier.ISSN; +import org.jabref.model.entry.field.StandardField; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -19,51 +19,30 @@ * The idea is to use the {@link DOAJFetcher} to do a request for a given ISSN number. */ -public class IssnFetcher implements IdBasedFetcher, IdFetcher { +public class IssnFetcher implements EntryBasedFetcher { private static final Logger LOGGER = LoggerFactory.getLogger(IssnFetcher.class); - private final DOAJFetcher doajFetcher; + private final JournalInformationFetcher journalInformationFetcher; // private final String SEARCH_URL = "https://doaj.org/api/search/journals/"; private final ISSNChecker issnChecker; - private final ImportFormatPreferences importFormatPreferences; - public IssnFetcher(ImportFormatPreferences importFormatPreferences) { - this.importFormatPreferences = importFormatPreferences; - this.doajFetcher = new DOAJFetcher(importFormatPreferences); + public IssnFetcher() { + this.journalInformationFetcher = new JournalInformationFetcher(); this.issnChecker = new ISSNChecker(); } @Override - public Optional performSearchById(String identifier) throws FetcherException { - - Optional checkedId = issnChecker.checkValue(identifier); + public List performSearch(BibEntry entry) throws FetcherException { + Optional checkedId = entry.getField(StandardField.ISSN).flatMap(issnChecker::checkValue); if (checkedId.isPresent()) { - String queryString = concatenateIssnWithId(identifier); - List bibEntries = doajFetcher.performSearch(queryString); - return bibEntries.stream().findFirst(); - } else { - LOGGER.warn("Not a valid ISSN"); - return Optional.empty(); + Optional journalInformation = journalInformationFetcher.getJournalInformation(checkedId.get(), ""); + return journalInformation.map(journalInfo -> new BibEntry().withField(StandardField.JOURNALTITLE, journalInfo.publisher())).stream().toList(); } - } - - @Override - public Optional findIdentifier(BibEntry entry) throws FetcherException { - // Need to create a getIssn() method in BibEntry that returns an Optional - return Optional.empty(); - } - - @Override - public String getIdentifierName() { - return getName(); + return Collections.emptyList(); } @Override public String getName() { return "ISSN"; } - - public String concatenateIssnWithId(String identifier) { - return "issn:" + identifier; - } } diff --git a/src/main/java/org/jabref/logic/importer/fetcher/JournalInformationFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/JournalInformationFetcher.java index 7d12875b7c9..1d70108beae 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/JournalInformationFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/JournalInformationFetcher.java @@ -90,7 +90,7 @@ private JournalInformation parseResponse(JSONObject responseJsonObject) throws F try { if (responseJsonObject.has("errors")) { JSONArray errors = responseJsonObject.optJSONArray("errors"); - if (errors != null && errors.length() > 0) { + if (errors != null && !errors.isEmpty()) { JSONObject error = errors.getJSONObject(0); String errorMessage = error.optString("message", ""); LOGGER.error("Error accessing catalog: {}", errorMessage); diff --git a/src/main/java/org/jabref/logic/importer/fetcher/isbntobibtex/IsbnFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/isbntobibtex/IsbnFetcher.java index 23344ddbba9..c449320075d 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/isbntobibtex/IsbnFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/isbntobibtex/IsbnFetcher.java @@ -34,13 +34,12 @@ public class IsbnFetcher implements EntryBasedFetcher, IdBasedFetcher { private static final Logger LOGGER = LoggerFactory.getLogger(IsbnFetcher.class); private static final Pattern NEWLINE_SPACE_PATTERN = Pattern.compile("\\n|\\r\\n|\\s"); protected final ImportFormatPreferences importFormatPreferences; - private final OpenLibraryIsbnFetcher openLibraryIsbnFetcher; private final List retryIsbnFetcher; private final GvkFetcher gvkIbsnFetcher; public IsbnFetcher(ImportFormatPreferences importFormatPreferences) { this.importFormatPreferences = importFormatPreferences; - this.openLibraryIsbnFetcher = new OpenLibraryIsbnFetcher(importFormatPreferences); + OpenLibraryIsbnFetcher openLibraryIsbnFetcher = new OpenLibraryIsbnFetcher(importFormatPreferences); this.gvkIbsnFetcher = new GvkFetcher(importFormatPreferences); this.retryIsbnFetcher = new ArrayList<>(); this.addRetryFetcher(openLibraryIsbnFetcher); diff --git a/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java b/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java index 1a898ba5427..bbbf2cd9902 100644 --- a/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java +++ b/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java @@ -1,6 +1,6 @@ package org.jabref.logic.importer.fetcher; -import java.util.Optional; +import java.util.List; import org.jabref.logic.importer.FetcherException; import org.jabref.logic.importer.ImportFormatPreferences; @@ -27,10 +27,10 @@ void setUp() { BibEntryPreferences bibEntryPrefs = mock(BibEntryPreferences.class); when(importPrefs.bibEntryPreferences()).thenReturn(bibEntryPrefs); - fetcher = new IssnFetcher(importPrefs); + fetcher = new IssnFetcher(); bibEntry = new BibEntry(BibEntry.DEFAULT_TYPE) - .withField(StandardField.ISSN, "2579-5341") + .withField(StandardField.ISSN, "2193-1801") .withField(StandardField.TITLE, "Query: Jurnal Sistem Informasi") .withField(StandardField.INSTITUTION, "Univesitas Islam Negeri Sumatera Utara, Fakultas Sains dan Teknologi, Program Studi Sistem Informasi") .withField(StandardField.PUBLISHER, "Univesitas Islam Negeri Sumatera Utara") @@ -39,17 +39,8 @@ void setUp() { @Test void performSearchById() throws FetcherException { - Optional fetchedEntry = fetcher.performSearchById("2579-5341"); - assertEquals(Optional.of(bibEntry), fetchedEntry); - } - - @Test - void findIdentifier() { - } - - @Test - void getIdentifierName() { - assertEquals("ISSN", fetcher.getIdentifierName()); + List fetchedEntry = fetcher.performSearch(bibEntry); + assertEquals(List.of(bibEntry), fetchedEntry); } @Test @@ -57,9 +48,4 @@ void getName() { assertEquals("ISSN", fetcher.getName()); } - @Test - void concatenateIssnWithId() { - String modifiedIdentifier = fetcher.concatenateIssnWithId("2579-5341"); - assertEquals("issn:2579-5341", modifiedIdentifier); - } } From 515fcc4312816a48df256edb09e8779f00342fb8 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sat, 4 Nov 2023 15:06:51 +0100 Subject: [PATCH 13/17] reafactor --- .../logic/importer/fetcher/IssnFetcher.java | 32 +++++++++++-------- .../fetcher/JournalInformationFetcher.java | 1 + .../importer/fetcher/IssnFetcherTest.java | 19 ++++++----- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java index 866a11a5164..d0f25337095 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java @@ -6,37 +6,31 @@ import org.jabref.logic.importer.EntryBasedFetcher; import org.jabref.logic.importer.FetcherException; -import org.jabref.logic.integrity.ISSNChecker; +import org.jabref.logic.importer.IdBasedFetcher; import org.jabref.logic.journals.JournalInformation; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.StandardField; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - /** * Fetcher to generate the BibTex entry from an ISSN. - * The idea is to use the {@link DOAJFetcher} to do a request for a given ISSN number. + * As an ISSN ist just a journal identifier, so we only return journal title and publisher + * The idea is to use the {@link JournalInformationFetcher} to do a request for a given ISSN. */ -public class IssnFetcher implements EntryBasedFetcher { +public class IssnFetcher implements EntryBasedFetcher, IdBasedFetcher { - private static final Logger LOGGER = LoggerFactory.getLogger(IssnFetcher.class); private final JournalInformationFetcher journalInformationFetcher; - // private final String SEARCH_URL = "https://doaj.org/api/search/journals/"; - private final ISSNChecker issnChecker; public IssnFetcher() { this.journalInformationFetcher = new JournalInformationFetcher(); - this.issnChecker = new ISSNChecker(); } @Override public List performSearch(BibEntry entry) throws FetcherException { - Optional checkedId = entry.getField(StandardField.ISSN).flatMap(issnChecker::checkValue); - if (checkedId.isPresent()) { - Optional journalInformation = journalInformationFetcher.getJournalInformation(checkedId.get(), ""); - return journalInformation.map(journalInfo -> new BibEntry().withField(StandardField.JOURNALTITLE, journalInfo.publisher())).stream().toList(); + Optional issn = entry.getField(StandardField.ISSN); + if (issn.isPresent()) { + Optional journalInformation = journalInformationFetcher.getJournalInformation(issn.get(), ""); + return journalInformation.map(journalInfo -> journalInformationToBibEntry(journalInfo, issn.get()) ).stream().toList(); } return Collections.emptyList(); } @@ -45,4 +39,14 @@ public List performSearch(BibEntry entry) throws FetcherException { public String getName() { return "ISSN"; } + + @Override + public Optional performSearchById(String identifier) throws FetcherException { + Optional journalInformation = journalInformationFetcher.getJournalInformation(identifier, ""); + return journalInformation.map(journalInfo -> journalInformationToBibEntry(journalInfo, identifier)); + } + + private BibEntry journalInformationToBibEntry(JournalInformation journalInfo, String issn){ + return new BibEntry().withField(StandardField.JOURNALTITLE, journalInfo.title()).withField(StandardField.PUBLISHER, journalInfo.publisher()).withField(StandardField.ISSN, issn); + } } diff --git a/src/main/java/org/jabref/logic/importer/fetcher/JournalInformationFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/JournalInformationFetcher.java index 1d70108beae..279edc6594a 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/JournalInformationFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/JournalInformationFetcher.java @@ -31,6 +31,7 @@ public class JournalInformationFetcher implements WebFetcher { public static final String NAME = "Journal Information"; private static final Logger LOGGER = LoggerFactory.getLogger(JournalInformationFetcher.class); + // Uses JabRef Online APIs private static final String API_URL = "https://jabref.org/api"; private static final Pattern QUOTES_BRACKET_PATTERN = Pattern.compile("[\"\\[\\]]"); diff --git a/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java b/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java index bbbf2cd9902..b8d93d6909a 100644 --- a/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java +++ b/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java @@ -1,6 +1,7 @@ package org.jabref.logic.importer.fetcher; import java.util.List; +import java.util.Optional; import org.jabref.logic.importer.FetcherException; import org.jabref.logic.importer.ImportFormatPreferences; @@ -29,23 +30,25 @@ void setUp() { fetcher = new IssnFetcher(); - bibEntry = new BibEntry(BibEntry.DEFAULT_TYPE) - .withField(StandardField.ISSN, "2193-1801") - .withField(StandardField.TITLE, "Query: Jurnal Sistem Informasi") - .withField(StandardField.INSTITUTION, "Univesitas Islam Negeri Sumatera Utara, Fakultas Sains dan Teknologi, Program Studi Sistem Informasi") - .withField(StandardField.PUBLISHER, "Univesitas Islam Negeri Sumatera Utara") - .withField(StandardField.LANGUAGE, "ID"); + bibEntry = new BibEntry() + .withField(StandardField.ISSN, "15454509") + .withField(StandardField.JOURNALTITLE, "Annual Review of Biochemistry") + .withField(StandardField.PUBLISHER, "Annual Reviews Inc."); } @Test - void performSearchById() throws FetcherException { + void performSearchByEntry() throws FetcherException { List fetchedEntry = fetcher.performSearch(bibEntry); assertEquals(List.of(bibEntry), fetchedEntry); } + @Test + void performSearchById() throws FetcherException { + Optional fetchedEntry = fetcher.performSearchById("15454509"); + assertEquals(Optional.of(bibEntry), fetchedEntry); + } @Test void getName() { assertEquals("ISSN", fetcher.getName()); } - } From 798d723ad2c34a73e90c436db978cecfbe22f744 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sat, 4 Nov 2023 15:44:50 +0100 Subject: [PATCH 14/17] add button next to journal field --- .../jabref/gui/fieldeditors/FieldEditors.java | 4 +-- .../jabref/gui/fieldeditors/ISSNEditor.fxml | 12 ++++--- .../jabref/gui/fieldeditors/ISSNEditor.java | 15 +++++++- .../gui/fieldeditors/ISSNEditorViewModel.java | 24 ++++++++++++- .../ISSNIdentifierEditorViewModel.java | 36 ------------------- .../identifier/IdentifierEditor.java | 5 +-- .../jabref/logic/importer/WebFetchers.java | 24 +++++++------ .../model/entry/field/FieldProperty.java | 1 + .../model/entry/field/StandardField.java | 2 +- 9 files changed, 64 insertions(+), 59 deletions(-) delete mode 100644 src/main/java/org/jabref/gui/fieldeditors/identifier/ISSNIdentifierEditorViewModel.java diff --git a/src/main/java/org/jabref/gui/fieldeditors/FieldEditors.java b/src/main/java/org/jabref/gui/fieldeditors/FieldEditors.java index 5148990b3be..5e817d5291c 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/FieldEditors.java +++ b/src/main/java/org/jabref/gui/fieldeditors/FieldEditors.java @@ -65,6 +65,8 @@ public static FieldEditorFX getForField(final Field field, return new JournalEditor(field, suggestionProvider, fieldCheckers); } else if (fieldProperties.contains(FieldProperty.DOI) || fieldProperties.contains(FieldProperty.EPRINT) || fieldProperties.contains(FieldProperty.ISBN)) { return new IdentifierEditor(field, suggestionProvider, fieldCheckers); + } else if (fieldProperties.contains(FieldProperty.ISSN)) { + return new ISSNEditor(field, suggestionProvider, fieldCheckers); } else if (field == StandardField.OWNER) { return new OwnerEditor(field, suggestionProvider, fieldCheckers); } else if (field == StandardField.GROUPS) { @@ -97,8 +99,6 @@ public static FieldEditorFX getForField(final Field field, return new KeywordsEditor(field, suggestionProvider, fieldCheckers, preferences, undoManager); } else if (field == InternalField.KEY_FIELD) { return new CitationKeyEditor(field, suggestionProvider, fieldCheckers, databaseContext); - } else if (field == StandardField.ISSN) { - return new ISSNEditor(field, suggestionProvider, fieldCheckers); } else { // default return new SimpleEditor(field, suggestionProvider, fieldCheckers, preferences, isMultiLine, undoManager); diff --git a/src/main/java/org/jabref/gui/fieldeditors/ISSNEditor.fxml b/src/main/java/org/jabref/gui/fieldeditors/ISSNEditor.fxml index 021a0f24f60..44d70fb78c4 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/ISSNEditor.fxml +++ b/src/main/java/org/jabref/gui/fieldeditors/ISSNEditor.fxml @@ -3,13 +3,11 @@ - - + - - + diff --git a/src/main/java/org/jabref/gui/fieldeditors/ISSNEditor.java b/src/main/java/org/jabref/gui/fieldeditors/ISSNEditor.java index db100d37416..b0951ecb6a9 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/ISSNEditor.java +++ b/src/main/java/org/jabref/gui/fieldeditors/ISSNEditor.java @@ -1,5 +1,7 @@ package org.jabref.gui.fieldeditors; +import java.util.Optional; + import javax.swing.undo.UndoManager; import javafx.fxml.FXML; @@ -8,6 +10,7 @@ import javafx.scene.layout.HBox; import org.jabref.gui.DialogService; +import org.jabref.gui.StateManager; import org.jabref.gui.autocompleter.SuggestionProvider; import org.jabref.gui.fieldeditors.contextmenu.DefaultMenu; import org.jabref.gui.util.TaskExecutor; @@ -23,11 +26,14 @@ public class ISSNEditor extends HBox implements FieldEditorFX { @FXML private ISSNEditorViewModel viewModel; @FXML private EditorTextArea textArea; @FXML private Button journalInfoButton; + @FXML private Button fetchInformationByIdentifierButton; @Inject private DialogService dialogService; @Inject private PreferencesService preferencesService; @Inject private UndoManager undoManager; @Inject private TaskExecutor taskExecutor; + @Inject private StateManager stateManager; + private Optional entry = Optional.empty(); public ISSNEditor(Field field, SuggestionProvider suggestionProvider, @@ -43,7 +49,9 @@ public ISSNEditor(Field field, fieldCheckers, taskExecutor, dialogService, - undoManager); + undoManager, + stateManager, + preferencesService); textArea.textProperty().bindBidirectional(viewModel.textProperty()); textArea.initContextMenu(new DefaultMenu(textArea)); @@ -57,6 +65,7 @@ public ISSNEditorViewModel getViewModel() { @Override public void bindToEntry(BibEntry entry) { + this.entry = Optional.of(entry); viewModel.bindToEntry(entry); } @@ -70,6 +79,10 @@ public void requestFocus() { textArea.requestFocus(); } + @FXML + private void fetchInformationByIdentifier() { + entry.ifPresent(viewModel::fetchBibliographyInformation); + } @FXML private void showJournalInfo() { if (JournalInfoOptInDialogHelper.isJournalInfoEnabled(dialogService, preferencesService.getEntryEditorPreferences())) { diff --git a/src/main/java/org/jabref/gui/fieldeditors/ISSNEditorViewModel.java b/src/main/java/org/jabref/gui/fieldeditors/ISSNEditorViewModel.java index 4784580409d..89cbf76e949 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/ISSNEditorViewModel.java +++ b/src/main/java/org/jabref/gui/fieldeditors/ISSNEditorViewModel.java @@ -5,14 +5,23 @@ import javafx.scene.control.Button; import org.jabref.gui.DialogService; +import org.jabref.gui.StateManager; import org.jabref.gui.autocompleter.SuggestionProvider; +import org.jabref.gui.mergeentries.FetchAndMergeEntry; import org.jabref.gui.util.TaskExecutor; import org.jabref.logic.integrity.FieldCheckers; +import org.jabref.logic.l10n.Localization; +import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.Field; +import org.jabref.model.entry.field.StandardField; +import org.jabref.preferences.PreferencesService; public class ISSNEditorViewModel extends AbstractEditorViewModel { private final TaskExecutor taskExecutor; private final DialogService dialogService; + private final UndoManager undoManager; + private final StateManager stateManager; + private final PreferencesService preferencesService; public ISSNEditorViewModel( Field field, @@ -20,13 +29,26 @@ public ISSNEditorViewModel( FieldCheckers fieldCheckers, TaskExecutor taskExecutor, DialogService dialogService, - UndoManager undoManager) { + UndoManager undoManager, + StateManager stateManager, + PreferencesService preferencesService) { super(field, suggestionProvider, fieldCheckers, undoManager); this.taskExecutor = taskExecutor; this.dialogService = dialogService; + this.undoManager = undoManager; + this.stateManager = stateManager; + this.preferencesService = preferencesService; } public void showJournalInfo(Button journalInfoButton) { PopOverUtil.showJournalInfo(journalInfoButton, entry, dialogService, taskExecutor); } + + public void fetchBibliographyInformation(BibEntry bibEntry) { + stateManager.getActiveDatabase().ifPresentOrElse( + databaseContext -> new FetchAndMergeEntry(databaseContext, taskExecutor, preferencesService, dialogService, undoManager) + .fetchAndMerge(bibEntry, StandardField.ISSN), + () -> dialogService.notify(Localization.lang("No library selected")) + ); + } } diff --git a/src/main/java/org/jabref/gui/fieldeditors/identifier/ISSNIdentifierEditorViewModel.java b/src/main/java/org/jabref/gui/fieldeditors/identifier/ISSNIdentifierEditorViewModel.java deleted file mode 100644 index fe69864e4f2..00000000000 --- a/src/main/java/org/jabref/gui/fieldeditors/identifier/ISSNIdentifierEditorViewModel.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.jabref.gui.fieldeditors.identifier; - -import javax.swing.undo.UndoManager; - -import org.jabref.gui.DialogService; -import org.jabref.gui.StateManager; -import org.jabref.gui.autocompleter.SuggestionProvider; -import org.jabref.gui.mergeentries.FetchAndMergeEntry; -import org.jabref.gui.util.TaskExecutor; -import org.jabref.logic.integrity.FieldCheckers; -import org.jabref.logic.l10n.Localization; -import org.jabref.model.entry.BibEntry; -import org.jabref.model.entry.field.StandardField; -import org.jabref.model.entry.identifier.ISSN; -import org.jabref.preferences.PreferencesService; - -public class ISSNIdentifierEditorViewModel extends BaseIdentifierEditorViewModel { - private final StateManager stateManager; - private final UndoManager undoManager; - - public ISSNIdentifierEditorViewModel(SuggestionProvider suggestionProvider, FieldCheckers fieldCheckers, DialogService dialogService, TaskExecutor taskExecutor, PreferencesService preferences, UndoManager undoManager, StateManager stateManager) { - super(StandardField.ISBN, suggestionProvider, fieldCheckers, dialogService, taskExecutor, preferences, undoManager); - this.undoManager = undoManager; - this.stateManager = stateManager; - configure(true, false); - } - - @Override - public void fetchBibliographyInformation(BibEntry bibEntry) { - stateManager.getActiveDatabase().ifPresentOrElse( - databaseContext -> new FetchAndMergeEntry(databaseContext, taskExecutor, preferences, dialogService, undoManager) - .fetchAndMerge(entry, field), - () -> dialogService.notify(Localization.lang("No library selected")) - ); - } -} diff --git a/src/main/java/org/jabref/gui/fieldeditors/identifier/IdentifierEditor.java b/src/main/java/org/jabref/gui/fieldeditors/identifier/IdentifierEditor.java index e45bc2f6384..7afd5d23fde 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/identifier/IdentifierEditor.java +++ b/src/main/java/org/jabref/gui/fieldeditors/identifier/IdentifierEditor.java @@ -32,7 +32,6 @@ import static org.jabref.model.entry.field.StandardField.DOI; import static org.jabref.model.entry.field.StandardField.EPRINT; import static org.jabref.model.entry.field.StandardField.ISBN; -import static org.jabref.model.entry.field.StandardField.ISSN; public class IdentifierEditor extends HBox implements FieldEditorFX { @@ -64,8 +63,7 @@ public IdentifierEditor(Field field, this.viewModel = new ISBNIdentifierEditorViewModel(suggestionProvider, fieldCheckers, dialogService, taskExecutor, preferencesService, undoManager, stateManager); case EPRINT -> this.viewModel = new EprintIdentifierEditorViewModel(suggestionProvider, fieldCheckers, dialogService, taskExecutor, preferencesService, undoManager); - case ISSN -> - this.viewModel = new ISSNIdentifierEditorViewModel(suggestionProvider, fieldCheckers, dialogService, taskExecutor, preferencesService, undoManager, stateManager); + case null, default -> { assert field != null; throw new IllegalStateException(String.format("Unable to instantiate a view model for identifier field editor '%s'", field.getDisplayName())); @@ -98,7 +96,6 @@ public BaseIdentifierEditorViewModel getViewModel() { @Override public void bindToEntry(BibEntry entry) { - this.entry = Optional.of(entry); viewModel.bindToEntry(entry); } diff --git a/src/main/java/org/jabref/logic/importer/WebFetchers.java b/src/main/java/org/jabref/logic/importer/WebFetchers.java index 5c3551fd36c..344fa6399b3 100644 --- a/src/main/java/org/jabref/logic/importer/WebFetchers.java +++ b/src/main/java/org/jabref/logic/importer/WebFetchers.java @@ -52,8 +52,10 @@ import org.jabref.model.entry.identifier.Identifier; import org.jabref.preferences.FilePreferences; +import static org.jabref.model.entry.field.StandardField.DOI; import static org.jabref.model.entry.field.StandardField.EPRINT; import static org.jabref.model.entry.field.StandardField.ISBN; +import static org.jabref.model.entry.field.StandardField.ISSN; public class WebFetchers { @@ -63,16 +65,18 @@ private WebFetchers() { public static Optional getIdBasedFetcherForField(Field field, ImportFormatPreferences importFormatPreferences) { IdBasedFetcher fetcher; - if (field == StandardField.DOI) { - fetcher = new DoiFetcher(importFormatPreferences); - } else if (field == ISBN) { - fetcher = new IsbnFetcher(importFormatPreferences); - // .addRetryFetcher(new EbookDeIsbnFetcher(importFormatPreferences)); - // .addRetryFetcher(new DoiToBibtexConverterComIsbnFetcher(importFormatPreferences)); - } else if (field == EPRINT) { - fetcher = new ArXivFetcher(importFormatPreferences); - } else { - return Optional.empty(); + switch (field) { + case DOI -> + fetcher = new DoiFetcher(importFormatPreferences); + case ISBN -> + fetcher = new IsbnFetcher(importFormatPreferences); + case EPRINT -> + fetcher = new ArXivFetcher(importFormatPreferences); + case ISSN -> + fetcher = new IssnFetcher(); + case null, default -> { + return Optional.empty(); + } } return Optional.of(fetcher); } diff --git a/src/main/java/org/jabref/model/entry/field/FieldProperty.java b/src/main/java/org/jabref/model/entry/field/FieldProperty.java index cba4a76714b..19356f4dccb 100644 --- a/src/main/java/org/jabref/model/entry/field/FieldProperty.java +++ b/src/main/java/org/jabref/model/entry/field/FieldProperty.java @@ -10,6 +10,7 @@ public enum FieldProperty { FILE_EDITOR, GENDER, ISBN, + ISSN, JOURNAL_NAME, LANGUAGE, MONTH, diff --git a/src/main/java/org/jabref/model/entry/field/StandardField.java b/src/main/java/org/jabref/model/entry/field/StandardField.java index 0e568838fb5..c286ca6ea3c 100644 --- a/src/main/java/org/jabref/model/entry/field/StandardField.java +++ b/src/main/java/org/jabref/model/entry/field/StandardField.java @@ -66,7 +66,7 @@ public enum StandardField implements Field { INTRODUCTION("introduction", FieldProperty.PERSON_NAMES), ISBN("isbn", "ISBN", FieldProperty.ISBN, FieldProperty.VERBATIM), ISRN("isrn", "ISRN", FieldProperty.VERBATIM), - ISSN("issn", "ISSN", FieldProperty.VERBATIM), + ISSN("issn", "ISSN", FieldProperty.ISSN, FieldProperty.VERBATIM), ISSUE("issue"), ISSUETITLE("issuetitle"), ISSUESUBTITLE("issuesubtitle"), From a13e3c825fedfaffbd9b24415486acaa06a1a51b Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sat, 4 Nov 2023 16:10:48 +0100 Subject: [PATCH 15/17] fix tests and checkstyle --- src/main/java/org/jabref/gui/fieldeditors/ISSNEditor.java | 1 + .../java/org/jabref/logic/importer/fetcher/IssnFetcher.java | 4 ++-- src/main/java/org/jabref/logic/integrity/ISSNChecker.java | 2 +- .../org/jabref/logic/importer/fetcher/IssnFetcherTest.java | 2 ++ 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/jabref/gui/fieldeditors/ISSNEditor.java b/src/main/java/org/jabref/gui/fieldeditors/ISSNEditor.java index b0951ecb6a9..7fc01a07c4a 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/ISSNEditor.java +++ b/src/main/java/org/jabref/gui/fieldeditors/ISSNEditor.java @@ -83,6 +83,7 @@ public void requestFocus() { private void fetchInformationByIdentifier() { entry.ifPresent(viewModel::fetchBibliographyInformation); } + @FXML private void showJournalInfo() { if (JournalInfoOptInDialogHelper.isJournalInfoEnabled(dialogService, preferencesService.getEntryEditorPreferences())) { diff --git a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java index d0f25337095..11f85d12304 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/IssnFetcher.java @@ -30,7 +30,7 @@ public List performSearch(BibEntry entry) throws FetcherException { Optional issn = entry.getField(StandardField.ISSN); if (issn.isPresent()) { Optional journalInformation = journalInformationFetcher.getJournalInformation(issn.get(), ""); - return journalInformation.map(journalInfo -> journalInformationToBibEntry(journalInfo, issn.get()) ).stream().toList(); + return journalInformation.map(journalInfo -> journalInformationToBibEntry(journalInfo, issn.get())).stream().toList(); } return Collections.emptyList(); } @@ -46,7 +46,7 @@ public Optional performSearchById(String identifier) throws FetcherExc return journalInformation.map(journalInfo -> journalInformationToBibEntry(journalInfo, identifier)); } - private BibEntry journalInformationToBibEntry(JournalInformation journalInfo, String issn){ + private BibEntry journalInformationToBibEntry(JournalInformation journalInfo, String issn) { return new BibEntry().withField(StandardField.JOURNALTITLE, journalInfo.title()).withField(StandardField.PUBLISHER, journalInfo.publisher()).withField(StandardField.ISSN, issn); } } diff --git a/src/main/java/org/jabref/logic/integrity/ISSNChecker.java b/src/main/java/org/jabref/logic/integrity/ISSNChecker.java index 3e9df1dd563..f7205d195b5 100644 --- a/src/main/java/org/jabref/logic/integrity/ISSNChecker.java +++ b/src/main/java/org/jabref/logic/integrity/ISSNChecker.java @@ -25,6 +25,6 @@ public Optional checkValue(String value) { if (!issn.isValidChecksum()) { return Optional.of(Localization.lang("incorrect control digit")); } - return Optional.of(issnString); + return Optional.empty(); } } diff --git a/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java b/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java index b8d93d6909a..684e01ecc63 100644 --- a/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java +++ b/src/test/java/org/jabref/logic/importer/fetcher/IssnFetcherTest.java @@ -22,6 +22,7 @@ class IssnFetcherTest { private IssnFetcher fetcher; private BibEntry bibEntry; + @BeforeEach void setUp() { ImportFormatPreferences importPrefs = mock(ImportFormatPreferences.class); @@ -41,6 +42,7 @@ void performSearchByEntry() throws FetcherException { List fetchedEntry = fetcher.performSearch(bibEntry); assertEquals(List.of(bibEntry), fetchedEntry); } + @Test void performSearchById() throws FetcherException { Optional fetchedEntry = fetcher.performSearchById("15454509"); From 1b4144366a716b0f992c668cfe6a5cf696133cb5 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sat, 4 Nov 2023 16:35:21 +0100 Subject: [PATCH 16/17] arch test --- src/test/java/org/jabref/logic/importer/WebFetchersTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/test/java/org/jabref/logic/importer/WebFetchersTest.java b/src/test/java/org/jabref/logic/importer/WebFetchersTest.java index ffa6314fff7..28a932d1cb5 100644 --- a/src/test/java/org/jabref/logic/importer/WebFetchersTest.java +++ b/src/test/java/org/jabref/logic/importer/WebFetchersTest.java @@ -11,6 +11,7 @@ import org.jabref.logic.importer.fetcher.GoogleScholar; import org.jabref.logic.importer.fetcher.GrobidCitationFetcher; import org.jabref.logic.importer.fetcher.GvkFetcher; +import org.jabref.logic.importer.fetcher.IssnFetcher; import org.jabref.logic.importer.fetcher.JstorFetcher; import org.jabref.logic.importer.fetcher.MrDLibFetcher; import org.jabref.logic.importer.fetcher.isbntobibtex.DoiToBibtexConverterComIsbnFetcher; @@ -78,6 +79,8 @@ void getIdBasedFetchersReturnsAllFetcherDerivingFromIdBasedFetcher() { expected.remove(EbookDeIsbnFetcher.class); expected.remove(GvkFetcher.class); expected.remove(DoiToBibtexConverterComIsbnFetcher.class); + //Remove special ISSN fetcher only suitable for journal lookup + expected.remove(IssnFetcher.class); // Remove the following, because they don't work at the moment expected.remove(JstorFetcher.class); expected.remove(GoogleScholar.class); From 4f13a2e2ed1d7f75f1b10496f1420c1bcbd3cd32 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sat, 4 Nov 2023 16:43:23 +0100 Subject: [PATCH 17/17] Fuuu checkstyle --- src/test/java/org/jabref/logic/importer/WebFetchersTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/jabref/logic/importer/WebFetchersTest.java b/src/test/java/org/jabref/logic/importer/WebFetchersTest.java index 28a932d1cb5..cf9b302c15d 100644 --- a/src/test/java/org/jabref/logic/importer/WebFetchersTest.java +++ b/src/test/java/org/jabref/logic/importer/WebFetchersTest.java @@ -79,7 +79,7 @@ void getIdBasedFetchersReturnsAllFetcherDerivingFromIdBasedFetcher() { expected.remove(EbookDeIsbnFetcher.class); expected.remove(GvkFetcher.class); expected.remove(DoiToBibtexConverterComIsbnFetcher.class); - //Remove special ISSN fetcher only suitable for journal lookup + // Remove special ISSN fetcher only suitable for journal lookup expected.remove(IssnFetcher.class); // Remove the following, because they don't work at the moment expected.remove(JstorFetcher.class);