When the webserver restarts while an echo2 application is active with an active Tree, the Echo2 application crashes when the page is reloaded. This is caused by a nullPointerException in Tree, because the expandedStack and expandedState fields in echopointng.Tree are transient, and thus not set when the Tree is deserialized.
Stack trace is:
java.lang.NullPointerException
at echopointng.Tree.isExpanded(Tree.java:945)
at echopointng.ui.syncpeer.TreeRenderer.renderExpandoCell(TreeRenderer.java:499)
at echopointng.ui.syncpeer.TreeRenderer.renderTreeRow(TreeRenderer.java:754)
at echopointng.ui.syncpeer.TreeRenderer.renderTreeRecursive(TreeRenderer.java:691)
at echopointng.ui.syncpeer.TreeRenderer.renderTree(TreeRenderer.java:708)
at echopointng.ui.syncpeer.TreePeer.renderHtml(TreePeer.java:311)
at echopointng.ui.syncpeer.AbstractEchoPointPeer.renderHtml(AbstractEchoPointPeer.java:298)
at nextapp.echo2.webcontainer.syncpeer.ContentPanePeer.renderChild(ContentPanePeer.java:236)
at nextapp.echo2.webcontainer.syncpeer.ContentPanePeer.renderHtml(ContentPanePeer.java:302)
at nextapp.echo2.webcontainer.syncpeer.ContentPanePeer.renderAdd(ContentPanePeer.java:165)
at nextapp.echo2.webcontainer.syncpeer.SplitPanePeer.renderChild(SplitPanePeer.java:341)
at nextapp.echo2.webcontainer.syncpeer.SplitPanePeer.renderAdd(SplitPanePeer.java:288)
at nextapp.echo2.webcontainer.syncpeer.SplitPanePeer.renderChild(SplitPanePeer.java:341)
at nextapp.echo2.webcontainer.syncpeer.SplitPanePeer.renderAdd(SplitPanePeer.java:288)
at nextapp.echo2.webcontainer.syncpeer.SplitPanePeer.renderChild(SplitPanePeer.java:341)
at nextapp.echo2.webcontainer.syncpeer.SplitPanePeer.renderAdd(SplitPanePeer.java:288)
at nextapp.echo2.webcontainer.syncpeer.SplitPanePeer.renderChild(SplitPanePeer.java:341)
at nextapp.echo2.webcontainer.syncpeer.SplitPanePeer.renderAdd(SplitPanePeer.java:288)
at nextapp.echo2.webcontainer.syncpeer.ContentPanePeer.renderChild(ContentPanePeer.java:238)
at nextapp.echo2.webcontainer.syncpeer.ContentPanePeer.renderHtml(ContentPanePeer.java:302)
at nextapp.echo2.webcontainer.syncpeer.ContentPanePeer.renderAdd(ContentPanePeer.java:165)
at nextapp.echo2.webcontainer.syncpeer.WindowPeer.renderRefresh(WindowPeer.java:124)
at nextapp.echo2.webcontainer.ContainerSynchronizeService.renderInit(ContainerSynchronizeService.java:427)
at nextapp.echo2.webrender.service.SynchronizeService.service(SynchronizeService.java:269)
at nextapp.echo2.webrender.WebRenderServlet.process(WebRenderServlet.java:273)
at nextapp.echo2.webrender.WebRenderServlet.doPost(WebRenderServlet.java:189)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.aci.hibernate.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:45)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)
One solution is to check for if transient fields are null in methods like Tree.isExpanded() and Tree.setExpandedState() and if they are null, initialize them.