Apache Sling provides a way to “decorate” resources before returning them through the Sling API. Here are some benefits and use cases for using Sling Resource Decoration.
By implementing a
ResourceDecorator, you are able to use this functionality in your Sling application.
Why Decorate Resources?
There are a few cases where using a Resource Decorator seems pretty useful.
Adding Resource Metadata
A couple of cases for implementing a Resource Decorator are mentioned in the Sling documentation on decorating resources. Docs say that you might use them to add metadata to a resource.
Here’s an example of a simple
ResourceDecorator that adds metadata to a resource:
Resource Decorators are good for wrapping resources as well. Implementing Sling’s
ResourceWrapper interface allows you to override functionality for
Resource methods, and sends calls for non-overridden methods to the underlying (or wrapped)
Resource. You can use a Resource Decorator to provide a wrapped resource with customized behavior.
This is kind of a combination of the last two cases, but you can use Resource Decorators to overlay the property set for a
Resource with other properties.
Adobe Consulting Services has sample code that illustrates this case:
Easier Script Access
This one’s more of a benefit than a use case, but if you use a Resource Decorator to add metadata or overlay properties, you can more easily access those properties in scripting languages like JSP or Sightly.
Finally, the last benefit I’ll mention of using Resource Decorators for adding metadata and overlaying properties is that it can help keep resource code with the resource, and out of the hands of helper/utility classes.
When you rely on helper/utility classes to provide resource-based operations like deriving custom properties, it can lead to extra resource resolution steps and parameter passing in your bundle code, extra Use API helpers in your Sightly scripts, or scriptlets/helper classes in your JSPs.
Using Resource Decorators can help simplify your Sling application, and help your code stick to common, resource-oriented Sling API operations.