Daniel Keir Haywood created CAUSEWAY-3772: ---------------------------------------------
Summary: Sorting on a collection of view models, hitting hollow exception Key: CAUSEWAY-3772 URL: https://issues.apache.org/jira/browse/CAUSEWAY-3772 Project: Causeway Issue Type: Bug Components: Viewer Wicket Affects Versions: 2.0.0 Reporter: Daniel Keir Haywood Assignee: Andi Huber Fix For: 2.1.0 InvoiceSummary is an entity Its collection of getInvoices is a repository query: @Collection public List<InvoiceForLease> getInvoices() { return invoiceForLeaseRepository.find....(); } Its collection "invoicesDocsFra" is derived, returning view model for each entity. public class InvoiceSummary_invoiceDocsFra { private final InvoiceSummary invoiceSummary; public List<DocAndCommFra> coll() { return invoiceSummary.streamInvoices() .map(docAndCommFactory::instantiate) .collect(Collectors.toList()); } } the DocAndCommFra is a view model that wraps each invoice: @Named(DocAndCommFra.LOGICAL_TYPE_NAMED) @DomainObject(nature = Nature.VIEW_MODEL) @DomainObjectLayout @NoArgsConstructor @AllArgsConstructor(access = AccessLevel.PACKAGE) public final class DocAndCommFra { public static final String LOGICAL_TYPE_NAMED = "outgoing.invoiceforlease.DocAndCommFra"; @Property @PropertyLayout(sequence = "1") @Getter @Setter private InvoiceForLease invoice; @Property @PropertyLayout(sequence = "1.3") public Lease getLease() { return getInvoice().getLease(); } @Property() @PropertyLayout(sequence = "1.4") public CommunicationChannel getSendTo() { return getInvoice().getSendTo(); } ... } it's possible to sort the "docAndCommsFra" table on invoice, and on lease, but not on sendTo. Note that CommunicationChannel is abstract, subtypes are either EmailAddress or PostalAddress. the stack trace is: * java.lang.RuntimeException * unrecoverable error: 'JDO entity org.estatio.module.invoiceforlease.dom.InvoiceForLease (oid=354330) is in HOLLOW state, its fields are no longer valid.' * org.apache.isis.commons.internal.exceptions._Exceptions#unrecoverable(_Exceptions.java:164) * org.apache.isis.persistence.jdo.datanucleus.entities.DnStateManagerForHollow#invalidFieldAccess(DnStateManagerForHollow.java:278) * org.apache.isis.persistence.jdo.datanucleus.entities.DnStateManagerForHollow#getObjectField(DnStateManagerForHollow.java:267) * org.estatio.module.invoiceforlease.dom.InvoiceForLease#dnGetlease(InvoiceForLease.java:-1) * org.estatio.module.invoiceforlease.dom.InvoiceForLease#getLease(InvoiceForLease.java:212) * org.estatio.module.invoiceforlease.dom.lifecycle.comms.DocAndCommFra#getLease(DocAndCommFra.java:79) * jdk.internal.reflect.GeneratedMethodAccessor292#invoke(null:-1) * jdk.internal.reflect.DelegatingMethodAccessorImpl#invoke(DelegatingMethodAccessorImpl.java:43) * java.lang.reflect.Method#invoke(Method.java:566) * org.apache.isis.commons.internal.reflection._Reflect#lambda$invokeMethodOn$13(_Reflect.java:577) * org.apache.isis.commons.functional.Try#call(Try.java:58) * org.apache.isis.commons.internal.reflection._Reflect#invokeMethodOn(_Reflect.java:575) * org.apache.isis.core.metamodel.commons.CanonicalInvoker#invoke(CanonicalInvoker.java:82) * org.apache.isis.core.metamodel.object.MmInvokeUtils#invokeNoArg(MmInvokeUtils.java:108) * org.apache.isis.core.metamodel.facets.properties.accessor.PropertyAccessorFacetViaAccessor#getProperty(PropertyAccessorFacetViaAccessor.java:65) * org.apache.isis.core.metamodel.specloader.specimpl.OneToOneAssociationDefault#get(OneToOneAssociationDefault.java:155) * org.apache.isis.core.metamodel.object.ManagedObjects#lambda$orderingBy$8(ManagedObjects.java:319) * org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.CollectionContentsSortableDataProvider#lambda$sorted$0(CollectionContentsSortableDataProvider.java:91) * java.util.TimSort#countRunAndMakeAscending(TimSort.java:355) * java.util.TimSort#sort(TimSort.java:220) * java.util.Arrays#sort(Arrays.java:1515) * java.util.ArrayList#sort(ArrayList.java:1750) * org.apache.isis.commons.collections.Can_Multiple#sorted(Can_Multiple.java:123) * org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.CollectionContentsSortableDataProvider#sorted(CollectionContentsSortableDataProvider.java:91) * org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.CollectionContentsSortableDataProvider#iterator(CollectionContentsSortableDataProvider.java:81) * org.apache.wicket.markup.repeater.data.DataViewBase$ModelIterator#<init>(DataViewBase.java:107) * org.apache.wicket.markup.repeater.data.DataViewBase#getItemModels(DataViewBase.java:74) * org.apache.wicket.markup.repeater.AbstractPageableView#getItemModels(AbstractPageableView.java:99) * org.apache.wicket.markup.repeater.RefreshingView#onPopulate(RefreshingView.java:93) * org.apache.wicket.markup.repeater.AbstractRepeater#onBeforeRender(AbstractRepeater.java:124) * org.apache.wicket.markup.repeater.AbstractPageableView#onBeforeRender(AbstractPageableView.java:113) * org.apache.wicket.Component#beforeRender(Component.java:949) * org.apache.wicket.MarkupContainer#onBeforeRenderChildren(MarkupContainer.java:1759) * org.apache.wicket.Component#onBeforeRender(Component.java:3832) * org.apache.wicket.Component#beforeRender(Component.java:949) * org.apache.wicket.MarkupContainer#onBeforeRenderChildren(MarkupContainer.java:1759) * org.apache.wicket.Component#onBeforeRender(Component.java:3832) * org.apache.wicket.Component#beforeRender(Component.java:949) * org.apache.wicket.page.PartialPageUpdate#prepareComponent(PartialPageUpdate.java:380) * org.apache.wicket.page.PartialPageUpdate#writeComponents(PartialPageUpdate.java:309) * org.apache.wicket.page.PartialPageUpdate#writeTo(PartialPageUpdate.java:182) * org.apache.wicket.ajax.AjaxRequestHandler#respond(AjaxRequestHandler.java:279) * org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor#respond(RequestCycle.java:910) * org.apache.wicket.request.RequestHandlerExecutor#execute(RequestHandlerExecutor.java:63) * org.apache.wicket.request.cycle.RequestCycle#execute(RequestCycle.java:294) * org.apache.wicket.request.cycle.RequestCycle#processRequest(RequestCycle.java:255) * org.apache.wicket.protocol.http.WicketFilter#processRequestCycle(WicketFilter.java:277) * org.apache.wicket.protocol.http.WicketFilter#processRequest(WicketFilter.java:208) * org.apache.wicket.protocol.http.WicketFilter#doFilter(WicketFilter.java:307) * org.apache.catalina.core.ApplicationFilterChain#internalDoFilter(ApplicationFilterChain.java:178) * org.apache.catalina.core.ApplicationFilterChain#doFilter(ApplicationFilterChain.java:153) * org.apache.isis.core.webapp.modules.logonlog.IsisLogOnExceptionFilter#doFilter(IsisLogOnExceptionFilter.java:80) * org.apache.catalina.core.ApplicationFilterChain#internalDoFilter(ApplicationFilterChain.java:178) * org.apache.catalina.core.ApplicationFilterChain#doFilter(ApplicationFilterChain.java:153) * org.apache.isis.security.spring.webmodule.SpringSecurityFilter#lambda$doFilter$0(SpringSecurityFilter.java:77) * org.apache.isis.commons.functional.ThrowingRunnable#callUncatched(ThrowingRunnable.java:56) * org.apache.isis.core.runtimeservices.session.InteractionServiceDefault#callInternal(InteractionServiceDefault.java:326) * org.apache.isis.core.runtimeservices.session.InteractionServiceDefault#call(InteractionServiceDefault.java:267) * org.apache.isis.applib.services.iactnlayer.InteractionService#lambda$callAndCatch$0(InteractionService.java:175) * org.apache.isis.commons.functional.Try#call(Try.java:58) * org.apache.isis.applib.services.iactnlayer.InteractionService#callAndCatch(InteractionService.java:175) * org.apache.isis.applib.services.iactnlayer.InteractionService#runAndCatch(InteractionService.java:186) * org.apache.isis.security.spring.webmodule.SpringSecurityFilter#doFilter(SpringSecurityFilter.java:75) * org.apache.catalina.core.ApplicationFilterChain#internalDoFilter(ApplicationFilterChain.java:178) * org.apache.catalina.core.ApplicationFilterChain#doFilter(ApplicationFilterChain.java:153) * org.estatio.webapp.custom.redirectv1url.RedirectIfMatchesV1UrlFilter#doFilter(RedirectIfMatchesV1UrlFilter.java:60) * org.apache.catalina.core.ApplicationFilterChain#internalDoFilter(ApplicationFilterChain.java:178) * org.apache.catalina.core.ApplicationFilterChain#doFilter(ApplicationFilterChain.java:153) * org.springframework.security.web.FilterChainProxy$VirtualFilterChain#doFilter(FilterChainProxy.java:337) * org.springframework.security.web.access.intercept.AuthorizationFilter#doFilter(AuthorizationFilter.java:96) * org.springframework.security.web.FilterChainProxy$VirtualFilterChain#doFilter(FilterChainProxy.java:346) * org.springframework.security.web.access.ExceptionTranslationFilter#doFilter(ExceptionTranslationFilter.java:122) * org.springframework.security.web.access.ExceptionTranslationFilter#doFilter(ExceptionTranslationFilter.java:116) * org.springframework.security.web.FilterChainProxy$VirtualFilterChain#doFilter(FilterChainProxy.java:346) * org.springframework.security.web.session.SessionManagementFilter#doFilter(SessionManagementFilter.java:126) * org.springframework.security.web.session.SessionManagementFilter#doFilter(SessionManagementFilter.java:81) * org.springframework.security.web.FilterChainProxy$VirtualFilterChain#doFilter(FilterChainProxy.java:346) * org.springframework.security.web.authentication.AnonymousAuthenticationFilter#doFilter(AnonymousAuthenticationFilter.java:109) * org.springframework.security.web.FilterChainProxy$VirtualFilterChain#doFilter(FilterChainProxy.java:346) * org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter#doFilter(SecurityContextHolderAwareRequestFilter.java:149) * org.springframework.security.web.FilterChainProxy$VirtualFilterChain#doFilter(FilterChainProxy.java:346) * org.springframework.security.web.savedrequest.RequestCacheAwareFilter#doFilter(RequestCacheAwareFilter.java:63) * org.springframework.security.web.FilterChainProxy$VirtualFilterChain#doFilter(FilterChainProxy.java:346) * org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter#doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) * org.springframework.web.filter.OncePerRequestFilter#doFilter(OncePerRequestFilter.java:117) * org.springframework.security.web.FilterChainProxy$VirtualFilterChain#doFilter(FilterChainProxy.java:346) * org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter#doFilter(DefaultLoginPageGeneratingFilter.java:237) * org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter#doFilter(DefaultLoginPageGeneratingFilter.java:223) * org.springframework.security.web.FilterChainProxy$VirtualFilterChain#doFilter(FilterChainProxy.java:346) * org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter#doFilter(AbstractAuthenticationProcessingFilter.java:223) * org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter#doFilter(AbstractAuthenticationProcessingFilter.java:217) * org.springframework.security.web.FilterChainProxy$VirtualFilterChain#doFilter(FilterChainProxy.java:346) * org.springframework.security.web.authentication.logout.LogoutFilter#doFilter(LogoutFilter.java:103) * org.springframework.security.web.authentication.logout.LogoutFilter#doFilter(LogoutFilter.java:89) * org.springframework.security.web.FilterChainProxy$VirtualFilterChain#doFilter(FilterChainProxy.java:346) * org.springframework.security.web.csrf.CsrfFilter#doFilterInternal(CsrfFilter.java:117) * org.springframework.web.filter.OncePerRequestFilter#doFilter(OncePerRequestFilter.java:117) * org.springframework.security.web.FilterChainProxy$VirtualFilterChain#doFilter(FilterChainProxy.java:346) * org.springframework.web.filter.CorsFilter#doFilterInternal(CorsFilter.java:91) * org.springframework.web.filter.OncePerRequestFilter#doFilter(OncePerRequestFilter.java:117) * org.springframework.security.web.FilterChainProxy$VirtualFilterChain#doFilter(FilterChainProxy.java:346) * org.springframework.security.web.header.HeaderWriterFilter#doHeadersAfter(HeaderWriterFilter.java:90) * org.springframework.security.web.header.HeaderWriterFilter#doFilterInternal(HeaderWriterFilter.java:75) * org.springframework.web.filter.OncePerRequestFilter#doFilter(OncePerRequestFilter.java:117) * org.springframework.security.web.FilterChainProxy$VirtualFilterChain#doFilter(FilterChainProxy.java:346) * org.springframework.security.web.context.SecurityContextPersistenceFilter#doFilter(SecurityContextPersistenceFilter.java:112) * org.springframework.security.web.context.SecurityContextPersistenceFilter#doFilter(SecurityContextPersistenceFilter.java:82) * org.springframework.security.web.FilterChainProxy$VirtualFilterChain#doFilter(FilterChainProxy.java:346) * org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter#doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) * org.springframework.web.filter.OncePerRequestFilter#doFilter(OncePerRequestFilter.java:117) * org.springframework.security.web.FilterChainProxy$VirtualFilterChain#doFilter(FilterChainProxy.java:346) * org.springframework.security.web.session.DisableEncodeUrlFilter#doFilterInternal(DisableEncodeUrlFilter.java:42) * org.springframework.web.filter.OncePerRequestFilter#doFilter(OncePerRequestFilter.java:117) * org.springframework.security.web.FilterChainProxy$VirtualFilterChain#doFilter(FilterChainProxy.java:346) * org.springframework.security.web.FilterChainProxy#doFilterInternal(FilterChainProxy.java:221) * org.springframework.security.web.FilterChainProxy#doFilter(FilterChainProxy.java:186) * org.springframework.web.filter.DelegatingFilterProxy#invokeDelegate(DelegatingFilterProxy.java:354) * org.springframework.web.filter.DelegatingFilterProxy#doFilter(DelegatingFilterProxy.java:267) * org.apache.catalina.core.ApplicationFilterChain#internalDoFilter(ApplicationFilterChain.java:178) * org.apache.catalina.core.ApplicationFilterChain#doFilter(ApplicationFilterChain.java:153) * org.springframework.web.filter.FormContentFilter#doFilterInternal(FormContentFilter.java:93) * org.springframework.web.filter.OncePerRequestFilter#doFilter(OncePerRequestFilter.java:117) * org.apache.catalina.core.ApplicationFilterChain#internalDoFilter(ApplicationFilterChain.java:178) * org.apache.catalina.core.ApplicationFilterChain#doFilter(ApplicationFilterChain.java:153) * org.springframework.web.filter.CharacterEncodingFilter#doFilterInternal(CharacterEncodingFilter.java:201) * org.springframework.web.filter.OncePerRequestFilter#doFilter(OncePerRequestFilter.java:117) * org.apache.catalina.core.ApplicationFilterChain#internalDoFilter(ApplicationFilterChain.java:178) * org.apache.catalina.core.ApplicationFilterChain#doFilter(ApplicationFilterChain.java:153) * org.apache.catalina.core.StandardWrapperValve#invoke(StandardWrapperValve.java:168) * org.apache.catalina.core.StandardContextValve#invoke(StandardContextValve.java:90) * org.apache.catalina.authenticator.AuthenticatorBase#invoke(AuthenticatorBase.java:481) * org.apache.catalina.core.StandardHostValve#invoke(StandardHostValve.java:130) * org.apache.catalina.valves.ErrorReportValve#invoke(ErrorReportValve.java:93) * org.apache.catalina.core.StandardEngineValve#invoke(StandardEngineValve.java:74) * org.apache.catalina.connector.CoyoteAdapter#service(CoyoteAdapter.java:342) * org.apache.coyote.http11.Http11Processor#service(Http11Processor.java:390) * org.apache.coyote.AbstractProcessorLight#process(AbstractProcessorLight.java:63) * org.apache.coyote.AbstractProtocol$ConnectionHandler#process(AbstractProtocol.java:928) * org.apache.tomcat.util.net.NioEndpoint$SocketProcessor#doRun(NioEndpoint.java:1794) * org.apache.tomcat.util.net.SocketProcessorBase#run(SocketProcessorBase.java:52) * org.apache.tomcat.util.threads.ThreadPoolExecutor#runWorker(ThreadPoolExecutor.java:1191) * org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker#run(ThreadPoolExecutor.java:659) * org.apache.tomcat.util.threads.TaskThread$WrappingRunnable#run(TaskThread.java:61) * java.lang.Thread#run(Thread.java:829) -- This message was sent by Atlassian Jira (v8.20.10#820010)