[
https://issues.apache.org/jira/browse/CAUSEWAY-3772?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Andi Huber updated CAUSEWAY-3772:
---------------------------------
Description:
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.
was:
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)
> 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
> Priority: Major
> Fix For: 2.1.0
>
> Attachments: stacktrace-3772.txt
>
>
> 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.
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)