Search code examples
aemsling

How to replace sling:resourceType value in bulk using query or script


How to replace sling:resourceType value in bulk using Query and Scipt.

For example I want to change sling:resourceType value from app/component/linkButton to app/component/content/linkbutton1.

The component is being used on 20 pages, and I want change it using query rather than manually on each page.


Solution

  • You can use the ACS AEM Tools open source project which includes AEM Fiddle. AEM Fiddle allows you to run scripts directly on the AEM instance without have to build.

    If you use AEM Fiddle, navigate to http://localhost:4502/miscadmin#/etc/acs-tools/aem-fiddle, click the plus sign in the top right and select .java. Insert this code and run. Make sure you update the query's path.

    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Iterator;
    
    import javax.jcr.query.Query;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletResponse;
    
    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;
    
    public class fiddle extends SlingAllMethodsServlet {
    
        @Override
        protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
            response.setStatus(HttpServletResponse.SC_OK);
            PrintWriter out = response.getWriter();
            ResourceResolver resolver = null;
    
            out.println("starting...");
    
            try {
                resolver = request.getResourceResolver();
    
                if (resolver != null) {
                    Iterator<Resource> resources = resolver.findResources("/jcr:root/content/mysite//*[@sling:resourceType='app/component/linkButton']", Query.XPATH);
    
                    while (resources.hasNext()) {
                        Resource resource = resources.next();
                        ModifiableValueMap properties = resource.adaptTo(ModifiableValueMap.class);
                        properties.put("sling:resourceType", "app/component/linkButton1");
                        resolver.commit();
                        out.println(resource.getPath());
                    }
                }
            } catch(Exception e) {
                response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
                e.printStackTrace(out);
            } finally {
                if (resolver != null && resolver.isLive()) {
                    resolver.close();
                    resolver = null;
                }
            }
    
            out.println("...finished");
        }
    }
    

    If you'd rather use JSP as you've stated, the code is the same:

    <%@include file="/libs/foundation/global.jsp"%><%
    %><%@page session="false" contentType="text/html; charset=utf-8" 
    pageEncoding="UTF-8"
    import="org.apache.sling.api.resource.*,
    java.util.*,
    javax.jcr.*,
    com.day.cq.search.*,
    com.day.cq.wcm.api.*,
    com.day.cq.dam.api.*,
    javax.jcr.query.Query,
    org.apache.sling.api.resource.ModifiableValueMap"%><%
    
        Iterator<Resource> resources = resourceResolver.findResources("/jcr:root/content/mysite//*[@sling:resourceType='app/component/linkButton']", Query.XPATH);
    
        while (resources.hasNext()) {
            Resource current = resources.next();
            ModifiableValueMap props = current.adaptTo(ModifiableValueMap.class);
            props.put("sling:resourceType", "app/component/linkButton1");
            resourceResolver.commit();
    %>
        <%=current.getPath()%>
    <%
        }
    %>