Sling Models with Sightly Part – IV (Key Annotations – II)

In this post, I will explain some important questions related to OSGi Services and Sling Models. These questions had been asked by some of my blog readers on the basis of my last blog.

So the Problem Statement is-

According to them, They have one interface with multiple service implementations and want to choose any one of these service implementations according to their need. So their questions were-

1. How to choose the desired service implementation from these service implementations in another services or servlets?
2. How to choose the desired service implementation from these service implementations in Sling Model Class?

I have created a demo implementation according to their requirement and for doing that I have created an interface named as TestService with a dummy method named as test(). Here is the code-

Now, I have created two dummy service implementations of this interface. Here is the code for the first implementation named as TestServiceFirstImpl.

Here is the code for my second implementation named as TestServiceSecondImpl.

Answer for the first question-
It is a two-step process. These steps are explained below-

Step 1
Add a new property that have a unique value for each and every service implementation. This property could be anything you want to add. For example, I am using service.label property for these services and on the basis of this property I will choose from these implementations.

Here are my new definitions for TestServiceFirstImpl class.

Code For TestServiceSecondImpl class.

Step:- 2

Use @Reference annotation in another servlet or in OSGi Service with an extra attribute named as “target”. Just redefine this line as shown below-

Try to run your code, you will get the desired output.

Q2. How to choose these services in Sling Model class?

In Sling Model class you can call an external service using two annotations. These are-
1. @OSGiService
2. @Inject with @Source annotation

If you are using @OSGiService annotation then you have an attribute “filter”, here add your condition and you will get the desired implementation as shown below-

If you are using @Inject with @Source annotation then you need to add one more annotation @Filter. Here is the new code-

Now here my complete working code that will show you the use of both of these two approaches.

Q3. How am I testing these annotations in Sling Model class?
I have created a dummy component and that component calls these Sling Model classes. Sightly code snippet is-

For complete working code, I am sharing the Git repository link.

Happy Coding..!!

Ankur Chauhan
Tech Lead

Sling Models with Sightly Part – III (Key Annotations – I)

The title of this blog is “Key Annotations – I” because In this post, I will explain two important annotations related to Sling Models and continue explaining other annotations in my coming posts. So for explaining two annotations, I have selected following two questions for this post.

1). How to include OSGI Services in Sling Model?
2). What is the use of @ResoucePath annotation?

I am assuming that you are using the latest versions of Sling Model APIs that I described in my previous blog.
For Answering first question, I have created an OSGi Service that have a dummy method as follows-

Now, You can include OSGi Services in your Sling Models using two annotations, these are-

1. @OSGiService Annotations
2. @Inject Annotation

Here is the Sling Model class, that shows how to use these annotations?

When you call this Model class then you will see that both of these two annotations working in the same manner.

Q1. What is the use of @ResoucePath annotations?
@ResoucePath annotation is a very handy annotation provide by Sling and using this annotation, you can convert a path into its resource object without writing any code. Let’s suppose you have a predefined path (e.g. /content/geometrixx/en) of the resource and want to convert that path into resource object then you can use @ResourcePath annotation.

Q2. How to use @ResoucePath annotation?
Here the code snippet that shows you the use of this annotation-

Q3. How am I testing these annotations?
I have created a dummy component and that component calls these Sling Model classes. Sightly code snippet is-

For complete working code, I am sharing the Git repository link.

Happy Coding..!!

Ankur Chauhan
Tech Lead

Sling Model with Sightly Part – I

In this post, I will explain, how to use sling models with Sightly in AEM6.x?

For doing this, I have created a project using maven archetype for AEM6. If you want to use any existing project, then you need to check two things-

1. Dependency for Sling models in your project’s pom.xml file. You can find this maven dependency in you AEM instance package finder tab as shown in fig-


Now search for this dependency in your Maven project parent pom.xml file. If it’s already there then it’s fine else add this dependency into your project.

2. In whatever java packages, you want to add your Sling Model classes, add these java packages information into your maven-bundle-plugin.
For example, I am using two java package for adding my Sling Model classes, these packages are-
sling.models and, so I have to place these package information into my maven-bundle-plugin, as shown below-

Q1). What will happen, If I don’t add these entries?

If you don’t add these entries, then maven will not add
“Sling-Model-Packages: sling.models,”
header entry in your bundle Manifest file. So that these classes will not behave as sling models and will work as simple java classes and, If you try to run your code without this entry, then you will not get desired output as well as there will be no error message in error.log file.

In this post, I will create a very basic example where I will get a name from the component dialog and print that value using Sling Model. So Let’s start-

Create a Sling model class.

Here I am using @Inject annotation on “firstName” property, it means that this property will be looked up from the resource (after first adapting it to a ValueMap) and it is injected.
@PostConstructor annotation defines that this method will run after injecting all field (having @Inject annotation) from the resource.

Create the component as shown below-

In slingModel.html file add these lines.

My dialog properties are as shown below: –

dialog Properties

Build your maven project and drop this component on your page. You will see a screen as-
1.3Open the dialog of this component and add any entry (For example “Ankur Chauhan”) you will see the desired output as-

Q2). Why are we creating Sling Model class for this example even we can directly use ${properties.firstName} in our slingModel.html file?

You are right, We can do that or you can say, we must do that. But as I already mention that, in this post I am going to show you a very basic use of Sling Model. So I think this is the simplest example for this post. You will see must better examples in my coming blogs.

I am also sharing the Git repository link.
Git repository link is –

Happy Coding..!!

Ankur Chauhan
Tech Lead

New Features in AEM 6.1 Sightly

In this blog, I will explain new features introduced in AEM6.1 Sightly. These features will make your sightly code more shorter and simple. These features are listed below.

  1. Introduction of <sly> tag.
  2. data-sly-repeat
  3. URL manipulation
  4. local for i18n

I will explain these features in the form of questionnaires, so let’s start.

Q1). What is the use of <sly> tag?
This tag is used to remove extra divs those are generated when we include a resource in our component’s HTML file using Sightly code.

Q2). We can do that using data-sly-unwrap, why <sly>?
For explaining this, Let’s consider we have to include a parsys component in our HTML without extra divs using data-sly-unwrap then your code line will be-

It will work fine but in this case, you have to first define a <div> tag to use data-sly-resource attribute and you also have to write data-sly-unwrap to remove this extra <div> tag.
Isn’t it simple if you don’t have to write this extra <div> tag and data-sly-unwrap.

Q3). How to use <sly> tag? or what is the syntax of <sly> tag?
If you want to write the same line using <sly> tag then code will be-

Here, you can see the difference between old approach and <sly> tag.

Q4). will <sly> tag not generate any extra divs?
Yes, it will not generate any extra <div> tag or any HTML DOM element, you can think it as a replacement of data-sly-unwrap Sightly tag.

Q5). is data-sly-unwrap is deprecated or removed from AEM6.1 Sightly?
No, you can use it as well but as you have a much better <sly> tag then I think data-sly-unwrap is not required. I think, It is available only to support the AEM6.0 Sightly code.

Q6). What is the data-sly-repeat tag in Sightly?
This tag is used to iterate any of the list element.

Q7). Can we do that using data-sly-list in Sightly?
Yes, you can do that by using data-sly-list but the only difference is that, if you use data-sly-repeat, you will not have to provide any container element.

Q8). Not getting your point, could you please elaborate on your statement i.e. any container element?
Let us consider you want to iterate all child pages of currentPage object then first use data-sly-list you will write the code as –

Output will be generated as –

And when you view the HTML element structure in you debugger then it will be –

Now use data-sly-repeat

Output will be –

And when you view the HTML element structure in you debugger then it will be –

You can see these generated DOM elements in debugger’s Elements tab.

Q9). We can achieve same DOM structure using data-sly-list, is it required to use data-sly-repeat for the same?
No, it is not required but using data-sly-repeat your HTML code will become shorter. For ex. If you want to achieve

output then the code you have to write with data-sly-list will be –

Here you have to add data-sly-unwrap and <div> tag for each element. But by using data-sly-repeat, These tags will not be required and your HTML looks more refined, simple and less complex.

Q10). What is URL manipulation in AEM6.1 Sightly?
In AEM 6.1 you can do some URL manipulations which are not available in AEM6.0 Sightly. Some of the examples are –
Adding extension, code is –

Output will be –

Adding scheme (http or https) if required –

Output will be –

Adding Selectors –

Output will be –

Adding Fragments –

Output will be –

Q11). What is the locale for i18n?
This locale is newly introduced object in AEM6.1. When we work with i18n in Sightly we can use this object to set custom locale. It can be used as –

Note –  This object is not present in AEM6.

I am also sharing the Git repository link where you can find demo examples for these properties.
Git repository link is –

Happy Coding..!!

Ankur Chauhan
Tech Lead