kitodo-production icon indicating copy to clipboard operation
kitodo-production copied to clipboard

Function "Select all rows" leads to exception

Open andre-hohmann opened this issue 2 years ago • 2 comments

Describe the bug If a list of results with several pages is shown in "processes" and all processes are selected, the following occurs:

  • If the last page is shown, it is not possible anymore to skip backwards. It leads to an exception (See "Additional context").

To Reproduce Steps to reproduce the behavior:

  1. Search enough processes to generate a result list of several result pages.
  2. Use function "select all rows".
  3. Click on the icon for the last result page or skip each page forward to the last result page.
  4. Click on the icon to skip backwards one result page
  5. See error message

Expected behavior If all rows of a result list is selected, it should be possible to skip forward and backwards between all result pages.

Release Kitodo.Production version 3.4.4

Desktop (please complete the following information):

  • OS: Windows 10
  • Chrome 103.0.5060.134 (Offizieller Build) (64-Bit)

Additional context

Date/time: 2022-07-27 16:04:12
User agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36
User IP: 127.0.0.1
Request URI: /kitodo/pages/processes.jsf
Ajax request: Yes
Status code: 500
Exception type: class java.lang.IndexOutOfBoundsException
Exception message: Index 98 out of bounds for length 98
Exception UUID:
Stack trace:
java.lang.IndexOutOfBoundsException: Index 98 out of bounds for length 98
	at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
	at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
	at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
	at java.base/java.util.Objects.checkIndex(Objects.java:372)
	at java.base/java.util.ArrayList.get(ArrayList.java:459)
	at org.primefaces.model.LazyDataModel.getRowData(LazyDataModel.java:74)
	at javax.faces.component.UIData.getRowData(UIData.java:516)
	at org.primefaces.component.datatable.feature.SelectionFeature.decodeMultipleSelection(SelectionFeature.java:108)
	at org.primefaces.component.datatable.feature.SelectionFeature.decode(SelectionFeature.java:62)
	at org.primefaces.component.datatable.DataTableRenderer.decode(DataTableRenderer.java:72)
	at javax.faces.component.UIComponentBase.decode(UIComponentBase.java:479)
	at org.primefaces.component.api.UIData.processDecodes(UIData.java:358)
	at org.apache.myfaces.context.servlet.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:775)
	at org.apache.myfaces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:213)
	at org.primefaces.component.api.UIData.visitTree(UIData.java:913)
	at javax.faces.component.UIForm.visitTree(UIForm.java:357)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1047)
	at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1192)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1047)
	at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1192)
	at org.primefaces.component.api.UITabPanel.visitTree(UITabPanel.java:940)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1047)
	at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1192)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1047)
	at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1192)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1047)
	at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1192)
	at org.apache.myfaces.context.servlet.PartialViewContextImpl.processPartialExecute(PartialViewContextImpl.java:435)
	at org.apache.myfaces.context.servlet.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:416)
	at org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:65)
	at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:97)
	at org.omnifaces.context.OmniPartialViewContext.processPartial(OmniPartialViewContext.java:124)
	at javax.faces.component.UIViewRoot$ApplyRequestValuesPhaseProcessor.process(UIViewRoot.java:1854)
	at javax.faces.component.UIViewRoot._process(UIViewRoot.java:1738)
	at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:942)
	at org.apache.myfaces.lifecycle.ApplyRequestValuesExecutor.execute(ApplyRequestValuesExecutor.java:42)
	at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:195)
	at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:142)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:204)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.kitodo.production.servletfilter.EncodingFilter.doFilter(EncodingFilter.java:69)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.omnifaces.filter.GzipResponseFilter.doFilter(GzipResponseFilter.java:181)
	at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327)
	at org.kitodo.production.security.SecurityObjectAccessFilter.doFilter(SecurityObjectAccessFilter.java:86)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:122)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:116)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:109)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:147)
	at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:125)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:223)
	at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:217)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
	at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:112)
	at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:82)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
	at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211)
	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:887)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1684)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.base/java.lang.Thread.run(Thread.java:829)
Impressum Datenschutz Nutzungsbedingungen

andre-hohmann avatar Jul 27 '22 14:07 andre-hohmann

related issue: https://github.com/kitodo/kitodo-production/issues/4946

BartChris avatar Aug 12 '22 12:08 BartChris

Thanks for the hint to the other issue!

andre-hohmann avatar Aug 12 '22 12:08 andre-hohmann

This also happens, when you just go the last page and choose "Select all Rows". In my case the last page has only four entries, After selecting "select all rows" i get:

java.lang.IndexOutOfBoundsException: Index 4 out of bounds for length 4
	at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
	at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
	at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
	at java.base/java.util.Objects.checkIndex(Objects.java:372)
	at java.base/java.util.ArrayList.get(ArrayList.java:459)
	at org.primefaces.model.LazyDataModel.getRowData(LazyDataModel.java:74)

BartChris avatar Oct 31 '22 14:10 BartChris

Overriding the getRowData() method as done here https://forum.primefaces.org/viewtopic.php?f=3&t=5948

 @Override
    public Object getRowData() {
        List<Object> data = (List<Object>) getWrappedData();
        if (isRowAvailable()){
            return data.get(getRowIndex());
        } else {
            int index = data.size() - 1;
            return data.get(index);
        }
    }

seem to fix the Nullpointer issue for me.

It seems right now the application tries to access data which is not there. This does however not fix the problem outlined in this issue: https://github.com/kitodo/kitodo-production/issues/5267

BartChris avatar Nov 04 '22 07:11 BartChris

@BartChris : Thanks a lot for the investigation and the suggestions. I think that will help solving this issue very much.

andre-hohmann avatar Nov 04 '22 07:11 andre-hohmann