question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

[Form Container] Proxy extension model class of Form Container results in infinite loop

See original GitHub issue

Bug Report

Current Behavior Extending the Container interface and implementing a new model class that proxies the WCM Core ContainerImpl results in an infinite loop on sling model instantiation for a Form Container added to a page. The issue is coming from the @PostConstruct implementation of ContainerImpl, which is calling FormsHelper which eventually executes a sling dispatcher include that attempts to adapt to the sling model again, and thus the cycle starts.

Expected behavior/code Extension via the proxy method is expected to be supported, to allow functionality to be added/modified from provided defaults.

Attempted implementation

import aQute.bnd.annotation.ConsumerType;
import com.adobe.cq.wcm.core.components.models.form.Container;

@ConsumerType
public interface HS2Container extends Container {

}
import com.adobe.cq.export.json.ComponentExporter;
import com.adobe.cq.wcm.core.components.models.form.Container;
import com.hs2solutions.aem.base.core.models.form.HS2Container;
import java.util.Map;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.models.annotations.Model;
import org.apache.sling.models.annotations.Via;
import org.apache.sling.models.annotations.injectorspecific.Self;
import org.apache.sling.models.annotations.via.ForcedResourceType;

@Model(
        adaptables = {Resource.class, SlingHttpServletRequest.class},
        adapters = {Container.class, HS2Container.class},
        resourceType = "hs2/components/content/form/container"
)
public class HS2ContainerImpl implements HS2Container {
    @Self
    @Via(type = ForcedResourceType.class, value = "core/wcm/components/form/container/v2/container")
    private Container superTypeContainer;

    @Override
    public String getMethod() {
        return superTypeContainer.getMethod();
    }

    @Override
    public String getAction() {
        return superTypeContainer.getAction();
    }

    @Override
    public String getId() {
        return superTypeContainer.getId();
    }

    @Override
    public String getName() {
        return superTypeContainer.getName();
    }

    @Override
    public String getEnctype() {
        return superTypeContainer.getEnctype();
    }

    @Override
    public String getResourceTypeForDropArea() {
        return superTypeContainer.getResourceTypeForDropArea();
    }

    @Override
    public String getRedirect() {
        return superTypeContainer.getRedirect();
    }

    @Override
    public String[] getExportedItemsOrder() {
        return superTypeContainer.getExportedItemsOrder();
    }

    @Override
    public Map<String, ? extends ComponentExporter> getExportedItems() {
        return superTypeContainer.getExportedItems();
    }

    @Override
    public String getExportedType() {
        return superTypeContainer.getExportedType();
    }
}

Resulting stack trace loop

	at org.apache.sling.models.impl.ModelAdapterFactory.invokePostConstruct(ModelAdapterFactory.java:896)
	at org.apache.sling.models.impl.ModelAdapterFactory.createObject(ModelAdapterFactory.java:703)
	at org.apache.sling.models.impl.ModelAdapterFactory.internalCreateModel(ModelAdapterFactory.java:394)
	at org.apache.sling.models.impl.ModelAdapterFactory.createModel(ModelAdapterFactory.java:261)
	at org.apache.sling.scripting.sightly.models.impl.SlingModelsUseProvider.provide(SlingModelsUseProvider.java:126)
	at org.apache.sling.scripting.sightly.impl.engine.extension.use.UseRuntimeExtension.call(UseRuntimeExtension.java:73)
	at org.apache.sling.scripting.sightly.impl.engine.runtime.RenderContextImpl.call(RenderContextImpl.java:69)
	at org.apache.sling.scripting.sightly.apps.core.wcm.components.form.container.v2.container.container_html.render(container_html.java:47)
	at org.apache.sling.scripting.sightly.java.compiler.RenderUnit.render(RenderUnit.java:48)
	at org.apache.sling.scripting.sightly.impl.engine.SightlyCompiledScript.eval(SightlyCompiledScript.java:61)
	at org.apache.sling.scripting.core.impl.DefaultSlingScript.call(DefaultSlingScript.java:386)
	at org.apache.sling.scripting.core.impl.DefaultSlingScript.eval(DefaultSlingScript.java:184)
	at org.apache.sling.scripting.core.impl.DefaultSlingScript.service(DefaultSlingScript.java:491)
	at org.apache.sling.engine.impl.request.RequestData.service(RequestData.java:552)
	at org.apache.sling.engine.impl.filter.SlingComponentFilterChain.render(SlingComponentFilterChain.java:44)
	at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:77)
	at com.day.cq.wcm.core.impl.WCMDeveloperModeFilter.doFilterWithErrorHandling(WCMDeveloperModeFilter.java:164)
	at com.day.cq.wcm.core.impl.WCMDeveloperModeFilter.doFilter(WCMDeveloperModeFilter.java:135)
	at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:68)
	at com.day.cq.wcm.core.impl.WCMDebugFilter.doFilter(WCMDebugFilter.java:138)
	at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:68)
	at com.day.cq.wcm.core.impl.WCMComponentFilter.doFilter(WCMComponentFilter.java:165)
	at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:68)
	at com.day.cq.wcm.core.impl.PageLockFilter.doFilter(PageLockFilter.java:91)
	at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:68)
	at com.day.cq.personalization.impl.TargetComponentFilter.doFilter(TargetComponentFilter.java:96)
	at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:68)
	at org.apache.sling.engine.impl.SlingRequestProcessorImpl.processComponent(SlingRequestProcessorImpl.java:282)
	at org.apache.sling.engine.impl.SlingRequestProcessorImpl.dispatchRequest(SlingRequestProcessorImpl.java:322)
	at org.apache.sling.engine.impl.request.SlingRequestDispatcher.dispatch(SlingRequestDispatcher.java:211)
	at org.apache.sling.engine.impl.request.SlingRequestDispatcher.include(SlingRequestDispatcher.java:104)
	at com.day.cq.wcm.core.impl.WCMComponentFilter$ForwardRequestDispatcher.include(WCMComponentFilter.java:516)
	at com.day.cq.wcm.foundation.forms.FormsHelper.includeResource(FormsHelper.java:598)
	at com.day.cq.wcm.foundation.forms.FormsHelper.runAction(FormsHelper.java:267)
	at com.adobe.cq.wcm.core.components.internal.models.v1.form.ContainerImpl.runActionTypeInit(ContainerImpl.java:146)
	at com.adobe.cq.wcm.core.components.internal.models.v1.form.ContainerImpl.initModel(ContainerImpl.java:136)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.sling.models.impl.ModelAdapterFactory.invokePostConstruct(ModelAdapterFactory.java:896)
	at org.apache.sling.models.impl.ModelAdapterFactory.createObject(ModelAdapterFactory.java:703)
	at org.apache.sling.models.impl.ModelAdapterFactory.internalCreateModel(ModelAdapterFactory.java:394)
	at org.apache.sling.models.impl.ModelAdapterFactory.createModel(ModelAdapterFactory.java:261)
	at org.apache.sling.scripting.sightly.models.impl.SlingModelsUseProvider.provide(SlingModelsUseProvider.java:126)
	at org.apache.sling.scripting.sightly.impl.engine.extension.use.UseRuntimeExtension.call(UseRuntimeExtension.java:73)
	at org.apache.sling.scripting.sightly.impl.engine.runtime.RenderContextImpl.call(RenderContextImpl.java:69)
	at org.apache.sling.scripting.sightly.apps.core.wcm.components.form.container.v2.container.container_html.render(container_html.java:47)

Issue Analytics

  • State:closed
  • Created 5 years ago
  • Comments:25 (10 by maintainers)

github_iconTop GitHub Comments

1reaction
richardhandcommented, Dec 2, 2019

The code for this issue is merged to master and will be available in the upcoming 2.8.0 release.

0reactions
andreeadraceacommented, Nov 7, 2019

The issue was fixed.

Read more comments on GitHub >

github_iconTop Results From Across the Web

Container proxy – Get this Extension for Firefox (en-US)
Download Container proxy for Firefox. Allows Firefox user assign different proxies to be used in different containers.
Read more >
3. Data model — Python 3.11.1 documentation
In order to avoid infinite recursion in this method, its implementation should always call the base class method with the same name to...
Read more >
Defects addressed in this fix pack - IBM
Solution: With this fix, on calling the requestCollection API for an exchange order does not result in infinite loop. The nature of the...
Read more >
CWE-20: Improper Input Validation (4.9) - MITRE
Input validation is a frequently-used technique for checking potentially dangerous inputs in order to ensure that the inputs are safe for ...
Read more >
HorizontalPodAutoscaler Walkthrough - Kubernetes
The container within the client Pod runs in an infinite loop, ... get the YAML of your HorizontalPodAutoscaler in the autoscaling/v2 form:.
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found