jabref icon indicating copy to clipboard operation
jabref copied to clipboard

Why "Remove selected entries from this group" often generates error?

Open jiewangjs opened this issue 1 year ago • 2 comments

JabRef version

5.13 (latest release)

Operating system

Windows

Details on version and operating system

No response

Checked with the latest development build (copy version output from About dialog)

  • [X] I made a backup of my libraries before testing the latest development version.
  • [X] I have tested the latest development version and the problem persists

Steps to reproduce the behaviour

image Steps to reproduce this error: Operation (Remove selected entry from group 3): image Result: image As we can see, the selected entry was successfully removed, but the error occurs almost certainly every time this operation is executed.

Appendix

...

Log File
Paste an excerpt of your log file here

jiewangjs avatar Jun 15 '24 15:06 jiewangjs

Can you please share the whole stack trace of the error message? I also recommend trying out the latest development version https://builds.jabref.org/main/

Siedlerchr avatar Jun 15 '24 17:06 Siedlerchr

Thanks! I am using the latest development version https://builds.jabref.org/main/. The whole stack trace of the error message is:

arraycopy:length-1 is negative 
The exception stacktrace was:
java.lang.ArrayIndexOutOfBoundsException: arraycopy: length -1 is negative
	at java.base/java.lang.System.arraycopy(Native Method)
	at [email protected]/javafx.collections.transformation.SortedList.updateUnsorted(Unknown Source)
	at [email protected]/javafx.collections.transformation.SortedList.sourceChanged(Unknown Source)
	at [email protected]/javafx.collections.transformation.TransformationList.lambda$getListener$0(Unknown Source)
	at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
	at [email protected]/javafx.collections.ListChangeBuilder.commit(Unknown Source)
	at [email protected]/javafx.collections.ListChangeBuilder.endChange(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.endChange(Unknown Source)
	at [email protected]/javafx.collections.transformation.FilteredList.sourceChanged(Unknown Source)
	at [email protected]/javafx.collections.transformation.TransformationList.lambda$getListener$0(Unknown Source)
	at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
	at [email protected]/javafx.collections.ListChangeBuilder.commit(Unknown Source)
	at [email protected]/javafx.collections.ListChangeBuilder.endChange(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.endChange(Unknown Source)
	at [email protected]/com.tobiasdiez.easybind.MappedBackedList.sourceChanged(Unknown Source)
	at [email protected]/javafx.collections.transformation.TransformationList.lambda$getListener$0(Unknown Source)
	at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
	at [email protected]/org.jabref.gui.util.UiThreadList.sourceChanged(Unknown Source)
	at [email protected]/javafx.collections.transformation.TransformationList.lambda$getListener$0(Unknown Source)
	at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
	at [email protected]/javafx.collections.FXCollections$UnmodifiableObservableListImpl.lambda$new$0(Unknown Source)
	at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
	at [email protected]/javafx.collections.FXCollections$SynchronizedObservableList.lambda$new$0(Unknown Source)
	at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
	at [email protected]/javafx.collections.ListChangeBuilder.commit(Unknown Source)
	at [email protected]/javafx.collections.ListChangeBuilder.endChange(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.endChange(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ObservableListWrapper.access$200(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ObservableListWrapper$1$1.invalidated(Unknown Source)
	at [email protected]/com.sun.javafx.collections.MapListenerHelper$Generic.fireValueChangedEvent(Unknown Source)
	at [email protected]/com.sun.javafx.collections.MapListenerHelper.fireValueChangedEvent(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ObservableMapWrapper.callObservers(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ObservableMapWrapper.put(Unknown Source)
	at [email protected]/org.jabref.model.entry.BibEntry.setField(Unknown Source)
	at [email protected]/org.jabref.model.entry.BibEntry.setField(Unknown Source)
	at [email protected]/org.jabref.gui.entryeditor.SourceTab.storeSource(Unknown Source)
	at [email protected]/org.jabref.gui.entryeditor.SourceTab.bindToEntry(Unknown Source)
	at [email protected]/org.jabref.gui.entryeditor.EntryEditorTab.notifyAboutFocus(Unknown Source)
	at [email protected]/org.jabref.gui.entryeditor.EntryEditor.setEntry(Unknown Source)
	at [email protected]/org.jabref.gui.LibraryTab.lambda$createMainTable$11(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
	at [email protected]/javafx.collections.ListChangeBuilder.commit(Unknown Source)
	at [email protected]/javafx.collections.ListChangeBuilder.endChange(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.endChange(Unknown Source)
	at [email protected]/com.sun.javafx.scene.control.SelectedItemsReadOnlyObservableList.lambda$new$0(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
	at [email protected]/javafx.collections.ListChangeBuilder.commit(Unknown Source)
	at [email protected]/javafx.collections.ListChangeBuilder.endChange(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.endChange(Unknown Source)
	at [email protected]/com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList._endChange(Unknown Source)
	at [email protected]/javafx.scene.control.MultipleSelectionModelBase$SelectedIndicesList._endChange(Unknown Source)
	at [email protected]/javafx.scene.control.ControlUtils.updateSelectedIndices(Unknown Source)
	at [email protected]/javafx.scene.control.TableView$TableViewArrayListSelectionModel.fireCustomSelectedCellsListChangeEvent(Unknown Source)
	at [email protected]/javafx.scene.control.TableView$TableViewArrayListSelectionModel.lambda$new$0(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
	at [email protected]/javafx.collections.ListChangeBuilder.commit(Unknown Source)
	at [email protected]/javafx.collections.ListChangeBuilder.endChange(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.endChange(Unknown Source)
	at [email protected]/javafx.collections.transformation.SortedList.sourceChanged(Unknown Source)
	at [email protected]/javafx.collections.transformation.TransformationList.lambda$getListener$0(Unknown Source)
	at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
	at [email protected]/javafx.collections.ListChangeBuilder.commit(Unknown Source)
	at [email protected]/javafx.collections.ListChangeBuilder.endChange(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.endChange(Unknown Source)
	at [email protected]/javafx.collections.ModifiableObservableListBase.add(Unknown Source)
	at java.base/java.util.AbstractList.add(Unknown Source)
	at [email protected]/com.sun.javafx.scene.control.SelectedCellsMap.add(Unknown Source)
	at [email protected]/javafx.scene.control.TableView$TableViewArrayListSelectionModel.select(Unknown Source)
	at [email protected]/javafx.scene.control.TableView$TableViewArrayListSelectionModel.select(Unknown Source)
	at [email protected]/javafx.scene.control.MultipleSelectionModelBase.shiftSelection(Unknown Source)
	at [email protected]/javafx.scene.control.MultipleSelectionModelBase.shiftSelection(Unknown Source)
	at [email protected]/javafx.scene.control.TableView$TableViewArrayListSelectionModel.updateSelection(Unknown Source)
	at [email protected]/javafx.scene.control.TableView$TableViewArrayListSelectionModel.lambda$new$2(Unknown Source)
	at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
	at [email protected]/javafx.collections.transformation.SortedList.sourceChanged(Unknown Source)
	at [email protected]/javafx.collections.transformation.TransformationList.lambda$getListener$0(Unknown Source)
	at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
	at [email protected]/javafx.collections.ListChangeBuilder.commit(Unknown Source)
	at [email protected]/javafx.collections.ListChangeBuilder.endChange(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.endChange(Unknown Source)
	at [email protected]/javafx.collections.transformation.FilteredList.sourceChanged(Unknown Source)
	at [email protected]/javafx.collections.transformation.TransformationList.lambda$getListener$0(Unknown Source)
	at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
	at [email protected]/javafx.collections.ListChangeBuilder.commit(Unknown Source)
	at [email protected]/javafx.collections.ListChangeBuilder.endChange(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.endChange(Unknown Source)
	at [email protected]/com.tobiasdiez.easybind.MappedBackedList.sourceChanged(Unknown Source)
	at [email protected]/javafx.collections.transformation.TransformationList.lambda$getListener$0(Unknown Source)
	at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
	at [email protected]/org.jabref.gui.util.UiThreadList.sourceChanged(Unknown Source)
	at [email protected]/javafx.collections.transformation.TransformationList.lambda$getListener$0(Unknown Source)
	at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
	at [email protected]/javafx.collections.FXCollections$UnmodifiableObservableListImpl.lambda$new$0(Unknown Source)
	at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
	at [email protected]/javafx.collections.FXCollections$SynchronizedObservableList.lambda$new$0(Unknown Source)
	at [email protected]/javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.fireChange(Unknown Source)
	at [email protected]/javafx.collections.ListChangeBuilder.commit(Unknown Source)
	at [email protected]/javafx.collections.ListChangeBuilder.endChange(Unknown Source)
	at [email protected]/javafx.collections.ObservableListBase.endChange(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ObservableListWrapper.access$200(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ObservableListWrapper$1$1.invalidated(Unknown Source)
	at [email protected]/com.sun.javafx.collections.MapListenerHelper$Generic.fireValueChangedEvent(Unknown Source)
	at [email protected]/com.sun.javafx.collections.MapListenerHelper.fireValueChangedEvent(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ObservableMapWrapper.callObservers(Unknown Source)
	at [email protected]/com.sun.javafx.collections.ObservableMapWrapper.put(Unknown Source)
	at [email protected]/org.jabref.model.entry.BibEntry.setField(Unknown Source)
	at [email protected]/org.jabref.model.entry.BibEntry.setField(Unknown Source)
	at [email protected]/org.jabref.model.groups.WordKeywordGroup.remove(Unknown Source)
	at [email protected]/org.jabref.model.groups.GroupTreeNode.removeEntriesFromGroup(Unknown Source)
	at [email protected]/org.jabref.gui.groups.GroupTreeViewModel.removeSelectedEntries(Unknown Source)
	at [email protected]/org.jabref.gui.groups.GroupTreeView$ContextAction.execute(Unknown Source)
	at [email protected]/org.jabref.gui.actions.JabRefAction.lambda$new$3(Unknown Source)
	at [email protected]/org.controlsfx.control.action.Action.handle(Unknown Source)
	at [email protected]/org.controlsfx.control.action.Action.handle(Unknown Source)
	at [email protected]/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
	at [email protected]/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
	at [email protected]/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
	at [email protected]/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
	at [email protected]/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
	at [email protected]/com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
	at [email protected]/com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
	at [email protected]/javafx.event.Event.fireEvent(Unknown Source)
	at [email protected]/javafx.scene.control.MenuItem.fire(Unknown Source)
	at [email protected]/com.sun.javafx.scene.control.ContextMenuContent$MenuItemContainer.doSelect(Unknown Source)
	at [email protected]/com.sun.javafx.scene.control.ContextMenuContent$MenuItemContainer.lambda$createChildren$12(Unknown Source)
	at [email protected]/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(Unknown Source)
	at [email protected]/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
	at [email protected]/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
	at [email protected]/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
	at [email protected]/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
	at [email protected]/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
	at [email protected]/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
	at [email protected]/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
	at [email protected]/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
	at [email protected]/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
	at [email protected]/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
	at [email protected]/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
	at [email protected]/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
	at [email protected]/com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
	at [email protected]/com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
	at [email protected]/javafx.event.Event.fireEvent(Unknown Source)
	at [email protected]/javafx.scene.Scene$MouseHandler.process(Unknown Source)
	at [email protected]/javafx.scene.Scene.processMouseEvent(Unknown Source)
	at [email protected]/javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source)
	at [email protected]/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
	at [email protected]/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
	at java.base/java.security.AccessController.doPrivileged(Unknown Source)
	at [email protected]/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(Unknown Source)
	at [email protected]/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Unknown Source)
	at [email protected]/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source)
	at [email protected]/com.sun.glass.ui.View.handleMouseEvent(Unknown Source)
	at [email protected]/com.sun.glass.ui.View.notifyMouse(Unknown Source)
	at [email protected]/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at [email protected]/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(Unknown Source)
	at java.base/java.lang.Thread.run(Unknown Source)

jiewangjs avatar Jun 15 '24 23:06 jiewangjs

I have been looking into this for a bit since I got the exact same error on Linux today. The culprit is in FilteredListProxy in Line 74. In that line System.arraycopy(filtered, pos + 1, filtered, pos, size - pos - 1); both size and pos have the identical value, thus leading to arraycopy receiving invalid arguments. But after testing for a bit I was not able to reproduce the error again so I can't really seem to find out why they are set equally. Which leads me to believe this might be a race condition somehow that just doesn't update the values in time?

I'll test a bit more to see if I can trigger it again or if I find a consistent setup. If I identify the culprit I'll submit a PR.

JamarleyHub avatar May 24 '25 17:05 JamarleyHub

I'll test a bit more to see if I can trigger it again or if I find a consistent setup. If I identify the culprit I'll submit a PR.

Maybe a bit of an update: This issue can be closed because, for all I can see, it's solved. The version I ran was in fact 5.15 but since you guys redesigned a lot of the repo a lot of things have changed. Including this specific behavior that causes this bug. The file I am referring to was only added in db9f83c (about two months after this issue was opened).

And after a bit of testing I have concluded: In the newest version on the main branch it is not possible to produce this bug.

Maybe a bit of an explanation why: Through a bit of experimentation I found that if you increase size, arraycopy doesn't trigger the bug, because it obviously doesn't find the index to remove in the table-list - it just glitches out the source list but that's it. Only if you increment the pos variable can you somehow trigger this. But since pos is literally the result of a binary search which can at max be size - 1, it is guaranteed that pos < size.

So it is literally not possible to have a behavior where arraycopy is called in this particular instance with a negative value.

Hope I was at least able to help close this issue. If anything, it was fun diving into your codebase. :)

JamarleyHub avatar May 24 '25 21:05 JamarleyHub

@JamarleyHub thanks so much for your analysis! Feel free to tackle any of the other bugs 😉

Siedlerchr avatar May 25 '25 07:05 Siedlerchr