Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set a resource property

Tags:

jcr

aem

sling

I have a Sling Resource object. What is the best way to set or update its property?

like image 404
Tomek Rękawek Avatar asked Jul 09 '14 20:07

Tomek Rękawek


3 Answers

It depends on the Sling version:

Sling >= 2.3.0 (since CQ 5.6)

Adapt your resource to ModifiableValueMap, use its put method and commit the resource resolver:

ModifiableValueMap map = resource.adaptTo(ModifiableValueMap.class);
map.put("property", "value");
resource.getResourceResolver().commit();

Sling < 2.3.0 (CQ 5.5 and earlier)

Adapt your resource to PersistableValueMap, use its put and save methods:

PersistableValueMap map = resource.adaptTo(PersistableValueMap.class);
map.put("property", "value");
map.save();

JCR API

You may also adapt the resource to Node and use the JCR API to change property. However, it's a good idea to stick to one abstraction layer and in this case we somehow break the Resource abstraction provided by Sling.

Node node = resource.adaptTo(Node.class);
node.setProperty("property", "value");
node.getSession().save();
like image 121
Tomek Rękawek Avatar answered Nov 14 '22 12:11

Tomek Rękawek


As many developers are not fond of using Node API. You can also use ValueMap and ModifiableValueMap APIs to read and update property respectively.

Read Value through ValueMap

ValueMap valueMap = resource.getValueMap();
valueMap.get("yourProperty", String.class);

Write/Modify property through ModifiableValueMap

ModifiableValueMap modifiableValueMap = resource.adaptTo(ModifiableValueMap.class);
modifiableValueMap.put("NewProperty", "Your Value");  //write
modifiableValueMap.put("OldProperty", "Updated Value"); // Modify

After writing property to a node, save these values by committing the 'resourceResolver'

You'll need system/service user for admin resourceResolver.

Go through this documentation for more info about service user.

like image 21
Manisha Avatar answered Nov 14 '22 11:11

Manisha


It is not working in publish. But if user logged-In as admin it will work.

ModifiableValueMap map = resource.adaptTo(ModifiableValueMap.class);
map.put("property", "value");
resource.getResourceResolver().commit();
like image 32
vasi Avatar answered Nov 14 '22 11:11

vasi