extending core components | Community
Skip to main content
bsr060893
Level 3
September 5, 2020
Solved

extending core components

  • September 5, 2020
  • 2 replies
  • 3300 views

Hi,

 

I am extending the core component ImageImpl, So i added the below line to my model

public class ImageServiceImpl extends ImageImpl implements Image

where ImageImpl of type com.adobe.cq.wcm.core.components.internal.models.v2.ImageImpl

 

As soon as i build the code the component will breaks because of extending the ImageImpl.

 

Why am i not allowed to extend the core ImageImpl?

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
Best answer by vanegi

Hi @bsr060893,

Please check this blog https://levelup.gitconnected.com/aem-extend-core-component-models-using-resource-type-association-and-delegation-b8855ed281e2 that outlines how we can extend core component models using resource type association and delegation. It explains about extending core component ImageImpl from scratch.

 

The core component Image component relies on a class called ImageImpl to implement it’s model. You can use the delegation pattern to override the core component model’s behavior and rely on the core Image interface to provide the methods you need:

 

 

 

import com.adobe.cq.wcm.core.components.models.Image; import lombok.experimental.Delegate; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.resource.Resource; import org.apache.sling.models.annotations.DefaultInjectionStrategy; 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.injectorspecific.ValueMapValue; import org.apache.sling.models.annotations.via.ResourceSuperType; @Model( adaptables = {Resource.class, SlingHttpServletRequest.class}, adapters = Image.class, // Adapts to the CC model interface resourceType = "demo/components/content/image", // Maps to OUR component, not the CC component defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL // No properties? No problem! ) public class CustomImage implements Image { // We will be honoring the contract between the HTL and the model implementation @Self // Indicates that we are resolving the current resource @Via(type = ResourceSuperType.class) // Resolve not as this model, but as the model of our supertype (ie: CC Image) @Delegate(excludes = DelegationExclusion.class) // Delegate all our methods to the CC Image except those defined below private Image delegate; @ValueMapValue private boolean useOriginal; // This is a new property that we are introducing @ValueMapValue protected String fileReference; // This is the CC Image property that point to the image asset location in the DAM @Override public String getSrc() { // If useOriginal is checked, then serve the raw asset in full resolution, otherwise, // delegate this method to the CC Image return useOriginal ? fileReference : delegate.getSrc(); } private interface DelegationExclusion { // Here we define the methods we want to override String getSrc(); // Override the method which determines the source of the asset } } view rawCustomImage.java hosted with ❤ by GitHub

 

 

 

Thanks!!

2 replies

Surabhi_Katiyar
Adobe Employee
Adobe Employee
September 6, 2020

Check the AEM error.log file for the error you are getting that will give a trace of the error that is coming up.

 

Also, confirm the AEM Core Component version you are using. If you are using 2.8.0 then there is a bug which has been fixed and similar issue has been discussed in the below link please check once:

 

https://github.com/adobe/aem-core-wcm-components/issues/928

bsr060893
bsr060893Author
Level 3
September 6, 2020
I am using 2.8.0. will check with the latest. Thank you
vanegi
Adobe Employee
vanegiAdobe EmployeeAccepted solution
Adobe Employee
September 7, 2020

Hi @bsr060893,

Please check this blog https://levelup.gitconnected.com/aem-extend-core-component-models-using-resource-type-association-and-delegation-b8855ed281e2 that outlines how we can extend core component models using resource type association and delegation. It explains about extending core component ImageImpl from scratch.

 

The core component Image component relies on a class called ImageImpl to implement it’s model. You can use the delegation pattern to override the core component model’s behavior and rely on the core Image interface to provide the methods you need:

 

 

 

import com.adobe.cq.wcm.core.components.models.Image; import lombok.experimental.Delegate; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.resource.Resource; import org.apache.sling.models.annotations.DefaultInjectionStrategy; 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.injectorspecific.ValueMapValue; import org.apache.sling.models.annotations.via.ResourceSuperType; @Model( adaptables = {Resource.class, SlingHttpServletRequest.class}, adapters = Image.class, // Adapts to the CC model interface resourceType = "demo/components/content/image", // Maps to OUR component, not the CC component defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL // No properties? No problem! ) public class CustomImage implements Image { // We will be honoring the contract between the HTL and the model implementation @Self // Indicates that we are resolving the current resource @Via(type = ResourceSuperType.class) // Resolve not as this model, but as the model of our supertype (ie: CC Image) @Delegate(excludes = DelegationExclusion.class) // Delegate all our methods to the CC Image except those defined below private Image delegate; @ValueMapValue private boolean useOriginal; // This is a new property that we are introducing @ValueMapValue protected String fileReference; // This is the CC Image property that point to the image asset location in the DAM @Override public String getSrc() { // If useOriginal is checked, then serve the raw asset in full resolution, otherwise, // delegate this method to the CC Image return useOriginal ? fileReference : delegate.getSrc(); } private interface DelegationExclusion { // Here we define the methods we want to override String getSrc(); // Override the method which determines the source of the asset } } view rawCustomImage.java hosted with ❤ by GitHub

 

 

 

Thanks!!