[KULRICE-12259] CXF mishandles empty collections in document search customization Created: 25/Mar/14  Updated: 27/Mar/14  Resolved: 27/Mar/14

Status: Closed
Project: Kuali Rice Development
Component/s: Development
Affects Version/s: None
Fix Version/s: 2.4
Security Level: Public (Public: Anyone can view)

Type: Bug Fix Priority: Major
Reporter: James Bennett Assignee: Shravya Saripella (Inactive)
Resolution: Complete Votes: 0
Labels: IU_Bug_Fix_Contribution
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

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)


 Comments   
Comment by Shravya Saripella (Inactive) [ 27/Mar/14 ]

Contribution complete.

Generated at Sun Sep 20 12:08:43 CDT 2020 using JIRA 7.0.11#70121-sha1:19d24976997c1d95f06f3e327e087be0b71f28d4.