update the tags in component when tags are moved in aem  content/cq:tags/a to  content/cq:tags/b | Community
Skip to main content
Level 2
August 2, 2024
Solved

update the tags in component when tags are moved in aem  content/cq:tags/a to  content/cq:tags/b

  • August 2, 2024
  • 3 replies
  • 944 views

How to update the tags in component when tags are moved in aem  content/cq:tags/a to  content/cq:tags/b ,considering component has couple of tag fields and it has to be updated ?

 

These component references are not stored I checked all the ways but no luck!

 

Please share me the solution if anyone has it?

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
Best answer by Rajumuddana

Hi Jyothirmai,

I have an old fiddle file, but you need to make your changes on top of it then execute in Fiddle by following safety measures mentioned above.

Note - This is not Tested Code.

 

import com.day.cq.search.PredicateGroup; import com.day.cq.search.Query; import com.day.cq.search.QueryBuilder; import com.day.cq.search.result.Hit; import com.day.cq.search.result.SearchResult; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; import org.apache.sling.api.resource.ModifiableValueMap; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.servlets.SlingAllMethodsServlet; import javax.jcr.RepositoryException; import javax.jcr.Session; import java.io.IOException; import java.io.PrintWriter; import java.time.LocalTime; import java.util.*; public class UpdateProperty1 extends SlingAllMethodsServlet { protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException { // Code here PrintWriter out = response.getWriter(); out.println("Start Time - " + LocalTime.now() + "<br>"); Set<String> pathsSet = new HashSet<>(); pathsSet.add("/content/abc"); ResourceResolver resourceResolver = request.getResourceResolver(); if (resourceResolver != null) { Session session = resourceResolver.adaptTo(Session.class); QueryBuilder queryBuilder = resourceResolver.adaptTo(QueryBuilder.class); Iterator<String> iterator = pathsSet.iterator(); Set<String> pagesSet = new HashSet<>(); while (iterator.hasNext()) { String contentPath = iterator.next(); out.println("*******Processing for: " + contentPath + "*********<br><br>"); if (queryBuilder != null && session != null) { try { fetchPages(contentPath, out, queryBuilder, session, resourceResolver, pagesSet); } catch (RepositoryException e) { out.println("RepositoryException - " + e.getMessage()); } } else { out.println("querybuilder or session is null"); } } //Saving changes. /*resourceResolver.commit(); resourceResolver.close();*/ } out.println("End Time - " + LocalTime.now()); } private void fetchPages(String rootPagePath, PrintWriter out, QueryBuilder queryBuilder, Session session, ResourceResolver resourceResolver, Set<String> pagesSet) throws RepositoryException { Map<String, String> predicateMap = new HashMap<>(); predicateMap.put("type", "cq:Page"); predicateMap.put("path", rootPagePath); predicateMap.put("p.self", "true"); predicateMap.put("1_property", "jcr:content/cq:tags"); predicateMap.put("1_property.value", "<old tag value>"); predicateMap.put("1_property.operation", "contains"); predicateMap.put("p.limit", "-1"); Query query = queryBuilder.createQuery(PredicateGroup.create(predicateMap), session); SearchResult result = query.getResult(); out.println("+++++++++Total Children: " + result.getTotalMatches() + "++++++++++<br>"); List<Hit> hits = result.getHits(); Iterator<Hit> hitsIterator = hits.iterator(); int ch = 0; while (hitsIterator.hasNext()) { Hit hit = hitsIterator.next(); String path = hit.getPath(); out.println(++ch+". " + path + "<br>"); addProperty(path + "/jcr:content", out, resourceResolver, "<new tag value>"); } } private void addProperty(String pagePath, PrintWriter out, ResourceResolver resourceResolver, String newTemplateVal) { Resource pageJcrRes = resourceResolver.getResource(pagePath); ModifiableValueMap modifiableValueMap = pageJcrRes.adaptTo(ModifiableValueMap.class); if (modifiableValueMap != null) { /** * If the property is an array, you need to update array with new value, then set to property * */ modifiableValueMap.put("cq:tags", newTemplateVal); } } }

 

3 replies

Level 4
August 2, 2024

 

One approach is, you shall use AEM fiddle(http://localhost:4502/etc/acs-tools/aem-fiddle.html) and run a script to update your tag references to new location. This approach has control while updating.

Steps to follow:

1. Query the node with ‘Old tag path’.

2. Iterate over the list of nodes and update the ‘cq:tags’ property.

3. Save the session.

4. You need to re-publish the updated nodes/pages (if required).

While publishing, make sure you check below things

  • Don’t Publish unpublished/never pages.
  • Don’t Publish Language masters.
  • Staging pages. (pages are modified after publish)

Note- please take backup of the respective content before you proceed.

Level 2
August 2, 2024

Could u please share sample script ? and please do let me know if there are any other approaches too 

 

Thanks in Advance

RajumuddanaAccepted solution
Level 4
August 5, 2024

Hi Jyothirmai,

I have an old fiddle file, but you need to make your changes on top of it then execute in Fiddle by following safety measures mentioned above.

Note - This is not Tested Code.

 

import com.day.cq.search.PredicateGroup; import com.day.cq.search.Query; import com.day.cq.search.QueryBuilder; import com.day.cq.search.result.Hit; import com.day.cq.search.result.SearchResult; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; import org.apache.sling.api.resource.ModifiableValueMap; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.servlets.SlingAllMethodsServlet; import javax.jcr.RepositoryException; import javax.jcr.Session; import java.io.IOException; import java.io.PrintWriter; import java.time.LocalTime; import java.util.*; public class UpdateProperty1 extends SlingAllMethodsServlet { protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException { // Code here PrintWriter out = response.getWriter(); out.println("Start Time - " + LocalTime.now() + "<br>"); Set<String> pathsSet = new HashSet<>(); pathsSet.add("/content/abc"); ResourceResolver resourceResolver = request.getResourceResolver(); if (resourceResolver != null) { Session session = resourceResolver.adaptTo(Session.class); QueryBuilder queryBuilder = resourceResolver.adaptTo(QueryBuilder.class); Iterator<String> iterator = pathsSet.iterator(); Set<String> pagesSet = new HashSet<>(); while (iterator.hasNext()) { String contentPath = iterator.next(); out.println("*******Processing for: " + contentPath + "*********<br><br>"); if (queryBuilder != null && session != null) { try { fetchPages(contentPath, out, queryBuilder, session, resourceResolver, pagesSet); } catch (RepositoryException e) { out.println("RepositoryException - " + e.getMessage()); } } else { out.println("querybuilder or session is null"); } } //Saving changes. /*resourceResolver.commit(); resourceResolver.close();*/ } out.println("End Time - " + LocalTime.now()); } private void fetchPages(String rootPagePath, PrintWriter out, QueryBuilder queryBuilder, Session session, ResourceResolver resourceResolver, Set<String> pagesSet) throws RepositoryException { Map<String, String> predicateMap = new HashMap<>(); predicateMap.put("type", "cq:Page"); predicateMap.put("path", rootPagePath); predicateMap.put("p.self", "true"); predicateMap.put("1_property", "jcr:content/cq:tags"); predicateMap.put("1_property.value", "<old tag value>"); predicateMap.put("1_property.operation", "contains"); predicateMap.put("p.limit", "-1"); Query query = queryBuilder.createQuery(PredicateGroup.create(predicateMap), session); SearchResult result = query.getResult(); out.println("+++++++++Total Children: " + result.getTotalMatches() + "++++++++++<br>"); List<Hit> hits = result.getHits(); Iterator<Hit> hitsIterator = hits.iterator(); int ch = 0; while (hitsIterator.hasNext()) { Hit hit = hitsIterator.next(); String path = hit.getPath(); out.println(++ch+". " + path + "<br>"); addProperty(path + "/jcr:content", out, resourceResolver, "<new tag value>"); } } private void addProperty(String pagePath, PrintWriter out, ResourceResolver resourceResolver, String newTemplateVal) { Resource pageJcrRes = resourceResolver.getResource(pagePath); ModifiableValueMap modifiableValueMap = pageJcrRes.adaptTo(ModifiableValueMap.class); if (modifiableValueMap != null) { /** * If the property is an array, you need to update array with new value, then set to property * */ modifiableValueMap.put("cq:tags", newTemplateVal); } } }

 

arunpatidar
Community Advisor
Community Advisor
August 5, 2024
kautuk_sahni
Community Manager
Community Manager
August 7, 2024

@jyothirmaiad Did you find the suggestions from users helpful? Please let us know if you require more information. Otherwise, please mark the answer as correct for posterity. If you've discovered a solution yourself, we would appreciate it if you could share it with the community. Thank you!

Kautuk Sahni