dotCMS / core

Headless/Hybrid Content Management System for Enterprises
http://dotcms.com
Other
846 stars 465 forks source link

StackOverflow rendering Widget code #30089

Open fabrizzio-dotCMS opened 4 hours ago

fabrizzio-dotCMS commented 4 hours ago

Parent Issue

No response

Problem Statement

When rendering content that includes a permissionableParent field we run into StackOverfowException rendering the json

Steps to Reproduce

  1. create a Content Type Widget with the following code:

#set($results = $dotcontent.pull("+contentType:Blog",10,"modDate desc"))

## Not used but needed for the dotJSON to work
<span>$results</span>

#set($resultList = [])

#if($results.size() > 0)
    #foreach($con in $results)
        #set($resultdoc = $con.getContentObject())
        #set($notUsedValue = $resultList.add($resultdoc))
    #end

    $dotJSON.put("posts", $resultList)
#end
  1. Now create an instance of the widget
  2. Go to the History tab and click on JSON (The later will fire the content resource using the contents returned by the velocity code on the widget )

The resulting page says 500 And the logs show the following stacktrace:

java.lang.StackOverflowError
javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: java.lang.StackOverflowError
    at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:487) ~[?:?]
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:425) ~[?:?]
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:383) ~[?:?]
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:336) ~[?:?]
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:223) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
    at com.dotmarketing.filters.CMSFilter.doFilterInternal(CMSFilter.java:181) ~[?:?]
    at com.dotmarketing.filters.CMSFilter.doFilter(CMSFilter.java:61) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
    at com.dotcms.filters.interceptor.AbstractWebInterceptorSupportFilter.doFilter(AbstractWebInterceptorSupportFilter.java:90) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
    at com.dotcms.filters.interceptor.AbstractWebInterceptorSupportFilter.doFilter(AbstractWebInterceptorSupportFilter.java:90) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
    at com.dotcms.visitor.filter.servlet.VisitorFilter.doFilter(VisitorFilter.java:81) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
    at com.dotcms.vanityurl.filters.VanityURLFilter.doFilter(VanityURLFilter.java:107) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
    at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) ~[?:?]
    at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) ~[?:?]
    at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) ~[?:?]
    at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:389) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
    at com.dotmarketing.filters.TimeMachineFilter.doFilter(TimeMachineFilter.java:137) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
    at com.dotmarketing.filters.ThreadNameFilter.doFilter(ThreadNameFilter.java:88) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
    at com.dotmarketing.filters.CookiesFilter.doFilter(CookiesFilter.java:53) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
    at com.dotmarketing.filters.CharsetEncodingFilter.doFilter(CharsetEncodingFilter.java:99) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
    at com.dotcms.filters.interceptor.AbstractWebInterceptorSupportFilter.doFilter(AbstractWebInterceptorSupportFilter.java:90) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
    at org.apache.catalina.filters.HttpHeaderSecurityFilter.doFilter(HttpHeaderSecurityFilter.java:129) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
    at com.dotcms.filters.NormalizationFilter.doFilter(NormalizationFilter.java:89) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[?:?]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[?:?]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168) ~[?:?]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[?:?]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) ~[?:?]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) ~[?:?]
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:670) ~[?:?]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[?:?]
    at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:765) ~[?:?]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[?:?]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) ~[?:?]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) ~[?:?]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[?:?]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928) ~[?:?]
    at org.apache.tomcat.util.net.Nio2Endpoint$SocketProcessor.doRun(Nio2Endpoint.java:1732) ~[?:?]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[?:?]
    at org.apache.tomcat.util.net.AbstractEndpoint.processSocket(AbstractEndpoint.java:1295) ~[?:?]
    at org.apache.tomcat.util.net.Nio2Endpoint$Nio2SocketWrapper$2.completed(Nio2Endpoint.java:643) ~[?:?]
    at org.apache.tomcat.util.net.Nio2Endpoint$Nio2SocketWrapper$2.completed(Nio2Endpoint.java:619) ~[?:?]
    at org.apache.tomcat.util.net.SecureNio2Channel$1.completed(SecureNio2Channel.java:1009) ~[?:?]
    at org.apache.tomcat.util.net.SecureNio2Channel$1.completed(SecureNio2Channel.java:937) ~[?:?]
    at java.base/sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:127) ~[?:?]
    at java.base/sun.nio.ch.Invoker$2.run(Invoker.java:219) ~[?:?]
    at java.base/sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112) ~[?:?]
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[?:?]
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[?:?]
    at java.base/java.lang.Thread.run(Thread.java:829) [?:?]
Caused by: org.glassfish.jersey.server.ContainerException: java.lang.StackOverflowError
    at org.glassfish.jersey.servlet.internal.ResponseWriter.rethrow(ResponseWriter.java:278) ~[?:?]
    at org.glassfish.jersey.servlet.internal.ResponseWriter.failure(ResponseWriter.java:260) ~[?:?]
    at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:509) ~[?:?]
    at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:334) ~[?:?]
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) ~[?:?]
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) ~[?:?]
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) ~[?:?]
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) ~[?:?]
    at org.glassfish.jersey.internal.Errors.process(Errors.java:267) ~[?:?]
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) ~[?:?]
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305) ~[?:?]
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154) ~[?:?]
    at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:471) ~[?:?]
    ... 77 more
Caused by: java.lang.StackOverflowError
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.populateMap(JSONObject.java:927) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.<init>(JSONObject.java:260) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.wrap(JSONObject.java:1557) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.populateMap(JSONObject.java:929) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.<init>(JSONObject.java:260) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.wrap(JSONObject.java:1557) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.populateMap(JSONObject.java:929) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.<init>(JSONObject.java:260) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.wrap(JSONObject.java:1557) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.populateMap(JSONObject.java:929) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.<init>(JSONObject.java:260) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.wrap(JSONObject.java:1557) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.populateMap(JSONObject.java:929) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.<init>(JSONObject.java:260) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.wrap(JSONObject.java:1557) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.populateMap(JSONObject.java:929) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.<init>(JSONObject.java:260) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.wrap(JSONObject.java:1557) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.populateMap(JSONObject.java:929) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.<init>(JSONObject.java:260) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.wrap(JSONObject.java:1557) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.populateMap(JSONObject.java:929) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.<init>(JSONObject.java:260) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.wrap(JSONObject.java:1557) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.populateMap(JSONObject.java:929) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.<init>(JSONObject.java:260) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.wrap(JSONObject.java:1557) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.populateMap(JSONObject.java:929) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.<init>(JSONObject.java:260) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.wrap(JSONObject.java:1557) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.populateMap(JSONObject.java:929) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.<init>(JSONObject.java:260) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.wrap(JSONObject.java:1557) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.populateMap(JSONObject.java:929) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.<init>(JSONObject.java:260) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.wrap(JSONObject.java:1557) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.populateMap(JSONObject.java:929) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.<init>(JSONObject.java:260) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.wrap(JSONObject.java:1557) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.populateMap(JSONObject.java:929) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.<init>(JSONObject.java:260) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.wrap(JSONObject.java:1557) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.populateMap(JSONObject.java:929) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.<init>(JSONObject.java:260) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.wrap(JSONObject.java:1557) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.populateMap(JSONObject.java:929) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.<init>(JSONObject.java:260) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.wrap(JSONObject.java:1557) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.populateMap(JSONObject.java:929) ~[?:?]
    at com.dotmarketing.util.json.JSONObject.<init>(JSONObject.java:260) ~[?:?]

Acceptance Criteria

We should be able to render the content returned by the velocity code

dotCMS Version

current trunk

Proposed Objective

Customer Success

Proposed Priority

Priority 1 - Show Stopper

External Links... Slack Conversations, Support Tickets, Figma Designs, etc.

More details here https://dotcms.slack.com/archives/C028Z3R2D/p1726760713047939

Assumptions & Initiation Needs

No response

Quality Assurance Notes & Workarounds

No response

Sub-Tasks & Estimates

No response

fabrizzio-dotCMS commented 4 hours ago

The issue lies in the methods @JsonIgnore public Permissionable getParentPermissionable() when they return an object that contains another parentPermissionable property within itself, and this new parentPermissionable has another parentPermissionable inside it, causing an infinite loop. The parentPermissionable property has already been marked with com.fasterxml.jackson.annotation.JsonIgnore, but our src/main/java/com/dotmarketing/util/json/JSONObject.java doesn't understand such annotation, as it only recognizes the com.dotmarketing.util.json.JSONIgnore. I'm certain that the annotations were changed at some point, neglecting that they were necessary for JSONObject.