ConcurrentModificationException during databoard binding constructions
The following problem was found in user's workspace log
!ENTRY org.eclipse.ui 4 0 2020-10-15 14:05:40.387
!MESSAGE Unhandled event loop exception
!STACK 0
org.simantics.databoard.binding.error.RuntimeBindingConstructionException: org.simantics.databoard.binding.error.BindingConstructionException: java.util.ConcurrentModificationException
at org.simantics.databoard.Bindings.getBindingUnchecked(Bindings.java:374)
at org.simantics.databoard.util.Bean.<init>(Bean.java:77)
at org.simantics.charts.query.ChartAndSubscriptionItemData.<init>(ChartAndSubscriptionItemData.java:25)
at org.simantics.charts.ui.AddVariableToChartAction.runInSwt(AddVariableToChartAction.java:128)
at org.simantics.charts.ui.AddVariableToChartAction$2.run(AddVariableToChartAction.java:204)
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:37)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4213)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3820)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1155)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1044)
at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153)
at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:680)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:594)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148)
at org.simantics.workbench.internal.SimanticsWorkbenchApplication.start(SimanticsWorkbenchApplication.java:156)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:653)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:590)
at org.eclipse.equinox.launcher.Main.run(Main.java:1499)
Caused by: org.simantics.databoard.binding.error.BindingConstructionException: java.util.ConcurrentModificationException
at org.simantics.databoard.binding.reflection.ClassBindingFactory.construct(ClassBindingFactory.java:629)
at org.simantics.databoard.binding.reflection.ClassBindingFactory.doConstruct(ClassBindingFactory.java:589)
at org.simantics.databoard.binding.reflection.ClassBindingFactory.construct(ClassBindingFactory.java:608)
at org.simantics.databoard.binding.reflection.ClassBindingFactory.getBinding(ClassBindingFactory.java:712)
at org.simantics.databoard.binding.impl.BeanBinding.create(BeanBinding.java:60)
at org.simantics.databoard.serialization.impl.MutableVariantSerializer.deserialize(MutableVariantSerializer.java:48)
at org.simantics.databoard.serialization.impl.MapSerializer.deserializeTo(MapSerializer.java:78)
at org.simantics.databoard.serialization.Serializer.deserializeToTry(Serializer.java:111)
at org.simantics.databoard.serialization.impl.GenericRecordSerializer.deserializeTo(GenericRecordSerializer.java:133)
at org.simantics.databoard.serialization.Serializer.deserializeToTry(Serializer.java:111)
at org.simantics.databoard.serialization.impl.ArraySerializer.deserializeToTry(ArraySerializer.java:103)
at org.simantics.databoard.serialization.impl.GenericRecordSerializer.deserializeTo(GenericRecordSerializer.java:133)
at org.simantics.databoard.serialization.Serializer$CompositeSerializer.deserializeTo(Serializer.java:416)
at org.simantics.databoard.serialization.Serializer.deserialize(Serializer.java:208)
at org.simantics.databoard.util.Bean.deserialize(Bean.java:381)
at org.simantics.browsing.ui.common.state.IdentifiedStatePersistor.deserialize(IdentifiedStatePersistor.java:55)
at org.simantics.browsing.ui.common.state.IdentifiedStatePersistor.deserialize(IdentifiedStatePersistor.java:33)
at org.simantics.browsing.ui.common.state.ExplorerStates$ReaderJob.run(ExplorerStates.java:49)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:56)
Caused by: java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1442)
at java.util.HashMap$ValueIterator.next(HashMap.java:1471)
at org.simantics.databoard.binding.reflection.ClassBindingFactory.isComplete(ClassBindingFactory.java:637)
at org.simantics.databoard.binding.reflection.ClassBindingFactory.construct(ClassBindingFactory.java:612)
... 18 more
Of course the non-thread-safe inprogress
map handling is a liability but at least the binding for ChartAndSubscriptionItemData
should be statically constructed to avoid re-getting the every single time a ChartAndSubscriptionItemData is constructed.