Set OSGi Component properties dynamically using OCD - Use case with Sling ResourceChangeListener

This post demonstrates the use of Object Class Definition(OCD) in setting the OSGi component properties.


In general, per OSGi R6 annotations and above, we can set OSGi component properties via

  • property attribute of @Component annotation (Static values) or
  • Dynamically using @ObjectClassDefinition together with @AttributeDefinition  (property amends in run time via Config Admin or /system/console/configMgr)
    • AttributeDefinition should be framed such that it evaluates to the property name correctly (underscores are converted to dots/period)
    • Association of OCD with OSGi component happens via annotation named @Designate

Example : Component properties like service.ranking and in case of specific implementations like say WorkflowProcess, we set property named process.label and for EventHandler, it is EventConstants.EVENT_TOPIC and examples add on in a similar fashion for any OSGi Component for that matter.  

OSGi Component Properties
In order to illustrate this, I would like to consider Sling ResourceChangeListener which expects the PATHS (mandatory property) to which it should listen to and optional CHANGES (added/removed/changed) and PROPERTY_NAMES_HINT (property name on the resource)

For static property values, we would write an Implementation for Listener like below. Sling ResourceChangeListener

Now for amending properties dynamically via Config Admin, we can create OCD in a separate file or within the same OSGi component.
In this case, ResourceChangeListener.PATHS is a field for the constant value - resource.paths. Hence @AttributeDefinition would be resource_paths(). Same way for other two properties.

Complete code snippet : 


On a long run, if we are to move to AEM as a Cloud service, this use case of dynamically amending properties via Config Admin/run time changes will not be applicable. However, if there is a situation of run mode specific OSGi component properties needs, then we can create OSGi config like we usually do for custom properties. (code level changes/ no run time)

Using the same example, 
  • Generic config listens for change of jcr:lastModified property on specified Asset resource. 
  • Author listens for change of cq:lastModified property on specified Page resource

OSGi Config - ResourceChangeListener


OSGi Config - ResourceChangeListener


I had a chance to respond to similar query in the Community, sharing the respective thread for reference -  https://experienceleaguecommunities.adobe.com/t5/adobe-experience-manager/multiple-paths-handling-in-eventhandler-not-working/m-p/426921

Comments

  1. Coin Development Company Coin Development Company is a trusted partner in cryptocurrency development, offering expert team, tailored solutions, innovative technology, security, and comprehensive support. We specialize in coin creation, token development, smart contracts, and blockchain consulting. Our team focuses on staying ahead of the curve, ensuring your coin stands out in the market, and providing ongoing maintenance and updates to keep your coin running smoothly.

    ReplyDelete

Post a Comment

Popular posts from this blog

Embedding Third party dependency/OSGi bundle in AEM application hosted in AEMasCS

OSGI Factory Configuration implementation

Creation of Template Types for Editable templates