diff --git a/CHANGELOG.md b/CHANGELOG.md index 23ae191e30d..8b832e4b2da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,9 +35,13 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve - We improved the linking of the `python3` interpreter via the shebang to dynamically use the systems default Python. Related to [JabRef-Browser-Extension #177](https://github.com/JabRef/JabRef-Browser-Extension/issues/177) - Automatically found pdf files now have the linking button to the far left and uses a link icon with a plus instead of a briefcase. The file name also has lowered opacity(70%) until added. [#3607](https://github.com/JabRef/jabref/issues/3607) - We simplified the select entry type form by splitting it into two parts ("Recommended" and "Others") based on internal usage data. [#6730](https://github.com/JabRef/jabref/issues/6730) +- The export to MS Office XML now uses the month name for the field `Month` instead of the two digit number [forum#2685](https://discourse.jabref.org/t/export-month-as-text-not-number/2685) ### Fixed +- We fixed an issue where getting bibliograhpic data from DOI or another identifer did not respect the library mode (BibTeX/biblatex)[#1018](https://github.com/JabRef/jabref/issues/6267) +- We fixed an issue where importing entries would not respect the library mode (BibTeX/biblatex)[#1018](https://github.com/JabRef/jabref/issues/1018) +- We fixed an issue where an exception occured when importing entries from a web search [#7606](https://github.com/JabRef/jabref/issues/7606) - We fixed an issue where the table column sort order was not properly stored and resulted in unsorted eports [#7524](https://github.com/JabRef/jabref/issues/7524) - We fixed an issue where the value of the field `school` or `institution` would be printed twice in the HTML Export [forum#2634](https://discourse.jabref.org/t/problem-with-exporting-techreport-phdthesis-mastersthesis-to-html/2634) - We fixed an issue preventing to connect to a shared database. [#7570](https://github.com/JabRef/jabref/pull/7570) diff --git a/README.md b/README.md index 345cf6dd7d7..011747998cb 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ It supports you in every step of your research work. ## Installation -Fresh development builds are available at [builds.jabref.org](https://builds.jabref.org/master/). +Fresh development builds are available at [builds.jabref.org](https://builds.jabref.org/main/). The [latest stable release is available at FossHub](https://downloads.jabref.org/). Please see our [Installation Guide](https://docs.jabref.org/installation). diff --git a/build.gradle b/build.gradle index f7796aad992..6b5f5376fb6 100644 --- a/build.gradle +++ b/build.gradle @@ -118,7 +118,7 @@ dependencies { implementation 'org.libreoffice:libreoffice:7.1.2' implementation 'org.libreoffice:unoloader:7.1.2' - implementation 'io.github.java-diff-utils:java-diff-utils:4.9' + implementation 'io.github.java-diff-utils:java-diff-utils:4.10' implementation 'info.debatty:java-string-similarity:2.0.0' antlr3 'org.antlr:antlr:3.5.2' @@ -196,7 +196,7 @@ dependencies { implementation 'com.vladsch.flexmark:flexmark-ext-gfm-strikethrough:0.62.2' implementation 'com.vladsch.flexmark:flexmark-ext-gfm-tasklist:0.62.2' - testImplementation 'io.github.classgraph:classgraph:4.8.104' + testImplementation 'io.github.classgraph:classgraph:4.8.105' testImplementation 'org.junit.jupiter:junit-jupiter:5.7.1' testRuntimeOnly 'org.junit.vintage:junit-vintage-engine:5.7.1' testImplementation 'org.junit.platform:junit-platform-launcher:1.7.1' @@ -278,7 +278,8 @@ processResources { "azureInstrumentationKey": System.getenv('AzureInstrumentationKey') ? System.getenv('AzureInstrumentationKey') : '', "springerNatureAPIKey": System.getenv('SpringerNatureAPIKey') ? System.getenv('SpringerNatureAPIKey') : '', "astrophysicsDataSystemAPIKey": System.getenv('AstrophysicsDataSystemAPIKey') ? System.getenv('AstrophysicsDataSystemAPIKey') : '', - "ieeeAPIKey": System.getenv('IEEEAPIKey') ? System.getenv('IEEEAPIKey') : '' + "ieeeAPIKey": System.getenv('IEEEAPIKey') ? System.getenv('IEEEAPIKey') : '', + "scienceDirectApiKey": System.getenv('SCIENCEDIRECTAPIKEY') ? System.getenv('SCIENCEDIRECTAPIKEY') : '' ) filteringCharset = 'UTF-8' } diff --git a/buildres/csl/csl-locales/Gemfile b/buildres/csl/csl-locales/Gemfile index 17b2c314a33..10a8635675e 100644 --- a/buildres/csl/csl-locales/Gemfile +++ b/buildres/csl/csl-locales/Gemfile @@ -1,4 +1,4 @@ -ruby '2.7.1' +ruby '3.0.0' source 'https://rubygems.org' gem 'rake' diff --git a/buildres/csl/csl-locales/Gemfile.lock b/buildres/csl/csl-locales/Gemfile.lock index b220ca304d2..e16789b793e 100644 --- a/buildres/csl/csl-locales/Gemfile.lock +++ b/buildres/csl/csl-locales/Gemfile.lock @@ -1,56 +1,85 @@ GIT remote: https://github.com/citation-style-language/Sheldon.git - revision: 1962fad73610a3e0b1610e0c24c16669d584196b + revision: 38b6de75ac4dd86d6b3b47c172431e6e44f53ca0 specs: - sheldon (1.0.2) + sheldon (1.0.30) citeproc-ruby csl-styles diffy dotenv + erubis (~> 2.7) + faraday + faraday_middleware + git_diff + hashdiff (= 0.3.7) nokogiri + octokit (~> 4.0) ostruct reverse_markdown GEM remote: https://rubygems.org/ specs: + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) citeproc (1.0.10) namae (~> 1.0) - citeproc-ruby (1.1.12) + citeproc-ruby (1.1.13) citeproc (~> 1.0, >= 1.0.9) csl (~> 1.5) - csl (1.5.1) + csl (1.5.2) namae (~> 1.0) csl-styles (1.0.1.10) csl (~> 1.0) diff-lcs (1.4.4) diffy (3.4.0) dotenv (2.7.6) - fuubar (2.5.0) + erubis (2.7.0) + faraday (1.3.0) + faraday-net_http (~> 1.0) + multipart-post (>= 1.2, < 3) + ruby2_keywords + faraday-net_http (1.0.1) + faraday_middleware (1.0.0) + faraday (~> 1.0) + fuubar (2.5.1) rspec-core (~> 3.0) ruby-progressbar (~> 1.4) - mini_portile2 (2.4.0) - namae (1.0.1) - nokogiri (1.10.10) - mini_portile2 (~> 2.4.0) - ostruct (0.2.0) - rake (13.0.1) + git_diff (0.4.3) + hashdiff (0.3.7) + mini_portile2 (2.5.0) + multipart-post (2.1.1) + namae (1.0.2) + nokogiri (1.11.1) + mini_portile2 (~> 2.5.0) + racc (~> 1.4) + octokit (4.20.0) + faraday (>= 0.9) + sawyer (~> 0.8.0, >= 0.5.3) + ostruct (0.3.3) + public_suffix (4.0.6) + racc (1.5.2) + rake (13.0.3) reverse_markdown (2.0.0) nokogiri - rspec (3.9.0) - rspec-core (~> 3.9.0) - rspec-expectations (~> 3.9.0) - rspec-mocks (~> 3.9.0) - rspec-core (3.9.2) - rspec-support (~> 3.9.3) - rspec-expectations (3.9.2) + rspec (3.10.0) + rspec-core (~> 3.10.0) + rspec-expectations (~> 3.10.0) + rspec-mocks (~> 3.10.0) + rspec-core (3.10.1) + rspec-support (~> 3.10.0) + rspec-expectations (3.10.1) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.9.0) - rspec-mocks (3.9.1) + rspec-support (~> 3.10.0) + rspec-mocks (3.10.2) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.9.0) - rspec-support (3.9.3) - ruby-progressbar (1.10.1) + rspec-support (~> 3.10.0) + rspec-support (3.10.2) + ruby-progressbar (1.11.0) + ruby2_keywords (0.0.4) + sawyer (0.8.2) + addressable (>= 2.3.5) + faraday (> 0.8, < 2.0) PLATFORMS ruby @@ -64,7 +93,7 @@ DEPENDENCIES sheldon! RUBY VERSION - ruby 2.7.1 + ruby 3.0.0p0 BUNDLED WITH - 2.1.4 + 2.2.3 diff --git a/buildres/csl/csl-locales/spec/spec_helper.rb b/buildres/csl/csl-locales/spec/spec_helper.rb index 6b85511fa8e..b1571abaa78 100644 --- a/buildres/csl/csl-locales/spec/spec_helper.rb +++ b/buildres/csl/csl-locales/spec/spec_helper.rb @@ -2,6 +2,8 @@ require 'json' LOCALE_ROOT = File.expand_path('../..', __FILE__) +PULL_REQUEST = File.join(LOCALE_ROOT, 'pull-request') +LOCALE_ROOT = PULL_REQUEST if File.directory?(PULL_REQUEST) NO_REGIONS = %w{ eu ar la diff --git a/buildres/csl/csl-styles/acta-anaesthesiologica-scandinavica.csl b/buildres/csl/csl-styles/acta-anaesthesiologica-scandinavica.csl index 8f2dc158822..643b9aa3003 100644 --- a/buildres/csl/csl-styles/acta-anaesthesiologica-scandinavica.csl +++ b/buildres/csl/csl-styles/acta-anaesthesiologica-scandinavica.csl @@ -155,9 +155,11 @@ - - - + + + + + diff --git a/buildres/csl/csl-styles/aquatic-conservation.csl b/buildres/csl/csl-styles/aquatic-conservation.csl index 7b083b793bf..cb0c81339c8 100644 --- a/buildres/csl/csl-styles/aquatic-conservation.csl +++ b/buildres/csl/csl-styles/aquatic-conservation.csl @@ -1,5 +1,5 @@ - diff --git a/buildres/csl/csl-styles/associacao-brasileira-de-normas-tecnicas-note.csl b/buildres/csl/csl-styles/associacao-brasileira-de-normas-tecnicas-note.csl index cacfd635ddd..b1e81bef570 100644 --- a/buildres/csl/csl-styles/associacao-brasileira-de-normas-tecnicas-note.csl +++ b/buildres/csl/csl-styles/associacao-brasileira-de-normas-tecnicas-note.csl @@ -1,5 +1,5 @@ - diff --git a/buildres/csl/csl-styles/dependent/college-and-research-libraries.csl b/buildres/csl/csl-styles/dependent/college-and-research-libraries.csl new file mode 100644 index 00000000000..a4793212fab --- /dev/null +++ b/buildres/csl/csl-styles/dependent/college-and-research-libraries.csl @@ -0,0 +1,17 @@ + + diff --git a/buildres/csl/csl-styles/dependent/experimental-biology-and-medicine.csl b/buildres/csl/csl-styles/dependent/experimental-biology-and-medicine.csl deleted file mode 100644 index 4e6b9695407..00000000000 --- a/buildres/csl/csl-styles/dependent/experimental-biology-and-medicine.csl +++ /dev/null @@ -1,16 +0,0 @@ - - diff --git a/buildres/csl/csl-styles/dependent/journal-of-neurosurgery-pediatrics.csl b/buildres/csl/csl-styles/dependent/journal-of-neurosurgery-pediatrics.csl index 188cc818fe1..9476670d2d8 100644 --- a/buildres/csl/csl-styles/dependent/journal-of-neurosurgery-pediatrics.csl +++ b/buildres/csl/csl-styles/dependent/journal-of-neurosurgery-pediatrics.csl @@ -4,13 +4,13 @@ Journal of Neurosurgery: Pediatrics http://www.zotero.org/styles/journal-of-neurosurgery-pediatrics - + 1933-0707 1933-0715 - 2012-09-09T21:58:08+00:00 + 2021-04-01T21:58:08+00:00 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License diff --git a/buildres/csl/csl-styles/dependent/journal-of-neurosurgery-spine.csl b/buildres/csl/csl-styles/dependent/journal-of-neurosurgery-spine.csl index 383db4462fa..8274d90adc8 100644 --- a/buildres/csl/csl-styles/dependent/journal-of-neurosurgery-spine.csl +++ b/buildres/csl/csl-styles/dependent/journal-of-neurosurgery-spine.csl @@ -4,13 +4,13 @@ Journal of Neurosurgery: Spine http://www.zotero.org/styles/journal-of-neurosurgery-spine - + 1547-5654 1547-5646 - 2012-09-09T21:58:08+00:00 + 2021-04-01T21:58:08+00:00 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License diff --git a/buildres/csl/csl-styles/dependent/journal-of-neurosurgery.csl b/buildres/csl/csl-styles/dependent/journal-of-neurosurgery.csl new file mode 100644 index 00000000000..2ef22530d9c --- /dev/null +++ b/buildres/csl/csl-styles/dependent/journal-of-neurosurgery.csl @@ -0,0 +1,17 @@ + + diff --git a/buildres/csl/csl-styles/dependent/neurosurgical-focus.csl b/buildres/csl/csl-styles/dependent/neurosurgical-focus.csl index 2338e7413bb..12294d931ed 100644 --- a/buildres/csl/csl-styles/dependent/neurosurgical-focus.csl +++ b/buildres/csl/csl-styles/dependent/neurosurgical-focus.csl @@ -4,12 +4,12 @@ Neurosurgical Focus http://www.zotero.org/styles/neurosurgical-focus - + 1092-0684 - 2012-09-09T21:58:08+00:00 + 2021-04-01T21:58:08+00:00 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License diff --git a/buildres/csl/csl-styles/dependent/south-african-medical-journal.csl b/buildres/csl/csl-styles/dependent/south-african-medical-journal.csl deleted file mode 100644 index c9e079e7a5e..00000000000 --- a/buildres/csl/csl-styles/dependent/south-african-medical-journal.csl +++ /dev/null @@ -1,16 +0,0 @@ - - diff --git a/buildres/csl/csl-styles/endocrine-connections.csl b/buildres/csl/csl-styles/endocrine-connections.csl new file mode 100644 index 00000000000..232242662f8 --- /dev/null +++ b/buildres/csl/csl-styles/endocrine-connections.csl @@ -0,0 +1,147 @@ + + diff --git a/buildres/csl/csl-styles/experimental-biology-and-medicine.csl b/buildres/csl/csl-styles/experimental-biology-and-medicine.csl new file mode 100644 index 00000000000..49b04ed92d5 --- /dev/null +++ b/buildres/csl/csl-styles/experimental-biology-and-medicine.csl @@ -0,0 +1,198 @@ + + diff --git a/buildres/csl/csl-styles/gost-r-7-0-5-2008-numeric-alphabetical.csl b/buildres/csl/csl-styles/gost-r-7-0-5-2008-numeric-alphabetical.csl index 7ab662b01d8..95861899904 100644 --- a/buildres/csl/csl-styles/gost-r-7-0-5-2008-numeric-alphabetical.csl +++ b/buildres/csl/csl-styles/gost-r-7-0-5-2008-numeric-alphabetical.csl @@ -13,7 +13,7 @@ Russian GOST-2008 style. Book, report, webpage, post-weblog and article chapters edited. Note!!! In articles form of № = Issue (Volume). - 2015-07-01T06:08:18+00:00 + 2021-04-23T06:08:18+00:00 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License @@ -131,7 +131,7 @@ - + diff --git a/buildres/csl/csl-styles/gost-r-7-0-5-2008-numeric.csl b/buildres/csl/csl-styles/gost-r-7-0-5-2008-numeric.csl index a451278e008..eb9c16ee577 100644 --- a/buildres/csl/csl-styles/gost-r-7-0-5-2008-numeric.csl +++ b/buildres/csl/csl-styles/gost-r-7-0-5-2008-numeric.csl @@ -18,7 +18,7 @@ И последнее, патенты по умолчанию представлены как USA, поскольку в CSL 1.0 нет переменной, соответствующей полю country в базе Zotero 4.0. Надеюсь, это будет исправлено в будущих версиях. 2010-03-22T10:40:00+06:00 - 2015-01-23T02:03:08+00:00 + 2021-04-23T02:03:08+00:00 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License @@ -63,7 +63,7 @@ - + @@ -153,7 +153,7 @@ - + diff --git a/buildres/csl/csl-styles/gost-r-7-0-5-2008.csl b/buildres/csl/csl-styles/gost-r-7-0-5-2008.csl index 62400465998..795fadfed75 100644 --- a/buildres/csl/csl-styles/gost-r-7-0-5-2008.csl +++ b/buildres/csl/csl-styles/gost-r-7-0-5-2008.csl @@ -14,7 +14,7 @@ Russian GOST-2008 style. - 2012-09-27T22:06:38+00:00 + 2021-04-23T08:29:37+00:00 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License @@ -134,11 +134,11 @@ - + - + diff --git a/buildres/csl/csl-styles/infoclio-de-kurzbelege.csl b/buildres/csl/csl-styles/infoclio-de-kurzbelege.csl new file mode 100644 index 00000000000..0a776fc6a60 --- /dev/null +++ b/buildres/csl/csl-styles/infoclio-de-kurzbelege.csl @@ -0,0 +1,467 @@ + + diff --git a/buildres/csl/csl-styles/infoclio-de.csl b/buildres/csl/csl-styles/infoclio-de.csl index 8430b682841..a3983aa7b35 100644 --- a/buildres/csl/csl-styles/infoclio-de.csl +++ b/buildres/csl/csl-styles/infoclio-de.csl @@ -292,7 +292,7 @@ - + + + + İstanbul Medical Journal + http://www.zotero.org/styles/istanbul-medical-journal + + + + + Huseyin Karamelikli + hakperest@gmail.com + https://www.karamelikli.com + + + + 2619-9793 + 2148-094X + Istanbul Medical Journal + 2021-04-10T13:40:36+00:00 + This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License + + + + ch. + presented at the + available + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/buildres/csl/csl-styles/jci-insight.csl b/buildres/csl/csl-styles/jci-insight.csl new file mode 100644 index 00000000000..adbd5781319 --- /dev/null +++ b/buildres/csl/csl-styles/jci-insight.csl @@ -0,0 +1,152 @@ + + diff --git a/buildres/csl/csl-styles/journal-of-neurosurgery.csl b/buildres/csl/csl-styles/journal-of-neurosurgery.csl deleted file mode 100644 index 0d3c267e778..00000000000 --- a/buildres/csl/csl-styles/journal-of-neurosurgery.csl +++ /dev/null @@ -1,182 +0,0 @@ - - diff --git a/buildres/csl/csl-styles/journal-of-nutrition.csl b/buildres/csl/csl-styles/journal-of-nutrition.csl index 96c8e38c731..e92117fe6ed 100644 --- a/buildres/csl/csl-styles/journal-of-nutrition.csl +++ b/buildres/csl/csl-styles/journal-of-nutrition.csl @@ -5,7 +5,7 @@ http://www.zotero.org/styles/journal-of-nutrition - + Sebastian Karcher @@ -15,7 +15,7 @@ 0022-3166 1541-6100 Vancouver style with only year/volume and et al after 11 authors - 2013-12-15T07:14:53+00:00 + 2021-04-19T12:19:55+00:00 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License @@ -90,13 +90,13 @@ - + - + @@ -107,7 +107,6 @@ - diff --git a/buildres/csl/csl-styles/journal-of-oil-palm-research.csl b/buildres/csl/csl-styles/journal-of-oil-palm-research.csl new file mode 100644 index 00000000000..037bf9ee77a --- /dev/null +++ b/buildres/csl/csl-styles/journal-of-oil-palm-research.csl @@ -0,0 +1,137 @@ + + diff --git a/buildres/csl/csl-styles/mammalia.csl b/buildres/csl/csl-styles/mammalia.csl index 23116cb37ca..6c6b643063f 100644 --- a/buildres/csl/csl-styles/mammalia.csl +++ b/buildres/csl/csl-styles/mammalia.csl @@ -5,8 +5,7 @@ http://www.zotero.org/styles/mammalia - - + Patrick O'Brien @@ -15,7 +14,7 @@ 0025-1461 1864-1547 Style for Mammalia as per the guidelines from October 1, 2020. - 2021-01-11T13:22:22+00:00 + 2021-04-21T09:13:35+00:00 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License @@ -26,7 +25,7 @@ - + - + diff --git a/buildres/csl/csl-styles/ocean-and-coastal-research.csl b/buildres/csl/csl-styles/ocean-and-coastal-research.csl new file mode 100644 index 00000000000..c44a8b4ab3e --- /dev/null +++ b/buildres/csl/csl-styles/ocean-and-coastal-research.csl @@ -0,0 +1,198 @@ + + diff --git a/buildres/csl/csl-styles/oil-shale.csl b/buildres/csl/csl-styles/oil-shale.csl new file mode 100644 index 00000000000..4d0d9c08619 --- /dev/null +++ b/buildres/csl/csl-styles/oil-shale.csl @@ -0,0 +1,338 @@ + + diff --git a/buildres/csl/csl-styles/revue-forestiere-francaise.csl b/buildres/csl/csl-styles/revue-forestiere-francaise.csl new file mode 100644 index 00000000000..2e04b49d975 --- /dev/null +++ b/buildres/csl/csl-styles/revue-forestiere-francaise.csl @@ -0,0 +1,262 @@ + + diff --git a/buildres/csl/csl-styles/society-of-biblical-literature-fullnote-bibliography.csl b/buildres/csl/csl-styles/society-of-biblical-literature-fullnote-bibliography.csl index 821bff3dc2e..36e4e54414f 100644 --- a/buildres/csl/csl-styles/society-of-biblical-literature-fullnote-bibliography.csl +++ b/buildres/csl/csl-styles/society-of-biblical-literature-fullnote-bibliography.csl @@ -24,10 +24,15 @@ Tyler Mykkanen + + J. David Stark + david@jdavidstark.com + https://www.jdavidstark.com/ + Society of Biblical Literature format with full notes and bibliography - 2018-02-01T14:42:46+00:00 + 2021-04-13T15:55:26+00:00 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License @@ -669,10 +674,21 @@ - - + + + + + + + + + + + @@ -920,8 +936,15 @@ + + + + + + + - + @@ -932,7 +955,7 @@ - + diff --git a/buildres/csl/csl-styles/south-african-medical-journal.csl b/buildres/csl/csl-styles/south-african-medical-journal.csl new file mode 100644 index 00000000000..6f5b658e695 --- /dev/null +++ b/buildres/csl/csl-styles/south-african-medical-journal.csl @@ -0,0 +1,158 @@ + + diff --git a/buildres/csl/csl-styles/surgical-neurology-international.csl b/buildres/csl/csl-styles/surgical-neurology-international.csl index f794bd3936e..57a2137ee9c 100644 --- a/buildres/csl/csl-styles/surgical-neurology-international.csl +++ b/buildres/csl/csl-styles/surgical-neurology-international.csl @@ -5,7 +5,7 @@ SNI http://www.zotero.org/styles/surgical-neurology-international - + @@ -18,7 +18,7 @@ 2229-5097 2152-7806 Style for Surgical Neurology International, the open-acccess journal for neurosurgery and clinical neuroscience. - 2019-12-23T14:40:52+00:00 + 2021-04-14T12:00:00+00:00 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License diff --git a/buildres/csl/csl-styles/the-bovine-practitioner.csl b/buildres/csl/csl-styles/the-bovine-practitioner.csl new file mode 100644 index 00000000000..0b3eec67e80 --- /dev/null +++ b/buildres/csl/csl-styles/the-bovine-practitioner.csl @@ -0,0 +1,210 @@ + + diff --git a/buildres/csl/csl-styles/the-journal-of-laryngology-and-otology.csl b/buildres/csl/csl-styles/the-journal-of-laryngology-and-otology.csl new file mode 100644 index 00000000000..df40ef9dbcf --- /dev/null +++ b/buildres/csl/csl-styles/the-journal-of-laryngology-and-otology.csl @@ -0,0 +1,234 @@ + + diff --git a/buildres/csl/csl-styles/universite-du-quebec-a-montreal.csl b/buildres/csl/csl-styles/universite-du-quebec-a-montreal.csl index 36dfd9f1f5a..7b6f0a146e1 100644 --- a/buildres/csl/csl-styles/universite-du-quebec-a-montreal.csl +++ b/buildres/csl/csl-styles/universite-du-quebec-a-montreal.csl @@ -953,7 +953,7 @@ - + diff --git a/buildres/csl/csl-styles/university-of-york-harvard-archaeology.csl b/buildres/csl/csl-styles/university-of-york-harvard-archaeology.csl index ceab9dca15e..5ecdf6c8f2a 100644 --- a/buildres/csl/csl-styles/university-of-york-harvard-archaeology.csl +++ b/buildres/csl/csl-styles/university-of-york-harvard-archaeology.csl @@ -38,7 +38,7 @@ - + diff --git a/buildres/csl/csl-styles/university-of-york-harvard-environment.csl b/buildres/csl/csl-styles/university-of-york-harvard-environment.csl index c65f9730e9c..886376b95f9 100644 --- a/buildres/csl/csl-styles/university-of-york-harvard-environment.csl +++ b/buildres/csl/csl-styles/university-of-york-harvard-environment.csl @@ -38,7 +38,7 @@ - + diff --git a/docs/advanced-reading/fetchers.md b/docs/advanced-reading/fetchers.md index 3903cb2d4e7..46d75c46b65 100644 --- a/docs/advanced-reading/fetchers.md +++ b/docs/advanced-reading/fetchers.md @@ -7,6 +7,7 @@ Fetchers are the implementation of the [search using online services](https://do | [IEEEXplore](https://docs.jabref.org/collect/import-using-online-bibliographic-database/ieeexplore) | [IEEE Xplore API portal](https://developer.ieee.org/) | `IEEEAPIKey` | 200 calls/day | | [MathSciNet](http://www.ams.org/mathscinet) | \(none\) | \(none\) | Depending on the current network | | [SAO/NASA Astrophysics Data System](https://docs.jabref.org/collect/import-using-online-bibliographic-database/ads) | [ADS UI](https://ui.adsabs.harvard.edu/user/settings/token) | `AstrophysicsDataSystemAPIKey` | 5000 calls/day | +| [ScienceDirect](https://www.sciencedirect.com/) | | `ScienceDirectApiKey` | | | [Springer Nature](https://docs.jabref.org/collect/import-using-online-bibliographic-database/springer) | [Springer Nature API Portal](https://dev.springernature.com/) | `SpringerNatureAPIKey` | 5000 calls/day | | [Zentralblatt Math](https://www.zbmath.org/) | \(none\) | \(none\) | Depending on the current network | diff --git a/src/main/java/org/jabref/gui/UpdateTimestampListener.java b/src/main/java/org/jabref/gui/UpdateTimestampListener.java index 0efc6878d2b..2ccc4a72d3c 100644 --- a/src/main/java/org/jabref/gui/UpdateTimestampListener.java +++ b/src/main/java/org/jabref/gui/UpdateTimestampListener.java @@ -1,5 +1,6 @@ package org.jabref.gui; +import org.jabref.model.entry.event.EntriesEventSource; import org.jabref.model.entry.event.EntryChangedEvent; import org.jabref.model.entry.field.StandardField; import org.jabref.preferences.PreferencesService; @@ -18,7 +19,9 @@ class UpdateTimestampListener { @Subscribe public void listen(EntryChangedEvent event) { - if (preferencesService.getTimestampPreferences().shouldAddModificationDate()) { + // The event source needs to be checked, since the timestamp is always updated on every change. The cleanup formatter is an exception to that behaviour, + // since it just should move the contents from the timestamp field to modificationdate or creationdate. + if (preferencesService.getTimestampPreferences().shouldAddModificationDate() && event.getEntriesEventSource() != EntriesEventSource.CLEANUP_TIMESTAMP) { event.getBibEntry().setField(StandardField.MODIFICATIONDATE, preferencesService.getTimestampPreferences().now()); } diff --git a/src/main/java/org/jabref/gui/cleanup/CleanupAction.java b/src/main/java/org/jabref/gui/cleanup/CleanupAction.java index 982cffb2eb3..abce5122c80 100644 --- a/src/main/java/org/jabref/gui/cleanup/CleanupAction.java +++ b/src/main/java/org/jabref/gui/cleanup/CleanupAction.java @@ -94,7 +94,8 @@ private void doCleanup(BibDatabaseContext databaseContext, CleanupPreset preset, // Create and run cleaner CleanupWorker cleaner = new CleanupWorker( databaseContext, - preferences.getCleanupPreferences(Globals.journalAbbreviationRepository)); + preferences.getCleanupPreferences(Globals.journalAbbreviationRepository), + preferences.getTimestampPreferences()); List changes = cleaner.cleanup(preset, entry); diff --git a/src/main/java/org/jabref/gui/cleanup/CleanupPresetPanel.fxml b/src/main/java/org/jabref/gui/cleanup/CleanupPresetPanel.fxml index 608cdc12823..72183521894 100644 --- a/src/main/java/org/jabref/gui/cleanup/CleanupPresetPanel.fxml +++ b/src/main/java/org/jabref/gui/cleanup/CleanupPresetPanel.fxml @@ -5,8 +5,13 @@ + + + + + + + diff --git a/src/main/java/org/jabref/gui/cleanup/CleanupPresetPanel.java b/src/main/java/org/jabref/gui/cleanup/CleanupPresetPanel.java index 3d94fee18bc..6957e66a556 100644 --- a/src/main/java/org/jabref/gui/cleanup/CleanupPresetPanel.java +++ b/src/main/java/org/jabref/gui/cleanup/CleanupPresetPanel.java @@ -36,6 +36,8 @@ public class CleanupPresetPanel extends VBox { @FXML private CheckBox cleanUpUpgradeExternalLinks; @FXML private CheckBox cleanUpBiblatex; @FXML private CheckBox cleanUpBibtex; + @FXML private CheckBox cleanUpTimestampToCreationDate; + @FXML private CheckBox cleanUpTimestampToModificationDate; @FXML private FieldFormatterCleanupsPanel formatterCleanupsPanel; public CleanupPresetPanel(BibDatabaseContext databaseContext, CleanupPreset cleanupPreset, FilePreferences filePreferences) { @@ -69,7 +71,30 @@ private void init(CleanupPreset cleanupPreset, FilePreferences filePreferences) .concat(": ") .concat(filePreferences.getFileNamePattern()); cleanupRenamePDFLabel.setText(currentPattern); - + cleanUpBibtex.selectedProperty().addListener( + (observable, oldValue, newValue) -> { + if (newValue) { + cleanUpBiblatex.selectedProperty().setValue(false); + } + }); + cleanUpBiblatex.selectedProperty().addListener( + (observable, oldValue, newValue) -> { + if (newValue) { + cleanUpBibtex.selectedProperty().setValue(false); + } + }); + cleanUpTimestampToCreationDate.selectedProperty().addListener( + (observable, oldValue, newValue) -> { + if (newValue) { + cleanUpTimestampToModificationDate.selectedProperty().setValue(false); + } + }); + cleanUpTimestampToModificationDate.selectedProperty().addListener( + (observable, oldValue, newValue) -> { + if (newValue) { + cleanUpTimestampToCreationDate.selectedProperty().setValue(false); + } + }); updateDisplay(cleanupPreset); } @@ -85,6 +110,9 @@ private void updateDisplay(CleanupPreset preset) { cleanUpUpgradeExternalLinks.setSelected(preset.isActive(CleanupPreset.CleanupStep.CLEAN_UP_UPGRADE_EXTERNAL_LINKS)); cleanUpBiblatex.setSelected(preset.isActive(CleanupPreset.CleanupStep.CONVERT_TO_BIBLATEX)); cleanUpBibtex.setSelected(preset.isActive(CleanupPreset.CleanupStep.CONVERT_TO_BIBTEX)); + cleanUpTimestampToCreationDate.setSelected(preset.isActive(CleanupPreset.CleanupStep.CONVERT_TIMESTAMP_TO_CREATIONDATE)); + cleanUpTimestampToModificationDate.setSelected(preset.isActive(CleanupPreset.CleanupStep.CONVERT_TIMESTAMP_TO_MODIFICATIONDATE)); + cleanUpTimestampToModificationDate.setSelected(preset.isActive(CleanupPreset.CleanupStep.DO_NOT_CONVERT_TIMESTAMP)); cleanUpISSN.setSelected(preset.isActive(CleanupPreset.CleanupStep.CLEAN_UP_ISSN)); formatterCleanupsPanel.cleanupsDisableProperty().setValue(!preset.getFormatterCleanups().isEnabled()); formatterCleanupsPanel.cleanupsProperty().setValue(FXCollections.observableArrayList(preset.getFormatterCleanups().getConfiguredActions())); @@ -124,6 +152,12 @@ public CleanupPreset getCleanupPreset() { if (cleanUpBibtex.isSelected()) { activeJobs.add(CleanupPreset.CleanupStep.CONVERT_TO_BIBTEX); } + if (cleanUpTimestampToCreationDate.isSelected()) { + activeJobs.add(CleanupPreset.CleanupStep.CONVERT_TIMESTAMP_TO_CREATIONDATE); + } + if (cleanUpTimestampToModificationDate.isSelected()) { + activeJobs.add(CleanupPreset.CleanupStep.CONVERT_TIMESTAMP_TO_MODIFICATIONDATE); + } activeJobs.add(CleanupPreset.CleanupStep.FIX_FILE_LINKS); diff --git a/src/main/java/org/jabref/gui/mergeentries/FetchAndMergeEntry.java b/src/main/java/org/jabref/gui/mergeentries/FetchAndMergeEntry.java index 0310d5fd823..7c1a9e127ba 100644 --- a/src/main/java/org/jabref/gui/mergeentries/FetchAndMergeEntry.java +++ b/src/main/java/org/jabref/gui/mergeentries/FetchAndMergeEntry.java @@ -66,9 +66,9 @@ public void fetchAndMerge(BibEntry entry, List fields) { BackgroundTask.wrap(() -> fetcher.get().performSearchById(fieldContent.get())) .onSuccess(fetchedEntry -> { ImportCleanup cleanup = new ImportCleanup(libraryTab.getBibDatabaseContext().getMode()); - cleanup.doPostCleanup(entry); String type = field.getDisplayName(); if (fetchedEntry.isPresent()) { + cleanup.doPostCleanup(fetchedEntry.get()); showMergeDialog(entry, fetchedEntry.get(), fetcher.get()); } else { dialogService.notify(Localization.lang("Cannot get info based on given %0: %1", type, fieldContent.get())); diff --git a/src/main/java/org/jabref/logic/cleanup/CleanupPreset.java b/src/main/java/org/jabref/logic/cleanup/CleanupPreset.java index d35d70affdb..b97196aad8a 100644 --- a/src/main/java/org/jabref/logic/cleanup/CleanupPreset.java +++ b/src/main/java/org/jabref/logic/cleanup/CleanupPreset.java @@ -65,6 +65,9 @@ public enum CleanupStep { * Converts to bibtex format */ CONVERT_TO_BIBTEX, + CONVERT_TIMESTAMP_TO_CREATIONDATE, + CONVERT_TIMESTAMP_TO_MODIFICATIONDATE, + DO_NOT_CONVERT_TIMESTAMP, MOVE_PDF, FIX_FILE_LINKS, CLEAN_UP_ISSN diff --git a/src/main/java/org/jabref/logic/cleanup/CleanupWorker.java b/src/main/java/org/jabref/logic/cleanup/CleanupWorker.java index 1fe79ea0258..0eabdb802f2 100644 --- a/src/main/java/org/jabref/logic/cleanup/CleanupWorker.java +++ b/src/main/java/org/jabref/logic/cleanup/CleanupWorker.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Objects; +import org.jabref.logic.preferences.TimestampPreferences; import org.jabref.model.FieldChange; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; @@ -13,10 +14,12 @@ public class CleanupWorker { private final BibDatabaseContext databaseContext; private final FilePreferences filePreferences; + private final TimestampPreferences timestampPreferences; - public CleanupWorker(BibDatabaseContext databaseContext, CleanupPreferences cleanupPreferences) { + public CleanupWorker(BibDatabaseContext databaseContext, CleanupPreferences cleanupPreferences, TimestampPreferences timestampPreferences) { this.databaseContext = databaseContext; this.filePreferences = cleanupPreferences.getFilePreferences(); + this.timestampPreferences = timestampPreferences; } public List cleanup(CleanupPreset preset, BibEntry entry) { @@ -65,6 +68,10 @@ private CleanupJob toJob(CleanupPreset.CleanupStep action) { return new ConvertToBiblatexCleanup(); case CONVERT_TO_BIBTEX: return new ConvertToBibtexCleanup(); + case CONVERT_TIMESTAMP_TO_CREATIONDATE: + return new TimeStampToCreationDate(timestampPreferences); + case CONVERT_TIMESTAMP_TO_MODIFICATIONDATE: + return new TimeStampToModificationDate(timestampPreferences); case MOVE_PDF: return new MoveFilesCleanup(databaseContext, filePreferences); case FIX_FILE_LINKS: diff --git a/src/main/java/org/jabref/logic/cleanup/TimeStampToCreationDate.java b/src/main/java/org/jabref/logic/cleanup/TimeStampToCreationDate.java new file mode 100644 index 00000000000..2d69a224853 --- /dev/null +++ b/src/main/java/org/jabref/logic/cleanup/TimeStampToCreationDate.java @@ -0,0 +1,88 @@ +package org.jabref.logic.cleanup; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +import org.jabref.logic.preferences.TimestampPreferences; +import org.jabref.model.FieldChange; +import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.Date; +import org.jabref.model.entry.event.EntriesEventSource; +import org.jabref.model.entry.field.Field; +import org.jabref.model.entry.field.StandardField; + +/** + * This class handles the migration from timestamp field to creationdate and modificationdate fields. + *

+ * If the old updateTimestamp setting is enabled, the timestamp field for each entry are migrated to the date-modified field. + * Otherwise it is migrated to the date-added field. + */ +public class TimeStampToCreationDate implements CleanupJob { + + private final Field timeStampField; + + public TimeStampToCreationDate(TimestampPreferences timestampPreferences) { + timeStampField = timestampPreferences.getTimestampField(); + } + + /** + * Formats the time stamp into the local date and time format. + * If the existing timestamp could not be parsed, the day/month/year "1" is used. + * For the time portion 00:00:00 is used. + */ + private Optional formatTimeStamp(String timeStamp) { + Optional parsedDate = Date.parse(timeStamp); + if (parsedDate.isEmpty()) { + // In case the given timestamp could not be parsed + return Optional.empty(); + } else { + Date date = parsedDate.get(); + int year = date.getYear().orElse(1); + int month = getMonth(date); + int day = date.getDay().orElse(1); + LocalDateTime localDateTime = LocalDateTime.of(year, month, day, 0, 0); + // Remove any time unites smaller than seconds + localDateTime.truncatedTo(ChronoUnit.SECONDS); + return Optional.of(localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); + } + } + + /** + * Returns the month value of the passed date if available. + * Otherwise returns the current month. + */ + private int getMonth(Date date) { + if (date.getMonth().isPresent()) { + return date.getMonth().get().getNumber(); + } + return 1; + } + + @Override + public List cleanup(BibEntry entry) { + // Query entries for their timestamp field entries + if (entry.getField(timeStampField).isPresent()) { + Optional formattedTimeStamp = formatTimeStamp(entry.getField(timeStampField).get()); + if (formattedTimeStamp.isEmpty()) { + // In case the timestamp could not be parsed, do nothing to not lose data + return Collections.emptyList(); + } + // Setting the EventSource is necessary to circumvent the update of the modification date during timestamp migration + entry.clearField(timeStampField, EntriesEventSource.CLEANUP_TIMESTAMP); + List changeList = new ArrayList<>(); + FieldChange changeTo; + // Add removal of timestamp field + changeList.add(new FieldChange(entry, StandardField.TIMESTAMP, formattedTimeStamp.get(), "")); + entry.setField(StandardField.CREATIONDATE, formattedTimeStamp.get(), EntriesEventSource.CLEANUP_TIMESTAMP); + changeTo = new FieldChange(entry, StandardField.CREATIONDATE, entry.getField(StandardField.CREATIONDATE).orElse(""), formattedTimeStamp.get()); + changeList.add(changeTo); + return changeList; + } + return Collections.emptyList(); + } +} diff --git a/src/main/java/org/jabref/migrations/TimeStampToDateAddAndModify.java b/src/main/java/org/jabref/logic/cleanup/TimeStampToModificationDate.java similarity index 50% rename from src/main/java/org/jabref/migrations/TimeStampToDateAddAndModify.java rename to src/main/java/org/jabref/logic/cleanup/TimeStampToModificationDate.java index b260009a0d4..6006484f7ff 100644 --- a/src/main/java/org/jabref/migrations/TimeStampToDateAddAndModify.java +++ b/src/main/java/org/jabref/logic/cleanup/TimeStampToModificationDate.java @@ -1,14 +1,18 @@ -package org.jabref.migrations; +package org.jabref.logic.cleanup; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.Optional; -import org.jabref.logic.importer.ParserResult; import org.jabref.logic.preferences.TimestampPreferences; +import org.jabref.model.FieldChange; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.Date; +import org.jabref.model.entry.event.EntriesEventSource; import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.StandardField; @@ -18,46 +22,24 @@ * If the old updateTimestamp setting is enabled, the timestamp field for each entry are migrated to the date-modified field. * Otherwise it is migrated to the date-added field. */ -public class TimeStampToDateAddAndModify implements PostOpenMigration { +public class TimeStampToModificationDate implements CleanupJob { - private final boolean interpretTimeStampAsModificationDate; private final Field timeStampField; - private final TimestampPreferences timestampPreferences; - public TimeStampToDateAddAndModify(TimestampPreferences timestampPreferences) { - this.timestampPreferences = timestampPreferences; - interpretTimeStampAsModificationDate = timestampPreferences.shouldUpdateTimestamp(); + public TimeStampToModificationDate(TimestampPreferences timestampPreferences) { timeStampField = timestampPreferences.getTimestampField(); } - @Override - public void performMigration(ParserResult parserResult) { - parserResult.getDatabase().getEntries().forEach(this::migrateEntry); - } - - private void migrateEntry(BibEntry entry) { - // Query entries for their timestamp field entries - entry.getField(timeStampField).ifPresent(timeStamp -> { - String formattedTimeStamp = formatTimeStamp(timeStamp); - if (interpretTimeStampAsModificationDate) { - entry.setField(StandardField.MODIFICATIONDATE, formattedTimeStamp); - } else { - entry.setField(StandardField.CREATIONDATE, formattedTimeStamp); - } - entry.clearField(timeStampField); - }); - } - /** * Formats the time stamp into the local date and time format. * If the existing timestamp could not be parsed, the day/month/year "1" is used. * For the time portion 00:00:00 is used. */ - private String formatTimeStamp(String timeStamp) { + private Optional formatTimeStamp(String timeStamp) { Optional parsedDate = Date.parse(timeStamp); if (parsedDate.isEmpty()) { - // What to do if the date cannot be parsed? Do we need the custom date format possibly? - return timestampPreferences.now(); + // In case the given timestamp could not be parsed + return Optional.empty(); } else { Date date = parsedDate.get(); int year = date.getYear().orElse(1); @@ -66,7 +48,7 @@ private String formatTimeStamp(String timeStamp) { LocalDateTime localDateTime = LocalDateTime.of(year, month, day, 0, 0); // Remove any time unites smaller than seconds localDateTime.truncatedTo(ChronoUnit.SECONDS); - return localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); + return Optional.of(localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); } } @@ -80,4 +62,27 @@ private int getMonth(Date date) { } return 1; } + + @Override + public List cleanup(BibEntry entry) { + // Query entries for their timestamp field entries + if (entry.getField(timeStampField).isPresent()) { + Optional formattedTimeStamp = formatTimeStamp(entry.getField(timeStampField).get()); + if (formattedTimeStamp.isEmpty()) { + // In case the timestamp could not be parsed, do nothing to not lose data + return Collections.emptyList(); + } + // Setting the EventSource is necessary to circumvent the update of the modification date during timestamp migration + entry.clearField(timeStampField, EntriesEventSource.CLEANUP_TIMESTAMP); + List changeList = new ArrayList<>(); + FieldChange changeTo; + // Add removal of timestamp field + changeList.add(new FieldChange(entry, StandardField.TIMESTAMP, formattedTimeStamp.get(), "")); + entry.setField(StandardField.MODIFICATIONDATE, formattedTimeStamp.get(), EntriesEventSource.CLEANUP_TIMESTAMP); + changeTo = new FieldChange(entry, StandardField.MODIFICATIONDATE, entry.getField(StandardField.MODIFICATIONDATE).orElse(""), formattedTimeStamp.get()); + changeList.add(changeTo); + return changeList; + } + return Collections.emptyList(); + } } diff --git a/src/main/java/org/jabref/logic/importer/OpenDatabase.java b/src/main/java/org/jabref/logic/importer/OpenDatabase.java index 8fec03796a9..e109892c895 100644 --- a/src/main/java/org/jabref/logic/importer/OpenDatabase.java +++ b/src/main/java/org/jabref/logic/importer/OpenDatabase.java @@ -13,7 +13,6 @@ import org.jabref.migrations.ConvertMarkingToGroups; import org.jabref.migrations.PostOpenMigration; import org.jabref.migrations.SpecialFieldsToSeparateFields; -import org.jabref.migrations.TimeStampToDateAddAndModify; import org.jabref.model.util.FileUpdateMonitor; import org.slf4j.Logger; @@ -73,7 +72,6 @@ private static void performLoadDatabaseMigrations(ParserResult parserResult, Tim List postOpenMigrations = Arrays.asList( new ConvertLegacyExplicitGroups(), new ConvertMarkingToGroups(), - new TimeStampToDateAddAndModify(timestampPreferences), new SpecialFieldsToSeparateFields(keywordDelimited) ); diff --git a/src/main/java/org/jabref/logic/importer/SearchBasedFetcher.java b/src/main/java/org/jabref/logic/importer/SearchBasedFetcher.java index b96dbac2ad5..3d20115bbf8 100644 --- a/src/main/java/org/jabref/logic/importer/SearchBasedFetcher.java +++ b/src/main/java/org/jabref/logic/importer/SearchBasedFetcher.java @@ -10,7 +10,7 @@ import org.apache.lucene.queryparser.flexible.core.parser.SyntaxParser; import org.apache.lucene.queryparser.flexible.standard.parser.StandardSyntaxParser; -import static org.jabref.logic.importer.fetcher.transformators.AbstractQueryTransformer.NO_EXPLICIT_FIELD; +import static org.jabref.logic.importer.fetcher.transformers.AbstractQueryTransformer.NO_EXPLICIT_FIELD; /** * Searches web resources for bibliographic information based on a free-text query. diff --git a/src/main/java/org/jabref/logic/importer/fetcher/ACMPortalFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/ACMPortalFetcher.java index d15e555e461..cf703faec02 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/ACMPortalFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/ACMPortalFetcher.java @@ -11,7 +11,7 @@ import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.Parser; import org.jabref.logic.importer.SearchBasedParserFetcher; -import org.jabref.logic.importer.fetcher.transformators.DefaultQueryTransformer; +import org.jabref.logic.importer.fetcher.transformers.DefaultQueryTransformer; import org.jabref.logic.importer.fileformat.BibtexParser; import org.jabref.model.util.DummyFileUpdateMonitor; diff --git a/src/main/java/org/jabref/logic/importer/fetcher/ArXiv.java b/src/main/java/org/jabref/logic/importer/fetcher/ArXiv.java index 0ee11216d1c..cf8c8aec2ec 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/ArXiv.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/ArXiv.java @@ -16,7 +16,6 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; -import org.jabref.logic.cleanup.CleanupJob; import org.jabref.logic.cleanup.EprintCleanup; import org.jabref.logic.help.HelpFile; import org.jabref.logic.importer.FetcherException; @@ -25,7 +24,7 @@ import org.jabref.logic.importer.IdFetcher; import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.PagedSearchBasedFetcher; -import org.jabref.logic.importer.fetcher.transformators.ArXivQueryTransformer; +import org.jabref.logic.importer.fetcher.transformers.ArXivQueryTransformer; import org.jabref.logic.util.io.XMLUtil; import org.jabref.logic.util.strings.StringSimilarity; import org.jabref.model.entry.BibEntry; @@ -80,7 +79,6 @@ public Optional findFullText(BibEntry entry) throws IOException { .map(Optional::get) .findFirst(); pdfUrl.ifPresent(url -> LOGGER.info("Fulltext PDF found @ arXiv.")); - return pdfUrl; } catch (FetcherException e) { LOGGER.warn("arXiv API request failed", e); @@ -117,11 +115,12 @@ private Optional searchForEntryById(String id) throws FetcherExcepti } } - private List searchForEntries(BibEntry entry) throws FetcherException { - entry = (BibEntry) entry.clone(); - CleanupJob cleanupJob = new EprintCleanup(); - cleanupJob.cleanup(entry); - // 1. Eprint + private List searchForEntries(BibEntry originalEntry) throws FetcherException { + // We need to clone the entry, because we modify it by a cleanup job. + final BibEntry entry = (BibEntry) originalEntry.clone(); + + // 1. Check for Eprint + new EprintCleanup().cleanup(entry); Optional identifier = entry.getField(StandardField.EPRINT); if (StringUtil.isNotBlank(identifier)) { try { @@ -133,26 +132,21 @@ private List searchForEntries(BibEntry entry) throws FetcherExceptio } // 2. DOI and other fields - String query; - - Optional doi = entry.getField(StandardField.DOI).flatMap(DOI::parse).map(DOI::getNormalized); - if (doi.isPresent()) { - // Search for an entry in the ArXiv which is linked to the doi - query = "doi:" + doi.get(); - } else { - Optional authorQuery = entry.getField(StandardField.AUTHOR).map(author -> "au:" + author); - Optional titleQuery = entry.getField(StandardField.TITLE).map(title -> "ti:" + StringUtil.ignoreCurlyBracket(title)); - query = OptionalUtil.toList(authorQuery, titleQuery).stream().collect(Collectors.joining("+AND+")); - } - + String query = entry.getField(StandardField.DOI) + .flatMap(DOI::parse) + .map(DOI::getNormalized) + .map(doiString -> "doi:" + doiString) + .orElseGet(() -> { + Optional authorQuery = entry.getField(StandardField.AUTHOR).map(author -> "au:" + author); + Optional titleQuery = entry.getField(StandardField.TITLE).map(title -> "ti:" + StringUtil.ignoreCurlyBracket(title)); + return String.join("+AND+", OptionalUtil.toList(authorQuery, titleQuery)); + }); Optional arxivEntry = searchForEntry(query); - if (arxivEntry.isPresent()) { // Check if entry is a match StringSimilarity match = new StringSimilarity(); String arxivTitle = arxivEntry.get().title.orElse(""); String entryTitle = StringUtil.ignoreCurlyBracket(entry.getField(StandardField.TITLE).orElse("")); - if (match.isSimilar(arxivTitle, entryTitle)) { return OptionalUtil.toList(arxivEntry); } @@ -175,7 +169,7 @@ private List queryApi(String searchQuery, List ids, /** * Queries the API. - * + *

* If only {@code searchQuery} is given, then the API will return results for each article that matches the query. * If only {@code ids} is given, then the API will return results for each article in the list. * If both {@code searchQuery} and {@code ids} are given, then the API will return each article in diff --git a/src/main/java/org/jabref/logic/importer/fetcher/AstrophysicsDataSystem.java b/src/main/java/org/jabref/logic/importer/fetcher/AstrophysicsDataSystem.java index 6da8f0920d3..2fff3084f95 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/AstrophysicsDataSystem.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/AstrophysicsDataSystem.java @@ -27,7 +27,7 @@ import org.jabref.logic.importer.PagedSearchBasedParserFetcher; import org.jabref.logic.importer.ParseException; import org.jabref.logic.importer.Parser; -import org.jabref.logic.importer.fetcher.transformators.DefaultQueryTransformer; +import org.jabref.logic.importer.fetcher.transformers.DefaultQueryTransformer; import org.jabref.logic.importer.fileformat.BibtexParser; import org.jabref.logic.net.URLDownload; import org.jabref.logic.util.BuildInfo; diff --git a/src/main/java/org/jabref/logic/importer/fetcher/CiteSeer.java b/src/main/java/org/jabref/logic/importer/fetcher/CiteSeer.java index c6e4c2b6ba5..4c72717d730 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/CiteSeer.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/CiteSeer.java @@ -20,7 +20,7 @@ import org.jabref.logic.importer.FetcherException; import org.jabref.logic.importer.Parser; import org.jabref.logic.importer.SearchBasedParserFetcher; -import org.jabref.logic.importer.fetcher.transformators.DefaultQueryTransformer; +import org.jabref.logic.importer.fetcher.transformers.DefaultQueryTransformer; import org.jabref.logic.importer.fileformat.CoinsParser; import org.jabref.logic.util.OS; import org.jabref.model.entry.BibEntry; diff --git a/src/main/java/org/jabref/logic/importer/fetcher/CollectionOfComputerScienceBibliographiesFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/CollectionOfComputerScienceBibliographiesFetcher.java index b6556e0930f..71bf613c79d 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/CollectionOfComputerScienceBibliographiesFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/CollectionOfComputerScienceBibliographiesFetcher.java @@ -14,7 +14,7 @@ import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.Parser; import org.jabref.logic.importer.SearchBasedParserFetcher; -import org.jabref.logic.importer.fetcher.transformators.DefaultQueryTransformer; +import org.jabref.logic.importer.fetcher.transformers.CollectionOfComputerScienceBibliographiesQueryTransformer; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.FieldFactory; @@ -37,7 +37,7 @@ public CollectionOfComputerScienceBibliographiesFetcher(ImportFormatPreferences @Override public URL getURLForQuery(QueryNode luceneQuery) throws URISyntaxException, MalformedURLException, FetcherException { return new URIBuilder(BASIC_SEARCH_URL) - .addParameter("query", new DefaultQueryTransformer().transformLuceneQuery(luceneQuery).orElse("")) + .addParameter("query", new CollectionOfComputerScienceBibliographiesQueryTransformer().transformLuceneQuery(luceneQuery).orElse("")) .addParameter("sort", "score") .build() .toURL(); diff --git a/src/main/java/org/jabref/logic/importer/fetcher/CompositeSearchBasedFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/CompositeSearchBasedFetcher.java index c616b018cb1..97506c284a6 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/CompositeSearchBasedFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/CompositeSearchBasedFetcher.java @@ -8,9 +8,7 @@ import org.jabref.logic.help.HelpFile; import org.jabref.logic.importer.FetcherException; -import org.jabref.logic.importer.ImportCleanup; import org.jabref.logic.importer.SearchBasedFetcher; -import org.jabref.model.database.BibDatabaseMode; import org.jabref.model.entry.BibEntry; import org.apache.lucene.queryparser.flexible.core.nodes.QueryNode; @@ -48,7 +46,6 @@ public Optional getHelpPage() { @Override public List performSearch(QueryNode luceneQuery) throws FetcherException { - ImportCleanup cleanup = new ImportCleanup(BibDatabaseMode.BIBTEX); // All entries have to be converted into one format, this is necessary for the format conversion return fetchers.parallelStream() .flatMap(searchBasedFetcher -> { @@ -60,7 +57,6 @@ public List performSearch(QueryNode luceneQuery) throws FetcherExcepti } }) .limit(maximumNumberOfReturnedResults) - .map(cleanup::doPostCleanup) .collect(Collectors.toList()); } } diff --git a/src/main/java/org/jabref/logic/importer/fetcher/CrossRef.java b/src/main/java/org/jabref/logic/importer/fetcher/CrossRef.java index e6627f17f54..9c201e1e7c1 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/CrossRef.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/CrossRef.java @@ -19,7 +19,7 @@ import org.jabref.logic.importer.ParseException; import org.jabref.logic.importer.Parser; import org.jabref.logic.importer.SearchBasedParserFetcher; -import org.jabref.logic.importer.fetcher.transformators.DefaultQueryTransformer; +import org.jabref.logic.importer.fetcher.transformers.DefaultQueryTransformer; import org.jabref.logic.importer.util.JsonReader; import org.jabref.logic.util.strings.StringSimilarity; import org.jabref.model.entry.Author; diff --git a/src/main/java/org/jabref/logic/importer/fetcher/DBLPFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/DBLPFetcher.java index 2d12d9820f5..d961ce0b3bc 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/DBLPFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/DBLPFetcher.java @@ -16,7 +16,7 @@ import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.Parser; import org.jabref.logic.importer.SearchBasedParserFetcher; -import org.jabref.logic.importer.fetcher.transformators.DBLPQueryTransformer; +import org.jabref.logic.importer.fetcher.transformers.DBLPQueryTransformer; import org.jabref.logic.importer.fileformat.BibtexParser; import org.jabref.logic.layout.LayoutFormatterBasedFormatter; import org.jabref.logic.layout.format.RemoveLatexCommandsFormatter; 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 5f62756cdf7..a8656936077 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/DOAJFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/DOAJFetcher.java @@ -16,7 +16,7 @@ import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.Parser; import org.jabref.logic.importer.SearchBasedParserFetcher; -import org.jabref.logic.importer.fetcher.transformators.DefaultQueryTransformer; +import org.jabref.logic.importer.fetcher.transformers.DefaultLuceneQueryTransformer; import org.jabref.logic.util.OS; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.Field; @@ -192,7 +192,7 @@ public Optional getHelpPage() { @Override public URL getURLForQuery(QueryNode luceneQuery) throws URISyntaxException, MalformedURLException, FetcherException { URIBuilder uriBuilder = new URIBuilder(SEARCH_URL); - DOAJFetcher.addPath(uriBuilder, new DefaultQueryTransformer().transformLuceneQuery(luceneQuery).orElse("")); + DOAJFetcher.addPath(uriBuilder, new DefaultLuceneQueryTransformer().transformLuceneQuery(luceneQuery).orElse("")); // Number of results uriBuilder.addParameter("pageSize", "30"); // Page (not needed so far) diff --git a/src/main/java/org/jabref/logic/importer/fetcher/GoogleScholar.java b/src/main/java/org/jabref/logic/importer/fetcher/GoogleScholar.java index ffd4f9a55e0..fc72717086f 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/GoogleScholar.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/GoogleScholar.java @@ -19,7 +19,7 @@ import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.PagedSearchBasedFetcher; import org.jabref.logic.importer.ParserResult; -import org.jabref.logic.importer.fetcher.transformators.ScholarQueryTransformer; +import org.jabref.logic.importer.fetcher.transformers.ScholarQueryTransformer; import org.jabref.logic.importer.fileformat.BibtexParser; import org.jabref.logic.l10n.Localization; import org.jabref.logic.net.URLDownload; diff --git a/src/main/java/org/jabref/logic/importer/fetcher/GvkFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/GvkFetcher.java index db6afbc6606..23dd4e8080e 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/GvkFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/GvkFetcher.java @@ -11,7 +11,7 @@ import org.jabref.logic.importer.FetcherException; import org.jabref.logic.importer.Parser; import org.jabref.logic.importer.SearchBasedParserFetcher; -import org.jabref.logic.importer.fetcher.transformators.GVKQueryTransformer; +import org.jabref.logic.importer.fetcher.transformers.GVKQueryTransformer; import org.jabref.logic.importer.fileformat.GvkParser; import org.apache.http.client.utils.URIBuilder; diff --git a/src/main/java/org/jabref/logic/importer/fetcher/IEEE.java b/src/main/java/org/jabref/logic/importer/fetcher/IEEE.java index 9cd5341d357..18d2254e013 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/IEEE.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/IEEE.java @@ -20,7 +20,7 @@ import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.PagedSearchBasedParserFetcher; import org.jabref.logic.importer.Parser; -import org.jabref.logic.importer.fetcher.transformators.IEEEQueryTransformer; +import org.jabref.logic.importer.fetcher.transformers.IEEEQueryTransformer; import org.jabref.logic.net.URLDownload; import org.jabref.logic.util.BuildInfo; import org.jabref.logic.util.OS; diff --git a/src/main/java/org/jabref/logic/importer/fetcher/INSPIREFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/INSPIREFetcher.java index c594ebb5efc..553114e46c6 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/INSPIREFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/INSPIREFetcher.java @@ -13,7 +13,7 @@ import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.Parser; import org.jabref.logic.importer.SearchBasedParserFetcher; -import org.jabref.logic.importer.fetcher.transformators.DefaultQueryTransformer; +import org.jabref.logic.importer.fetcher.transformers.DefaultLuceneQueryTransformer; import org.jabref.logic.importer.fileformat.BibtexParser; import org.jabref.logic.importer.util.MediaTypes; import org.jabref.logic.layout.format.LatexToUnicodeFormatter; @@ -52,7 +52,7 @@ public Optional getHelpPage() { @Override public URL getURLForQuery(QueryNode luceneQuery) throws URISyntaxException, MalformedURLException, FetcherException { URIBuilder uriBuilder = new URIBuilder(INSPIRE_HOST); - uriBuilder.addParameter("q", new DefaultQueryTransformer().transformLuceneQuery(luceneQuery).orElse("")); // Query + uriBuilder.addParameter("q", new DefaultLuceneQueryTransformer().transformLuceneQuery(luceneQuery).orElse("")); return uriBuilder.build().toURL(); } diff --git a/src/main/java/org/jabref/logic/importer/fetcher/JstorFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/JstorFetcher.java index 4c2f49a16d5..9e78db86377 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/JstorFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/JstorFetcher.java @@ -19,7 +19,7 @@ import org.jabref.logic.importer.ParseException; import org.jabref.logic.importer.Parser; import org.jabref.logic.importer.SearchBasedParserFetcher; -import org.jabref.logic.importer.fetcher.transformators.DefaultQueryTransformer; +import org.jabref.logic.importer.fetcher.transformers.JstorQueryTransformer; import org.jabref.logic.importer.fileformat.BibtexParser; import org.jabref.logic.net.URLDownload; import org.jabref.model.entry.BibEntry; @@ -51,7 +51,7 @@ public JstorFetcher(ImportFormatPreferences importFormatPreferences) { @Override public URL getURLForQuery(QueryNode luceneQuery) throws URISyntaxException, MalformedURLException, FetcherException { URIBuilder uriBuilder = new URIBuilder(SEARCH_HOST); - uriBuilder.addParameter("Query", new DefaultQueryTransformer().transformLuceneQuery(luceneQuery).orElse("")); + uriBuilder.addParameter("Query", new JstorQueryTransformer().transformLuceneQuery(luceneQuery).orElse("")); return uriBuilder.build().toURL(); } diff --git a/src/main/java/org/jabref/logic/importer/fetcher/MathSciNet.java b/src/main/java/org/jabref/logic/importer/fetcher/MathSciNet.java index bfc2ca3ab8c..f8282fce74d 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/MathSciNet.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/MathSciNet.java @@ -23,7 +23,7 @@ import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.Parser; import org.jabref.logic.importer.SearchBasedParserFetcher; -import org.jabref.logic.importer.fetcher.transformators.DefaultQueryTransformer; +import org.jabref.logic.importer.fetcher.transformers.DefaultQueryTransformer; import org.jabref.logic.importer.fileformat.BibtexParser; import org.jabref.logic.util.OS; import org.jabref.model.entry.BibEntry; diff --git a/src/main/java/org/jabref/logic/importer/fetcher/MedlineFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/MedlineFetcher.java index 304b76da38a..42731cc1ae5 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/MedlineFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/MedlineFetcher.java @@ -28,7 +28,7 @@ import org.jabref.logic.importer.Parser; import org.jabref.logic.importer.ParserResult; import org.jabref.logic.importer.SearchBasedFetcher; -import org.jabref.logic.importer.fetcher.transformators.DefaultQueryTransformer; +import org.jabref.logic.importer.fetcher.transformers.DefaultQueryTransformer; import org.jabref.logic.importer.fileformat.MedlineImporter; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; diff --git a/src/main/java/org/jabref/logic/importer/fetcher/ScienceDirect.java b/src/main/java/org/jabref/logic/importer/fetcher/ScienceDirect.java index 9db80d2b600..dd8868c3082 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/ScienceDirect.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/ScienceDirect.java @@ -7,6 +7,7 @@ import org.jabref.logic.importer.FulltextFetcher; import org.jabref.logic.net.URLDownload; +import org.jabref.logic.util.BuildInfo; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.StandardField; import org.jabref.model.entry.identifier.DOI; @@ -31,7 +32,7 @@ public class ScienceDirect implements FulltextFetcher { private static final Logger LOGGER = LoggerFactory.getLogger(ScienceDirect.class); private static final String API_URL = "http://api.elsevier.com/content/article/doi/"; - private static final String API_KEY = "fb82f2e692b3c72dafe5f4f1fa0ac00b"; + private static final String API_KEY = new BuildInfo().scienceDirectApiKey; @Override public Optional findFullText(BibEntry entry) throws IOException { diff --git a/src/main/java/org/jabref/logic/importer/fetcher/SpringerFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/SpringerFetcher.java index 5c3b34b6d01..efd8f4b325b 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/SpringerFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/SpringerFetcher.java @@ -14,7 +14,7 @@ import org.jabref.logic.importer.FetcherException; import org.jabref.logic.importer.PagedSearchBasedParserFetcher; import org.jabref.logic.importer.Parser; -import org.jabref.logic.importer.fetcher.transformators.SpringerQueryTransformer; +import org.jabref.logic.importer.fetcher.transformers.SpringerQueryTransformer; import org.jabref.logic.util.BuildInfo; import org.jabref.logic.util.OS; import org.jabref.model.entry.BibEntry; diff --git a/src/main/java/org/jabref/logic/importer/fetcher/ZbMATH.java b/src/main/java/org/jabref/logic/importer/fetcher/ZbMATH.java index 1794c678455..592688412ce 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/ZbMATH.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/ZbMATH.java @@ -16,7 +16,7 @@ import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.Parser; import org.jabref.logic.importer.SearchBasedParserFetcher; -import org.jabref.logic.importer.fetcher.transformators.ZbMathQueryTransformer; +import org.jabref.logic.importer.fetcher.transformers.ZbMathQueryTransformer; import org.jabref.logic.importer.fileformat.BibtexParser; import org.jabref.logic.net.URLDownload; import org.jabref.model.entry.AuthorList; diff --git a/src/main/java/org/jabref/logic/importer/fetcher/transformators/ArXivQueryTransformer.java b/src/main/java/org/jabref/logic/importer/fetcher/transformators/ArXivQueryTransformer.java deleted file mode 100644 index dd94eab746b..00000000000 --- a/src/main/java/org/jabref/logic/importer/fetcher/transformators/ArXivQueryTransformer.java +++ /dev/null @@ -1,77 +0,0 @@ -package org.jabref.logic.importer.fetcher.transformators; - -import java.util.Optional; - -public class ArXivQueryTransformer extends AbstractQueryTransformer { - // These can be used for filtering in post processing - private int startYear = Integer.MAX_VALUE; - private int endYear = Integer.MIN_VALUE; - - @Override - protected String getLogicalAndOperator() { - return " AND "; - } - - @Override - protected String getLogicalOrOperator() { - return " OR "; - } - - /** - * Check whether this works as an unary operator - * @return - */ - @Override - protected String getLogicalNotOperator() { - return " ANDNOT "; - } - - @Override - protected String handleAuthor(String author) { - return String.format("au:\"%s\"", author); - } - - @Override - protected String handleTitle(String title) { - return String.format("ti:\"%s\"", title); - } - - @Override - protected String handleJournal(String journalTitle) { - return String.format("jr:\"%s\"", journalTitle); - } - - /** - * Manual testing shows that this works if added as an unfielded term, might lead to false positives - */ - @Override - protected String handleYear(String year) { - startYear = Math.min(startYear, Integer.parseInt(year)); - endYear = Math.max(endYear, Integer.parseInt(year)); - return year; - } - - /** - * Currently not supported - */ - @Override - protected String handleYearRange(String yearRange) { - String[] split = yearRange.split("-"); - startYear = Math.min(startYear, Integer.parseInt(split[0])); - endYear = Math.max(endYear, Integer.parseInt(split[1])); - return ""; - } - - @Override - protected String handleUnFieldedTerm(String term) { - return String.format("all:\"%s\"", term); - } - - public Optional getStartYear() { - return startYear == Integer.MAX_VALUE ? Optional.empty() : Optional.of(startYear); - } - - public Optional getEndYear() { - return endYear == Integer.MIN_VALUE ? Optional.empty() : Optional.of(endYear); - } -} diff --git a/src/main/java/org/jabref/logic/importer/fetcher/transformators/DBLPQueryTransformer.java b/src/main/java/org/jabref/logic/importer/fetcher/transformators/DBLPQueryTransformer.java deleted file mode 100644 index df943509320..00000000000 --- a/src/main/java/org/jabref/logic/importer/fetcher/transformators/DBLPQueryTransformer.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.jabref.logic.importer.fetcher.transformators; - -import java.util.StringJoiner; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DBLPQueryTransformer extends AbstractQueryTransformer { - private static final Logger LOGGER = LoggerFactory.getLogger(DBLPQueryTransformer.class); - - @Override - protected String getLogicalAndOperator() { - return " "; - } - - @Override - protected String getLogicalOrOperator() { - return "|"; - } - - @Override - protected String getLogicalNotOperator() { - LOGGER.warn("DBLP does not support Boolean NOT operator."); - return ""; - } - - @Override - protected String handleAuthor(String author) { - // DBLP does not support explicit author field search - return String.format("\"%s\"", author); - } - - @Override - protected String handleTitle(String title) { - // DBLP does not support explicit title field search - return String.format("\"%s\"", title); - } - - @Override - protected String handleJournal(String journalTitle) { - // DBLP does not support explicit journal field search - return String.format("\"%s\"", journalTitle); - } - - @Override - protected String handleYear(String year) { - // DBLP does not support explicit year field search - return year; - } - - @Override - protected String handleYearRange(String yearRange) { - // DBLP does not support explicit year range search - String[] split = yearRange.split("-"); - StringJoiner resultBuilder = new StringJoiner(getLogicalOrOperator()); - for (int i = Integer.parseInt(split[0]); i <= Integer.parseInt(split[1]); i++) { - resultBuilder.add(String.valueOf(i)); - } - return resultBuilder.toString(); - } - - @Override - protected String handleUnFieldedTerm(String term) { - return String.format("\"%s\"", term); - } -} diff --git a/src/main/java/org/jabref/logic/importer/fetcher/transformators/ScholarQueryTransformer.java b/src/main/java/org/jabref/logic/importer/fetcher/transformators/ScholarQueryTransformer.java deleted file mode 100644 index a83db9364b1..00000000000 --- a/src/main/java/org/jabref/logic/importer/fetcher/transformators/ScholarQueryTransformer.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.jabref.logic.importer.fetcher.transformators; - -public class ScholarQueryTransformer extends AbstractQueryTransformer { - // These have to be integrated into the Google Scholar query URL as these are just supported as query parameters - private int startYear = Integer.MAX_VALUE; - private int endYear = Integer.MIN_VALUE; - - @Override - protected String getLogicalAndOperator() { - return " AND "; - } - - @Override - protected String getLogicalOrOperator() { - return " OR "; - } - - @Override - protected String getLogicalNotOperator() { - return "-"; - } - - @Override - protected String handleAuthor(String author) { - return String.format("author:\"%s\"", author); - } - - @Override - protected String handleTitle(String title) { - return String.format("allintitle:\"%s\"", title); - } - - @Override - protected String handleJournal(String journalTitle) { - return String.format("source:\"%s\"", journalTitle); - } - - @Override - protected String handleYear(String year) { - startYear = Math.min(startYear, Integer.parseInt(year)); - endYear = Math.max(endYear, Integer.parseInt(year)); - return ""; - } - - @Override - protected String handleYearRange(String yearRange) { - String[] split = yearRange.split("-"); - startYear = Math.min(startYear, Integer.parseInt(split[0])); - endYear = Math.max(endYear, Integer.parseInt(split[1])); - return ""; - } - - @Override - protected String handleUnFieldedTerm(String term) { - return String.format("\"%s\"", term); - } - - public int getStartYear() { - return startYear == Integer.MAX_VALUE ? Integer.MIN_VALUE : startYear; - } - - public int getEndYear() { - return endYear == Integer.MIN_VALUE ? Integer.MAX_VALUE : endYear; - } -} diff --git a/src/main/java/org/jabref/logic/importer/fetcher/transformators/AbstractQueryTransformer.java b/src/main/java/org/jabref/logic/importer/fetcher/transformers/AbstractQueryTransformer.java similarity index 73% rename from src/main/java/org/jabref/logic/importer/fetcher/transformators/AbstractQueryTransformer.java rename to src/main/java/org/jabref/logic/importer/fetcher/transformers/AbstractQueryTransformer.java index 32c7a6b8d18..22e8c642d80 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/transformators/AbstractQueryTransformer.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/transformers/AbstractQueryTransformer.java @@ -1,6 +1,7 @@ -package org.jabref.logic.importer.fetcher.transformators; +package org.jabref.logic.importer.fetcher.transformers; import java.util.Optional; +import java.util.StringJoiner; import java.util.stream.Collectors; import org.apache.lucene.queryparser.flexible.core.nodes.BooleanQueryNode; @@ -13,13 +14,17 @@ import org.slf4j.LoggerFactory; /** - * In case the transformator contains state for a query transformation (such as the {@link IEEEQueryTransformer}), it has to be noted at the JavaDoc. + * In case the transformer contains state for a query transformation (such as the {@link IEEEQueryTransformer}), it has to be noted at the JavaDoc. * Otherwise, a single instance QueryTransformer can be used. */ public abstract class AbstractQueryTransformer { public static final String NO_EXPLICIT_FIELD = "default"; private static final Logger LOGGER = LoggerFactory.getLogger(AbstractQueryTransformer.class); + // These can be used for filtering in post processing + protected int startYear = Integer.MAX_VALUE; + protected int endYear = Integer.MIN_VALUE; + /** * Transforms a and b and c to (a AND b AND c), where * a, b, and c can be complex expressions. @@ -136,25 +141,80 @@ private Optional transform(ModifierQueryNode query) { */ protected abstract String handleYear(String year); + /** + * Parses the year range and fills startYear and endYear. + * Ensures that startYear <= endYear + */ + protected void parseYearRange(String yearRange) { + String[] split = yearRange.split("-"); + int parsedStartYear = Integer.parseInt(split[0]); + startYear = parsedStartYear; + if (split.length >= 1) { + int parsedEndYear = Integer.parseInt(split[1]); + if (parsedEndYear >= parsedStartYear) { + endYear = parsedEndYear; + } else { + startYear = parsedEndYear; + endYear = parsedStartYear; + } + } + } + /** * Return a string representation of the year-range fielded term * Should follow the structure yyyy-yyyy * * Example: 2015-2021 */ - protected abstract String handleYearRange(String yearRange); + protected String handleYearRange(String yearRange) { + parseYearRange(yearRange); + if (endYear == Integer.MAX_VALUE) { + // invalid year range + return yearRange; + } + StringJoiner resultBuilder = new StringJoiner(getLogicalOrOperator()); + for (int i = startYear; i <= endYear; i++) { + resultBuilder.add(handleYear(String.valueOf(i))); + } + return resultBuilder.toString(); + } /** * Return a string representation of the un-fielded (default fielded) term + * + * Default implementation: just return the term (in quotes if a space is contained) */ - protected abstract String handleUnFieldedTerm(String term); + protected String handleUnFieldedTerm(String term) { + return quoteStringIfSpaceIsContained(term); + } + + /** + * Encloses the given string with " if there is a space contained + * + * @return Returns a string + */ + protected String quoteStringIfSpaceIsContained(String string) { + if (string.contains(" ")) { + return "\"" + string + "\""; + } else { + return string; + } + } + + protected String createKeyValuePair(String fieldAsString, String term) { + return createKeyValuePair(fieldAsString, term, ":"); + } + + protected String createKeyValuePair(String fieldAsString, String term, String separator) { + return String.format("%s%s%s", fieldAsString, separator, quoteStringIfSpaceIsContained(term)); + } /** * Return a string representation of the provided field * If it is not supported return an empty optional. */ protected Optional handleOtherField(String fieldAsString, String term) { - return Optional.of(String.format("%s:\"%s\"", fieldAsString, term)); + return Optional.of(createKeyValuePair(fieldAsString, term)); } private Optional transform(QueryNode query) { diff --git a/src/main/java/org/jabref/logic/importer/fetcher/transformers/ArXivQueryTransformer.java b/src/main/java/org/jabref/logic/importer/fetcher/transformers/ArXivQueryTransformer.java new file mode 100644 index 00000000000..51efafba3dd --- /dev/null +++ b/src/main/java/org/jabref/logic/importer/fetcher/transformers/ArXivQueryTransformer.java @@ -0,0 +1,49 @@ +package org.jabref.logic.importer.fetcher.transformers; + +public class ArXivQueryTransformer extends YearRangeByFilteringQueryTransformer { + @Override + protected String getLogicalAndOperator() { + return " AND "; + } + + @Override + protected String getLogicalOrOperator() { + return " OR "; + } + + @Override + protected String getLogicalNotOperator() { + return " ANDNOT "; + } + + @Override + protected String handleAuthor(String author) { + return createKeyValuePair("au", author); + } + + @Override + protected String handleTitle(String title) { + return createKeyValuePair("ti", title); + } + + @Override + protected String handleJournal(String journalTitle) { + return createKeyValuePair("jr", journalTitle); + } + + /** + * Manual testing shows that this works if added as an unfielded term, might lead to false positives + */ + @Override + protected String handleYear(String year) { + startYear = Math.min(startYear, Integer.parseInt(year)); + endYear = Math.max(endYear, Integer.parseInt(year)); + return year; + } + + @Override + protected String handleUnFieldedTerm(String term) { + return createKeyValuePair("all", term); + } + +} diff --git a/src/main/java/org/jabref/logic/importer/fetcher/transformators/DefaultQueryTransformer.java b/src/main/java/org/jabref/logic/importer/fetcher/transformers/CollectionOfComputerScienceBibliographiesQueryTransformer.java similarity index 52% rename from src/main/java/org/jabref/logic/importer/fetcher/transformators/DefaultQueryTransformer.java rename to src/main/java/org/jabref/logic/importer/fetcher/transformers/CollectionOfComputerScienceBibliographiesQueryTransformer.java index b99e327269c..18e43a1f114 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/transformators/DefaultQueryTransformer.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/transformers/CollectionOfComputerScienceBibliographiesQueryTransformer.java @@ -1,6 +1,6 @@ -package org.jabref.logic.importer.fetcher.transformators; +package org.jabref.logic.importer.fetcher.transformers; -public class DefaultQueryTransformer extends AbstractQueryTransformer { +public class CollectionOfComputerScienceBibliographiesQueryTransformer extends AbstractQueryTransformer { @Override protected String getLogicalAndOperator() { @@ -9,41 +9,31 @@ protected String getLogicalAndOperator() { @Override protected String getLogicalOrOperator() { - return " "; + return " OR "; } @Override protected String getLogicalNotOperator() { - return ""; + return "-"; } @Override protected String handleAuthor(String author) { - return author; + return createKeyValuePair("au", author); } @Override protected String handleTitle(String title) { - return title; + return createKeyValuePair("ti", title); } @Override protected String handleJournal(String journalTitle) { - return journalTitle; + return quoteStringIfSpaceIsContained(journalTitle); } @Override protected String handleYear(String year) { - return year; - } - - @Override - protected String handleYearRange(String yearRange) { - return yearRange; - } - - @Override - protected String handleUnFieldedTerm(String term) { - return term; + return String.format("year:%s", year); } } diff --git a/src/main/java/org/jabref/logic/importer/fetcher/transformers/DBLPQueryTransformer.java b/src/main/java/org/jabref/logic/importer/fetcher/transformers/DBLPQueryTransformer.java new file mode 100644 index 00000000000..97fd186a27e --- /dev/null +++ b/src/main/java/org/jabref/logic/importer/fetcher/transformers/DBLPQueryTransformer.java @@ -0,0 +1,45 @@ +package org.jabref.logic.importer.fetcher.transformers; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * DBLP does not support explicit year field search, thus we extend YearAndYearRangeByFilteringQueryTransformer + */ +public class DBLPQueryTransformer extends YearAndYearRangeByFilteringQueryTransformer { + private static final Logger LOGGER = LoggerFactory.getLogger(DBLPQueryTransformer.class); + + @Override + protected String getLogicalAndOperator() { + return " "; + } + + @Override + protected String getLogicalOrOperator() { + return "|"; + } + + @Override + protected String getLogicalNotOperator() { + LOGGER.warn("DBLP does not support Boolean NOT operator."); + return ""; + } + + @Override + protected String handleAuthor(String author) { + // DBLP does not support explicit author field search + return quoteStringIfSpaceIsContained(author); + } + + @Override + protected String handleTitle(String title) { + // DBLP does not support explicit title field search + return quoteStringIfSpaceIsContained(title); + } + + @Override + protected String handleJournal(String journalTitle) { + // DBLP does not support explicit journal field search + return quoteStringIfSpaceIsContained(journalTitle); + } +} diff --git a/src/main/java/org/jabref/logic/importer/fetcher/transformers/DefaultLuceneQueryTransformer.java b/src/main/java/org/jabref/logic/importer/fetcher/transformers/DefaultLuceneQueryTransformer.java new file mode 100644 index 00000000000..b13aba1b1b3 --- /dev/null +++ b/src/main/java/org/jabref/logic/importer/fetcher/transformers/DefaultLuceneQueryTransformer.java @@ -0,0 +1,42 @@ +package org.jabref.logic.importer.fetcher.transformers; + +/** + * Transforms the query to a lucene query string + */ +public class DefaultLuceneQueryTransformer extends AbstractQueryTransformer { + + @Override + protected String getLogicalAndOperator() { + return " AND "; + } + + @Override + protected String getLogicalOrOperator() { + return " OR "; + } + + @Override + protected String getLogicalNotOperator() { + return "NOT "; + } + + @Override + protected String handleAuthor(String author) { + return createKeyValuePair("author", author); + } + + @Override + protected String handleTitle(String title) { + return createKeyValuePair("title", title); + } + + @Override + protected String handleJournal(String journalTitle) { + return createKeyValuePair("journal", journalTitle); + } + + @Override + protected String handleYear(String year) { + return createKeyValuePair("year", year); + } +} diff --git a/src/main/java/org/jabref/logic/importer/fetcher/transformers/DefaultQueryTransformer.java b/src/main/java/org/jabref/logic/importer/fetcher/transformers/DefaultQueryTransformer.java new file mode 100644 index 00000000000..f77c42b99b9 --- /dev/null +++ b/src/main/java/org/jabref/logic/importer/fetcher/transformers/DefaultQueryTransformer.java @@ -0,0 +1,37 @@ +package org.jabref.logic.importer.fetcher.transformers; + +/** + * Default query transformer without any boolean operators + */ +public class DefaultQueryTransformer extends YearAndYearRangeByFilteringQueryTransformer { + + @Override + protected String getLogicalAndOperator() { + return " "; + } + + @Override + protected String getLogicalOrOperator() { + return " "; + } + + @Override + protected String getLogicalNotOperator() { + return ""; + } + + @Override + protected String handleAuthor(String author) { + return quoteStringIfSpaceIsContained(author); + } + + @Override + protected String handleTitle(String title) { + return quoteStringIfSpaceIsContained(title); + } + + @Override + protected String handleJournal(String journalTitle) { + return quoteStringIfSpaceIsContained(journalTitle); + } +} diff --git a/src/main/java/org/jabref/logic/importer/fetcher/transformators/GVKQueryTransformer.java b/src/main/java/org/jabref/logic/importer/fetcher/transformers/GVKQueryTransformer.java similarity index 62% rename from src/main/java/org/jabref/logic/importer/fetcher/transformators/GVKQueryTransformer.java rename to src/main/java/org/jabref/logic/importer/fetcher/transformers/GVKQueryTransformer.java index 402e68b09c0..e2da33c57ed 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/transformators/GVKQueryTransformer.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/transformers/GVKQueryTransformer.java @@ -1,11 +1,11 @@ -package org.jabref.logic.importer.fetcher.transformators; +package org.jabref.logic.importer.fetcher.transformers; import java.util.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class GVKQueryTransformer extends AbstractQueryTransformer { +public class GVKQueryTransformer extends YearRangeByFilteringQueryTransformer { private static final Logger LOGGER = LoggerFactory.getLogger(GVKQueryTransformer.class); @Override @@ -16,52 +16,46 @@ protected String getLogicalAndOperator() { @Override protected String getLogicalOrOperator() { LOGGER.warn("GVK does not support Boolean OR operator"); - return ""; + return " "; } @Override protected String getLogicalNotOperator() { LOGGER.warn("GVK does not support Boolean NOT operator"); - return ""; + return " "; } @Override protected String handleAuthor(String author) { - return String.format("pica.per=\"%s\"", author); + return createKeyValuePair("pica.per", author, "="); } @Override protected String handleTitle(String title) { - return String.format("pica.tit=\"%s\"", title); + return createKeyValuePair("pica.tit", title, "="); } @Override protected String handleJournal(String journalTitle) { // zti means "Zeitschrift", does not search for conferences (kon:) - return String.format("pica.zti=\"%s\"", journalTitle); + return createKeyValuePair("pica.zti", journalTitle, "="); } @Override protected String handleYear(String year) { - // ver means Veröffentlichungsangaben - return "pica.ver=" + year; - } - - @Override - protected String handleYearRange(String yearRange) { - // Returns empty string as otherwise leads to no results - return ""; + // "erj" means "Erscheinungsjahr" + return "pica.erj=" + year; } @Override protected String handleUnFieldedTerm(String term) { // all does not search in full-text // Other option is txt: but this does not search in meta data - return String.format("pica.all=\"%s\"", term); + return createKeyValuePair("pica.all", term, "="); } @Override protected Optional handleOtherField(String fieldAsString, String term) { - return Optional.of("pica." + fieldAsString + "=\"" + term + "\""); + return Optional.of(createKeyValuePair("pica." + fieldAsString, term, "=")); } } diff --git a/src/main/java/org/jabref/logic/importer/fetcher/transformators/IEEEQueryTransformer.java b/src/main/java/org/jabref/logic/importer/fetcher/transformers/IEEEQueryTransformer.java similarity index 64% rename from src/main/java/org/jabref/logic/importer/fetcher/transformators/IEEEQueryTransformer.java rename to src/main/java/org/jabref/logic/importer/fetcher/transformers/IEEEQueryTransformer.java index a6bb4cd49c4..ad18946be53 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/transformators/IEEEQueryTransformer.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/transformers/IEEEQueryTransformer.java @@ -1,4 +1,4 @@ -package org.jabref.logic.importer.fetcher.transformators; +package org.jabref.logic.importer.fetcher.transformers; import java.util.Objects; import java.util.Optional; @@ -6,7 +6,7 @@ /** * Needs to be instantiated for each new query */ -public class IEEEQueryTransformer extends AbstractQueryTransformer { +public class IEEEQueryTransformer extends YearRangeByFilteringQueryTransformer { // These have to be integrated into the IEEE query URL as these are just supported as query parameters // Journal is wrapped in quotes by the transformer private String journal; @@ -31,18 +31,17 @@ protected String getLogicalNotOperator() { @Override protected String handleAuthor(String author) { - return String.format("author:\"%s\"", author); + return createKeyValuePair("author", author); } @Override protected String handleTitle(String title) { - return String.format("article_title:\"%s\"", title); + return createKeyValuePair("article_title", title); } @Override protected String handleJournal(String journalTitle) { - journal = String.format("\"%s\"", journalTitle); - return ""; + return handleUnFieldedTerm(journalTitle); } @Override @@ -52,19 +51,6 @@ protected String handleYear(String year) { return ""; } - @Override - protected String handleYearRange(String yearRange) { - String[] split = yearRange.split("-"); - startYear = Math.min(startYear, Integer.parseInt(split[0])); - endYear = Math.max(endYear, Integer.parseInt(split[1])); - return ""; - } - - @Override - protected String handleUnFieldedTerm(String term) { - return String.format("\"%s\"", term); - } - @Override protected Optional handleOtherField(String fieldAsString, String term) { return switch (fieldAsString) { @@ -78,14 +64,6 @@ private Optional handleArticleNumber(String term) { return Optional.empty(); } - public Optional getStartYear() { - return startYear == Integer.MAX_VALUE ? Optional.empty() : Optional.of(startYear); - } - - public Optional getEndYear() { - return endYear == Integer.MIN_VALUE ? Optional.empty() : Optional.of(endYear); - } - public Optional getJournal() { return Objects.isNull(journal) ? Optional.empty() : Optional.of(journal); } diff --git a/src/main/java/org/jabref/logic/importer/fetcher/transformators/JstorQueryTransformer.java b/src/main/java/org/jabref/logic/importer/fetcher/transformers/JstorQueryTransformer.java similarity index 62% rename from src/main/java/org/jabref/logic/importer/fetcher/transformators/JstorQueryTransformer.java rename to src/main/java/org/jabref/logic/importer/fetcher/transformers/JstorQueryTransformer.java index 1c7be5db728..05c4b9b6ff1 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/transformators/JstorQueryTransformer.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/transformers/JstorQueryTransformer.java @@ -1,4 +1,4 @@ -package org.jabref.logic.importer.fetcher.transformators; +package org.jabref.logic.importer.fetcher.transformers; public class JstorQueryTransformer extends AbstractQueryTransformer { @Override @@ -18,17 +18,17 @@ protected String getLogicalNotOperator() { @Override protected String handleAuthor(String author) { - return String.format("au:\"%s\"", author); + return createKeyValuePair("au", author); } @Override protected String handleTitle(String title) { - return String.format("ti:\"%s\"", title); + return createKeyValuePair("ti", title); } @Override protected String handleJournal(String journalTitle) { - return String.format("pt:\"%s\"", journalTitle); + return createKeyValuePair("pt", journalTitle); } @Override @@ -38,12 +38,10 @@ protected String handleYear(String year) { @Override protected String handleYearRange(String yearRange) { - String[] split = yearRange.split("-"); - return "sd:" + split[0] + getLogicalAndOperator() + "ed:" + split[1]; - } - - @Override - protected String handleUnFieldedTerm(String term) { - return String.format("\"%s\"", term); + parseYearRange(yearRange); + if (endYear == Integer.MAX_VALUE) { + return yearRange; + } + return "sd:" + Integer.toString(startYear) + getLogicalAndOperator() + "ed:" + Integer.toString(endYear); } } diff --git a/src/main/java/org/jabref/logic/importer/fetcher/transformers/ScholarQueryTransformer.java b/src/main/java/org/jabref/logic/importer/fetcher/transformers/ScholarQueryTransformer.java new file mode 100644 index 00000000000..a1556d5cbac --- /dev/null +++ b/src/main/java/org/jabref/logic/importer/fetcher/transformers/ScholarQueryTransformer.java @@ -0,0 +1,37 @@ +package org.jabref.logic.importer.fetcher.transformers; + +public class ScholarQueryTransformer extends YearAndYearRangeByFilteringQueryTransformer { + // Start year and end year have to be integrated into the query URL itself as these are just supported as query parameters + private int startYear = Integer.MAX_VALUE; + private int endYear = Integer.MIN_VALUE; + + @Override + protected String getLogicalAndOperator() { + return " AND "; + } + + @Override + protected String getLogicalOrOperator() { + return " OR "; + } + + @Override + protected String getLogicalNotOperator() { + return "-"; + } + + @Override + protected String handleAuthor(String author) { + return createKeyValuePair("author", author); + } + + @Override + protected String handleTitle(String title) { + return createKeyValuePair("allintitle", title); + } + + @Override + protected String handleJournal(String journalTitle) { + return createKeyValuePair("source", journalTitle); + } +} diff --git a/src/main/java/org/jabref/logic/importer/fetcher/transformators/SpringerQueryTransformer.java b/src/main/java/org/jabref/logic/importer/fetcher/transformers/SpringerQueryTransformer.java similarity index 52% rename from src/main/java/org/jabref/logic/importer/fetcher/transformators/SpringerQueryTransformer.java rename to src/main/java/org/jabref/logic/importer/fetcher/transformers/SpringerQueryTransformer.java index 3907caef708..d8aaf31f7a3 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/transformators/SpringerQueryTransformer.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/transformers/SpringerQueryTransformer.java @@ -1,6 +1,4 @@ -package org.jabref.logic.importer.fetcher.transformators; - -import java.util.StringJoiner; +package org.jabref.logic.importer.fetcher.transformers; /** * This class converts a query string written in lucene syntax into a complex query. @@ -26,17 +24,17 @@ protected String getLogicalNotOperator() { @Override protected String handleAuthor(String author) { - return String.format("name:\"%s\"", author); + return createKeyValuePair("name", author); } @Override protected String handleTitle(String title) { - return String.format("title:\"%s\"", title); + return createKeyValuePair("title", title); } @Override protected String handleJournal(String journalTitle) { - return String.format("journal:\"%s\"", journalTitle); + return createKeyValuePair("journal", journalTitle); } @@ -44,19 +42,4 @@ protected String handleJournal(String journalTitle) { protected String handleYear(String year) { return String.format("date:%s*", year); } - - @Override - protected String handleYearRange(String yearRange) { - String[] split = yearRange.split("-"); - StringJoiner resultBuilder = new StringJoiner("*" + getLogicalOrOperator() + "date:", "(date:", "*)"); - for (int i = Integer.parseInt(split[0]); i <= Integer.parseInt(split[1]); i++) { - resultBuilder.add(String.valueOf(i)); - } - return resultBuilder.toString(); - } - - @Override - protected String handleUnFieldedTerm(String term) { - return "\"" + term + "\""; - } } diff --git a/src/main/java/org/jabref/logic/importer/fetcher/transformers/YearAndYearRangeByFilteringQueryTransformer.java b/src/main/java/org/jabref/logic/importer/fetcher/transformers/YearAndYearRangeByFilteringQueryTransformer.java new file mode 100644 index 00000000000..fe348bf3acd --- /dev/null +++ b/src/main/java/org/jabref/logic/importer/fetcher/transformers/YearAndYearRangeByFilteringQueryTransformer.java @@ -0,0 +1,15 @@ +package org.jabref.logic.importer.fetcher.transformers; + +/** + * This is a query transformer for a fetcher, which does not support server-side filtering by year and year-range. + * Thus, JabRef (as client) filters for years and year ranges on client-side. + */ +public abstract class YearAndYearRangeByFilteringQueryTransformer extends YearRangeByFilteringQueryTransformer { + + @Override + protected String handleYear(String year) { + startYear = Math.min(startYear, Integer.parseInt(year)); + endYear = Math.max(endYear, Integer.parseInt(year)); + return ""; + } +} diff --git a/src/main/java/org/jabref/logic/importer/fetcher/transformers/YearRangeByFilteringQueryTransformer.java b/src/main/java/org/jabref/logic/importer/fetcher/transformers/YearRangeByFilteringQueryTransformer.java new file mode 100644 index 00000000000..40480dc4d13 --- /dev/null +++ b/src/main/java/org/jabref/logic/importer/fetcher/transformers/YearRangeByFilteringQueryTransformer.java @@ -0,0 +1,31 @@ +package org.jabref.logic.importer.fetcher.transformers; + +import java.util.Optional; + +/** + * This is a query transformer for a fetcher, which does not support server-side filtering by year-range (e.g., only publications between 1999 and 2002). + * Thus, JabRef (as client) filters for year ranges on client-side. + */ +public abstract class YearRangeByFilteringQueryTransformer extends AbstractQueryTransformer { + + public Optional getStartYear() { + return startYear == Integer.MAX_VALUE ? Optional.empty() : Optional.of(startYear); + } + + public Optional getEndYear() { + return endYear == Integer.MIN_VALUE ? Optional.empty() : Optional.of(endYear); + } + + /** + * The API does not support querying for a year range. + * Nevertheless, we store the start year and end year, + * because we filter it after fetching all results + * + * @return "", because the provider does not support server-side filtering, but our client filters + */ + @Override + protected String handleYearRange(String yearRange) { + parseYearRange(yearRange); + return ""; + } +} diff --git a/src/main/java/org/jabref/logic/importer/fetcher/transformators/ZbMathQueryTransformer.java b/src/main/java/org/jabref/logic/importer/fetcher/transformers/ZbMathQueryTransformer.java similarity index 76% rename from src/main/java/org/jabref/logic/importer/fetcher/transformators/ZbMathQueryTransformer.java rename to src/main/java/org/jabref/logic/importer/fetcher/transformers/ZbMathQueryTransformer.java index b2a466c20a1..b1e0c42d300 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/transformators/ZbMathQueryTransformer.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/transformers/ZbMathQueryTransformer.java @@ -1,4 +1,4 @@ -package org.jabref.logic.importer.fetcher.transformators; +package org.jabref.logic.importer.fetcher.transformers; public class ZbMathQueryTransformer extends AbstractQueryTransformer { @@ -19,17 +19,17 @@ protected String getLogicalNotOperator() { @Override protected String handleAuthor(String author) { - return String.format("au:\"%s\"", author); + return createKeyValuePair("au", author); } @Override protected String handleTitle(String title) { - return String.format("ti:\"%s\"", title); + return createKeyValuePair("ti", title); } @Override protected String handleJournal(String journalTitle) { - return String.format("so:\"%s\"", journalTitle); + return createKeyValuePair("so", journalTitle); } @Override @@ -44,6 +44,6 @@ protected String handleYearRange(String yearRange) { @Override protected String handleUnFieldedTerm(String term) { - return String.format("any:\"%s\"", term); + return createKeyValuePair("any", term); } } diff --git a/src/main/java/org/jabref/logic/importer/fileformat/GvkParser.java b/src/main/java/org/jabref/logic/importer/fileformat/GvkParser.java index 9641ccdb0a0..6dc44d0ed67 100644 --- a/src/main/java/org/jabref/logic/importer/fileformat/GvkParser.java +++ b/src/main/java/org/jabref/logic/importer/fileformat/GvkParser.java @@ -48,7 +48,7 @@ private List parseEntries(Document content) { // Namespace srwNamespace = Namespace.getNamespace("srw","http://www.loc.gov/zing/srw/"); - // Schleife ueber allen Teilergebnissen + // Schleife ueber alle Teilergebnisse // Element root = content.getDocumentElement(); Element root = (Element) content.getElementsByTagName("zs:searchRetrieveResponse").item(0); Element srwrecords = getChild("zs:records", root); @@ -62,7 +62,9 @@ private List parseEntries(Document content) { if (e != null) { e = getChild("record", e); if (e != null) { - result.add(parseEntry(e)); + BibEntry bibEntry = parseEntry(e); + // TODO: Add filtering on years (based on org.jabref.logic.importer.fetcher.transformers.YearRangeByFilteringQueryTransformer.getStartYear) + result.add(bibEntry); } } } diff --git a/src/main/java/org/jabref/logic/msbib/MSBibConverter.java b/src/main/java/org/jabref/logic/msbib/MSBibConverter.java index 2ee5d0c9e50..5b282296c0e 100644 --- a/src/main/java/org/jabref/logic/msbib/MSBibConverter.java +++ b/src/main/java/org/jabref/logic/msbib/MSBibConverter.java @@ -63,7 +63,7 @@ public static MSBibEntry convert(BibEntry entry) { } result.day = entry.getFieldOrAliasLatexFree(StandardField.DAY).orElse(null); - result.month = entry.getMonth().map(Month::getNumber).map(Object::toString).orElse(null); + result.month = entry.getMonth().map(Month::getFullName).orElse(null); if (!entry.getLatexFreeField(StandardField.YEAR).isPresent()) { result.year = entry.getFieldOrAliasLatexFree(StandardField.YEAR).orElse(null); diff --git a/src/main/java/org/jabref/logic/util/BuildInfo.java b/src/main/java/org/jabref/logic/util/BuildInfo.java index 529772854b5..47ef962f21a 100644 --- a/src/main/java/org/jabref/logic/util/BuildInfo.java +++ b/src/main/java/org/jabref/logic/util/BuildInfo.java @@ -26,6 +26,7 @@ public final class BuildInfo { public final String springerNatureAPIKey; public final String astrophysicsDataSystemAPIKey; public final String ieeeAPIKey; + public final String scienceDirectApiKey; public final String minRequiredJavaVersion; public final boolean allowJava9; @@ -53,6 +54,7 @@ public BuildInfo(String path) { springerNatureAPIKey = BuildInfo.getValue(properties, "springerNatureAPIKey", "118d90a519d0fc2a01ee9715400054d4"); astrophysicsDataSystemAPIKey = BuildInfo.getValue(properties, "astrophysicsDataSystemAPIKey", "tAhPRKADc6cC26mZUnAoBt3MAjCvKbuCZsB4lI3c"); ieeeAPIKey = BuildInfo.getValue(properties, "ieeeAPIKey", "5jv3wyt4tt2bwcwv7jjk7pc3"); + scienceDirectApiKey = BuildInfo.getValue(properties, "scienceDirectApiKey", "fb82f2e692b3c72dafe5f4f1fa0ac00b"); minRequiredJavaVersion = properties.getProperty("minRequiredJavaVersion", "1.8"); allowJava9 = "true".equals(properties.getProperty("allowJava9", "true")); } diff --git a/src/main/java/org/jabref/model/entry/event/EntriesEventSource.java b/src/main/java/org/jabref/model/entry/event/EntriesEventSource.java index ede1ea5285c..913fffcd2ab 100644 --- a/src/main/java/org/jabref/model/entry/event/EntriesEventSource.java +++ b/src/main/java/org/jabref/model/entry/event/EntriesEventSource.java @@ -7,5 +7,6 @@ public enum EntriesEventSource { LOCAL, SHARED, UNDO, + CLEANUP_TIMESTAMP, SAVE_ACTION } diff --git a/src/main/java/org/jabref/model/strings/StringUtil.java b/src/main/java/org/jabref/model/strings/StringUtil.java index 4997b38444d..6709e1a633f 100644 --- a/src/main/java/org/jabref/model/strings/StringUtil.java +++ b/src/main/java/org/jabref/model/strings/StringUtil.java @@ -654,7 +654,6 @@ public static String boldHTML(String input) { * Return string enclosed in HTML bold tags if not null, otherwise return alternative text in HTML bold tags */ public static String boldHTML(String input, String alternative) { - if (input == null) { return "" + alternative + ""; } diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index 87bfdd17e9f..7bbc176507b 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -2296,3 +2296,7 @@ Use\ custom\ DOI\ base\ URI\ for\ article\ access=Use custom DOI base URI for ar Unable\ to\ find\ valid\ certification\ path\ to\ requested\ target(%0),\ download\ anyway?=Unable to find valid certification path to requested target(%0), download anyway? Download\ operation\ canceled.=Download operation canceled. + +Convert\ timestamp\ field\ to\ field\ 'creationdate'=Convert timestamp field to field 'creationdate' +Convert\ timestamp\ field\ to\ field\ 'modificationdate'=Convert timestamp field to field 'modificationdate' + diff --git a/src/test/java/org/jabref/logic/cleanup/CleanupWorkerTest.java b/src/test/java/org/jabref/logic/cleanup/CleanupWorkerTest.java index f2215b97912..a0f8601f523 100644 --- a/src/test/java/org/jabref/logic/cleanup/CleanupWorkerTest.java +++ b/src/test/java/org/jabref/logic/cleanup/CleanupWorkerTest.java @@ -19,6 +19,7 @@ import org.jabref.logic.formatter.bibtexfields.UnitsToLatexFormatter; import org.jabref.logic.formatter.casechanger.ProtectTermsFormatter; import org.jabref.logic.layout.LayoutFormatterPreferences; +import org.jabref.logic.preferences.TimestampPreferences; import org.jabref.logic.protectedterms.ProtectedTermsLoader; import org.jabref.logic.protectedterms.ProtectedTermsPreferences; import org.jabref.model.FieldChange; @@ -65,7 +66,7 @@ void setUp(@TempDir Path bibFolder) throws IOException { when(fileDirPrefs.shouldStoreFilesRelativeToBib()).thenReturn(true); worker = new CleanupWorker(context, - new CleanupPreferences(mock(LayoutFormatterPreferences.class), fileDirPrefs)); + new CleanupPreferences(mock(LayoutFormatterPreferences.class), fileDirPrefs), mock(TimestampPreferences.class)); } @Test diff --git a/src/test/java/org/jabref/logic/cleanup/ISSNCleanupTest.java b/src/test/java/org/jabref/logic/cleanup/ISSNCleanupTest.java index daf131f728e..f4be912cb47 100644 --- a/src/test/java/org/jabref/logic/cleanup/ISSNCleanupTest.java +++ b/src/test/java/org/jabref/logic/cleanup/ISSNCleanupTest.java @@ -3,6 +3,7 @@ import java.util.Optional; import org.jabref.logic.layout.LayoutFormatterPreferences; +import org.jabref.logic.preferences.TimestampPreferences; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.StandardField; @@ -21,7 +22,7 @@ public class ISSNCleanupTest { @BeforeEach public void setUp() { worker = new CleanupWorker(mock(BibDatabaseContext.class), - new CleanupPreferences(mock(LayoutFormatterPreferences.class), mock(FilePreferences.class))); + new CleanupPreferences(mock(LayoutFormatterPreferences.class), mock(FilePreferences.class)), mock(TimestampPreferences.class)); } @Test diff --git a/src/test/java/org/jabref/migrations/TimeStampToDateAddAndModifyTest.java b/src/test/java/org/jabref/logic/cleanup/TimeStampToCreationDateTest.java similarity index 58% rename from src/test/java/org/jabref/migrations/TimeStampToDateAddAndModifyTest.java rename to src/test/java/org/jabref/logic/cleanup/TimeStampToCreationDateTest.java index eaabac2cc10..6cfbb82029f 100644 --- a/src/test/java/org/jabref/migrations/TimeStampToDateAddAndModifyTest.java +++ b/src/test/java/org/jabref/logic/cleanup/TimeStampToCreationDateTest.java @@ -1,4 +1,4 @@ -package org.jabref.migrations; +package org.jabref.logic.cleanup; import java.util.List; import java.util.stream.Stream; @@ -17,28 +17,20 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -class TimeStampToDateAddAndModifyTest { +class TimeStampToCreationDateTest { - private static Field customTimeStampField = new UnknownField("dateOfCreation"); + private static final Field CUSTOM_TIME_STAMP_FIELD = new UnknownField("dateOfCreation"); - private TimestampPreferences timestampPreferences = Mockito.mock(TimestampPreferences.class); + private final TimestampPreferences timestampPreferences = Mockito.mock(TimestampPreferences.class); public void makeMockReturnCustomField() { - Mockito.when(timestampPreferences.getTimestampField()).then(invocation -> customTimeStampField); + Mockito.when(timestampPreferences.getTimestampField()).then(invocation -> CUSTOM_TIME_STAMP_FIELD); } public void makeMockReturnStandardField() { Mockito.when(timestampPreferences.getTimestampField()).then(invocation -> StandardField.TIMESTAMP); } - public void makeMockToMigrateToCreationDate() { - Mockito.when(timestampPreferences.shouldUpdateTimestamp()).then(invocation -> Boolean.FALSE); - } - - public void makeMockToMigrateToModificationDate() { - Mockito.when(timestampPreferences.shouldUpdateTimestamp()).then(invocation -> Boolean.TRUE); - } - public static Stream standardFieldToCreationDate() { return Stream.of( Arguments.of( @@ -62,27 +54,25 @@ public static Stream standardFieldToCreationDate() { @ParameterizedTest @MethodSource("standardFieldToCreationDate") public void withStandardFieldToCreationDate(BibEntry expected, BibEntry input) { - makeMockToMigrateToCreationDate(); makeMockReturnStandardField(); - TimeStampToDateAddAndModify migrator = new TimeStampToDateAddAndModify(timestampPreferences); - ParserResult entries = new ParserResult(List.of(input)); - migrator.performMigration(entries); - assertEquals(List.of(expected), entries.getDatabase().getEntries()); + TimeStampToCreationDate migrator = new TimeStampToCreationDate(timestampPreferences); + migrator.cleanup(input); + assertEquals(expected, input); } public static Stream customFieldToCreationDate() { return Stream.of( Arguments.of( new BibEntry().withField(StandardField.CREATIONDATE, "2018-09-10T00:00:00"), - new BibEntry().withField(customTimeStampField, "2018-09-10") + new BibEntry().withField(CUSTOM_TIME_STAMP_FIELD, "2018-09-10") ), Arguments.of( new BibEntry().withField(StandardField.CREATIONDATE, "2020-12-24T00:00:00"), - new BibEntry().withField(customTimeStampField, "2020-12-24") + new BibEntry().withField(CUSTOM_TIME_STAMP_FIELD, "2020-12-24") ), Arguments.of( new BibEntry().withField(StandardField.CREATIONDATE, "2020-12-31T00:00:00"), - new BibEntry().withField(customTimeStampField, "2020-12-31") + new BibEntry().withField(CUSTOM_TIME_STAMP_FIELD, "2020-12-31") ) ); } @@ -93,74 +83,10 @@ public static Stream customFieldToCreationDate() { @ParameterizedTest @MethodSource("customFieldToCreationDate") public void withCustomFieldToCreationDate(BibEntry expected, BibEntry input) { - makeMockToMigrateToCreationDate(); - makeMockReturnCustomField(); - TimeStampToDateAddAndModify migrator = new TimeStampToDateAddAndModify(timestampPreferences); - ParserResult entries = new ParserResult(List.of(input)); - migrator.performMigration(entries); - assertEquals(List.of(expected), entries.getDatabase().getEntries()); - } - - public static Stream standardFieldToModificationDate() { - return Stream.of( - Arguments.of( - new BibEntry().withField(StandardField.MODIFICATIONDATE, "2018-09-10T00:00:00"), - new BibEntry().withField(StandardField.TIMESTAMP, "2018-09-10") - ), - Arguments.of( - new BibEntry().withField(StandardField.MODIFICATIONDATE, "2020-12-24T00:00:00"), - new BibEntry().withField(StandardField.TIMESTAMP, "2020-12-24") - ), - Arguments.of( - new BibEntry().withField(StandardField.MODIFICATIONDATE, "2020-12-31T00:00:00"), - new BibEntry().withField(StandardField.TIMESTAMP, "2020-12-31") - ) - ); - } - - /** - * Tests migration to modificationdate if the users uses the default ISO yyyy-mm-dd format and the standard timestamp field - */ - @ParameterizedTest - @MethodSource("standardFieldToModificationDate") - public void withStandardFieldToModificationDate(BibEntry expected, BibEntry input) { - makeMockToMigrateToModificationDate(); - makeMockReturnStandardField(); - TimeStampToDateAddAndModify migrator = new TimeStampToDateAddAndModify(timestampPreferences); - ParserResult entries = new ParserResult(List.of(input)); - migrator.performMigration(entries); - assertEquals(List.of(expected), entries.getDatabase().getEntries()); - } - - public static Stream customFieldToModificationDate() { - return Stream.of( - Arguments.of( - new BibEntry().withField(StandardField.MODIFICATIONDATE, "2018-09-10T00:00:00"), - new BibEntry().withField(customTimeStampField, "2018-09-10") - ), - Arguments.of( - new BibEntry().withField(StandardField.MODIFICATIONDATE, "2020-12-24T00:00:00"), - new BibEntry().withField(customTimeStampField, "2020-12-24") - ), - Arguments.of( - new BibEntry().withField(StandardField.MODIFICATIONDATE, "2020-12-31T00:00:00"), - new BibEntry().withField(customTimeStampField, "2020-12-31") - ) - ); - } - - /** - * Tests migration to modificationdate if the users uses the default ISO yyyy-mm-dd format and a custom timestamp field - */ - @ParameterizedTest - @MethodSource("customFieldToModificationDate") - public void withCustomFieldToModificationDate(BibEntry expected, BibEntry input) { - makeMockToMigrateToModificationDate(); makeMockReturnCustomField(); - TimeStampToDateAddAndModify migrator = new TimeStampToDateAddAndModify(timestampPreferences); - ParserResult entries = new ParserResult(List.of(input)); - migrator.performMigration(entries); - assertEquals(List.of(expected), entries.getDatabase().getEntries()); + TimeStampToCreationDate migrator = new TimeStampToCreationDate(timestampPreferences); + migrator.cleanup(input); + assertEquals(expected, input); } public static Stream entriesMigratedToCreationDateFromDifferentFormats() { @@ -244,12 +170,11 @@ public static Stream entriesMigratedToCreationDateFromDifferentFormat @ParameterizedTest @MethodSource("entriesMigratedToCreationDateFromDifferentFormats") public void withDifferentFormats(BibEntry expected, BibEntry input) { - makeMockToMigrateToCreationDate(); makeMockReturnStandardField(); - TimeStampToDateAddAndModify migrator = new TimeStampToDateAddAndModify(timestampPreferences); + TimeStampToCreationDate migrator = new TimeStampToCreationDate(timestampPreferences); ParserResult parserResult = new ParserResult(List.of(input)); - migrator.performMigration(parserResult); - assertEquals(List.of(expected), parserResult.getDatabase().getEntries()); + migrator.cleanup(input); + assertEquals(expected, input); } } diff --git a/src/test/java/org/jabref/logic/cleanup/TimeStampToModificationDateTest.java b/src/test/java/org/jabref/logic/cleanup/TimeStampToModificationDateTest.java new file mode 100644 index 00000000000..79f3fbc8438 --- /dev/null +++ b/src/test/java/org/jabref/logic/cleanup/TimeStampToModificationDateTest.java @@ -0,0 +1,89 @@ +package org.jabref.logic.cleanup; + +import java.util.stream.Stream; + +import org.jabref.logic.preferences.TimestampPreferences; +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.field.UnknownField; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class TimeStampToModificationDateTest { + + private static Field customTimeStampField = new UnknownField("dateOfCreation"); + + private TimestampPreferences timestampPreferences = Mockito.mock(TimestampPreferences.class); + + public void makeMockReturnCustomField() { + Mockito.when(timestampPreferences.getTimestampField()).then(invocation -> customTimeStampField); + } + + public void makeMockReturnStandardField() { + Mockito.when(timestampPreferences.getTimestampField()).then(invocation -> StandardField.TIMESTAMP); + } + + public static Stream standardFieldToModificationDate() { + return Stream.of( + Arguments.of( + new BibEntry().withField(StandardField.MODIFICATIONDATE, "2018-09-10T00:00:00"), + new BibEntry().withField(StandardField.TIMESTAMP, "2018-09-10") + ), + Arguments.of( + new BibEntry().withField(StandardField.MODIFICATIONDATE, "2020-12-24T00:00:00"), + new BibEntry().withField(StandardField.TIMESTAMP, "2020-12-24") + ), + Arguments.of( + new BibEntry().withField(StandardField.MODIFICATIONDATE, "2020-12-31T00:00:00"), + new BibEntry().withField(StandardField.TIMESTAMP, "2020-12-31") + ) + ); + } + + /** + * Tests migration to field "modificationdate" if the users uses the default ISO yyyy-mm-dd format and the standard timestamp field + */ + @ParameterizedTest + @MethodSource("standardFieldToModificationDate") + public void withStandardFieldToModificationDate(BibEntry expected, BibEntry input) { + makeMockReturnStandardField(); + TimeStampToModificationDate migrator = new TimeStampToModificationDate(timestampPreferences); + migrator.cleanup(input); + assertEquals(expected, input); + } + + public static Stream customFieldToModificationDate() { + return Stream.of( + Arguments.of( + new BibEntry().withField(StandardField.MODIFICATIONDATE, "2018-09-10T00:00:00"), + new BibEntry().withField(customTimeStampField, "2018-09-10") + ), + Arguments.of( + new BibEntry().withField(StandardField.MODIFICATIONDATE, "2020-12-24T00:00:00"), + new BibEntry().withField(customTimeStampField, "2020-12-24") + ), + Arguments.of( + new BibEntry().withField(StandardField.MODIFICATIONDATE, "2020-12-31T00:00:00"), + new BibEntry().withField(customTimeStampField, "2020-12-31") + ) + ); + } + + /** + * Tests migration to field "modificationdate" if the users uses the default ISO yyyy-mm-dd format and a custom timestamp field + */ + @ParameterizedTest + @MethodSource("customFieldToModificationDate") + public void withCustomFieldToModificationDate(BibEntry expected, BibEntry input) { + makeMockReturnCustomField(); + TimeStampToModificationDate migrator = new TimeStampToModificationDate(timestampPreferences); + migrator.cleanup(input); + assertEquals(expected, input); + } +} diff --git a/src/test/java/org/jabref/logic/importer/fetcher/ArXivTest.java b/src/test/java/org/jabref/logic/importer/fetcher/ArXivTest.java index ffb2a25fb3c..84bb345e80a 100644 --- a/src/test/java/org/jabref/logic/importer/fetcher/ArXivTest.java +++ b/src/test/java/org/jabref/logic/importer/fetcher/ArXivTest.java @@ -99,7 +99,7 @@ void findFullTextByTitle() throws IOException { void findFullTextByTitleWithCurlyBracket() throws IOException { entry.setField(StandardField.TITLE, "Machine versus {Human} {Attention} in {Deep} {Reinforcement} {Learning} {Tasks}"); - assertEquals(Optional.of(new URL("https://arxiv.org/pdf/2010.15942v2")), fetcher.findFullText(entry)); + assertEquals(Optional.of(new URL("http://arxiv.org/pdf/2010.15942v2")), fetcher.findFullText(entry)); } @Test @@ -131,7 +131,7 @@ void findFullTextByTitleWithCurlyBracketAndPartOfAuthor() throws IOException { entry.setField(StandardField.TITLE, "Machine versus {Human} {Attention} in {Deep} {Reinforcement} {Learning} {Tasks}"); entry.setField(StandardField.AUTHOR, "Zhang, Ruohan and Guo"); - assertEquals(Optional.of(new URL("https://arxiv.org/pdf/2010.15942v2")), fetcher.findFullText(entry)); + assertEquals(Optional.of(new URL("http://arxiv.org/pdf/2010.15942v2")), fetcher.findFullText(entry)); } @Test diff --git a/src/test/java/org/jabref/logic/importer/fetcher/CollectionOfComputerScienceBibliographiesFetcherTest.java b/src/test/java/org/jabref/logic/importer/fetcher/CollectionOfComputerScienceBibliographiesFetcherTest.java index 539decbf37c..6da4e04affa 100644 --- a/src/test/java/org/jabref/logic/importer/fetcher/CollectionOfComputerScienceBibliographiesFetcherTest.java +++ b/src/test/java/org/jabref/logic/importer/fetcher/CollectionOfComputerScienceBibliographiesFetcherTest.java @@ -10,7 +10,7 @@ import org.jabref.logic.importer.FetcherException; import org.jabref.logic.importer.ImportFormatPreferences; -import org.jabref.logic.importer.fetcher.transformators.AbstractQueryTransformer; +import org.jabref.logic.importer.fetcher.transformers.AbstractQueryTransformer; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.StandardField; import org.jabref.model.entry.field.UnknownField; diff --git a/src/test/java/org/jabref/logic/importer/fetcher/GvkFetcherTest.java b/src/test/java/org/jabref/logic/importer/fetcher/GvkFetcherTest.java index 88cd4b91ef0..17e8b2ded4e 100644 --- a/src/test/java/org/jabref/logic/importer/fetcher/GvkFetcherTest.java +++ b/src/test/java/org/jabref/logic/importer/fetcher/GvkFetcherTest.java @@ -5,7 +5,7 @@ import java.util.List; import org.jabref.logic.importer.FetcherException; -import org.jabref.logic.importer.fetcher.transformators.AbstractQueryTransformer; +import org.jabref.logic.importer.fetcher.transformers.AbstractQueryTransformer; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.StandardField; import org.jabref.model.entry.field.UnknownField; @@ -31,32 +31,30 @@ public class GvkFetcherTest { public void setUp() { fetcher = new GvkFetcher(); - bibEntryPPN591166003 = new BibEntry(); - bibEntryPPN591166003.setType(StandardEntryType.Book); - bibEntryPPN591166003.setField(StandardField.TITLE, "Effective Java"); - bibEntryPPN591166003.setField(StandardField.PUBLISHER, "Addison-Wesley"); - bibEntryPPN591166003.setField(StandardField.YEAR, "2008"); - bibEntryPPN591166003.setField(StandardField.AUTHOR, "Joshua Bloch"); - bibEntryPPN591166003.setField(StandardField.SERIES, "The @Java series"); - bibEntryPPN591166003.setField(StandardField.ADDRESS, "Upper Saddle River, NJ [u.a.]"); - bibEntryPPN591166003.setField(StandardField.EDITION, "2. ed., 5. print."); - bibEntryPPN591166003.setField(StandardField.NOTE, "Literaturverz. S. 321 - 325"); - bibEntryPPN591166003.setField(StandardField.ISBN, "9780321356680"); - bibEntryPPN591166003.setField(StandardField.PAGETOTAL, "XXI, 346"); - bibEntryPPN591166003.setField(new UnknownField("ppn_gvk"), "591166003"); - bibEntryPPN591166003.setField(StandardField.SUBTITLE, "[revised and updated for JAVA SE 6]"); - - bibEntryPPN66391437X = new BibEntry(); - bibEntryPPN66391437X.setType(StandardEntryType.Book); - bibEntryPPN66391437X.setField(StandardField.TITLE, "Effective unit testing"); - bibEntryPPN66391437X.setField(StandardField.PUBLISHER, "Manning"); - bibEntryPPN66391437X.setField(StandardField.YEAR, "2013"); - bibEntryPPN66391437X.setField(StandardField.AUTHOR, "Lasse Koskela"); - bibEntryPPN66391437X.setField(StandardField.ADDRESS, "Shelter Island, NY"); - bibEntryPPN66391437X.setField(StandardField.ISBN, "9781935182573"); - bibEntryPPN66391437X.setField(StandardField.PAGETOTAL, "XXIV, 223"); - bibEntryPPN66391437X.setField(new UnknownField("ppn_gvk"), "66391437X"); - bibEntryPPN66391437X.setField(StandardField.SUBTITLE, "A guide for Java developers"); + bibEntryPPN591166003 = new BibEntry(StandardEntryType.Book) + .withField(StandardField.TITLE, "Effective Java") + .withField(StandardField.PUBLISHER, "Addison-Wesley") + .withField(StandardField.YEAR, "2008") + .withField(StandardField.AUTHOR, "Joshua Bloch") + .withField(StandardField.SERIES, "The @Java series") + .withField(StandardField.ADDRESS, "Upper Saddle River, NJ [u.a.]") + .withField(StandardField.EDITION, "2. ed., 5. print.") + .withField(StandardField.NOTE, "Literaturverz. S. 321 - 325") + .withField(StandardField.ISBN, "9780321356680") + .withField(StandardField.PAGETOTAL, "XXI, 346") + .withField(new UnknownField("ppn_gvk"), "591166003") + .withField(StandardField.SUBTITLE, "[revised and updated for JAVA SE 6]"); + + bibEntryPPN66391437X = new BibEntry(StandardEntryType.Book) + .withField(StandardField.TITLE, "Effective unit testing") + .withField(StandardField.PUBLISHER, "Manning") + .withField(StandardField.YEAR, "2013") + .withField(StandardField.AUTHOR, "Lasse Koskela") + .withField(StandardField.ADDRESS, "Shelter Island, NY") + .withField(StandardField.ISBN, "9781935182573") + .withField(StandardField.PAGETOTAL, "XXIV, 223") + .withField(new UnknownField("ppn_gvk"), "66391437X") + .withField(StandardField.SUBTITLE, "A guide for Java developers"); } @Test @@ -69,7 +67,7 @@ public void simpleSearchQueryURLCorrect() throws Exception { String query = "java jdk"; QueryNode luceneQuery = new StandardSyntaxParser().parse(query, AbstractQueryTransformer.NO_EXPLICIT_FIELD); URL url = fetcher.getURLForQuery(luceneQuery); - assertEquals("http://sru.gbv.de/gvk?version=1.1&operation=searchRetrieve&query=pica.all%3D%22java%22+and+pica.all%3D%22jdk%22&maximumRecords=50&recordSchema=picaxml&sortKeys=Year%2C%2C1", url.toString()); + assertEquals("http://sru.gbv.de/gvk?version=1.1&operation=searchRetrieve&query=pica.all%3Djava+and+pica.all%3Djdk&maximumRecords=50&recordSchema=picaxml&sortKeys=Year%2C%2C1", url.toString()); } @Test @@ -77,7 +75,7 @@ public void complexSearchQueryURLCorrect() throws Exception { String query = "kon:java tit:jdk"; QueryNode luceneQuery = new StandardSyntaxParser().parse(query, AbstractQueryTransformer.NO_EXPLICIT_FIELD); URL url = fetcher.getURLForQuery(luceneQuery); - assertEquals("http://sru.gbv.de/gvk?version=1.1&operation=searchRetrieve&query=pica.kon%3D%22java%22+and+pica.tit%3D%22jdk%22&maximumRecords=50&recordSchema=picaxml&sortKeys=Year%2C%2C1", url.toString()); + assertEquals("http://sru.gbv.de/gvk?version=1.1&operation=searchRetrieve&query=pica.kon%3Djava+and+pica.tit%3Djdk&maximumRecords=50&recordSchema=picaxml&sortKeys=Year%2C%2C1", url.toString()); } @Test diff --git a/src/test/java/org/jabref/logic/importer/fetcher/transformators/JstorQueryTransformerTest.java b/src/test/java/org/jabref/logic/importer/fetcher/transformators/JstorQueryTransformerTest.java deleted file mode 100644 index e8a5a6014b9..00000000000 --- a/src/test/java/org/jabref/logic/importer/fetcher/transformators/JstorQueryTransformerTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.jabref.logic.importer.fetcher.transformators; - -class JstorQueryTransformerTest implements InfixTransformerTest { - - @Override - public AbstractQueryTransformer getTransformator() { - return new JstorQueryTransformer(); - } - - @Override - public String getAuthorPrefix() { - return "au:"; - } - - @Override - public String getUnFieldedPrefix() { - return ""; - } - - @Override - public String getJournalPrefix() { - return "pt:"; - } - - @Override - public String getTitlePrefix() { - return "ti:"; - } - - @Override - public void convertYearField() throws Exception { - - } - - @Override - public void convertYearRangeField() throws Exception { - - } -} diff --git a/src/test/java/org/jabref/logic/importer/fetcher/transformators/ArXivQueryTransformerTest.java b/src/test/java/org/jabref/logic/importer/fetcher/transformers/ArXivQueryTransformerTest.java similarity index 54% rename from src/test/java/org/jabref/logic/importer/fetcher/transformators/ArXivQueryTransformerTest.java rename to src/test/java/org/jabref/logic/importer/fetcher/transformers/ArXivQueryTransformerTest.java index ac5933ae7bb..0eba3b200aa 100644 --- a/src/test/java/org/jabref/logic/importer/fetcher/transformators/ArXivQueryTransformerTest.java +++ b/src/test/java/org/jabref/logic/importer/fetcher/transformers/ArXivQueryTransformerTest.java @@ -1,4 +1,4 @@ -package org.jabref.logic.importer.fetcher.transformators; +package org.jabref.logic.importer.fetcher.transformers; import java.util.Optional; @@ -7,10 +7,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -class ArXivQueryTransformerTest implements InfixTransformerTest { +class ArXivQueryTransformerTest extends YearRangeByFilteringQueryTransformerTest { @Override - public AbstractQueryTransformer getTransformator() { + public ArXivQueryTransformer getTransformer() { return new ArXivQueryTransformer(); } @@ -36,25 +36,13 @@ public String getTitlePrefix() { @Override public void convertYearField() throws Exception { - ArXivQueryTransformer transformer = ((ArXivQueryTransformer) getTransformator()); + ArXivQueryTransformer transformer = getTransformer(); String queryString = "2018"; QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); Optional query = transformer.transformLuceneQuery(luceneQuery); - Optional expected = Optional.of(queryString); - assertEquals(expected, query); + assertEquals(Optional.of("2018"), query); assertEquals(2018, transformer.getStartYear()); assertEquals(2018, transformer.getEndYear()); } - @Override - public void convertYearRangeField() throws Exception { - ArXivQueryTransformer transformer = ((ArXivQueryTransformer) getTransformator()); - - String queryString = "year-range:2018-2021"; - QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); - transformer.transformLuceneQuery(luceneQuery); - - assertEquals(2018, transformer.getStartYear()); - assertEquals(2021, transformer.getEndYear()); - } } diff --git a/src/test/java/org/jabref/logic/importer/fetcher/transformers/CollectionOfComputerScienceBibliographiesQueryTransformerTest.java b/src/test/java/org/jabref/logic/importer/fetcher/transformers/CollectionOfComputerScienceBibliographiesQueryTransformerTest.java new file mode 100644 index 00000000000..305421a3db1 --- /dev/null +++ b/src/test/java/org/jabref/logic/importer/fetcher/transformers/CollectionOfComputerScienceBibliographiesQueryTransformerTest.java @@ -0,0 +1,53 @@ +package org.jabref.logic.importer.fetcher.transformers; + +import java.util.Optional; + +import org.apache.lucene.queryparser.flexible.core.nodes.QueryNode; +import org.apache.lucene.queryparser.flexible.standard.parser.StandardSyntaxParser; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class CollectionOfComputerScienceBibliographiesQueryTransformerTest extends InfixTransformerTest { + + @Override + public CollectionOfComputerScienceBibliographiesQueryTransformer getTransformer() { + return new CollectionOfComputerScienceBibliographiesQueryTransformer(); + } + + @Override + public String getAuthorPrefix() { + return "au:"; + } + + @Override + public String getUnFieldedPrefix() { + return ""; + } + + @Override + public String getJournalPrefix() { + return ""; + } + + @Override + public String getTitlePrefix() { + return "ti:"; + } + + @Override + public void convertYearField() throws Exception { + String queryString = "2018"; + QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); + Optional query = getTransformer().transformLuceneQuery(luceneQuery); + assertEquals(Optional.of("year:2018"), query); + } + + @Override + public void convertYearRangeField() throws Exception { + String queryString = "year-range:2018-2021"; + QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); + Optional query = getTransformer().transformLuceneQuery(luceneQuery); + assertEquals(Optional.of("year:2018 OR year:2019 OR year:2020 OR year:2021"), query); + } + +} diff --git a/src/test/java/org/jabref/logic/importer/fetcher/transformators/DBLPQueryTransformerTest.java b/src/test/java/org/jabref/logic/importer/fetcher/transformers/DBLPQueryTransformerTest.java similarity index 78% rename from src/test/java/org/jabref/logic/importer/fetcher/transformators/DBLPQueryTransformerTest.java rename to src/test/java/org/jabref/logic/importer/fetcher/transformers/DBLPQueryTransformerTest.java index d531f19da9d..1801576f0b2 100644 --- a/src/test/java/org/jabref/logic/importer/fetcher/transformators/DBLPQueryTransformerTest.java +++ b/src/test/java/org/jabref/logic/importer/fetcher/transformers/DBLPQueryTransformerTest.java @@ -1,4 +1,4 @@ -package org.jabref.logic.importer.fetcher.transformators; +package org.jabref.logic.importer.fetcher.transformers; import java.util.Optional; @@ -7,10 +7,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -class DBLPQueryTransformerTest implements InfixTransformerTest { +class DBLPQueryTransformerTest extends InfixTransformerTest { @Override - public AbstractQueryTransformer getTransformator() { + public DBLPQueryTransformer getTransformer() { return new DBLPQueryTransformer(); } @@ -38,7 +38,7 @@ public String getTitlePrefix() { public void convertYearField() throws Exception { String queryString = "year:2015"; QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); - Optional searchQuery = getTransformator().transformLuceneQuery(luceneQuery); + Optional searchQuery = getTransformer().transformLuceneQuery(luceneQuery); Optional expected = Optional.of("2015"); assertEquals(expected, searchQuery); } @@ -47,7 +47,7 @@ public void convertYearField() throws Exception { public void convertYearRangeField() throws Exception { String queryString = "year-range:2012-2015"; QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); - Optional searchQuery = getTransformator().transformLuceneQuery(luceneQuery); + Optional searchQuery = getTransformer().transformLuceneQuery(luceneQuery); Optional expected = Optional.of("2012|2013|2014|2015"); assertEquals(expected, searchQuery); } diff --git a/src/test/java/org/jabref/logic/importer/fetcher/transformers/DefaultQueryTransformerTest.java b/src/test/java/org/jabref/logic/importer/fetcher/transformers/DefaultQueryTransformerTest.java new file mode 100644 index 00000000000..70b4e4a5bfb --- /dev/null +++ b/src/test/java/org/jabref/logic/importer/fetcher/transformers/DefaultQueryTransformerTest.java @@ -0,0 +1,29 @@ +package org.jabref.logic.importer.fetcher.transformers; + +class DefaultQueryTransformerTest extends YearAndYearRangeByFilteringQueryTransformerTest { + + @Override + protected DefaultQueryTransformer getTransformer() { + return new DefaultQueryTransformer(); + } + + @Override + public String getAuthorPrefix() { + return ""; + } + + @Override + public String getUnFieldedPrefix() { + return ""; + } + + @Override + public String getJournalPrefix() { + return ""; + } + + @Override + public String getTitlePrefix() { + return ""; + } +} diff --git a/src/test/java/org/jabref/logic/importer/fetcher/transformators/GVKQueryTransformerTest.java b/src/test/java/org/jabref/logic/importer/fetcher/transformers/GVKQueryTransformerTest.java similarity index 80% rename from src/test/java/org/jabref/logic/importer/fetcher/transformators/GVKQueryTransformerTest.java rename to src/test/java/org/jabref/logic/importer/fetcher/transformers/GVKQueryTransformerTest.java index 9dab863dc10..0f366ece141 100644 --- a/src/test/java/org/jabref/logic/importer/fetcher/transformators/GVKQueryTransformerTest.java +++ b/src/test/java/org/jabref/logic/importer/fetcher/transformers/GVKQueryTransformerTest.java @@ -1,4 +1,4 @@ -package org.jabref.logic.importer.fetcher.transformators; +package org.jabref.logic.importer.fetcher.transformers; import java.util.Optional; @@ -8,10 +8,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -class GVKQueryTransformerTest implements InfixTransformerTest { +class GVKQueryTransformerTest extends InfixTransformerTest { @Override - public AbstractQueryTransformer getTransformator() { + public GVKQueryTransformer getTransformer() { return new GVKQueryTransformer(); } @@ -37,10 +37,9 @@ public String getTitlePrefix() { @Override public void convertYearField() throws Exception { - String queryString = "year:2018"; QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); - Optional query = getTransformator().transformLuceneQuery(luceneQuery); + Optional query = getTransformer().transformLuceneQuery(luceneQuery); Optional expected = Optional.of("ver:2018"); assertEquals(expected, query); @@ -49,6 +48,5 @@ public void convertYearField() throws Exception { @Disabled("Not supported by GVK") @Override public void convertYearRangeField() throws Exception { - } } diff --git a/src/test/java/org/jabref/logic/importer/fetcher/transformators/IEEEQueryTransformerTest.java b/src/test/java/org/jabref/logic/importer/fetcher/transformers/IEEEQueryTransformerTest.java similarity index 81% rename from src/test/java/org/jabref/logic/importer/fetcher/transformators/IEEEQueryTransformerTest.java rename to src/test/java/org/jabref/logic/importer/fetcher/transformers/IEEEQueryTransformerTest.java index 7d2042a34e3..e1b252e1f12 100644 --- a/src/test/java/org/jabref/logic/importer/fetcher/transformators/IEEEQueryTransformerTest.java +++ b/src/test/java/org/jabref/logic/importer/fetcher/transformers/IEEEQueryTransformerTest.java @@ -1,14 +1,16 @@ -package org.jabref.logic.importer.fetcher.transformators; +package org.jabref.logic.importer.fetcher.transformers; + +import java.util.Optional; import org.apache.lucene.queryparser.flexible.core.nodes.QueryNode; import org.apache.lucene.queryparser.flexible.standard.parser.StandardSyntaxParser; import static org.junit.jupiter.api.Assertions.assertEquals; -class IEEEQueryTransformerTest implements InfixTransformerTest { +class IEEEQueryTransformerTest extends InfixTransformerTest { @Override - public AbstractQueryTransformer getTransformator() { + public IEEEQueryTransformer getTransformer() { return new IEEEQueryTransformer(); } @@ -34,7 +36,7 @@ public String getTitlePrefix() { @Override public void convertJournalField() throws Exception { - IEEEQueryTransformer transformer = ((IEEEQueryTransformer) getTransformator()); + IEEEQueryTransformer transformer = ((IEEEQueryTransformer) getTransformer()); String queryString = "journal:Nature"; QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); @@ -45,11 +47,14 @@ public void convertJournalField() throws Exception { @Override public void convertYearField() throws Exception { - IEEEQueryTransformer transformer = ((IEEEQueryTransformer) getTransformator()); + // IEEE does not support year range + // Thus, a generic test does not work + + IEEEQueryTransformer transformer = ((IEEEQueryTransformer) getTransformer()); String queryString = "year:2021"; QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); - transformer.transformLuceneQuery(luceneQuery); + Optional result = transformer.transformLuceneQuery(luceneQuery); assertEquals(2021, transformer.getStartYear()); assertEquals(2021, transformer.getEndYear()); @@ -57,8 +62,7 @@ public void convertYearField() throws Exception { @Override public void convertYearRangeField() throws Exception { - - IEEEQueryTransformer transformer = ((IEEEQueryTransformer) getTransformator()); + IEEEQueryTransformer transformer = ((IEEEQueryTransformer) getTransformer()); String queryString = "year-range:2018-2021"; QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); diff --git a/src/test/java/org/jabref/logic/importer/fetcher/transformators/InfixTransformerTest.java b/src/test/java/org/jabref/logic/importer/fetcher/transformers/InfixTransformerTest.java similarity index 56% rename from src/test/java/org/jabref/logic/importer/fetcher/transformators/InfixTransformerTest.java rename to src/test/java/org/jabref/logic/importer/fetcher/transformers/InfixTransformerTest.java index f986a04c7e0..70088f66604 100644 --- a/src/test/java/org/jabref/logic/importer/fetcher/transformators/InfixTransformerTest.java +++ b/src/test/java/org/jabref/logic/importer/fetcher/transformers/InfixTransformerTest.java @@ -1,4 +1,4 @@ -package org.jabref.logic.importer.fetcher.transformators; +package org.jabref.logic.importer.fetcher.transformers; import java.util.Optional; @@ -11,87 +11,88 @@ /** * Test Interface for all transformers that use infix notation for their logical binary operators */ -public interface InfixTransformerTest { +public abstract class InfixTransformerTest { - AbstractQueryTransformer getTransformator(); + protected abstract T getTransformer(); /* All prefixes have to include the used separator * Example in the case of ':': "author:" */ - String getAuthorPrefix(); - String getUnFieldedPrefix(); + protected abstract String getAuthorPrefix(); - String getJournalPrefix(); + protected abstract String getUnFieldedPrefix(); - String getTitlePrefix(); + protected abstract String getJournalPrefix(); + + protected abstract String getTitlePrefix(); @Test - default void convertAuthorField() throws Exception { + public void convertAuthorField() throws Exception { String queryString = "author:\"Igor Steinmacher\""; QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); - Optional searchQuery = getTransformator().transformLuceneQuery(luceneQuery); + Optional searchQuery = getTransformer().transformLuceneQuery(luceneQuery); Optional expected = Optional.of(getAuthorPrefix() + "\"Igor Steinmacher\""); assertEquals(expected, searchQuery); } @Test - default void convertUnFieldedTerm() throws Exception { + public void convertUnFieldedTerm() throws Exception { String queryString = "\"default value\""; QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); - Optional searchQuery = getTransformator().transformLuceneQuery(luceneQuery); + Optional searchQuery = getTransformer().transformLuceneQuery(luceneQuery); Optional expected = Optional.of(getUnFieldedPrefix() + queryString); assertEquals(expected, searchQuery); } @Test - default void convertExplicitUnFieldedTerm() throws Exception { + public void convertExplicitUnFieldedTerm() throws Exception { String queryString = "default:\"default value\""; QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); - Optional searchQuery = getTransformator().transformLuceneQuery(luceneQuery); + Optional searchQuery = getTransformer().transformLuceneQuery(luceneQuery); Optional expected = Optional.of(getUnFieldedPrefix() + "\"default value\""); assertEquals(expected, searchQuery); } @Test - default void convertJournalField() throws Exception { + public void convertJournalField() throws Exception { String queryString = "journal:Nature"; QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); - Optional searchQuery = getTransformator().transformLuceneQuery(luceneQuery); - Optional expected = Optional.of(getJournalPrefix() + "\"Nature\""); + Optional searchQuery = getTransformer().transformLuceneQuery(luceneQuery); + Optional expected = Optional.of(getJournalPrefix() + "Nature"); assertEquals(expected, searchQuery); } @Test - void convertYearField() throws Exception; + public abstract void convertYearField() throws Exception; @Test - void convertYearRangeField() throws Exception; + public abstract void convertYearRangeField() throws Exception; @Test - default void convertMultipleValuesWithTheSameField() throws Exception { + public void convertMultipleValuesWithTheSameField() throws Exception { String queryString = "author:\"Igor Steinmacher\" author:\"Christoph Treude\""; QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); - Optional searchQuery = getTransformator().transformLuceneQuery(luceneQuery); - Optional expected = Optional.of(getAuthorPrefix() + "\"Igor Steinmacher\"" + getTransformator().getLogicalAndOperator() + getAuthorPrefix() + "\"Christoph Treude\""); + Optional searchQuery = getTransformer().transformLuceneQuery(luceneQuery); + Optional expected = Optional.of(getAuthorPrefix() + "\"Igor Steinmacher\"" + getTransformer().getLogicalAndOperator() + getAuthorPrefix() + "\"Christoph Treude\""); assertEquals(expected, searchQuery); } @Test - default void groupedOperations() throws Exception { + public void groupedOperations() throws Exception { String queryString = "(author:\"Igor Steinmacher\" OR author:\"Christoph Treude\" AND author:\"Christoph Freunde\") AND title:test"; QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); - Optional searchQuery = getTransformator().transformLuceneQuery(luceneQuery); - Optional expected = Optional.of("(" + getAuthorPrefix() + "\"Igor Steinmacher\"" + getTransformator().getLogicalOrOperator() + "(" + getAuthorPrefix() + "\"Christoph Treude\"" + getTransformator().getLogicalAndOperator() + getAuthorPrefix() + "\"Christoph Freunde\"))" + getTransformator().getLogicalAndOperator() + getTitlePrefix() + "\"test\""); + Optional searchQuery = getTransformer().transformLuceneQuery(luceneQuery); + Optional expected = Optional.of("(" + getAuthorPrefix() + "\"Igor Steinmacher\"" + getTransformer().getLogicalOrOperator() + "(" + getAuthorPrefix() + "\"Christoph Treude\"" + getTransformer().getLogicalAndOperator() + getAuthorPrefix() + "\"Christoph Freunde\"))" + getTransformer().getLogicalAndOperator() + getTitlePrefix() + "test"); assertEquals(expected, searchQuery); } @Test - default void notOperator() throws Exception { + public void notOperator() throws Exception { String queryString = "!(author:\"Igor Steinmacher\" OR author:\"Christoph Treude\")"; QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); - Optional searchQuery = getTransformator().transformLuceneQuery(luceneQuery); - Optional expected = Optional.of(getTransformator().getLogicalNotOperator() + "(" + getAuthorPrefix() + "\"Igor Steinmacher\"" + getTransformator().getLogicalOrOperator() + getAuthorPrefix() + "\"Christoph Treude\")"); + Optional searchQuery = getTransformer().transformLuceneQuery(luceneQuery); + Optional expected = Optional.of(getTransformer().getLogicalNotOperator() + "(" + getAuthorPrefix() + "\"Igor Steinmacher\"" + getTransformer().getLogicalOrOperator() + getAuthorPrefix() + "\"Christoph Treude\")"); assertEquals(expected, searchQuery); } } diff --git a/src/test/java/org/jabref/logic/importer/fetcher/transformators/ScholarQueryTransformerTest.java b/src/test/java/org/jabref/logic/importer/fetcher/transformers/JstorQueryTransformerTest.java similarity index 52% rename from src/test/java/org/jabref/logic/importer/fetcher/transformators/ScholarQueryTransformerTest.java rename to src/test/java/org/jabref/logic/importer/fetcher/transformers/JstorQueryTransformerTest.java index e83329b893a..85a1db5c454 100644 --- a/src/test/java/org/jabref/logic/importer/fetcher/transformators/ScholarQueryTransformerTest.java +++ b/src/test/java/org/jabref/logic/importer/fetcher/transformers/JstorQueryTransformerTest.java @@ -1,20 +1,22 @@ -package org.jabref.logic.importer.fetcher.transformators; +package org.jabref.logic.importer.fetcher.transformers; + +import java.util.Optional; import org.apache.lucene.queryparser.flexible.core.nodes.QueryNode; import org.apache.lucene.queryparser.flexible.standard.parser.StandardSyntaxParser; import static org.junit.jupiter.api.Assertions.assertEquals; -class ScholarQueryTransformerTest implements InfixTransformerTest { +class JstorQueryTransformerTest extends InfixTransformerTest { @Override - public AbstractQueryTransformer getTransformator() { - return new ScholarQueryTransformer(); + public JstorQueryTransformer getTransformer() { + return new JstorQueryTransformer(); } @Override public String getAuthorPrefix() { - return "author:"; + return "au:"; } @Override @@ -24,36 +26,27 @@ public String getUnFieldedPrefix() { @Override public String getJournalPrefix() { - return "source:"; + return "pt:"; } @Override public String getTitlePrefix() { - return "allintitle:"; + return "ti:"; } @Override public void convertYearField() throws Exception { - ScholarQueryTransformer transformer = ((ScholarQueryTransformer) getTransformator()); - - String queryString = "year:2021"; + String queryString = "year:2018"; QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); - transformer.transformLuceneQuery(luceneQuery); - - assertEquals(2021, transformer.getStartYear()); - assertEquals(2021, transformer.getEndYear()); + Optional query = getTransformer().transformLuceneQuery(luceneQuery); + assertEquals(Optional.of("sd:2018 AND ed:2018"), query); } @Override public void convertYearRangeField() throws Exception { - - ScholarQueryTransformer transformer = ((ScholarQueryTransformer) getTransformator()); - String queryString = "year-range:2018-2021"; QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); - transformer.transformLuceneQuery(luceneQuery); - - assertEquals(2018, transformer.getStartYear()); - assertEquals(2021, transformer.getEndYear()); + Optional query = getTransformer().transformLuceneQuery(luceneQuery); + assertEquals(Optional.of("sd:2018 AND ed:2021"), query); } } diff --git a/src/test/java/org/jabref/logic/importer/fetcher/transformers/ScholarQueryTransformerTest.java b/src/test/java/org/jabref/logic/importer/fetcher/transformers/ScholarQueryTransformerTest.java new file mode 100644 index 00000000000..f2264ca0735 --- /dev/null +++ b/src/test/java/org/jabref/logic/importer/fetcher/transformers/ScholarQueryTransformerTest.java @@ -0,0 +1,30 @@ +package org.jabref.logic.importer.fetcher.transformers; + +class ScholarQueryTransformerTest extends YearAndYearRangeByFilteringQueryTransformerTest { + + @Override + public ScholarQueryTransformer getTransformer() { + return new ScholarQueryTransformer(); + } + + @Override + public String getAuthorPrefix() { + return "author:"; + } + + @Override + public String getUnFieldedPrefix() { + return ""; + } + + @Override + public String getJournalPrefix() { + return "source:"; + } + + @Override + public String getTitlePrefix() { + return "allintitle:"; + } + +} diff --git a/src/test/java/org/jabref/logic/importer/fetcher/transformators/SpringerQueryTransformerTest.java b/src/test/java/org/jabref/logic/importer/fetcher/transformers/SpringerQueryTransformerTest.java similarity index 78% rename from src/test/java/org/jabref/logic/importer/fetcher/transformators/SpringerQueryTransformerTest.java rename to src/test/java/org/jabref/logic/importer/fetcher/transformers/SpringerQueryTransformerTest.java index c0fbd484251..fb53f80ba37 100644 --- a/src/test/java/org/jabref/logic/importer/fetcher/transformators/SpringerQueryTransformerTest.java +++ b/src/test/java/org/jabref/logic/importer/fetcher/transformers/SpringerQueryTransformerTest.java @@ -1,4 +1,4 @@ -package org.jabref.logic.importer.fetcher.transformators; +package org.jabref.logic.importer.fetcher.transformers; import java.util.Optional; @@ -7,7 +7,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -class SpringerQueryTransformerTest implements InfixTransformerTest { +class SpringerQueryTransformerTest extends InfixTransformerTest { @Override public String getAuthorPrefix() { @@ -15,7 +15,7 @@ public String getAuthorPrefix() { } @Override - public AbstractQueryTransformer getTransformator() { + public SpringerQueryTransformer getTransformer() { return new SpringerQueryTransformer(); } @@ -38,7 +38,7 @@ public String getTitlePrefix() { public void convertYearField() throws Exception { String queryString = "year:2015"; QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); - Optional searchQuery = getTransformator().transformLuceneQuery(luceneQuery); + Optional searchQuery = getTransformer().transformLuceneQuery(luceneQuery); Optional expected = Optional.of("date:2015*"); assertEquals(expected, searchQuery); @@ -48,7 +48,7 @@ public void convertYearField() throws Exception { public void convertYearRangeField() throws Exception { String queryString = "year-range:2012-2015"; QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); - Optional searchQuery = getTransformator().transformLuceneQuery(luceneQuery); + Optional searchQuery = getTransformer().transformLuceneQuery(luceneQuery); Optional expected = Optional.of("date:2012* OR date:2013* OR date:2014* OR date:2015*"); assertEquals(expected, searchQuery); diff --git a/src/test/java/org/jabref/logic/importer/fetcher/transformers/YearAndYearRangeByFilteringQueryTransformerTest.java b/src/test/java/org/jabref/logic/importer/fetcher/transformers/YearAndYearRangeByFilteringQueryTransformerTest.java new file mode 100644 index 00000000000..54bd9c12247 --- /dev/null +++ b/src/test/java/org/jabref/logic/importer/fetcher/transformers/YearAndYearRangeByFilteringQueryTransformerTest.java @@ -0,0 +1,21 @@ +package org.jabref.logic.importer.fetcher.transformers; + +import java.util.Optional; + +import org.apache.lucene.queryparser.flexible.core.nodes.QueryNode; +import org.apache.lucene.queryparser.flexible.standard.parser.StandardSyntaxParser; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public abstract class YearAndYearRangeByFilteringQueryTransformerTest extends YearRangeByFilteringQueryTransformerTest { + @Override + public void convertYearField() throws Exception { + YearAndYearRangeByFilteringQueryTransformer transformer = getTransformer(); + String queryString = "year:2021"; + QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); + Optional query = transformer.transformLuceneQuery(luceneQuery); + assertEquals(Optional.of(""), query); + assertEquals(2021, transformer.getStartYear()); + assertEquals(2021, transformer.getEndYear()); + } +} diff --git a/src/test/java/org/jabref/logic/importer/fetcher/transformers/YearRangeByFilteringQueryTransformerTest.java b/src/test/java/org/jabref/logic/importer/fetcher/transformers/YearRangeByFilteringQueryTransformerTest.java new file mode 100644 index 00000000000..244f2ed8e4a --- /dev/null +++ b/src/test/java/org/jabref/logic/importer/fetcher/transformers/YearRangeByFilteringQueryTransformerTest.java @@ -0,0 +1,31 @@ +package org.jabref.logic.importer.fetcher.transformers; + +import java.util.Optional; + +import org.apache.lucene.queryparser.flexible.core.nodes.QueryNode; +import org.apache.lucene.queryparser.flexible.standard.parser.StandardSyntaxParser; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public abstract class YearRangeByFilteringQueryTransformerTest extends InfixTransformerTest { + + @Override + public void convertYearRangeField() throws Exception { + YearRangeByFilteringQueryTransformer transformer = getTransformer(); + + String queryString = "year-range:2018-2021"; + QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); + Optional result = transformer.transformLuceneQuery(luceneQuery); + + // The API does not support querying for a year range + // The implementation of the fetcher filters the results manually + + // The implementations returns an empty query + assertEquals(Optional.of(""), result); + + // The implementation sets the start year and end year values according to the query + assertEquals(2018, transformer.getStartYear()); + assertEquals(2021, transformer.getEndYear()); + } + +} diff --git a/src/test/java/org/jabref/logic/importer/fetcher/transformators/ZbMathQueryTransformerTest.java b/src/test/java/org/jabref/logic/importer/fetcher/transformers/ZbMathQueryTransformerTest.java similarity index 78% rename from src/test/java/org/jabref/logic/importer/fetcher/transformators/ZbMathQueryTransformerTest.java rename to src/test/java/org/jabref/logic/importer/fetcher/transformers/ZbMathQueryTransformerTest.java index 73737455534..0b9cd9a88d1 100644 --- a/src/test/java/org/jabref/logic/importer/fetcher/transformators/ZbMathQueryTransformerTest.java +++ b/src/test/java/org/jabref/logic/importer/fetcher/transformers/ZbMathQueryTransformerTest.java @@ -1,4 +1,4 @@ -package org.jabref.logic.importer.fetcher.transformators; +package org.jabref.logic.importer.fetcher.transformers; import java.util.Optional; @@ -7,10 +7,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -class ZbMathQueryTransformerTest implements InfixTransformerTest { +class ZbMathQueryTransformerTest extends InfixTransformerTest { @Override - public AbstractQueryTransformer getTransformator() { + public ZbMathQueryTransformer getTransformer() { return new ZbMathQueryTransformer(); } @@ -38,7 +38,7 @@ public String getTitlePrefix() { public void convertYearField() throws Exception { String queryString = "year:2015"; QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); - Optional searchQuery = getTransformator().transformLuceneQuery(luceneQuery); + Optional searchQuery = getTransformer().transformLuceneQuery(luceneQuery); Optional expected = Optional.of("py:2015"); assertEquals(expected, searchQuery); } @@ -47,7 +47,7 @@ public void convertYearField() throws Exception { public void convertYearRangeField() throws Exception { String queryString = "year-range:2012-2015"; QueryNode luceneQuery = new StandardSyntaxParser().parse(queryString, AbstractQueryTransformer.NO_EXPLICIT_FIELD); - Optional searchQuery = getTransformator().transformLuceneQuery(luceneQuery); + Optional searchQuery = getTransformer().transformLuceneQuery(luceneQuery); Optional expected = Optional.of("py:2012-2015"); assertEquals(expected, searchQuery); } diff --git a/src/test/resources/org/jabref/logic/exporter/MsBibExportFormatTestDay.xml b/src/test/resources/org/jabref/logic/exporter/MsBibExportFormatTestDay.xml index a6e655b3cb4..9b477d9224f 100644 --- a/src/test/resources/org/jabref/logic/exporter/MsBibExportFormatTestDay.xml +++ b/src/test/resources/org/jabref/logic/exporter/MsBibExportFormatTestDay.xml @@ -16,7 +16,7 @@ 2002 - 7 + July 3 Tech. rep. diff --git a/src/test/resources/org/jabref/logic/exporter/MsBibExportFormatTestDayBiblatex.bib b/src/test/resources/org/jabref/logic/exporter/MsBibExportFormatTestDayBiblatex.bib new file mode 100644 index 00000000000..047b696df13 --- /dev/null +++ b/src/test/resources/org/jabref/logic/exporter/MsBibExportFormatTestDayBiblatex.bib @@ -0,0 +1,8 @@ +% Encoding: UTF-8 + +@TechReport{, + author = {Sam and jason}, + date = {2002-07-03}, +} + +@Comment{jabref-meta: databaseType:biblatex;} diff --git a/src/test/resources/org/jabref/logic/exporter/MsBibExportFormatTestDayBiblatex.xml b/src/test/resources/org/jabref/logic/exporter/MsBibExportFormatTestDayBiblatex.xml new file mode 100644 index 00000000000..9b477d9224f --- /dev/null +++ b/src/test/resources/org/jabref/logic/exporter/MsBibExportFormatTestDayBiblatex.xml @@ -0,0 +1,23 @@ + + + + techreport + Report + + + + + Sam + + + jason + + + + + 2002 + July + 3 + Tech. rep. + +