Skip to content
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

Fix citation keys unintentionally being overwritten on import #7443

Merged
merged 3 commits into from
Mar 26, 2021

Conversation

LucasF-42
Copy link
Contributor

@LucasF-42 LucasF-42 commented Feb 14, 2021

Fixes #7420

Hello JabRef-Team,
I've attempted to create a fix for issue 7420. I'm not sure if it's done as expected though, please let me know if I need to change/update anything.

The 'fixed' version behaves like this:
If 'Preferences' > 'Citation key patterns' > 'Overwrite existing keys' is unchecked, generateKey() in CitationKeyGenerator:

  • overwrites the default citationKey with an newly generated one only, if it is blank
  • the default citationKey is not overwritten anymore (and therefore stays the same), if it is not blank

Behaviour remains unchanged if 'Overwrite existing keys' is checked.
(Let me know if I misunderstood how this feature was supposed to work in general and I'll adapt the behaviour accordingly)

Fixes #7420

  • Change in CHANGELOG.md described (if applicable)
  • Tests created for changes (if applicable)
  • Manually tested changed features in running JabRef (always required)
  • Screenshots added in PR description (for UI changes)
  • Checked documentation: Is the information available and up to date? If not created an issue at https://github.com/JabRef/user-documentation/issues or, even better, submitted a pull request to the documentation repository.

Fixes JabRef#7420
If 'Overwrite existing keys' in 'Preferences' > 'Citation key patterns' is unchecked, 'CitatonKeyGenerator' only overwrites the default citationKey if it is blank. If it is not blank, the default citationKey is not overwritten.
@tobiasdiez
Copy link
Member

Thanks a lot for your PR.

I think using the setting 'Citation key patterns' > 'Overwrite existing keys' might be confusing. This is used to warn/prevent users if they try to generate a key using the "Generate key" button in the entry editor, although the entry already has a key. The use case is that after generating a new key, old latex documents stop compiling and some users would like to prevent this. As you see, this has nothing to do with the import.

Maybe it's better to add a checkbox in the import dialog. Another idea would be to let the users specify a cleanup preset in the preferences that is applied after an import. The latter would then also resolve #1018. @LucasF-42 @JabRef/developers what do you prefer?

@LucasF-42
Copy link
Contributor Author

Oh, I've completely missed the mark then, sorry about that.
The way I understood the description/discussion within the issue, I presumed the 'Overwrite existing keys'- option was the one that governs whether the default citationKey of an imported entry is overwritten by a generated key based on user preferences, or not (and wasn't working as intended). My bad.

Just for my understanding in general: If the Bibtex-Source-String:

@Article{Igor:2013eha,
  author        = {Igor, Kulikov},
  title         = {A new GPU-accelerated hydrodynamical code for numerical simulation of interacting galaxies},
  year          = {2013},
  month         = {11},
  archiveprefix = {arXiv},
  eprint        = {1311.0861},
  primaryclass  = {astro-ph.IM},
}

is being imported after a web search, default behaviour would be to overwrite the citationKey of the BibEntry-Object with a generated key, based on the pattern specified in CitationKeyPattern-Preferences (e.g. Igor2013 in case of a default pattern of [auth][year]).
If a user were to choose not to overwrite keys, the BibEntry would continue using Igor:2013eha as its citationKey.
Would that then be considered intended behaviour for an import?

I'm afraid I'm not able to fully comprehend the "cleanup preferences"-solution you've mentioned, so I'm definitely not fit to voice an opinion here. I've just got a first, very localised look at JabRef while attempting to fix the mentioned issue.

Not sure about the protocol - would you like me to close this PR and await your decision on this topic?

@k3KAW8Pnf7mkmdSMPHz27
Copy link
Sponsor Member

k3KAW8Pnf7mkmdSMPHz27 commented Feb 15, 2021

Another idea would be to let the users specify a cleanup preset in the preferences that is applied after an import.

I like this option! I think it would address a lot of the confusion regarding when the citation key generator is used and what behavior it has.
However, I don't think it replaces this PR. I think there is a need for a "default"/global citation key generation behavior, which in my opinion, should be set in the Citation key patterns preferences. I consider the "unwanted" characters another example of when a "default" option is necessary and should be applied wherever/whenever the citation key generator is used.

Oh, I've completely missed the mark then, sorry about that.
The way I understood the description/discussion within the issue,

I don't think there is such a thing as missing the mark when it comes to JabRef, when something leads to an improvement I think everything is up for discussion and on the mark 😛

'Overwrite existing keys'- option was the one that governs whether the default citationKey of an imported entry is overwritten by a generated key based on user preferences

I'd argue that this is the case.

"cleanup preferences"-solution you've mentioned, so I'm definitely not fit to voice an opinion here

I interpret it as essentially running a "cleanup action" on the imported entries, perhaps using different preferences but otherwise same as the
Skärmavbild 2021-02-15 kl  08 32 47

@Siedlerchr
Copy link
Member

From my point of view as I proposed in #7420 (comment) it needs to the check needs to be added to the import handler before the key generator is called

@k3KAW8Pnf7mkmdSMPHz27
Copy link
Sponsor Member

From my point of view as I proposed in #7420 (comment) it needs to the check needs to be added to the import handler before the key generator is called

Am I reading too much into your comment in that you are aligned with the "add a checkbox in the import dialog" option?

In my mind, the logic is that a citation key generator object is created based on preferences (CitationKeyPatternPreferences). If the importer wants to override these settings, it should create a new instance of this object. Then it is up to the CitationKeyGenerator to adhere to these preferences. Admittedly, this doesn't work well with shouldWarnBeforeOverwriteCiteKey. Perhaps I am just overcomplicating things and thinking about this in the wrong way.

@tobiasdiez
Copy link
Member

Indeed, there is no such thing as missing the mark in our cosy JabRef world.

There are two things here that we shouldn't confuse:

  • Use clicks "Generate citation key" button, controlled by the Citation keys > Overwrite existing keys preference.
  • Automatically generate keys upon import / web search instead of using the one provided by the fetcher (which most of the times is some cryptic key).

Although from a code point of view they are the same, for a user they are quite different and one could easily imagine that a user might want to prevent overwriting manually set keys but still would like to have automatically generated keys upon import.

I think, the best way forward would be to introduce a new preference setting "generate (new?) key on import". That could go in the "General" tab below the other import-related preferences (entry owner + time stamp). Or if you feel comfortable enough with the code, create a new preference tab "Import" where you put all of these 3 preferences options. Maybe @calixtus has more input about the structure of the preferences.

@LucasF-42
Copy link
Contributor Author

Thank you all for the explanations/comments, I feel like I've got a better idea about the subject. I'd have to take a closer look at the project again to see whether I feel like I'd be able to implement the "create a new 'Import tab' in preferences"-solution.

I was wondering though, wouldn't the option to decide whether or not to generate a key for a given import in the import dialogue be advantageous as well (on top of the new entry in preferences)? This way a user wouldn't have to change their preferences when importing an entry for which they'd like to go against said preference. (As long as I'm not confusing things again)

@tobiasdiez
Copy link
Member

I agree that such an option in the import dialog might be handy from time to time. However, this also makes the import dialog more complicated, so I'm not sure if it's a good idea to add it there. Maybe first try the solution via the preferences, and then see if the users would like to have an option during the import as well?

@Siedlerchr
Copy link
Member

@LucasF-42 It would be really nice if you could go with the simple solution first. That would be a huge benefit already for many users!
We can always add an option in the import dialog later.

@LucasF-42
Copy link
Contributor Author

It seems I'm unable to accomplish even that, I'm afraid.
I've 'managed' to add an "Import settings" tab, as well as a checkbox for toggling the option (by attempting to copy how other Tabs are implemented, so nothing to write home about at all).

image

The 'feature' as such seems to be working as well, but it's messing with something (or more like: breaking something) and I have been unable to understand what exactly it is.

image

These exceptions are raised once you have toggled the checkbox in the "Import settings" at least once in a session, as soon as you delete the last remaining entry within a library.
If the setting has not been changed in a session, no matter if the option is enabled or not, these exceptions are not raised when deleting the last entry in the library.
However, the more often you toggle the option, the more exceptions are thrown.
Example after having toggled the setting three times:

image

Didn't want to push the branch in it's current (broken) state.

@tobiasdiez
Copy link
Member

Thanks for your continued work on this. Looks already pretty good. Concerning the error message, could you copy & paste the complete stacktrace. Moreover, it would be good to have the code with your changes at hand. Could you maybe push them to a different branch?

Commit does not work as intended yet (is buggy)
@LucasF-42
Copy link
Contributor Author

Here's a link to the new branch containing the code on my JabRef fork (hope that's how you wanted me to do that).
And this is the stacktrace that's being displayed on the console when the exception is thrown:

stack trace details

java.util.NoSuchElementException: java.lang.IndexOutOfBoundsException
	at java.util.AbstractList$Itr.next(AbstractList.java:377) ~[?:?]
	at java.util.Iterator.forEachRemaining(Iterator.java:133) ~[?:?]
	at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) ~[?:?]
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[?:?]
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[?:?]
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) ~[?:?]
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:?]
	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) ~[?:?]
	at org.jabref.gui.maintable.MainTable.getSelectedEntries(MainTable.java:402) ~[JabRef-100.0.0.jar:?]
	at org.jabref.gui.LibraryTab.lambda$createMainTable$13(LibraryTab.java:488) ~[JabRef-100.0.0.jar:?]
	at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:329) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:239) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:211) ~[javafx.base:?]
	at com.sun.javafx.scene.control.SelectedItemsReadOnlyObservableList.lambda$new$0(SelectedItemsReadOnlyObservableList.java:89) ~[javafx.controls:?]
	at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:329) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:239) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:211) ~[javafx.base:?]
	at com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList._endChange(ReadOnlyUnbackedObservableList.java:64) ~[javafx.controls:?]
	at javafx.scene.control.MultipleSelectionModelBase$SelectedIndicesList._endChange(MultipleSelectionModelBase.java:896) ~[javafx.controls:?]
	at javafx.scene.control.ControlUtils.updateSelectedIndices(ControlUtils.java:202) ~[javafx.controls:?]
	at javafx.scene.control.TableView$TableViewArrayListSelectionModel.fireCustomSelectedCellsListChangeEvent(TableView.java:3023) ~[javafx.controls:?]
	at javafx.scene.control.TableView$TableViewArrayListSelectionModel.clearSelection(TableView.java:2799) ~[javafx.controls:?]
	at javafx.scene.control.TableView$TableViewArrayListSelectionModel.updateDefaultSelection(TableView.java:2988) ~[javafx.controls:?]
	at javafx.scene.control.TableView$TableViewArrayListSelectionModel.lambda$new$2(TableView.java:2178) ~[javafx.controls:?]
	at javafx.collections.WeakListChangeListener.onChanged(WeakListChangeListener.java:88) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:329) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:239) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:211) ~[javafx.base:?]
	at javafx.collections.transformation.SortedList.sourceChanged(SortedList.java:111) ~[javafx.base:?]
	at javafx.collections.transformation.TransformationList.lambda$getListener$0(TransformationList.java:106) ~[javafx.base:?]
	at javafx.collections.WeakListChangeListener.onChanged(WeakListChangeListener.java:88) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:329) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:239) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:211) ~[javafx.base:?]
	at javafx.collections.transformation.FilteredList.sourceChanged(FilteredList.java:147) ~[javafx.base:?]
	at javafx.collections.transformation.TransformationList.lambda$getListener$0(TransformationList.java:106) ~[javafx.base:?]
	at javafx.collections.WeakListChangeListener.onChanged(WeakListChangeListener.java:88) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:164) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:239) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:211) ~[javafx.base:?]
	at com.tobiasdiez.easybind.MappedBackedList.sourceChanged(MappedBackedList.java:69) ~[easybind-2.1.0.jar:?]
	at javafx.collections.transformation.TransformationList.lambda$getListener$0(TransformationList.java:106) ~[javafx.base:?]
	at javafx.collections.WeakListChangeListener.onChanged(WeakListChangeListener.java:88) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:164) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:239) ~[javafx.base:?]
	at org.jabref.gui.util.UiThreadList.sourceChanged(UiThreadList.java:23) ~[JabRef-100.0.0.jar:?]
	at javafx.collections.transformation.TransformationList.lambda$getListener$0(TransformationList.java:106) ~[javafx.base:?]
	at javafx.collections.WeakListChangeListener.onChanged(WeakListChangeListener.java:88) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:164) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:239) ~[javafx.base:?]
	at javafx.collections.FXCollections$UnmodifiableObservableListImpl.lambda$new$0(FXCollections.java:963) ~[javafx.base:?]
	at javafx.collections.WeakListChangeListener.onChanged(WeakListChangeListener.java:88) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:329) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73) ~[javafx.base:?]
	at javafx.collections.FXCollections$SynchronizedObservableList.lambda$new$0(FXCollections.java:1217) ~[javafx.base:?]
	at javafx.collections.WeakListChangeListener.onChanged(WeakListChangeListener.java:88) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:164) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:239) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:211) ~[javafx.base:?]
	at javafx.collections.ModifiableObservableListBase.remove(ModifiableObservableListBase.java:189) ~[javafx.base:?]
	at java.util.AbstractList$Itr.remove(AbstractList.java:387) ~[?:?]
	at java.util.Collection.removeIf(Collection.java:577) ~[?:?]
	at org.jabref.model.database.BibDatabase.removeEntries(BibDatabase.java:242) ~[JabRef-100.0.0.jar:?]
	at org.jabref.model.database.BibDatabase.removeEntries(BibDatabase.java:225) ~[JabRef-100.0.0.jar:?]
	at org.jabref.gui.LibraryTab.delete(LibraryTab.java:405) ~[JabRef-100.0.0.jar:?]
	at org.jabref.gui.LibraryTab.delete(LibraryTab.java:387) ~[JabRef-100.0.0.jar:?]
	at org.jabref.gui.edit.EditAction.lambda$execute$0(EditAction.java:70) ~[JabRef-100.0.0.jar:?]
	at java.util.Optional.ifPresent(Optional.java:176) ~[?:?]
	at org.jabref.gui.edit.EditAction.execute(EditAction.java:46) ~[JabRef-100.0.0.jar:?]
	at org.jabref.gui.actions.JabRefAction.lambda$new$3(JabRefAction.java:41) ~[JabRef-100.0.0.jar:?]
	at org.controlsfx.control.action.Action.handle(Action.java:419) ~[controlsfx-11.0.3.jar:?]
	at org.controlsfx.control.action.Action.handle(Action.java:64) ~[controlsfx-11.0.3.jar:?]
	at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) ~[javafx.base:?]
	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234) ~[javafx.base:?]
	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) ~[javafx.base:?]
	at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) ~[javafx.base:?]
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) ~[javafx.base:?]
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[javafx.base:?]
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) ~[javafx.base:?]
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[javafx.base:?]
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) ~[javafx.base:?]
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[javafx.base:?]
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) ~[javafx.base:?]
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[javafx.base:?]
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) ~[javafx.base:?]
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[javafx.base:?]
	at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) ~[javafx.base:?]
	at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) ~[javafx.base:?]
	at javafx.event.Event.fireEvent(Event.java:198) ~[javafx.base:?]
	at javafx.scene.Node.fireEvent(Node.java:8889) ~[javafx.graphics:?]
	at javafx.scene.control.Button.fire(Button.java:203) ~[javafx.controls:?]
	at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:208) ~[javafx.controls:?]
	at com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274) ~[javafx.controls:?]
	at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:247) ~[javafx.base:?]
	at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) ~[javafx.base:?]
	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234) ~[javafx.base:?]
	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) ~[javafx.base:?]
	at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) ~[javafx.base:?]
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) ~[javafx.base:?]
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[javafx.base:?]
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) ~[javafx.base:?]
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[javafx.base:?]
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) ~[javafx.base:?]
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[javafx.base:?]
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) ~[javafx.base:?]
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[javafx.base:?]
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) ~[javafx.base:?]
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[javafx.base:?]
	at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) ~[javafx.base:?]
	at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) ~[javafx.base:?]
	at javafx.event.Event.fireEvent(Event.java:198) ~[javafx.base:?]
	at javafx.scene.Scene$MouseHandler.process(Scene.java:3856) ~[javafx.graphics:?]
	at javafx.scene.Scene.processMouseEvent(Scene.java:1851) ~[javafx.graphics:?]
	at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2584) ~[javafx.graphics:?]
	at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:409) ~[javafx.graphics:?]
	at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:299) ~[javafx.graphics:?]
	at java.security.AccessController.doPrivileged(AccessController.java:391) ~[?:?]
	at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:447) ~[javafx.graphics:?]
	at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:412) ~[javafx.graphics:?]
	at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:446) ~[javafx.graphics:?]
	at com.sun.glass.ui.View.handleMouseEvent(View.java:556) ~[javafx.graphics:?]
	at com.sun.glass.ui.View.notifyMouse(View.java:942) ~[javafx.graphics:?]
	at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method) ~[javafx.graphics:?]
	at com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277) ~[javafx.graphics:?]
	at java.lang.Thread.run(Thread.java:832) [?:?]
Caused by: java.lang.IndexOutOfBoundsException
	at javafx.collections.transformation.SortedList.get(SortedList.java:168) ~[javafx.base:?]
	at javafx.scene.control.TableView$TableViewSelectionModel.getModelItem(TableView.java:2030) ~[javafx.controls:?]
	at javafx.scene.control.MultipleSelectionModelBase$1.getModelItem(MultipleSelectionModelBase.java:74) ~[javafx.controls:?]
	at com.sun.javafx.scene.control.SelectedItemsReadOnlyObservableList.get(SelectedItemsReadOnlyObservableList.java:98) ~[javafx.controls:?]
	at java.util.AbstractList$Itr.next(AbstractList.java:371) ~[?:?]
	... 144 more
Caused by: java.lang.IndexOutOfBoundsException

14:44:44.697 [JavaFX Application Thread] ERROR org.jabref.gui.FallbackExceptionHandler - Uncaught exception occurred in Thread[JavaFX Application Thread,5,main]
java.util.NoSuchElementException: java.lang.IndexOutOfBoundsException
	at java.util.AbstractList$Itr.next(AbstractList.java:377) ~[?:?]
	at java.util.Iterator.forEachRemaining(Iterator.java:133) ~[?:?]
	at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) ~[?:?]
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[?:?]
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[?:?]
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) ~[?:?]
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:?]
	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) ~[?:?]
	at org.jabref.gui.maintable.MainTable.getSelectedEntries(MainTable.java:402) ~[JabRef-100.0.0.jar:?]
	at org.jabref.gui.LibraryTab.lambda$createMainTable$14(LibraryTab.java:491) ~[JabRef-100.0.0.jar:?]
	at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:329) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:239) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:211) ~[javafx.base:?]
	at com.sun.javafx.scene.control.SelectedItemsReadOnlyObservableList.lambda$new$0(SelectedItemsReadOnlyObservableList.java:89) ~[javafx.controls:?]
	at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:329) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:239) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:211) ~[javafx.base:?]
	at com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList._endChange(ReadOnlyUnbackedObservableList.java:64) ~[javafx.controls:?]
	at javafx.scene.control.MultipleSelectionModelBase$SelectedIndicesList._endChange(MultipleSelectionModelBase.java:896) ~[javafx.controls:?]
	at javafx.scene.control.ControlUtils.updateSelectedIndices(ControlUtils.java:202) ~[javafx.controls:?]
	at javafx.scene.control.TableView$TableViewArrayListSelectionModel.fireCustomSelectedCellsListChangeEvent(TableView.java:3023) ~[javafx.controls:?]
	at javafx.scene.control.TableView$TableViewArrayListSelectionModel.clearSelection(TableView.java:2799) ~[javafx.controls:?]
	at javafx.scene.control.TableView$TableViewArrayListSelectionModel.updateDefaultSelection(TableView.java:2988) ~[javafx.controls:?]
	at javafx.scene.control.TableView$TableViewArrayListSelectionModel.lambda$new$2(TableView.java:2178) ~[javafx.controls:?]
	at javafx.collections.WeakListChangeListener.onChanged(WeakListChangeListener.java:88) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:329) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:239) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:211) ~[javafx.base:?]
	at javafx.collections.transformation.SortedList.sourceChanged(SortedList.java:111) ~[javafx.base:?]
	at javafx.collections.transformation.TransformationList.lambda$getListener$0(TransformationList.java:106) ~[javafx.base:?]
	at javafx.collections.WeakListChangeListener.onChanged(WeakListChangeListener.java:88) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:329) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:239) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:211) ~[javafx.base:?]
	at javafx.collections.transformation.FilteredList.sourceChanged(FilteredList.java:147) ~[javafx.base:?]
	at javafx.collections.transformation.TransformationList.lambda$getListener$0(TransformationList.java:106) ~[javafx.base:?]
	at javafx.collections.WeakListChangeListener.onChanged(WeakListChangeListener.java:88) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:164) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:239) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:211) ~[javafx.base:?]
	at com.tobiasdiez.easybind.MappedBackedList.sourceChanged(MappedBackedList.java:69) ~[easybind-2.1.0.jar:?]
	at javafx.collections.transformation.TransformationList.lambda$getListener$0(TransformationList.java:106) ~[javafx.base:?]
	at javafx.collections.WeakListChangeListener.onChanged(WeakListChangeListener.java:88) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:164) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:239) ~[javafx.base:?]
	at org.jabref.gui.util.UiThreadList.sourceChanged(UiThreadList.java:23) ~[JabRef-100.0.0.jar:?]
	at javafx.collections.transformation.TransformationList.lambda$getListener$0(TransformationList.java:106) ~[javafx.base:?]
	at javafx.collections.WeakListChangeListener.onChanged(WeakListChangeListener.java:88) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:164) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:239) ~[javafx.base:?]
	at javafx.collections.FXCollections$UnmodifiableObservableListImpl.lambda$new$0(FXCollections.java:963) ~[javafx.base:?]
	at javafx.collections.WeakListChangeListener.onChanged(WeakListChangeListener.java:88) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:329) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73) ~[javafx.base:?]
	at javafx.collections.FXCollections$SynchronizedObservableList.lambda$new$0(FXCollections.java:1217) ~[javafx.base:?]
	at javafx.collections.WeakListChangeListener.onChanged(WeakListChangeListener.java:88) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:164) ~[javafx.base:?]
	at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:239) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482) ~[javafx.base:?]
	at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541) ~[javafx.base:?]
	at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:211) ~[javafx.base:?]
	at javafx.collections.ModifiableObservableListBase.remove(ModifiableObservableListBase.java:189) ~[javafx.base:?]
	at java.util.AbstractList$Itr.remove(AbstractList.java:387) ~[?:?]
	at java.util.Collection.removeIf(Collection.java:577) ~[?:?]
	at org.jabref.model.database.BibDatabase.removeEntries(BibDatabase.java:242) ~[JabRef-100.0.0.jar:?]
	at org.jabref.model.database.BibDatabase.removeEntries(BibDatabase.java:225) ~[JabRef-100.0.0.jar:?]
	at org.jabref.gui.LibraryTab.delete(LibraryTab.java:405) ~[JabRef-100.0.0.jar:?]
	at org.jabref.gui.LibraryTab.delete(LibraryTab.java:387) ~[JabRef-100.0.0.jar:?]
	at org.jabref.gui.edit.EditAction.lambda$execute$0(EditAction.java:70) ~[JabRef-100.0.0.jar:?]
	at java.util.Optional.ifPresent(Optional.java:176) ~[?:?]
	at org.jabref.gui.edit.EditAction.execute(EditAction.java:46) ~[JabRef-100.0.0.jar:?]
	at org.jabref.gui.actions.JabRefAction.lambda$new$3(JabRefAction.java:41) ~[JabRef-100.0.0.jar:?]
	at org.controlsfx.control.action.Action.handle(Action.java:419) ~[controlsfx-11.0.3.jar:?]
	at org.controlsfx.control.action.Action.handle(Action.java:64) ~[controlsfx-11.0.3.jar:?]
	at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) ~[javafx.base:?]
	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234) ~[javafx.base:?]
	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) ~[javafx.base:?]
	at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) ~[javafx.base:?]
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) ~[javafx.base:?]
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[javafx.base:?]
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) ~[javafx.base:?]
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[javafx.base:?]
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) ~[javafx.base:?]
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[javafx.base:?]
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) ~[javafx.base:?]
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[javafx.base:?]
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) ~[javafx.base:?]
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[javafx.base:?]
	at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) ~[javafx.base:?]
	at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) ~[javafx.base:?]
	at javafx.event.Event.fireEvent(Event.java:198) ~[javafx.base:?]
	at javafx.scene.Node.fireEvent(Node.java:8889) ~[javafx.graphics:?]
	at javafx.scene.control.Button.fire(Button.java:203) ~[javafx.controls:?]
	at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:208) ~[javafx.controls:?]
	at com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274) ~[javafx.controls:?]
	at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:247) ~[javafx.base:?]
	at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) ~[javafx.base:?]
	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234) ~[javafx.base:?]
	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) ~[javafx.base:?]
	at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) ~[javafx.base:?]
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) ~[javafx.base:?]
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[javafx.base:?]
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) ~[javafx.base:?]
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[javafx.base:?]
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) ~[javafx.base:?]
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[javafx.base:?]
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) ~[javafx.base:?]
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[javafx.base:?]
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) ~[javafx.base:?]
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) ~[javafx.base:?]
	at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) ~[javafx.base:?]
	at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) ~[javafx.base:?]
	at javafx.event.Event.fireEvent(Event.java:198) ~[javafx.base:?]
	at javafx.scene.Scene$MouseHandler.process(Scene.java:3856) ~[javafx.graphics:?]
	at javafx.scene.Scene.processMouseEvent(Scene.java:1851) ~[javafx.graphics:?]
	at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2584) ~[javafx.graphics:?]
	at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:409) ~[javafx.graphics:?]
	at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:299) ~[javafx.graphics:?]
	at java.security.AccessController.doPrivileged(AccessController.java:391) ~[?:?]
	at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:447) ~[javafx.graphics:?]
	at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:412) ~[javafx.graphics:?]
	at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:446) ~[javafx.graphics:?]
	at com.sun.glass.ui.View.handleMouseEvent(View.java:556) ~[javafx.graphics:?]
	at com.sun.glass.ui.View.notifyMouse(View.java:942) ~[javafx.graphics:?]
	at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method) ~[javafx.graphics:?]
	at com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277) ~[javafx.graphics:?]
	at java.lang.Thread.run(Thread.java:832) [?:?]
Caused by: java.lang.IndexOutOfBoundsException
	at javafx.collections.transformation.SortedList.get(SortedList.java:168) ~[javafx.base:?]
	at javafx.scene.control.TableView$TableViewSelectionModel.getModelItem(TableView.java:2030) ~[javafx.controls:?]
	at javafx.scene.control.MultipleSelectionModelBase$1.getModelItem(MultipleSelectionModelBase.java:74) ~[javafx.controls:?]
	at com.sun.javafx.scene.control.SelectedItemsReadOnlyObservableList.get(SelectedItemsReadOnlyObservableList.java:98) ~[javafx.controls:?]
	at java.util.AbstractList$Itr.next(AbstractList.java:371) ~[?:?]
	... 144 more

@tobiasdiez
Copy link
Member

Thanks! After looking at your code, I think, the issue is not coming from your changes. It looks like there is an issue somewhere in the entry list code, and you just found a way to trigger them. In fact such issues have been reported before, we just didn't had a way to reproduce them.

So I would propose you push your changes to this PR, we merge and then have a look at the exception later.

@tobiasdiez tobiasdiez added the status: changes required Pull requests that are not yet complete label Mar 10, 2021
@LucasF-42
Copy link
Contributor Author

I kinda forgot about merging/pushing, sorry about that. If further changes/improvements are required/preferred, let me know.

Copy link
Member

@Siedlerchr Siedlerchr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, lgtm so far!

@Siedlerchr Siedlerchr added status: ready-for-review Pull Requests that are ready to be reviewed by the maintainers and removed status: changes required Pull requests that are not yet complete labels Mar 12, 2021
@calixtus
Copy link
Member

Looks very good, although I maybe make some little rewordings before merging this to fit to the name conventions of JabRef! Thank you!
Maybe we'll reorganize the preferences soon, there is already another PR in waiting with a preferences option that would fit in this tab...

@Siedlerchr Siedlerchr merged commit 05a0211 into JabRef:master Mar 26, 2021
Siedlerchr added a commit that referenced this pull request Mar 28, 2021
* upstream/master: (191 commits)
  Fix for issue 7416: font size of the preferences dialog does not update with the rest of the GUI. (#7509)
  Fix school/instituation is printed twice (#7574)
  Dsiable notarisation until we hae an account for JabRef e.V. (#7572)
  Fix citation keys unintentionally being overwritten on import (#7443)
  Fix AuthentificationPlugin not declared in mergedModule (#7570)
  Suggestions for changes in caching latex free authors (#7301)
  Add simple Unit Tests (#7542)
  Fix drag and drop into empty library (#7555)
  Bump richtextfx from 0.10.4 to 0.10.6 (#7563)
  Bump pdfbox from 2.0.22 to 2.0.23 (#7561)
  Bump org.eclipse.jgit (#7560)
  Bump fontbox from 2.0.22 to 2.0.23 (#7562)
  Bump guava from 30.1-jre to 30.1.1-jre (#7564)
  Bump xmpbox from 2.0.22 to 2.0.23 (#7565)
  Bump hmarr/auto-approve-action from v2.0.0 to v2.1.0 (#7566)
  Add gource (#7193)
  UI: Fix for group icon (#7552)
  Fix for issue 6487: Opening BibTex file (doubleclick) from Folder with spaces not working (#7551)
  add ability to insert arxivId (#7549)
  Fixed missing trigger for linked file operations (#7548)
  ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
status: ready-for-review Pull Requests that are ready to be reviewed by the maintainers
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Citation keys are always overwritten when importing through web search
5 participants