Expand my Community achievements bar.

Modify metadata asset programatically

Avatar

Level 3

Hello,

I am trying to modify metadata/dc:description when I create an asset, but changes does not commited on CRX.

My asset is a PDF and my code:

Asset assetFitxer = assetManager.createAsset(pathDAM, inStream, mimeType, true);
Resource metadataRes = assetFitxer.adaptTo(Resource.class).getChild("jcr:content/metadata");

ModifiableValueMap map = metadataRes.adaptTo(ModifiableValueMap.class);
map.put("dc:description", newCode);
ResourceResolver rs = metadataRes.getResourceResolver();
rs.commit();

--> PDF's file has own metadata and I need to modify dc:description 

If I did commit before to change metadata and after it, changes do not save yet.

 

I think workflow dam asset does not end before I try to change dc:description, so metadata field has original value. 

 

Any suggestions?

Thanks! 

13 Replies

Avatar

Community Advisor

can you try like, after creating the asset :

 

AssetManager assetManager = resourceResolver.adaptTo(AssetManager.class);

Asset assetFitxer = assetManager.createAsset(pathDAM, inStream, mimeType, true);

 

resourceResolver.commit();
resourceResolver.refresh();

 

Then get the resource and update/set the dc:description property

Avatar

Community Advisor
Are you getting any error? or what is happening with the changes? Can you debug and see the output result? or print out the lines failing?

Avatar

Level 3
Hi, I do not have any error. I do not see property modified on DAM when I access to asset.

Avatar

Community Advisor

Can you try like ValueMap

ValueMap map = metadataRes.adaptTo(ModifiableValueMap.class);
map.put("dc:description", newCode);

 

or

can you adaptTo Node node and set the property

metadata = node.getNode("jcr:content/metadata");

metadata.setProperty("dam:sha1").getString()dc:description", newCode);

Avatar

Community Advisor

Hi @abcr1 

Try below code which I used a while ago. Hope this works for you as well.

AssetManager assetManager = resourceResolver.adaptTo(AssetManager.class);
Asset newAsset = assetManager.createAsset(assetPath, is, mimeType, true);
Node asssetNode = newAsset.adaptTo(Node.class);
Node jcr_content = (asssetNode != null && asssetNode.hasNode("jcr:content")) ? asssetNode.getNode("jcr:content") : null;
Node metadata = (jcr_content != null && jcr_content.hasNode("metadata")) ? jcr_content.getNode("metadata") : null;
metadata.setProperty("dc:description", "value");
metadata.getSession().save();

AG

Avatar

Community Advisor
Hi @abcr1, Where are you writing this code, standalone file(run main method)/Service/Model? Can you share your code snippet, it will help. And you want to create new asset and add property or update existing asset property?

Avatar

Level 3

Hi @Anudeep_Garnepudi , I execute this code on a service in a step on own workflow. I create an asset, a pdf file wich has previous metadata. Then, I need to modify its dc:description with a new value.

 

My code is simple:

 

Asset assetFitxer = assetManager.createAsset(pathDAM, inStream, mimeType, true);
Resource metadataRes = assetFitxer.adaptTo(Resource.class).getChild("jcr:content/metadata");
ResourceResolver rs = metadataRes.getResourceResolver();
rs.commit();
Thread.sleep(5000);  --> sometimes it works, I think it depends on executime time on update asset workflow not?
ModifiableValueMap map = metadataRes.adaptTo(ModifiableValueMap.class);
map.put("dc:description", codiEADOP);
rs.commit();

  

Thanks!

Avatar

Community Advisor
Hi @abcr1, your custom process step is part of OOTB DAM Update Asset workflow? If not add it as part of that workflow or make sure your workflow runs after the OOTB DAM Update Asset workflow.

Avatar

Level 3
Hi @Anudeep_Garnepudi , my workflow is external. Conflict with DAM Update Asset workflow is a suggestion mine. My workflow process documents and when I create asset with pdf file I suppose that workflow AEM affects my update on metadata property. I only can modify property after create asset, on same service. Thanks

Avatar

Community Advisor
Hi @abcr1, add Container Step at the end of DAM Update Asset workflow and configure your custom workflow so that your workflow will always execute after DAM Update Asset. Refer: https://docs.adobe.com/content/help/en/experience-manager-64/developing/extending-aem/extending-work...

Avatar

Level 4
Just to rule out the DAM Update Asset workflow as the root cause of conflict. Can you disable the workflow and try if metadata update is happening ?