Not able to extends PageImpl.java from Core Components | Community
Skip to main content
Level 2
September 25, 2020
Solved

Not able to extends PageImpl.java from Core Components

  • September 25, 2020
  • 5 replies
  • 2996 views

Hello,

 

I have to extend the existing implementation of com.adobe.cq.wcm.core.components.internal.models.v2.PageImpl, because I have to provide an additional css class to getCssClassNames method based on some settings in page properties. But its not possible to extend this class because this class is in the "internal" package. And as I know this will not be exported to other OSGi bundles.

 

For me this means, I have to copy the code from v2.PageImpl and v1.PageImpl and all other used classes which are also in "internal" package to my project. In my opinion this kind of implementation of core components does not make any sense, because it blocks developers to reuse existing code.

 

Or does somebody have a solution for this problem?

 

regards

Reini

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 vmadala

Hello @reini1 

Since core implemented classes are in the internal package, you can't extend these classes into your package.
This is expected behavior, you can get more info about this limitation here https://github.com/adobe/aem-core-wcm-components/issues/503
I would suggest here, you don't need to copy all the code from the core implementation class (PageImpl.java),
you can use the Delegation pattern for sling models. For this, you have to write a model class and  you can add you're own methods something like below

public class MyPageImpl implements Page  {

  @1961677
@2434638(type = ResourceSuperType.class)
private Page page;  // here you'll get the actual implementation class of PageImpl

@9944223
public String getAppResourcesPath() {
return page.appResourcesPath;
}


public String getCssClassNames() {
return "my-css-class-name"
}

}

You've to use this model in your HTL file and you're component must inherit from the core page component.


Thanks,

Venkat.M

5 replies

Manjunath_K
Level 7
September 25, 2020

.

joerghoh
Adobe Employee
Adobe Employee
September 25, 2020

Hi,

It is the decision of the core component team to hide the implementation classes. My recommendation is to have that discussion at the core components repository at https://github.com/adobe/aem-core-wcm-components/issues.

You get the best answers there for this question.

vmadala
vmadalaAccepted solution
Level 3
September 26, 2020

Hello @reini1 

Since core implemented classes are in the internal package, you can't extend these classes into your package.
This is expected behavior, you can get more info about this limitation here https://github.com/adobe/aem-core-wcm-components/issues/503
I would suggest here, you don't need to copy all the code from the core implementation class (PageImpl.java),
you can use the Delegation pattern for sling models. For this, you have to write a model class and  you can add you're own methods something like below

public class MyPageImpl implements Page  {

  @1961677
@2434638(type = ResourceSuperType.class)
private Page page;  // here you'll get the actual implementation class of PageImpl

@9944223
public String getAppResourcesPath() {
return page.appResourcesPath;
}


public String getCssClassNames() {
return "my-css-class-name"
}

}

You've to use this model in your HTL file and you're component must inherit from the core page component.


Thanks,

Venkat.M

Shashi_Mulugu
Community Advisor
Community Advisor
September 26, 2020

@reini1 if you want to inject any new css classes, please use page level style system which is OOTB. Refer to below community post for reference:

 

https://experienceleaguecommunities.adobe.com/t5/adobe-experience-manager/don-t-understand-cssclassnames-in-aem-core-wcm-components-2-0-0/qaq-p/270537

arunpatidar
Community Advisor
Community Advisor
September 27, 2020

You have to extend the interface, not the actual implementation as suggested by @vmadala 

Arun Patidar