Skip to content

"Quality → Clean up entries" blocks the process (repeated exception pop-up windows) #15366

@mikezhanghaozhe

Description

@mikezhanghaozhe

JabRef version

Latest development branch build (please note build date below)

Operating system

macOS

Details on version and operating system

macOS Tahoe Version 26.2

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

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

Steps to reproduce the behaviour

  1. Select an entry in the library.
Image
  1. Change the pages range to be something like p. 50 that requires clean up.
Image
  1. Go to Quality -> Clean up entries.
Image Image
  1. The process breaks with many pop up blocking window.
Image Image
  1. Here is the error message.
    ERROR: Uncaught exception occurred in Thread[#69,pool-2-thread-4,5,main]: java.lang.IllegalStateException: This operation is permitted on the event thread only; currentThread = pool-2-t

  2. Note: using the cleanup icon in the left sidebar (with title "Article") for the entry works correctly on my side. The issue only occurs when running Quality -> Clean up entries.

  3. This may be related to #11966, which was similar but closed.

Appendix

...

Log File
2026-03-18 12:38:34 [pool-2-thread-4] org.jabref.logic.util.FallbackExceptionHandler.uncaughtException()
ERROR: Uncaught exception occurred in Thread[#69,pool-2-thread-4,5,main]: java.lang.IllegalStateException: This operation is permitted on the event thread only; currentThread = pool-2-thread-4
	at javafx.graphics@25.0.2/com.sun.glass.ui.Application.checkEventThread(Application.java:442)
	at javafx.graphics@25.0.2/com.sun.glass.ui.MenuItem.setEnabled(MenuItem.java:108)
	at javafx.graphics@25.0.2/com.sun.javafx.tk.quantum.GlassSystemMenu.lambda$insertMenuItem$2(GlassSystemMenu.java:289)
	at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(ExpressionHelper.java:376)
	at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:91)
	at javafx.base@25.0.2/javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:104)
	at javafx.base@25.0.2/javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:111)
	at javafx.base@25.0.2/javafx.beans.property.BooleanPropertyBase$Listener.invalidated(BooleanPropertyBase.java:239)
	at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(ExpressionHelper.java:376)
	at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:91)
	at javafx.base@25.0.2/javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:104)
	at javafx.base@25.0.2/javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:111)
	at javafx.base@25.0.2/javafx.beans.property.BooleanPropertyBase$Listener.invalidated(BooleanPropertyBase.java:239)
	at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:147)
	at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:91)
	at javafx.base@25.0.2/javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:104)
	at javafx.base@25.0.2/javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:111)
	at javafx.base@25.0.2/javafx.beans.property.BooleanPropertyBase$Listener.invalidated(BooleanPropertyBase.java:239)
	at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:147)
	at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:91)
	at javafx.base@25.0.2/javafx.beans.binding.BooleanBinding.invalidate(BooleanBinding.java:180)
	at javafx.base@25.0.2/com.sun.javafx.binding.BindingHelperObserver.invalidated(BindingHelperObserver.java:52)
	at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:147)
	at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:91)
	at javafx.base@25.0.2/javafx.beans.property.ReadOnlyBooleanPropertyBase.fireValueChangedEvent(ReadOnlyBooleanPropertyBase.java:78)
	at javafx.base@25.0.2/javafx.beans.property.ReadOnlyBooleanWrapper.fireValueChangedEvent(ReadOnlyBooleanWrapper.java:103)
	at javafx.base@25.0.2/javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:111)
	at javafx.base@25.0.2/javafx.beans.property.BooleanPropertyBase$Listener.invalidated(BooleanPropertyBase.java:239)
	at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:147)
	at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:91)
	at javafx.base@25.0.2/javafx.beans.binding.BooleanBinding.invalidate(BooleanBinding.java:180)
	at javafx.base@25.0.2/javafx.beans.binding.Bindings$ShortCircuitAndInvalidator.invalidated(Bindings.java:4669)
	at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:147)
	at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:91)
	at javafx.base@25.0.2/javafx.beans.binding.BooleanBinding.invalidate(BooleanBinding.java:180)
	at javafx.base@25.0.2/com.sun.javafx.binding.BindingHelperObserver.invalidated(BindingHelperObserver.java:52)
	at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:147)
	at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:91)
	at javafx.base@25.0.2/javafx.beans.binding.ObjectBinding.invalidate(ObjectBinding.java:192)
	at javafx.base@25.0.2/com.sun.javafx.binding.BindingHelperObserver.invalidated(BindingHelperObserver.java:52)
	at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(ExpressionHelper.java:376)
	at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:91)
	at javafx.base@25.0.2/javafx.beans.binding.ObjectBinding.invalidate(ObjectBinding.java:192)
	at com.tobiasdiez.easybind@2.3.0/com.tobiasdiez.easybind.FlatMapBindingBase.mappedInvalidated(FlatMap.java:72)
	at com.tobiasdiez.easybind@2.3.0/com.tobiasdiez.easybind.FlatMapBindingBase.lambda$new$1(FlatMap.java:22)
	at javafx.base@25.0.2/javafx.beans.WeakInvalidationListener.invalidated(WeakInvalidationListener.java:82)
	at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:147)
	at javafx.base@25.0.2/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:91)
	at javafx.base@25.0.2/javafx.beans.binding.BooleanBinding.invalidate(BooleanBinding.java:180)
	at javafx.base@25.0.2/com.sun.javafx.binding.BindingHelperObserver.invalidated(BindingHelperObserver.java:52)
	at javafx.base@25.0.2/com.sun.javafx.collections.MapListenerHelper$Generic.fireValueChangedEvent(MapListenerHelper.java:318)
	at javafx.base@25.0.2/com.sun.javafx.collections.MapListenerHelper.fireValueChangedEvent(MapListenerHelper.java:70)
	at javafx.base@25.0.2/com.sun.javafx.collections.ObservableMapWrapper.callObservers(ObservableMapWrapper.java:115)
	at javafx.base@25.0.2/com.sun.javafx.collections.ObservableMapWrapper.put(ObservableMapWrapper.java:169)
	at org.jabref.jablib/org.jabref.model.entry.BibEntry.setField(BibEntry.java:592)
	at org.jabref.jablib/org.jabref.logic.cleanup.FieldFormatterCleanup.cleanupSingleField(FieldFormatterCleanup.java:62)
	at org.jabref.jablib/org.jabref.logic.cleanup.FieldFormatterCleanup.cleanup(FieldFormatterCleanup.java:35)
	at org.jabref.jablib/org.jabref.logic.cleanup.CleanupWorker.cleanup(CleanupWorker.java:44)
	at org.jabref/org.jabref.gui.cleanup.CleanupDialogViewModel.doCleanup(CleanupDialogViewModel.java:170)
	at org.jabref/org.jabref.gui.cleanup.CleanupDialogViewModel.cleanupWithProgress(CleanupDialogViewModel.java:231)
	at org.jabref/org.jabref.gui.cleanup.CleanupDialogViewModel$1.call(CleanupDialogViewModel.java:136)
	at org.jabref/org.jabref.gui.cleanup.CleanupDialogViewModel$1.call(CleanupDialogViewModel.java:133)
	at org.jabref/org.jabref.gui.util.UiTaskExecutor$1.call(UiTaskExecutor.java:175)
	at javafx.graphics@25.0.2/javafx.concurrent.Task$TaskCallable.call(Task.java:1407)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:328)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:545)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:328)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
	at java.base/java.lang.Thread.run(Thread.java:1474)

Metadata

Metadata

Assignees

Labels

good first issueAn issue intended for project-newcomers. Varies in difficulty.📍 AssignedAssigned by assign-issue-action (or manually assigned)

Type

No fields configured for bug.

Projects

Status
Done
Status
Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions