4 Replies Latest reply on Jul 9, 2008 10:31 AM by fmarwede

    crash by delete the last item in scrollableDataTable

      i have implemented a scrollableDataTable for message, there is a checkbox in every line, with that you can acknowledge the message. If the checkbox is selected, delete the message object from Message-List. When i delete the last message, i got the error message and crash.

      17.06.2008 10:44:35 com.sun.facelets.FaceletViewHandler handleRenderException
      SCHWERWIEGEND: Error Rendering View[/restricted/paneDefinition.xhtml]
      javax.faces.FacesException: java.lang.IndexOutOfBoundsException: Index: 0,Size: 0
       at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:675)
       at javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:650)
       at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:681)
       at javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:650)
       at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:681)
       at javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:650)
       at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:681)
       at javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:650)
       at org.ajax4jsf.component.AjaxViewRoot.encodeChildren(AjaxViewRoot.java:509)
       at javax.faces.component.UIComponent.encodeAll(UIComponent.java:886)
       at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:571)
       at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
       at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:189)
       at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
       at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
       at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
       at javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
       at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:147)
       at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:256)
       at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:362)
       at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:488)
       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.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(Thread.java:595)
      Caused by: java.lang.IndexOutOfBoundsException: Index: 0,Size: 0
       at java.util.SubList.rangeCheck(AbstractList.java:849)
       at java.util.SubList.get(AbstractList.java:722)
       at org.richfaces.model.ScrollableTableDataModel.getObjectById(ScrollableTableDataModel.java:165)
       at org.richfaces.model.DataModelCache.getObjectById(DataModelCache.java:103)
       at org.richfaces.model.ScrollableTableDataModel.loadAndMap(ScrollableTableDataModel.java:232)
       at org.richfaces.model.ScrollableTableDataModel.getRowData(ScrollableTableDataModel.java:190)
       at org.richfaces.model.DataModelCache.getRowData(DataModelCache.java:126)
       at org.richfaces.model.ScrollableTableDataModel.isRowAvailable(ScrollableTableDataModel.java:206)
       at org.richfaces.model.DataModelCache.isRowAvailable(DataModelCache.java:148)
       at org.ajax4jsf.component.UIDataAdaptor.isRowAvailable(UIDataAdaptor.java:268)
       at org.ajax4jsf.component.UIDataAdaptor.setRowKey(UIDataAdaptor.java:358)
       at org.ajax4jsf.component.UIDataAdaptor$ComponentVisitor.process(UIDataAdaptor.java:96)
       at org.ajax4jsf.component.UIDataAdaptor.encodeAjaxChild(UIDataAdaptor.java:494)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:105)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:68)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:116)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:68)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:116)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:68)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:116)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:68)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:116)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:68)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:116)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:68)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:116)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:68)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:116)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:68)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:116)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:68)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:116)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:68)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:116)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:68)
       at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:116)
       at org.ajax4jsf.renderkit.AjaxContainerRenderer.encodeAjax(AjaxContainerRenderer.java:123)
       at org.ajax4jsf.component.UIAjaxRegion.encodeAjax(UIAjaxRegion.java:267)
       at org.ajax4jsf.component.AjaxViewRoot$4.invokeContextCallback(AjaxViewRoot.java:484)
       at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:672)
      

      message.xhtml

      <ui:composition xmlns="http://www.w3.org/1999/xhtml"
       xmlns:ui="http://java.sun.com/jsf/facelets"
       xmlns:h="http://java.sun.com/jsf/html"
       xmlns:f="http://java.sun.com/jsf/core"
       xmlns:a4j="http://richfaces.org/a4j"
       xmlns:rich="http://richfaces.org/rich">
       <a4j:jsFunction name="acknowlegeAllAlarm" action="#{mainBean.acknowledgeAllAlarms}" />
       <rich:contextMenu id="menu" event="oncontextmenu" submitMode="none">
       <rich:menuItem value="Acknowledge all alarms" onclick="acknowlegeAllAlarm();"/>
       </rich:contextMenu>
       <rich:scrollableDataTable id="alarmPaneId"
       height="#{layoutBean.alarmTblHeight}"
       width="#{layoutBean.alarmTblWidth}"
       value="#{appData.alarms}" var="alarm"
       rowClasses="taskRows" columnClasses="taskColumns">
      
       <rich:column sortable="false">
       <f:facet name="header">
       <h:outputText value="Start Time"/>
       </f:facet>
       <h:outputText value="#{alarm.startTimeString}" />
       </rich:column>
       <rich:column sortable="false">
       <f:facet name="header">
       <h:outputText value="End Time"/>
       </f:facet>
       <h:outputText value="#{alarm.endTimeString}"
       title="#{alarm.endTimeString}"/>
       </rich:column>
       <rich:column sortable="false">
       <f:facet name="header">
       <h:outputText value="Text"/>
       </f:facet>
       <h:outputText value="#{alarm.text}" title="#{alarm.text}"/>
       </rich:column>
       <rich:column sortable="false" width="80">
       <f:facet name="header">
       <h:outputText value="Category"/>
       </f:facet>
       <h:outputText value="#{alarm.category}" title="#{alarm.category}"/>
       </rich:column>
       <rich:column sortable="false" width="60">
       <f:facet name="header">
       <h:outputText value="Severity"/>
       </f:facet>
       <h:outputText value="#{alarm.severity}" />
       </rich:column>
       <rich:column sortable="false" width="78">
       <f:facet name="header">
       <h:outputText value="Port"/>
       </f:facet>
       <h:outputText value="#{alarm.portName}"
       title="#{alarm.portName}"/>
       </rich:column>
       <rich:column sortable="false">
       <f:facet name="header">
       <h:outputText value="Acknowledged"/>
       </f:facet>
       <h:selectBooleanCheckbox value="#{alarm.acknowledged}"
       onclick="this.disabled=true;sendAck#{alarm.id}()">
       <a4j:jsFunction reRender="actualAlarmId" name="sendAck#{alarm.id}"
       action="#{mainBean.alarmAcknowledged}" ajaxSingle="true">
       <a4j:actionparam name="id" value="#{alarm.id}" />
       </a4j:jsFunction>
       </h:selectBooleanCheckbox>
       </rich:column>
       <rich:componentControl for="menu" operation="show"/>
      
       </rich:scrollableDataTable>
      <script>
       jQuery('.iBox')[0].childNodes[1].firstChild.childNodes[1].firstChild.height="";
      </script>
      
      </ui:composition>
      


      reRender is controlled by java bean and a4j:push
      case UPDATED_ALARM:
       case DELETED_ALARM:
       {
       componentsToUpdate = "alarmPaneId";
       break;
       }
      


      a4j:push
      
      <a4j:form>
       <a4j:region>
       <a4j:push reRender="#{mainBean.componentsToUpdate}"
       eventProducer="#{mainBean.addCommandEventListener}" interval="3000" />
       </a4j:region>
       </a4j:form>
      


        • 1. Re: crash by delete the last item in scrollableDataTable
          ilya_shaikovsky

          "reRender is controlled by java bean and a4j:push"

          why you just can't reRender from your jsFunction instead of creation so complex solution?

          • 2. Re: crash by delete the last item in scrollableDataTable

            thanks for your response. Because the reRender is controlled by DB. The messages come from DB, when db hast new message, then pop up to UI, then reRender the Message table.

            • 3. Re: crash by delete the last item in scrollableDataTable
              maxi

              i'm working at the same project and we coun't find a solution yet, but i have an guess.
              after debugging and including the source, i found in the
              function public T getObjectById(Object id)
              in public abstract class ScrollableTableDataModel
              the problem
              this function will be called with an correct id (a simpleRowKey), but the loadData function returns an empty list and the l.get(0) crashes ... so an

              List l = loadData(i, i + 1, lastSortOrder);
              if (l.size()>0)
              return l.get(0);

              should do the trick.

              Ok, i may have a completly wrong idea, but i will be very thankful if an developer can look at this proposal...

              thanks in advance

              • 4. Re: crash by delete the last item in scrollableDataTable

                Hi Maxi :)

                do you really want an empty table only with headers if last line is deleted?

                I think the normal solution for that is to write something like "Currently no entries in this table" in a line with colspan over all columns. When you do it that way you always have at least one row in your table and you never get IndexOutOfBound.