Kuali Rice Development
  1. Kuali Rice Development
  2. KULRICE-12259

CXF mishandles empty collections in document search customization

    Details

    • Type: Bug Fix Bug Fix
    • Status: Closed Closed
    • Priority: Major Major
    • Resolution: Complete
    • Affects Version/s: None
    • Fix Version/s: 2.4
    • Component/s: Development
    • Security Level: Public (Public: Anyone can view)
    • Similar issues:
      KULRICE-8865CollectionsFormatter - want to specify a custom message if the collection is empty
      KULRICE-6352Upgrade from apache cxf 2.3.6 to 2.3.7
      KULRICE-6395Ability to use default datatables action for an empty table
      KULRICE-790Add info about custom doc search features to Customizing Document Search Page
      KULRICE-3754Add support for custom help on custom doc searches
      KULRICE-8717Document Search issue with custom attribute date searches
      KULRICE-6197Document Search - Technical Guide
      KULRICE-3758Searching Document Operation with empty string nets null pointer exception
      KULRICE-6881Unable to customize document search results based on criteria
      KULRICE-13505Complex document search customizations test
    • Rice Module:
      KEW
    • KAI Review Status:
      Not Required
    • KTI Review Status:
      Not Required
    • Code Review Status:
      Not Required
    • Contributing Institution:
      Indiana Univ
    • Include in Release Notes?:
      Yes

      Description

      When making a web service call and passing in an empty collection CXF seems to change it to a null value. This can cause issues during document search customization since it is making a web service call to a remote client application. If no results are found to customize it throws an IllegalArgumentException instead of doing nothing like we would expect. Further, this becomes an intermittent issue because doc search defaults to only showing the documents for the current day so as soon as any documents get created which match the criteria this issue goes away. That makes it extra confusing for implementors since it can be reported but not easily reproduced.

      Example stacktrace:

      org.kuali.rice.core.api.exception.RiceIllegalArgumentException: defaultResults was null
      	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
      	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
      	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
      	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
      	at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshallException(JAXBEncoderDecoder.java:452)
      	at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:593)
      	at org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:156)
      	at org.apache.cxf.interceptor.ClientFaultConverter.processFaultDetail(ClientFaultConverter.java:153)
      	at org.apache.cxf.interceptor.ClientFaultConverter.handleMessage(ClientFaultConverter.java:80)
      	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
      	at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:99)
      	at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
      	at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
      	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
      	at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:795)
      	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:2407)
      	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:2241)
      	at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:2084)
      	at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
      	at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:732)
      	at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
      	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
      	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:544)
      	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:341)
      	at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:294)
      	at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
      	at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:124)
      	at $Proxy767.customizeResults(Unknown Source)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      	at java.lang.reflect.Method.invoke(Method.java:597)
      	at org.kuali.rice.ksb.messaging.BusClientFailureProxy.invokeInternal(BusClientFailureProxy.java:111)
      	at org.kuali.rice.core.api.util.reflect.BaseInvocationHandler.invoke(BaseInvocationHandler.java:58)
      	at $Proxy768.customizeResults(Unknown Source)
      	at org.kuali.rice.kew.docsearch.DocumentSearchCustomizationMediatorImpl.customizeResults(DocumentSearchCustomizationMediatorImpl.java:160)
      	at org.kuali.rice.kew.docsearch.service.impl.DocumentSearchServiceImpl.lookupDocuments(DocumentSearchServiceImpl.java:199)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      	at java.lang.reflect.Method.invoke(Method.java:597)
      	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
      	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
      	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
      	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
      	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
      	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
      	at $Proxy663.lookupDocuments(Unknown Source)
      	at org.kuali.rice.kew.impl.document.search.DocumentSearchCriteriaBoLookupableHelperService.getSearchResultsHelper(DocumentSearchCriteriaBoLookupableHelperService.java:121)
      	at org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl.getSearchResults(KualiLookupableHelperServiceImpl.java:60)
      	at org.kuali.rice.kns.lookup.AbstractLookupableHelperServiceImpl.performLookup(AbstractLookupableHelperServiceImpl.java:1100)
      	at org.kuali.rice.kew.impl.document.search.DocumentSearchCriteriaBoLookupableHelperService.performLookup(DocumentSearchCriteriaBoLookupableHelperService.java:289)
      	at org.kuali.rice.kns.lookup.KualiLookupableImpl.performLookup(KualiLookupableImpl.java:307)
      	at org.kuali.rice.kns.web.struts.action.KualiLookupAction.search(KualiLookupAction.java:209)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      	at java.lang.reflect.Method.invoke(Method.java:597)
      	at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:269)
      	at org.kuali.rice.kns.web.struts.action.KualiAction.dispatchMethod(KualiAction.java:168)
      	at org.kuali.rice.kns.web.struts.action.KualiAction.execute(KualiAction.java:129)
      	at org.kuali.rice.kns.web.struts.action.KualiLookupAction.execute(KualiLookupAction.java:159)
      	at org.kuali.rice.kns.web.struts.action.KualiRequestProcessor$1.doInTransaction(KualiRequestProcessor.java:486)
      	at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:130)
      	at org.kuali.rice.kns.web.struts.action.KualiRequestProcessor.processActionPerform(KualiRequestProcessor.java:482)
      	at org.kuali.rice.kns.web.struts.action.KualiRequestProcessor.processFormActionAndForward(KualiRequestProcessor.java:215)
      	at org.kuali.rice.kns.web.struts.action.KualiRequestProcessor.strutsProcess(KualiRequestProcessor.java:202)
      	at org.kuali.rice.kns.web.struts.action.KualiRequestProcessor.process(KualiRequestProcessor.java:89)
      	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
      	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
      	at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
      	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
      	at edu.iu.uis.eden.web.IUUserAccessFilter.doFilter(IUUserAccessFilter.java:88)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
      	at org.kuali.rice.kew.web.UserPreferencesFilter.doFilter(UserPreferencesFilter.java:78)
      	at org.kuali.rice.kew.web.UserPreferencesFilter.doFilter(UserPreferencesFilter.java:62)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
      	at org.kuali.rice.kew.web.UserLoginFilter.doFilter(UserLoginFilter.java:89)
      	at org.kuali.rice.kew.web.UserLoginFilter.doFilter(UserLoginFilter.java:77)
      	at edu.iu.uis.rice.web.IUUserLoginFilter.doFilter(IUUserLoginFilter.java:134)
      	at edu.iu.uis.rice.web.IUUserLoginFilter.doFilter(IUUserLoginFilter.java:74)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
      	at org.kuali.rice.kew.web.BootstrapFilterChain.doFilter(BootstrapFilter.java:271)
      	at edu.iu.uis.cas.filter.CASFilter.redirectOrForwardChain(CASFilter.java:434)
      	at edu.iu.uis.cas.filter.CASFilter.doFilterUnsynchronized(CASFilter.java:360)
      	at edu.iu.uis.cas.filter.CASFilter.doFilter(CASFilter.java:339)
      	at org.kuali.rice.kew.web.BootstrapFilterChain.doFilter(BootstrapFilter.java:264)
      	at org.kuali.rice.kew.web.BootstrapFilter.doFilter(BootstrapFilter.java:162)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
      	at org.kuali.rice.core.web.Log4JContextClearingFilter.doFilterInternal(Log4JContextClearingFilter.java:37)
      	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
      	at org.displaytag.filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java:125)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
      	at org.kuali.rice.krad.web.filter.HideWebInfFilter.doFilter(HideWebInfFilter.java:69)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
      	at edu.iu.uis.rice.web.IUTransactionFilter.doFilter(IUTransactionFilter.java:58)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
      	at edu.iu.uis.rice.web.WhitespaceFilter.doFilter(WhitespaceFilter.java:34)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
      	at edu.iu.uis.rice.web.PortalPolicyFilter.doFilter(PortalPolicyFilter.java:30)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
      	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
      	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185)
      	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
      	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)
      	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
      	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
      	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
      	at org.apache.catalina.ha.session.JvmRouteBinderValve.invoke(JvmRouteBinderValve.java:219)
      	at org.apache.catalina.ha.tcp.ReplicationValve.invoke(ReplicationValve.java:333)
      	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
      	at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:193)
      	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
      	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
      	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
      	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
      	at java.lang.Thread.run(Thread.java:662)
      

        Activity

        Hide
        Shravya Saripella (Inactive) added a comment -

        Contribution complete.

        Show
        Shravya Saripella (Inactive) added a comment - Contribution complete.

          People

          • Assignee:
            Shravya Saripella (Inactive)
            Reporter:
            James Bennett
          • Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Structure Helper Panel