[ 
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)

Reply via email to