Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 415048

Summary: Disposing an open TableEditor raises persistant Exception
Product: [RT] RAP Reporter: Johannes Eickhold <jeick>
Component: RWTAssignee: Project Inbox <rap-inbox>
Status: RESOLVED FIXED QA Contact:
Severity: normal    
Priority: P3 CC: mknauer
Version: 2.2   
Target Milestone: 2.2 M1   
Hardware: All   
OS: All   
Whiteboard:

Description Johannes Eickhold CLA 2013-08-14 07:18:01 EDT
When switching from a Table with an open TableEditor to some other part in our UI the following Exception is thrown.
After that the Excepten is thrown each time an event is processed.

Failed to execute PhaseListener after phase 'PROCESS_ACTION'.
org.eclipse.swt.SWTException: Widget is disposed
	at org.eclipse.swt.SWT.error(SWT.java:3582)
	at org.eclipse.swt.SWT.error(SWT.java:3505)
	at org.eclipse.swt.SWT.error(SWT.java:3476)
	at org.eclipse.swt.widgets.Widget.error(Widget.java:1025)
	at org.eclipse.swt.widgets.Widget.getDisplay(Widget.java:406)
	at org.eclipse.swt.custom.TableEditor$2.afterPhase(TableEditor.java:220)
	at org.eclipse.rap.rwt.internal.lifecycle.PhaseListenerManager.notifyAfterPhase(PhaseListenerManager.java:87)
	at org.eclipse.rap.rwt.internal.lifecycle.PhaseExecutor.execute(PhaseExecutor.java:36)
	at org.eclipse.rap.rwt.internal.lifecycle.SimpleLifeCycle.execute(SimpleLifeCycle.java:51)
	at org.eclipse.rap.rwt.internal.service.LifeCycleServiceHandler.runLifeCycle(LifeCycleServiceHandler.java:139)
	at org.eclipse.rap.rwt.internal.service.LifeCycleServiceHandler.handlePostRequest(LifeCycleServiceHandler.java:125)
	at org.eclipse.rap.rwt.internal.service.LifeCycleServiceHandler.synchronizedService(LifeCycleServiceHandler.java:76)
	at org.eclipse.rap.rwt.internal.service.LifeCycleServiceHandler.service(LifeCycleServiceHandler.java:67)
	at org.eclipse.rap.rwt.engine.RWTServlet.handleValidRequest(RWTServlet.java:119)
	at org.eclipse.rap.rwt.engine.RWTServlet.handleRequest(RWTServlet.java:106)
	at org.eclipse.rap.rwt.engine.RWTServlet.doPost(RWTServlet.java:99)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:755)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
	at org.eclipse.rap.rwt.osgi.internal.CutOffContextPathWrapper.service(CutOffContextPathWrapper.java:106)
	at org.eclipse.equinox.http.servlet.internal.ServletRegistration.service(ServletRegistration.java:61)
	at org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:128)
	at org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:60)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
	at org.eclipse.equinox.http.jetty.internal.HttpServerManager$InternalHttpServiceServlet.service(HttpServerManager.java:386)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:457)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:229)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
	at org.eclipse.jetty.server.Server.handle(Server.java:368)
	at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489)
	at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:953)
	at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1014)
	at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:861)
	at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
	at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
	at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628)
	at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
	at java.lang.Thread.run(Unknown Source)

The relevant code is in org.eclipse.swt.custom.TableEditor.resize():
  // [rh] Adaption of the above code for RWT (see bug 364802)
  final LifeCycle lifeCycle = getApplicationContext().getLifeCycleFactory().getLifeCycle();
  lifeCycle.addPhaseListener( new PhaseListener() {
    public void beforePhase( PhaseEvent event ) {
    }

    public void afterPhase( PhaseEvent event ) {
      if( table == null ) {
        lifeCycle.removePhaseListener( this );
      } else if( table.getDisplay() == Display.getCurrent()) {
        layout();
        lifeCycle.removePhaseListener( this );
      }
    }

    public PhaseId getPhaseId() {
      return PhaseId.PROCESS_ACTION;
    }
  }

Maybe the Exception could be prevented if line
  if( table == null ) {
would be changed to
  if( table == null || table.isDisposed() ) {
Comment 1 Ivan Furnadjiev CLA 2013-08-14 08:33:24 EDT
Recently we added a check for disposed widget in widget.getDisplay() method (see bug 398981). Fixed as suggested with commit a57dfe9897c7d64772972315b7f31fa463c8dacf.