An overriding concept is a pretty known subject in AEM. Components can be overridden in an application with a sling resolution technique. Similarly, Apache sling has a resolution order to resolve OSGi configs as well. Basically, application-specific config’s can override AEM Libs configs. For more details on OSGI config & their resolution order, Read my posts here.
- How does OSGi Config work?
- AEM OSGi Config Resolution Order
Scenarios/Problems
Let’s consider a scenario of a project where you have to use another AEM Project or third-party source code like ACS Commons. And, there are some services which you want to use but with different configurations. Assume services do have configurations in place.
Now you might be thinking that what is the big deal in that. We can upload third-party code & change the configuration. Well, That is the whole point. The moment you change the configuration for your application, One more maintenance issue happens. Got it? No?
No worry. The issue is that every time you update/install third-party code for your application, You have to manually change the configuration. You might think it is okay. But it is not when you have to support the same in every environment after every deployment. Someone has to fix every time. And what if the configuration has to be updated in prod publish environment. It is tough to maintain. Let me explain with config files.
#Thirdparty config’s XML File match for ContentFeed service under config.publish folder & apps folder is /apps/abc/thirdparty/. ContentFeed Service is part of platform code base.
Let’s consider a scenario of a project where you have to use another AEM Project or third-party source code like ACS Commons. And, there are some services which you want to use but with different configurations. Assume services do have configurations in place.
Now you might be thinking that what is the big deal in that. We can upload third-party code & change the configuration. Well, That is the whole point. The moment you change the configuration for your application, One more maintenance issue happens. Got it? No?
No worry. The issue is that every time you update/install third-party code for your application, You have to manually change the configuration. You might think it is okay. But it is not when you have to support the same in every environment after every deployment. Someone has to fix every time. And what if the configuration has to be updated in prod publish environment. It is tough to maintain. Let me explain with config files.
#Thirdparty config’s XML File match for ContentFeed service under config.publish folder & apps folder is /apps/abc/thirdparty/. ContentFeed Service is part of platform code base.
#Base config: com.abc.core.contentFeed.xml
<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0"
jcr:primaryType="sling:OsgiConfig"
contentFeedPath="https://example.com/api/core/platform"/>
#Your application would like to override this config. And apps are/apps/myapp etc.
#Brand specific config: com.abc.core.contentFeed.xml
<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0"
jcr:primaryType="sling:OsgiConfig"
contentFeedPath="https://example.com/api/feed<myapp-feeds>"/>
Now, ContentFeed service does not pick your application-specific config & even though you have the same config in your application. It always picks up the third party config. And it happens ContentFeed service is part of platform source code. I hope the problem is clear to you now. let’s see a solution.
General Solution
A general approach is to keep modifying third-party configs in every environment after each deployment. And, When QA reports this or that not working, a new person struggles to find why it is not working. Most of us do not remember that service configs are overridden by the deployment. The second approach is to override the full code itself with different service names & configurations. Must easy to maintain but having duplicate code & same bugs as third-party has. And fixing bugs every time something fixed in the third-party source.
Alternative Solution
The solution to the above problem is simple. Make sure your app config file name is the same as third-party config. Read about the XML config & service naming convention. AEM OSGi Config Resolution Order
To make sure Service picks your configuration, You need to create the same XML config under the same run mode folder & with additional run mode info because that is how AEM put precedence over other config’s. Let me explain with the source code.
The solution to the above problem is simple. Make sure your app config file name is the same as third-party config. Read about the XML config & service naming convention. AEM OSGi Config Resolution Order
To make sure Service picks your configuration, You need to create the same XML config under the same run mode folder & with additional run mode info because that is how AEM put precedence over other config’s. Let me explain with the source code.
#Third-Party config file name is com.abc.core.contentFeed.xml
folder structure is: /apps/third-party/config.publish, config.author etc.
#Your app config name must be com.abc.core.contentFeed.xml
your Folder structure for config must be: /apps/third-party/config.publish.qa, /apps/third-party/config.publish.stage etc.
I hope the solution is clear to you. The solution seems easy but it solves the general problems.
No comments:
Post a Comment
If you have any doubts or questions, please let us know.