Invalid Thread access

I got this exception when I tried to save a workflow with an ImagePortObject. Do you have idea what could be the problem? (It has an SvgCell.Type spec.)T

Thanks, gabor

DEBUG     WorkflowEditor     Could not save workflow: Could not save workflow: Writer expected
java.lang.reflect.InvocationTargetException
    at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:421)
    at org.eclipse.jface.dialogs.ProgressMonitorDialog.run(ProgressMonitorDialog.java:507)
    at org.eclipse.ui.internal.progress.ProgressMonitorJobsDialog.run(ProgressMonitorJobsDialog.java:275)
    at org.eclipse.ui.internal.progress.ProgressManager.run(ProgressManager.java:1162)
    at org.knime.workbench.editor2.WorkflowEditor.doSave(WorkflowEditor.java:1131)
    at org.eclipse.ui.internal.SaveableHelper$4.run(SaveableHelper.java:247)
    at org.eclipse.ui.internal.SaveableHelper$5.run(SaveableHelper.java:277)
    at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:464)
    at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:372)
    at org.eclipse.jface.window.ApplicationWindow$1.run(ApplicationWindow.java:759)
    at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
    at org.eclipse.jface.window.ApplicationWindow.run(ApplicationWindow.java:756)
    at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2600)
    at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:285)
    at org.eclipse.ui.internal.SaveableHelper.runProgressMonitorOperation(SaveableHelper.java:264)
    at org.eclipse.ui.internal.SaveableHelper.savePart(SaveableHelper.java:252)
    at org.eclipse.ui.internal.EditorManager.saveAll(EditorManager.java:1115)
    at org.eclipse.ui.internal.Workbench$19.run(Workbench.java:1181)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.ui.internal.Workbench.saveAllEditors(Workbench.java:1130)
    at org.eclipse.ui.internal.Workbench.busyClose(Workbench.java:1048)
    at org.eclipse.ui.internal.Workbench.access$15(Workbench.java:1032)
    at org.eclipse.ui.internal.Workbench$25.run(Workbench.java:1276)
    at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
    at org.eclipse.ui.internal.Workbench.close(Workbench.java:1274)
    at org.eclipse.ui.internal.Workbench.close(Workbench.java:1246)
    at org.eclipse.ui.internal.WorkbenchWindow.busyClose(WorkbenchWindow.java:731)
    at org.eclipse.ui.internal.WorkbenchWindow.access$0(WorkbenchWindow.java:710)
    at org.eclipse.ui.internal.WorkbenchWindow$5.run(WorkbenchWindow.java:826)
    at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
    at org.eclipse.ui.internal.WorkbenchWindow.close(WorkbenchWindow.java:824)
    at org.eclipse.jface.window.Window.handleShellCloseEvent(Window.java:741)
    at org.eclipse.jface.window.Window$3.shellClosed(Window.java:687)
    at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:98)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1062)
    at org.eclipse.swt.widgets.Decorations.closeWidget(Decorations.java:308)
    at org.eclipse.swt.widgets.Decorations.WM_CLOSE(Decorations.java:1665)
    at org.eclipse.swt.widgets.Control.windowProc(Control.java:4162)
    at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:341)
    at org.eclipse.swt.widgets.Decorations.windowProc(Decorations.java:1598)
    at org.eclipse.swt.widgets.Shell.windowProc(Shell.java:2038)
    at org.eclipse.swt.widgets.Display.windowProc(Display.java:4873)
    at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)
    at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:2454)
    at org.eclipse.swt.widgets.Shell.callWindowProc(Shell.java:497)
    at org.eclipse.swt.widgets.Control.windowProc(Control.java:4251)
    at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:341)
    at org.eclipse.swt.widgets.Decorations.windowProc(Decorations.java:1598)
    at org.eclipse.swt.widgets.Shell.windowProc(Shell.java:2038)
    at org.eclipse.swt.widgets.Display.windowProc(Display.java:4873)
    at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)
    at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:2454)
    at org.eclipse.swt.widgets.Shell.callWindowProc(Shell.java:497)
    at org.eclipse.swt.widgets.Control.windowProc(Control.java:4251)
    at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:341)
    at org.eclipse.swt.widgets.Decorations.windowProc(Decorations.java:1598)
    at org.eclipse.swt.widgets.Shell.windowProc(Shell.java:2038)
    at org.eclipse.swt.widgets.Display.windowProc(Display.java:4873)
    at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
    at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2459)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3655)
    at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2640)
    at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2604)
    at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2438)
    at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:671)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:664)
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
    at org.knime.product.rcp.KNIMEApplication.start(KNIMEApplication.java:95)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:619)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:574)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1407)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1383)
Caused by: org.eclipse.swt.SWTException: Invalid thread access
    at org.eclipse.swt.SWT.error(SWT.java:4083)
    at org.eclipse.swt.SWT.error(SWT.java:3998)
    at org.eclipse.swt.SWT.error(SWT.java:3969)
    at org.eclipse.swt.widgets.Widget.error(Widget.java:468)
    at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:359)
    at org.eclipse.swt.widgets.ToolItem.setEnabled(ToolItem.java:630)
    at org.eclipse.jface.action.StatusLine.setCanceled(StatusLine.java:473)
    at org.eclipse.jface.action.StatusLineManager$1.setCanceled(StatusLineManager.java:189)
    at org.eclipse.core.runtime.ProgressMonitorWrapper.setCanceled(ProgressMonitorWrapper.java:132)
    at org.eclipse.ui.internal.dialogs.EventLoopProgressMonitor.setCanceled(EventLoopProgressMonitor.java:151)
    at org.knime.workbench.editor2.SaveWorkflowRunnable.run(SaveWorkflowRunnable.java:157)
    at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121)
 

Is this the only error message related to the save operation? Do you find any other problems/stack traces in the log that might be connected? I assume there is one; the stack you posted indicates a bug in the error handling code.

Thanks,
  Bernd

Hi Bernd,

You were right. I have not noticed this exception:

java.lang.Error: Writer expected
    at org.apache.batik.transcoder.svg2svg.SVGTranscoder.transcode(Unknown Source)
    at org.knime.base.data.xml.SvgImageContent.save(SvgImageContent.java:158)
    at org.knime.core.node.port.image.ImagePortObject.save(ImagePortObject.java:217)
    at org.knime.core.node.port.AbstractPortObject$MyPortObjectSerializer.savePortObject(AbstractPortObject.java:198)
    at org.knime.core.node.port.AbstractPortObject$MyPortObjectSerializer.savePortObject(AbstractPortObject.java:1)
    at org.knime.core.node.NodePersistorVersion200.savePort(NodePersistorVersion200.java:354)
    at org.knime.core.node.NodePersistorVersion200.savePorts(NodePersistorVersion200.java:220)
    at org.knime.core.node.NodePersistorVersion200.save(NodePersistorVersion200.java:177)
    at org.knime.core.node.workflow.SingleNodeContainerPersistorVersion200.save(SingleNodeContainerPersistorVersion200.java:270)
    at org.knime.core.node.workflow.WorkflowPersistorVersion200.saveNodeContainer(WorkflowPersistorVersion200.java:705)
    at org.knime.core.node.workflow.WorkflowPersistorVersion200.save(WorkflowPersistorVersion200.java:520)
    at org.knime.core.node.workflow.WorkflowManager.save(WorkflowManager.java:5952)
    at org.knime.workbench.editor2.SaveWorkflowRunnable.run(SaveWorkflowRunnable.java:120)
    at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121)

Do you have an idea what did I wrong? (If it helps my code is here.)

Thanks, gabor

This is a bug. It will be fixed in the next KNIME release.

Hi Gabor,

I just sent you a nightly build update site that contains the bug fix. It would be great if you could confirm the fix. Please note, we can't currently verify the fix as we don't have any node in the KNIME distribution that spits out an SVG port object.

Thanks,
  Bernd

Hi Bernd,

Thank you for your fast feedback and the great fix. It is working fine (both save and load) with SVG, and PNG in the snapshot. Really appreciated. (It is a really good thing that even if I pioneer to new areas (Java code generation, imaging) I can find great support.)

Cheers, gabor