Skip to content

Fix for issue #372 #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1,016 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
1016 commits
Select commit Hold shift + click to select a range
6547d18
Refine text for update available (#13010)
subhramit Apr 27, 2025
6716d54
Use basic type (#13016)
koppor Apr 28, 2025
0d6cb31
Update javadoc (#13018)
subhramit Apr 28, 2025
337b08b
Add `@return` to `getFileDirectories` (#13019)
koppor Apr 28, 2025
f3f753a
Bump com.konghq:unirest-modules-gson from 4.4.5 to 4.4.6 (#13024)
dependabot[bot] Apr 28, 2025
7aa2d48
Bump com.fasterxml.jackson.dataformat:jackson-dataformat-yaml (#13023)
dependabot[bot] Apr 28, 2025
c2f8ee8
Bump net.java.dev.jna:jna-platform from 5.16.0 to 5.17.0 (#13025)
dependabot[bot] Apr 28, 2025
b912303
Bump de.undercouch:citeproc-java from 3.2.0 to 3.3.0 (#13026)
dependabot[bot] Apr 28, 2025
4ff598a
Bump org.junit.platform:junit-platform-launcher from 1.12.1 to 1.12.2…
dependabot[bot] Apr 28, 2025
fd23447
Revert "Add Crowdin action (#13007)"
koppor Apr 29, 2025
97aaab5
New Crowdin updates (#13027)
Siedlerchr Apr 29, 2025
a77883b
Fix path - and fix typo (#13038)
koppor Apr 30, 2025
8ddb985
Updating the gradle wrapper does not need any JDK (#13037)
koppor Apr 30, 2025
dfdbe38
Switch if branches for readbility (#13042)
koppor May 1, 2025
ae457db
refine-jabsrv (#13044)
koppor May 2, 2025
de56006
Merging Entry Creation Buttons Into a Single Tool (#13020)
Marika-Academic May 2, 2025
8159964
Keep merge=union for JabRef_en.properties
koppor May 2, 2025
869e80e
Fix directory path validation checks (#13029)
paudelritij May 2, 2025
d9ea011
Add rendered DOI tests for CSL APA 7th ed. (#13052)
subhramit May 3, 2025
99d49ca
Fix: fallback conversion from BibTeX year field to biblatex date fiel…
wanling0000 May 4, 2025
fad9026
Make comment on fixed issue more readable
koppor May 4, 2025
6fa3f53
Add suggested jabref groups (#12997)
luks-santos May 4, 2025
f81518e
Fix environment variable JAVA_HOME (#13054)
koppor May 4, 2025
fef1b02
Fix OO sync button not enabeld for jstyle (#13055)
Siedlerchr May 4, 2025
e984f71
Add -ea workflow (both JDK-ea and JavaFX-ea) (#13056)
koppor May 5, 2025
c707a8f
Fix path for artifacts (#13057)
koppor May 5, 2025
98e2863
fix jpackage resource building for mac (#13032)
koppor May 5, 2025
eeb1dd4
Bump jablib/src/main/resources/csl-styles from `28ee0a5` to `b8070a7`…
dependabot[bot] May 5, 2025
43190d8
Bump jablib/src/main/resources/csl-locales from `76a834b` to `e277625…
dependabot[bot] May 5, 2025
d8181b5
Try to fix -ea workflow
koppor May 5, 2025
3430e8e
Make conditions consistent
koppor May 5, 2025
4e10f30
Bump jablib/src/main/abbrv.jabref.org from `7f27d79` to `6926b83` (#1…
dependabot[bot] May 5, 2025
38c6841
Bump jbangdev/jbang-action from 0.125.1 to 0.126.0 (#13065)
dependabot[bot] May 5, 2025
53c6573
Bump luceneVersion from 10.2.0 to 10.2.1 (#13064)
dependabot[bot] May 5, 2025
5579e8f
Bump org.jsoup:jsoup from 1.19.1 to 1.20.1 (#13063)
dependabot[bot] May 5, 2025
ffbf9bd
Bump pdfbox from 3.0.4 to 3.0.5 (#13062)
dependabot[bot] May 5, 2025
7a05985
Bump com.dlsc.gemsfx:gemsfx from 2.96.0 to 2.104.0 (#13061)
dependabot[bot] May 5, 2025
4abdca6
readd dmg position script (#13066)
Siedlerchr May 5, 2025
d32d91a
Port changes of normal build to ea build (#13067)
koppor May 5, 2025
0feea85
Add link to instructions for building from sources in `README.md` (#1…
nberth May 7, 2025
6405a0d
Fix: Increase preview area in style selection dialog to show full cit…
lydia-yan May 7, 2025
d8cd25b
Avoid `Path.of()`` in resource loading (#13075)
subhramit May 7, 2025
0a1d67b
CSL4LibreOffice - I [Bibliography formatting] (#13074)
subhramit May 7, 2025
5c289cc
Create "Architecture and Components" (#13077)
koppor May 8, 2025
f5eb2b0
minor-code-updates (#13078)
koppor May 8, 2025
c0e23e2
Move .tex files not required for testing to src/test/latex (#13079)
koppor May 8, 2025
02ec5b8
Use `getResourceAsStream` for JStyle reload (#13080)
subhramit May 9, 2025
2e4e315
Fix inclusion of output string in translation (#13082)
koppor May 9, 2025
5a845c5
Micro code updates (#13085)
koppor May 9, 2025
542007d
Replace unused variables by_ (#13084)
koppor May 9, 2025
56f9004
Change e. g. to e.g. (#13083)
koppor May 9, 2025
42937b8
Use TEST keys also for non-fetcher tests (#13043)
koppor May 9, 2025
0eab01f
Added api keys from default build file (#12816)
jnchin314 May 9, 2025
72d5cc2
Migrate CLI handling from Apache Commons CLI to PicoCLI (#13012)
calixtus May 9, 2025
c210a80
Fix typos (#13088)
koppor May 9, 2025
d940392
Add 'Make absolute/relative' toggle-switch in library properties (#13…
paudelritij May 9, 2025
f019d37
Hide tabs without restart (#12958)
koppor May 9, 2025
43e5a7d
Fix startup in case of files (#13089)
koppor May 9, 2025
c000564
Remove wrong hints to Chocolate.bib (#13090)
koppor May 10, 2025
1453483
Improve UX for "Copy to" option with success dialog (#13071)
luks-santos May 10, 2025
e0f9e86
Check label "dev: binary" for upload to builds.jabref.org (#13086)
koppor May 10, 2025
7bf82e8
hotfix: enable ea build also on label added
koppor May 10, 2025
52913d6
fix-git-version (#13093)
koppor May 10, 2025
bb6b553
Fix condition for "comment-on-pr"
koppor May 10, 2025
ec396a8
fix-localization (#13092)
koppor May 10, 2025
b899437
Add ADR for migration from Apache Commons to Picocli (#13096)
subhramit May 10, 2025
fcf1e70
Update year (#13097)
subhramit May 11, 2025
c0ecc2e
Add more options to ADR-044 (#13098)
koppor May 11, 2025
3e1bd93
Fix notarization flag (#13095)
koppor May 11, 2025
7e73f49
Add missing empty line
koppor May 11, 2025
7cf4848
feat: select correct tab for creation of new entry (#13087) (#13091)
lydia-yan May 11, 2025
795f997
Fix dash
koppor May 11, 2025
5a04773
Add type "Bug" (#13099)
koppor May 11, 2025
6cb8055
Refine http sever doc (#13100)
koppor May 12, 2025
0c1b553
Bump jablib/src/main/resources/csl-styles from `b8070a7` to `9b777f6`…
dependabot[bot] May 12, 2025
abef72a
Bump com.konghq:unirest-modules-gson from 4.4.6 to 4.4.7 (#13102)
dependabot[bot] May 12, 2025
9e55146
Bump com.tngtech.archunit:archunit-junit5-engine from 1.4.0 to 1.4.1 …
dependabot[bot] May 12, 2025
bf6e985
Bump org.openrewrite.rewrite from 7.5.0 to 7.6.1 (#13105)
dependabot[bot] May 12, 2025
13eaa29
Bump ai.djl:bom from 0.32.0 to 0.33.0 (#13106)
dependabot[bot] May 12, 2025
1616797
Bump com.konghq:unirest-java-core from 4.4.6 to 4.4.7 (#13104)
dependabot[bot] May 12, 2025
3b892c0
Make lobid fetcher search for ISBN as well (#13107)
Siedlerchr May 12, 2025
fe09477
Remove "pinned" in case of assignees left
koppor May 12, 2025
16f8159
Fix `OpenAITokenizer` constructor deprecation (#13108)
InAnYan May 13, 2025
5457693
Disable non-working tets (with issue links) (#12868)
koppor May 13, 2025
56f6c89
Disable JabLib tests not working on Windows (#12869)
koppor May 13, 2025
53bfd6f
Use "library" for .bib file (#13113)
koppor May 14, 2025
2521eca
Add --enable-native-access (#13094)
koppor May 14, 2025
5cd0f61
Remove commenting on n/a build (not needed in most cases)
koppor May 15, 2025
bcd94f5
Remove unused variable (#13117)
koppor May 15, 2025
dca5cd5
Add 'Open example library' button to Welcome Tab (#13068)
khushp3 May 15, 2025
6ba53f0
Add Dockerimages (#13114)
koppor May 15, 2025
1375bdb
Fix browser extension import commands (#13110)
Siedlerchr May 15, 2025
cc1064a
Link to JabRefs repo (#13120)
koppor May 16, 2025
4cca285
Fix legacy warning
koppor May 16, 2025
14c45ce
Update CONTRIBUTING.md (#13121)
koppor May 16, 2025
861b00b
jablib on MavenCentral (#13123)
koppor May 16, 2025
14f85e3
Fix JBang JabKit launcher
koppor May 16, 2025
1758506
Add JabKit to README.md (#13124)
koppor May 17, 2025
9a17cde
Add .gitignore for search test files
koppor May 17, 2025
c06f141
Add alias for importToOpen with a single dash to be backwards comptai…
Siedlerchr May 18, 2025
9e7026a
Add publishing of JabLib snapshot to maven central (#13126)
koppor May 19, 2025
404c625
Update GitVersion.yml (#13133)
koppor May 19, 2025
18068df
off-by-5-error (and use 10 just to be sure)
koppor May 19, 2025
11ea6af
Bump org.xmlunit:xmlunit-matchers from 2.10.0 to 2.10.1 (#13134)
dependabot[bot] May 19, 2025
563ce58
Bump com.squareup.retrofit2:retrofit from 2.11.0 to 3.0.0 (#13135)
dependabot[bot] May 19, 2025
b108e74
Bump jbangdev/jbang-action from 0.126.0 to 0.126.1 (#13136)
dependabot[bot] May 19, 2025
c3ffcb3
Bump docker/login-action from 2 to 3 (#13138)
dependabot[bot] May 19, 2025
b535de8
Bump docker/metadata-action from 4 to 5 (#13139)
dependabot[bot] May 19, 2025
bf9990e
Bump org.jetbrains.kotlin:kotlin-stdlib-jdk8 from 2.1.20 to 2.1.21 (#…
dependabot[bot] May 19, 2025
2798063
Bump org.openrewrite.recipe:rewrite-recipe-bom from 3.7.0 to 3.8.0 (#…
dependabot[bot] May 19, 2025
f8025ac
Bump jablib/src/main/resources/csl-styles from `9b777f6` to `c1f8f60`…
dependabot[bot] May 19, 2025
b910a28
Bump org.xmlunit:xmlunit-core from 2.10.0 to 2.10.1 (#13137)
dependabot[bot] May 19, 2025
706d180
Bump com.tngtech.archunit:archunit-junit5-api from 1.4.0 to 1.4.1 (#1…
dependabot[bot] May 19, 2025
c9fca68
Add support for Refer/BibIX import format (#13118)
paudelritij May 19, 2025
e8fe5d7
Bump DavidAnson/markdownlint-cli2-action from 19 to 20 (#13141)
dependabot[bot] May 19, 2025
f8c0ca9
Refine descriptions for linux store entries (#13149)
Siedlerchr May 19, 2025
3c97e33
Bump org.eclipse.jgit:org.eclipse.jgit (#13145)
dependabot[bot] May 19, 2025
bd2a14a
Bump dev.langchain4j:langchain4j from 0.36.2 to 1.0.0 (#13146)
dependabot[bot] May 20, 2025
06a3d58
Update gradle.properties (#13154)
koppor May 20, 2025
2340398
Add gg to .gitignore (#13152)
koppor May 20, 2025
61fb260
Fix label removal on unassigment (#13155)
koppor May 20, 2025
5069894
Fix citation key table (#13151)
koppor May 20, 2025
4796a03
test: ensure search history is shared and ordered correctly across da…
FlyJoanne May 21, 2025
e2948d2
feat: fetcher from clipboard and auto-select identifier type if valid…
lydia-yan May 21, 2025
daf5a20
Refine HTTP Server (#13156)
koppor May 23, 2025
9c33a08
Add JabRef cloning command (#13157)
koppor May 23, 2025
f86f0d3
Add support for path as first argument
koppor May 23, 2025
dee9627
Fix off-by-one
koppor May 23, 2025
860606d
fix location of properties files for crowdin (#13159)
Siedlerchr May 25, 2025
55232e6
New Crowdin updates (#13160)
Siedlerchr May 25, 2025
9fd0b4d
fix path
Siedlerchr May 25, 2025
c28ef5a
Update Gradle Wrapper from 8.14 to 8.14.1 (#13163)
koppor May 26, 2025
1775f0d
New Crowdin updates (#13161)
Siedlerchr May 26, 2025
3c5b91b
New Crowdin updates (#13165)
Siedlerchr May 26, 2025
6732e59
Bump dev.langchain4j:langchain4j-google-ai-gemini (#13167)
dependabot[bot] May 26, 2025
8dcb9b4
Bump org.gradle.toolchains.foojay-resolver-convention (#13166)
dependabot[bot] May 26, 2025
a76e753
Bump org.hibernate.validator:hibernate-validator (#13168)
dependabot[bot] May 26, 2025
bd99ac6
Bump org.xmlunit:xmlunit-matchers from 2.10.1 to 2.10.2 (#13170)
dependabot[bot] May 26, 2025
c283080
Bump jablib/src/main/resources/csl-styles from `c1f8f60` to `8a2317a`…
dependabot[bot] May 26, 2025
0fa92cd
Bump org.mockito:mockito-core from 5.17.0 to 5.18.0 (#13169)
dependabot[bot] May 26, 2025
cafea20
Create merge-upstream.yml (#13173)
koppor May 27, 2025
6fac02d
Create ADR 0045 for --input (#13164)
koppor May 27, 2025
9e9137f
Refine conditions of workflows (#13172)
koppor May 27, 2025
65d404f
Fix permissions
koppor May 27, 2025
bb4bd3a
Add forgotten if
koppor May 27, 2025
c9b8323
Fix typo in ADR-0045 filename
koppor May 27, 2025
5b5cba8
Fix job name
koppor May 27, 2025
38ba42b
Rename readme.md to README.md
koppor May 27, 2025
ee6eb6d
Refine text for referencing (#13176)
koppor May 27, 2025
c884329
Add multiple-meta-data.* (#13177)
koppor May 28, 2025
4d2fd15
Refactor: use strict types, `toList`, `List.of`, remove unused variab…
subhramit May 28, 2025
068065c
New translations jabref_en.properties (Portuguese, Brazilian) (#13179)
Siedlerchr May 28, 2025
8da3a0d
Enable JEP-450 and ZGC (#13175)
koppor May 28, 2025
3e1a4f4
Update docs to new structure (#13039)
koppor May 28, 2025
50c605c
Add progess output for consisteny check (#13181)
Siedlerchr May 29, 2025
2841904
Adapt casing
koppor May 29, 2025
20874f9
Web Import: Add New Entries to 'Imported Entries' Group (#12998)
paudelritij May 29, 2025
bb09904
Refactor Databasesearcher (#13183)
palukku May 29, 2025
460fdea
Refine conditions for deleting binaries
koppor May 29, 2025
a8c7f59
Add CheckoutPR.java (#13184)
koppor May 30, 2025
3cb15af
Add justfile (#13189)
koppor May 30, 2025
0bc6411
Sync on PR creation, too
koppor May 30, 2025
ac156ed
Use latest release of github-action-move-issues
koppor May 30, 2025
770f086
Also allow "refs" in the PR description
koppor May 30, 2025
0c51b24
chore: fix gradle vfs watch properties (#13192)
Yubo-Cao May 30, 2025
b4a2994
docs: updated walkthrough documentation (#13199)
Yubo-Cao May 31, 2025
ea22869
Fix for issue 13132: Show entry column only when not empty (#13180)
Vane-Arellano May 31, 2025
219d198
Update PULL_REQUEST_TEMPLATE.md (#13188)
koppor May 31, 2025
c1e726b
CheckoutPR: Add support for updating main (#13195)
koppor May 31, 2025
d26788e
Add run-jabkit and run-jabsrv to justfile (#13200)
koppor May 31, 2025
345c8ab
Add required checkout step to cleanup
koppor May 31, 2025
d520036
New Crowdin updates (#13191)
Siedlerchr May 31, 2025
2800bf6
Disable non-working rule (#13201)
koppor May 31, 2025
efe5971
Enable "just run main"
koppor May 31, 2025
314456c
Rename label "dev: binary" to "dev: binaries"
koppor May 31, 2025
95f8ca4
Add testing instructions to PR template (#13203)
koppor May 31, 2025
0ea5480
feat(focus): Add functionality to focus on running instance (#13196)
miguelro20 Jun 1, 2025
a26d7c6
Add JBang tests and renovate support (#13204)
koppor Jun 1, 2025
b07fcb6
Switch to PdfViewFX (#13193)
Siedlerchr Jun 1, 2025
6bc772d
feat(ci-cd): change issue URL pattern (#13206)
InAnYan Jun 1, 2025
4f1b9fc
Switch to gradlex for modularity (#13112)
koppor Jun 1, 2025
14b5611
Add link to JabRef guru (#13207)
koppor Jun 1, 2025
298ed89
Use setup-jbang action (instead of custom call of .sh script) (#13208)
koppor Jun 1, 2025
d5a0544
Fix porcelain for consistency check (#13209)
Siedlerchr Jun 1, 2025
8d2d595
Run Windows tests only on main (and on demand) (#13210)
koppor Jun 1, 2025
dc592a5
Miscellaneous refactoring - II (#13197)
subhramit Jun 1, 2025
4d115c4
Fix wrong detection of issue numbers (#13211)
koppor Jun 1, 2025
6577e45
Add yml as YAML extension (#13213)
koppor Jun 2, 2025
66b90d2
Preapre: Enable gradle configuration cache (#13212)
koppor Jun 2, 2025
43ee723
New Crowdin updates (#13214)
Siedlerchr Jun 2, 2025
9695833
Fix position of checkout
koppor Jun 2, 2025
e7c2631
Update gource.yml
koppor Jun 2, 2025
33522ea
Try parallel gource build
koppor Jun 2, 2025
7d9815c
Add Pseudonymization to CLI (#13158)
paudelritij Jun 2, 2025
36382da
Fixed search result focus handling (#13174)
ZodGaz Jun 2, 2025
352708b
Bump jablib/src/main/resources/csl-styles from `8a2317a` to `c3df987`…
dependabot[bot] Jun 2, 2025
262f874
Bump jablib/src/main/abbrv.jabref.org from `6926b83` to `333c2f1` (#1…
dependabot[bot] Jun 2, 2025
ed1b433
Improve AI preferences UI and templates (#13202)
InAnYan Jun 2, 2025
aa4aa5c
Try to fix output
koppor Jun 2, 2025
190f5d2
try to speficy the dirs separate (#13218)
Siedlerchr Jun 2, 2025
6006553
test: add additional tests for ExternalLinkCreator (#13115)
brandon-lau0 Jun 2, 2025
86b5f2b
Bump com.dlsc.gemsfx:gemsfx from 2.104.0 to 3.1.1 in /jabgui (#13220)
dependabot[bot] Jun 2, 2025
cb16ec4
Bump dev.langchain4j:langchain4j from 1.0.0 to 1.0.1 in /jabgui (#13222)
dependabot[bot] Jun 2, 2025
ceca7e4
Update dependabot.yml (#13226)
koppor Jun 2, 2025
14b49f4
Refinement of gource workflow (#13230)
koppor Jun 2, 2025
b309292
Keyword Tooltip/Cleanup for MSC codes added to Keyword Editor (#12914)
JustinHennis1 Jun 2, 2025
de58f03
Bump org.apache.httpcomponents.client5:httpclient5 in /jabgui (#13228)
dependabot[bot] Jun 2, 2025
fe2d4b2
Bump org.apache.httpcomponents.client5:httpclient5 in /jablib (#13229)
dependabot[bot] Jun 2, 2025
19f4e96
Fix JBang test (#13236)
koppor Jun 3, 2025
eb9c427
Bump dev.langchain4j:langchain4j from 1.0.0 to 1.0.1 in /jablib (#13224)
dependabot[bot] Jun 3, 2025
84f9fd9
Fix About Dialog Does not Show all Maintainers (#13231)
victoriacliu Jun 3, 2025
5dfa8e7
Fix macOS-14 gradlew :jabgui:run (#13232)
koppor Jun 3, 2025
0b9dec7
New Crowdin updates (#13239)
Siedlerchr Jun 3, 2025
fef855a
Remove melting pot references from changelog
subhramit Jun 4, 2025
c4293ed
Fix PR number in entry reference
subhramit Jun 4, 2025
4805151
New translations jabref_en.properties (Italian) (#13247)
Siedlerchr Jun 4, 2025
c7da74a
Refine build (#13248)
koppor Jun 4, 2025
d3d0fc3
Disable renovate for gradle and github actions
koppor Jun 4, 2025
255669e
chore(deps): update dependency just-the-docs to v0.10.1 (#13252)
renovate-bot Jun 4, 2025
66d4fa0
Enable using snapshots
koppor Jun 4, 2025
5690a5e
chore(deps): update dependency jekyll to "~> 4.4.0" (#13255)
renovate-bot Jun 4, 2025
37bec92
Try to group PRs (and disable depdency dashboard)
koppor Jun 4, 2025
fcdcacb
chore(deps): update dependency org.postgresql:postgresql to v42.7.6 (…
renovate-bot Jun 4, 2025
bd2c4f9
Reformat build.kts (#13246)
koppor Jun 4, 2025
fcb0bb4
chore(deps): update dependency org.bouncycastle:bcprov-jdk18on to v1.…
renovate-bot Jun 4, 2025
214a843
chore(deps): update dependency org.hibernate.validator:hibernate-vali…
renovate-bot Jun 5, 2025
83e0e88
Ignore Docker for now
koppor Jun 5, 2025
b2104a1
Bring back .mailmap (#13237)
koppor Jun 5, 2025
2d94374
Add FAQ on upstream sync (#13238)
koppor Jun 5, 2025
aa07981
Fixed Localizations in citation relations (#13240)
pranav0510s Jun 5, 2025
7ac36c8
Add demo for issue 9798 (#13263)
koppor Jun 5, 2025
ae9f742
Use named groups
subhramit Jun 5, 2025
9d0d1c4
Fix codespaces indent
subhramit Jun 5, 2025
5767a85
Update renovate.json
koppor Jun 5, 2025
251b84a
New Crowdin updates (#13265)
Siedlerchr Jun 5, 2025
b919860
Merge remote-tracking branch 'origin/main' into fix-for-issue-#372
koppor Jun 5, 2025
b0da898
Fix logger import
koppor Jun 5, 2025
a0d2c8f
Remove unnecessary separator
koppor Jun 5, 2025
a70195d
Remove obsolete comment
koppor Jun 5, 2025
8057a82
Reorder lookup menu
koppor Jun 5, 2025
da44233
Compilefix
koppor Jun 5, 2025
7f0d9c6
Merge branch 'main' into fix-for-issue-#372
koppor Jun 5, 2025
23b6172
add test case
calixtus Jun 6, 2025
1a7cf26
Remove normalize method
calixtus Jun 7, 2025
983091a
Refactor RemoveWhitespace to NonSpaceWhitespaceRemover
calixtus Jun 7, 2025
db3e91d
Fix CHANGELOG.md
calixtus Jun 7, 2025
e394341
Remove argument record
calixtus Jun 7, 2025
4dd5004
Simplify
calixtus Jun 7, 2025
c223e24
Rewrite
calixtus Jun 7, 2025
88ce43f
l10n
calixtus Jun 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ Note that this project **does not** adhere to [Semantic Versioning](https://semv
- We added automatic browser extension install on Windows for Chrome and Edge. [#6076](https://github.com/JabRef/jabref/issues/6076)
- We added a search bar for filtering keyboard shortcuts. [#11686](https://github.com/JabRef/jabref/issues/11686)
- By double clicking on a local citation in the Citation Relations Tab you can now jump the linked entry. [#11955](https://github.com/JabRef/jabref/pull/11955)
- Added functionality for mass addition of bibliographic information for multiple entries to the "Lookup" menu. [#372](https://github.com/JabRef/jabref/issues/372)

### Changed

Expand Down
1 change: 1 addition & 0 deletions src/main/java/org/jabref/gui/actions/StandardActions.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ public enum StandardActions implements Action {
OPEN_URL(Localization.lang("Open URL or DOI"), IconTheme.JabRefIcons.WWW, KeyBinding.OPEN_URL_OR_DOI),
SEARCH_SHORTSCIENCE(Localization.lang("Search ShortScience")),
MERGE_WITH_FETCHED_ENTRY(Localization.lang("Get bibliographic data from %0", "DOI/ISBN/...")),
MASS_GET_BIBLIOGRAPHIC_DATA(Localization.lang("Get bibliographic data from %0 (fully automated)", "DOI/ISBN/...")),
ATTACH_FILE(Localization.lang("Attach file"), IconTheme.JabRefIcons.ATTACH_FILE),
ATTACH_FILE_FROM_URL(Localization.lang("Attach file from URL"), IconTheme.JabRefIcons.DOWNLOAD_FILE),
PRIORITY(Localization.lang("Priority"), IconTheme.JabRefIcons.PRIORITY),
Expand Down
16 changes: 15 additions & 1 deletion src/main/java/org/jabref/gui/frame/MainMenu.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
import org.jabref.gui.maintable.NewLibraryFromPdfActionOffline;
import org.jabref.gui.maintable.NewLibraryFromPdfActionOnline;
import org.jabref.gui.mergeentries.MergeEntriesAction;
import org.jabref.gui.mergeentries.MultiEntryMergeWithFetchedDataAction;
import org.jabref.gui.plaincitationparser.PlainCitationParserAction;
import org.jabref.gui.preferences.GuiPreferences;
import org.jabref.gui.preferences.ShowPreferencesAction;
Expand Down Expand Up @@ -273,7 +274,20 @@ private void createMenu() {

new SeparatorMenuItem(),

factory.createMenuItem(StandardActions.FIND_UNLINKED_FILES, new FindUnlinkedFilesAction(dialogService, stateManager))
factory.createMenuItem(StandardActions.FIND_UNLINKED_FILES, new FindUnlinkedFilesAction(dialogService, stateManager)),

new SeparatorMenuItem(),

factory.createMenuItem(
StandardActions.MASS_GET_BIBLIOGRAPHIC_DATA,
new MultiEntryMergeWithFetchedDataAction(
frame::getCurrentLibraryTab,
preferences,
dialogService,
stateManager,
taskExecutor
)
)
);

final MenuItem pushToApplicationMenuItem = factory.createMenuItem(pushToApplicationCommand.getAction(), pushToApplicationCommand);
Expand Down
207 changes: 92 additions & 115 deletions src/main/java/org/jabref/gui/mergeentries/FetchAndMergeEntry.java
Original file line number Diff line number Diff line change
@@ -1,23 +1,16 @@

package org.jabref.gui.mergeentries;

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.TreeSet;

import javax.swing.undo.UndoManager;

import org.jabref.gui.DialogService;
import org.jabref.gui.preferences.GuiPreferences;
import org.jabref.gui.undo.NamedCompound;
import org.jabref.gui.undo.UndoableChangeType;
import org.jabref.gui.undo.UndoableFieldChange;
import org.jabref.logic.importer.EntryBasedFetcher;
import org.jabref.logic.importer.FetcherClientException;
import org.jabref.logic.importer.FetcherServerException;
import org.jabref.logic.importer.IdBasedFetcher;
import org.jabref.logic.importer.ImportCleanup;
import org.jabref.logic.importer.WebFetcher;
Expand All @@ -28,22 +21,18 @@
import org.jabref.model.database.BibDatabaseContext;
import org.jabref.model.entry.BibEntry;
import org.jabref.model.entry.field.Field;
import org.jabref.model.entry.field.FieldFactory;
import org.jabref.model.entry.field.StandardField;
import org.jabref.model.entry.types.EntryType;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Class for fetching and merging bibliographic information
*/
public class FetchAndMergeEntry {

// All identifiers listed here should also appear at {@link org.jabref.logic.importer.CompositeIdFetcher#performSearchById}
public static List<Field> SUPPORTED_FIELDS = Arrays.asList(StandardField.DOI, StandardField.EPRINT, StandardField.ISBN);

public static final List<Field> SUPPORTED_IDENTIFIER_FIELDS = Arrays.asList(StandardField.DOI, StandardField.EPRINT, StandardField.ISBN);

private static final Logger LOGGER = LoggerFactory.getLogger(FetchAndMergeEntry.class);

private final DialogService dialogService;
private final UndoManager undoManager;
private final BibDatabaseContext bibDatabaseContext;
Expand All @@ -63,124 +52,112 @@ public FetchAndMergeEntry(BibDatabaseContext bibDatabaseContext,
}

public void fetchAndMerge(BibEntry entry) {
fetchAndMerge(entry, SUPPORTED_FIELDS);
fetchAndMerge(entry, SUPPORTED_IDENTIFIER_FIELDS);
}

public void fetchAndMerge(BibEntry entry, Field field) {
fetchAndMerge(entry, Collections.singletonList(field));
fetchAndMerge(entry, List.of(field));
}

public void fetchAndMerge(BibEntry entry, List<Field> fields) {
for (Field field : fields) {
Optional<String> fieldContent = entry.getField(field);
if (fieldContent.isPresent()) {
Optional<IdBasedFetcher> fetcher = WebFetchers.getIdBasedFetcherForField(field, preferences.getImportFormatPreferences());
if (fetcher.isPresent()) {
BackgroundTask.wrap(() -> fetcher.get().performSearchById(fieldContent.get()))
.onSuccess(fetchedEntry -> {
ImportCleanup cleanup = ImportCleanup.targeting(bibDatabaseContext.getMode(), preferences.getFieldPreferences());
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()));
}
})
.onFailure(exception -> {
LOGGER.error("Error while fetching bibliographic information", exception);
if (exception instanceof FetcherClientException) {
dialogService.showInformationDialogAndWait(Localization.lang("Fetching information using %0", fetcher.get().getName()), Localization.lang("No data was found for the identifier"));
} else if (exception instanceof FetcherServerException) {
dialogService.showInformationDialogAndWait(Localization.lang("Fetching information using %0", fetcher.get().getName()), Localization.lang("Server not available"));
} else {
dialogService.showInformationDialogAndWait(Localization.lang("Fetching information using %0", fetcher.get().getName()), Localization.lang("Error occurred %0", exception.getMessage()));
}
})
.executeWith(taskExecutor);
}
} else {
dialogService.notify(Localization.lang("No %0 found", field.getDisplayName()));
}
}
fields.forEach(field -> fetchAndMergeEntry(entry, field));
}

private void fetchAndMergeEntry(BibEntry entry, Field field) {
entry.getField(field)
.flatMap(fieldContent -> WebFetchers.getIdBasedFetcherForField(field, preferences.getImportFormatPreferences()))
.ifPresent(fetcher -> executeFetchTask(fetcher, field, entry));
}

private void executeFetchTask(IdBasedFetcher fetcher, Field field, BibEntry entry) {
entry.getField(field).ifPresent(fieldContent ->
BackgroundTask.wrap(() -> fetcher.performSearchById(fieldContent))
.onSuccess(fetchedEntry -> processFetchedEntry(fetchedEntry, entry, fetcher))
.onFailure(exception -> handleFetchException(exception, fetcher))
.executeWith(taskExecutor)
);
}

private void processFetchedEntry(Optional<BibEntry> fetchedEntry, BibEntry originalEntry, IdBasedFetcher fetcher) {
ImportCleanup cleanup = ImportCleanup.targeting(bibDatabaseContext.getMode(), preferences.getFieldPreferences());
fetchedEntry.ifPresentOrElse(
entry -> {
cleanup.doPostCleanup(entry);
showMergeDialog(originalEntry, entry, fetcher);
},
() -> notifyNoInfo(originalEntry)
);
}

private void notifyNoInfo(BibEntry entry) {
dialogService.notify(Localization.lang("Cannot get info based on given %0: %1",
entry.getType().getDisplayName(),
entry.getCitationKey().orElse("")));
}

private void handleFetchException(Exception exception, WebFetcher fetcher) {
LOGGER.error("Error while fetching bibliographic information", exception);
dialogService.showErrorDialogAndWait(
Localization.lang("Error while fetching from %0", fetcher.getName()),
exception
);
}

private void showMergeDialog(BibEntry originalEntry, BibEntry fetchedEntry, WebFetcher fetcher) {
MergeEntriesDialog dialog = createMergeDialog(originalEntry, fetchedEntry, fetcher);
Optional<BibEntry> mergedEntry = dialogService.showCustomDialogAndWait(dialog)
.map(EntriesMergeResult::mergedEntry);

mergedEntry.ifPresentOrElse(
entry -> processMergedEntry(originalEntry, entry, fetcher),
() -> notifyCanceledMerge(originalEntry)
);
}

private MergeEntriesDialog createMergeDialog(BibEntry originalEntry, BibEntry fetchedEntry, WebFetcher fetcher) {
MergeEntriesDialog dialog = new MergeEntriesDialog(originalEntry, fetchedEntry, preferences);
dialog.setTitle(Localization.lang("Merge entry with %0 information", fetcher.getName()));
dialog.setLeftHeaderText(Localization.lang("Original entry"));
dialog.setRightHeaderText(Localization.lang("Entry from %0", fetcher.getName()));
Optional<BibEntry> mergedEntry = dialogService.showCustomDialogAndWait(dialog).map(EntriesMergeResult::mergedEntry);

if (mergedEntry.isPresent()) {
NamedCompound ce = new NamedCompound(Localization.lang("Merge entry with %0 information", fetcher.getName()));

// Updated the original entry with the new fields
Set<Field> jointFields = new TreeSet<>(Comparator.comparing(Field::getName));
jointFields.addAll(mergedEntry.get().getFields());
Set<Field> originalFields = new TreeSet<>(Comparator.comparing(Field::getName));
originalFields.addAll(originalEntry.getFields());
boolean edited = false;

// entry type
EntryType oldType = originalEntry.getType();
EntryType newType = mergedEntry.get().getType();

if (!oldType.equals(newType)) {
originalEntry.setType(newType);
ce.addEdit(new UndoableChangeType(originalEntry, oldType, newType));
edited = true;
}

// fields
for (Field field : jointFields) {
Optional<String> originalString = originalEntry.getField(field);
Optional<String> mergedString = mergedEntry.get().getField(field);
if (originalString.isEmpty() || !originalString.equals(mergedString)) {
originalEntry.setField(field, mergedString.get()); // mergedString always present
ce.addEdit(new UndoableFieldChange(originalEntry, field, originalString.orElse(null),
mergedString.get()));
edited = true;
}
}

// Remove fields which are not in the merged entry, unless they are internal fields
for (Field field : originalFields) {
if (!jointFields.contains(field) && !FieldFactory.isInternalField(field)) {
Optional<String> originalString = originalEntry.getField(field);
originalEntry.clearField(field);
ce.addEdit(new UndoableFieldChange(originalEntry, field, originalString.get(), null)); // originalString always present
edited = true;
}
}

if (edited) {
ce.end();
undoManager.addEdit(ce);
dialogService.notify(Localization.lang("Updated entry with info from %0", fetcher.getName()));
} else {
dialogService.notify(Localization.lang("No information added"));
}
} else {
dialogService.notify(Localization.lang("Canceled merging entries"));
return dialog;
}

private void processMergedEntry(BibEntry originalEntry, BibEntry mergedEntry, WebFetcher fetcher) {
NamedCompound ce = new NamedCompound(Localization.lang("Merge entry with %0 information", fetcher.getName()));
MergeEntriesHelper.mergeEntries(originalEntry, mergedEntry, ce);

if (ce.hasEdits()) {
ce.end();
undoManager.addEdit(ce);
}

dialogService.notify(Localization.lang("Updated entry with info from %0", fetcher.getName()));
}

private void notifyCanceledMerge(BibEntry entry) {
String citationKey = entry.getCitationKey().orElse(entry.getAuthorTitleYear(40));
dialogService.notify(Localization.lang("Canceled merging entries") + " [" + citationKey + "]");
}

public void fetchAndMerge(BibEntry entry, EntryBasedFetcher fetcher) {
BackgroundTask.wrap(() -> fetcher.performSearch(entry).stream().findFirst())
.onSuccess(fetchedEntry -> {
if (fetchedEntry.isPresent()) {
ImportCleanup cleanup = ImportCleanup.targeting(bibDatabaseContext.getMode(), preferences.getFieldPreferences());
cleanup.doPostCleanup(fetchedEntry.get());
showMergeDialog(entry, fetchedEntry.get(), fetcher);
} else {
dialogService.notify(Localization.lang("Could not find any bibliographic information."));
}
})
.onFailure(exception -> {
LOGGER.error("Error while fetching entry with {} ", fetcher.getName(), exception);
dialogService.showErrorDialogAndWait(Localization.lang("Error while fetching from %0", fetcher.getName()), exception);
})
.onSuccess(fetchedEntry -> processFetchedEntryForEntryBasedFetcher(fetchedEntry, entry, fetcher))
.onFailure(exception -> handleFetchException(exception, fetcher))
.executeWith(taskExecutor);
}

private void processFetchedEntryForEntryBasedFetcher(Optional<BibEntry> fetchedEntry, BibEntry originalEntry, EntryBasedFetcher fetcher) {
fetchedEntry
.map(this::cleanupFetchedEntry)
.ifPresentOrElse(
fe -> showMergeDialog(originalEntry, fe, fetcher),
() -> dialogService.notify(Localization.lang("Could not find any bibliographic information."))
);
}

private BibEntry cleanupFetchedEntry(BibEntry fetchedEntry) {
ImportCleanup cleanup = ImportCleanup.targeting(bibDatabaseContext.getMode(), preferences.getFieldPreferences());
cleanup.doPostCleanup(fetchedEntry);
return fetchedEntry;
}
}
Loading