NPE designing a view with Canvas and BIRT IDeviceRenderer

SWT Designer allows you to create the views, editors, perspectives, pref pages, composites, etc. that comprise Eclipse SWT & RCP applications and plug-ins.

Moderators: Konstantin.Scheglov, gnebling, Alexander.Mitin, jwren, Eric Clayberg

NPE designing a view with Canvas and BIRT IDeviceRenderer

Postby cebarne2 » Mon Aug 27, 2007 10:00 am

I'm working with a Canvas subclass that instantiates an IDeviceRenderer in the constructor.
Code: Select all
PluginSettings ps = PluginSettings.instance();
[IDeviceRenderer] render = ps.getDevice("dv.SWT");


Switching the the "Design" tab results in an NPE. If I replace my custom Canvas with the non sub-classed Canvas, no problem. What is the best practice to avoid this particular issue?

-Thanks


Code: Select all
!ENTRY com.swtdesigner 4 4 2007-08-27 10:27:47.025
!MESSAGE Designer internal error [6.4.0.20070706072623]: java.lang.NullPointerException
!STACK 0
org.apache.commons.lang.exception.NestableError: java.lang.NullPointerException
   at com.swtdesigner.model.swing.properties.custom.DesignTimeHelper.execute(DesignTimeHelper.java:56)
   at com.swtdesigner.model.JavaInfo.notifyPropertyChanged(JavaInfo.java:5567)
   at com.swtdesigner.model.swt.widgets.control.ControlInfo.notifyPropertyChanged(ControlInfo.java:392)
   at com.swtdesigner.model.swt.rcp.parts.WorkbenchPartInfo.notifyPropertyChanged(WorkbenchPartInfo.java:166)
   at com.swtdesigner.model.JavaInfo.notifyPropertyChanged(JavaInfo.java:5549)
   at com.swtdesigner.gef.common.property.DesignerEditorPropertyComposite.handleRootNodeSelected(DesignerEditorPropertyComposite.java:662)
   at com.swtdesigner.gef.common.property.DesignerEditorPropertyComposite.updatePropertyComposite(DesignerEditorPropertyComposite.java:865)
   at com.swtdesigner.gef.DesignerEditor.parseCompilationUnit(DesignerEditor.java:1163)
   at com.swtdesigner.gef.DesignerEditor$17.execute(DesignerEditor.java:1067)
   at com.swtdesigner.model.swing.properties.custom.DesignTimeHelper.execute(DesignTimeHelper.java:54)
   at com.swtdesigner.gef.DesignerEditor.handleActivate(DesignerEditor.java:1061)
   at com.swtdesigner.gef.DesignerEditor.handleActivate(DesignerEditor.java:1055)
   at com.swtdesigner.editors.MultiPageEditor.showDesignEditor(MultiPageEditor.java:413)
   at com.swtdesigner.editors.MultiPageEditor$2.widgetSelected(MultiPageEditor.java:183)
   at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:227)
   at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
   at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:938)
   at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:962)
   at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:947)
   at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:706)
   at org.eclipse.swt.custom.CTabFolder.setSelection(CTabFolder.java:3227)
   at org.eclipse.swt.custom.CTabFolder.onMouse(CTabFolder.java:2005)
   at org.eclipse.swt.custom.CTabFolder$1.handleEvent(CTabFolder.java:316)
   at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
   at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:938)
   at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3682)
   at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3293)
   at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2389)
   at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2353)
   at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2219)
   at org.eclipse.ui.internal.Workbench$4.run(Workbench.java:466)
   at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:289)
   at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:461)
   at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
   at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:106)
   at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:153)
   at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:106)
   at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:76)
   at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:363)
   at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:176)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
   at java.lang.reflect.Method.invoke(Unknown Source)
   at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:504)
   at org.eclipse.equinox.launcher.Main.basicRun(Main.java:443)
   at org.eclipse.equinox.launcher.Main.run(Main.java:1169)
Caused by: java.lang.NullPointerException
   at org.eclipse.birt.chart.factory.Generator.render(Generator.java:1203)
   at com.rockwellcollins.ccase.admintools.widgets.ChartCanvas.drawToCachedImage(ChartCanvas.java:160)
   at com.rockwellcollins.ccase.admintools.widgets.ChartCanvas$1.paintControl(ChartCanvas.java:94)
   at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:216)
   at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
   at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:938)
   at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:962)
   at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:947)
   at org.eclipse.swt.widgets.Composite.WM_PRINTCLIENT(Composite.java:1340)
   at org.eclipse.swt.widgets.Control.windowProc(Control.java:3730)
   at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:291)
   at org.eclipse.swt.widgets.Display.windowProc(Display.java:4351)
   at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)
   at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:2259)
   at org.eclipse.swt.widgets.Scrollable.callWindowProc(Scrollable.java:77)
   at org.eclipse.swt.widgets.Control.windowProc(Control.java:3760)
   at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:291)
   at org.eclipse.swt.widgets.Display.windowProc(Display.java:4364)
   at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)
   at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:2259)
   at org.eclipse.swt.widgets.Scrollable.callWindowProc(Scrollable.java:77)
   at org.eclipse.swt.widgets.Control.windowProc(Control.java:3760)
   at org.eclipse.swt.widgets.Display.windowProc(Display.java:4364)
   at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)
   at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:2259)
   at org.eclipse.swt.widgets.Scrollable.callWindowProc(Scrollable.java:77)
   at org.eclipse.swt.widgets.Control.windowProc(Control.java:3760)
   at org.eclipse.swt.widgets.Display.windowProc(Display.java:4364)
   at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)
   at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:2259)
   at org.eclipse.swt.widgets.Scrollable.callWindowProc(Scrollable.java:77)
   at org.eclipse.swt.widgets.Control.windowProc(Control.java:3760)
   at org.eclipse.swt.widgets.Display.windowProc(Display.java:4364)
   at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)
   at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:2259)
   at org.eclipse.swt.widgets.Scrollable.callWindowProc(Scrollable.java:77)
   at org.eclipse.swt.widgets.Control.windowProc(Control.java:3760)
   at org.eclipse.swt.widgets.Display.windowProc(Display.java:4364)
   at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)
   at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:2259)
   at org.eclipse.swt.widgets.Scrollable.callWindowProc(Scrollable.java:77)
   at org.eclipse.swt.widgets.Control.windowProc(Control.java:3760)
   at org.eclipse.swt.widgets.Display.windowProc(Display.java:4364)
   at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)
   at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:2259)
   at org.eclipse.swt.widgets.Shell.callWindowProc(Shell.java:456)
   at org.eclipse.swt.widgets.Control.windowProc(Control.java:3760)
   at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:291)
   at org.eclipse.swt.widgets.Decorations.windowProc(Decorations.java:1584)
   at org.eclipse.swt.widgets.Shell.windowProc(Shell.java:1753)
   at org.eclipse.swt.widgets.Display.windowProc(Display.java:4364)
   at com.swtdesigner.test.TestShot.makeShot(Native Method)
   at com.swtdesigner.test.TestShot.makeShot(TestShot.java:216)
   at com.swtdesigner.model.swt.widgets.control.ControlInfo.creatShotImage(ControlInfo.java:403)
   at com.swtdesigner.model.swt.widgets.control.ControlInfo.createGUIShot(ControlInfo.java:454)
   at com.swtdesigner.model.swt.widgets.composite.AbstractCompositeInfo.createGUIShot(AbstractCompositeInfo.java:279)
   at com.swtdesigner.model.swt.rcp.parts.ViewLikeInfo.createGUIShot(ViewLikeInfo.java:154)
   at com.swtdesigner.model.JavaInfo$19.execute(JavaInfo.java:5577)
   at com.swtdesigner.model.swing.properties.custom.DesignTimeHelper.execute(DesignTimeHelper.java:54)
   ... 46 more
[/code]
cebarne2
 
Posts: 67
Joined: Tue Sep 23, 2003 10:11 am
Location: Cedar Rapids, IA

Re: NPE designing a view with Canvas and BIRT IDeviceRendere

Postby Eric Clayberg » Mon Aug 27, 2007 10:26 am

cebarne2 wrote:Switching the the "Design" tab results in an NPE. If I replace my custom Canvas with the non sub-classed Canvas, no problem. What is the best practice to avoid this particular issue?

Fix this exception:

Code: Select all
java.lang.NullPointerException
   at org.eclipse.birt.chart.factory.Generator.render(Generator.java:1203)
   at com.rockwellcollins.ccase.admintools.widgets.ChartCanvas.drawToCachedImage(ChartCanvas.java:160)
   at com.rockwellcollins.ccase.admintools.widgets.ChartCanvas$1.paintControl(ChartCanvas.java:94)

I don't have your code, so I can only offer general advice. With a test case, I could get more specific.

In general, I would suggest adding a null check or an Beans.isDesignTime() check. See the Designer FAQ for details.
Eric Clayberg
Software Engineering Manager
Google
http://code.google.com/webtoolkit/download.html

Author: "Eclipse Plug-ins"
http://www.qualityeclipse.com
Eric Clayberg
Moderator
 
Posts: 4503
Joined: Tue Sep 30, 2003 6:39 am
Location: Boston, MA USA

Postby cebarne2 » Tue Aug 28, 2007 7:29 am

Thanks.

This is just the nudge I needed. I looked through the FAQ and missed the point of Beans.isDesignTime(). It did the trick.

You always get me back on my feet, Eric.
cebarne2
 
Posts: 67
Joined: Tue Sep 23, 2003 10:11 am
Location: Cedar Rapids, IA

Postby Eric Clayberg » Tue Aug 28, 2007 9:09 am

cebarne2 wrote:This is just the nudge I needed. I looked through the FAQ and missed the point of Beans.isDesignTime().

Beans.isDesignTime() is very handy when dealing with complex custom widgets.

Basically, if your component needs to access resources (databases, other classes, etc.) that aren't available at design time (assume nothing like that is available), your should make that code a no-op by using Beans.isDesignTime(). Make sure that any component can work with some default data that you supply in the event that its external data source is missing. You can also deal with this reactively, by looking at exceptions recorded to your Eclipse ".log" file. If your component throws an NPE, fix the NPE.

Some combination of null checks, isDesignTime check or other defensive programming is usually sufficient. I have never seen a custom component that couldn't be made design time friendly in a couple of minutes.
Eric Clayberg
Software Engineering Manager
Google
http://code.google.com/webtoolkit/download.html

Author: "Eclipse Plug-ins"
http://www.qualityeclipse.com
Eric Clayberg
Moderator
 
Posts: 4503
Joined: Tue Sep 30, 2003 6:39 am
Location: Boston, MA USA


Return to SWT Designer

Who is online

Users browsing this forum: No registered users and 2 guests