如何使用查询或脚本批量替换 sling:resourceType 值

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

如何使用 Query 和 Scipt 批量替换 sling:resourceType 值。

例如我想更改 sling:resourceType 值 从 app/component/linkButtonapp/component/content/linkbutton1.

该组件在 20 个页面上使用,我想使用查询而不是在每个页面上手动更改它。

可以使用ACS AEM Tools open source project which includes AEM Fiddle。 AEM Fiddle 允许您直接在 AEM 实例上 运行 脚本,而无需构建。

如果您使用 AEM Fiddle,请导航至 http://localhost:4502/miscadmin#/etc/acs-tools/aem-fiddle,单击右上角的加号,然后单击 select .java。插入此代码和 运行。确保更新查询的路径。

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");
    }
}

如果您更愿意像您所说的那样使用 JSP,代码是相同的:

<%@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()%>
<%
    }
%>

目的的最佳选择是groovy console

执行此任务的以下脚本:

import javax.jcr.Node

getNode('/content/').recurse { resourceNode ->
    if (resourceNode.hasProperty('sling:resourceType')) {
        final def resourceType = resourceNode.getProperty('sling:resourceType').string
        if (resourceType.equals('OLD_RESOURCE_TYPE')) {
            println "changing " + resourceNode.path
            resourceNode.setProperty('sling:resourceType', 'NEW_RESOURCE_TYPE')
            resourceNode.save();
        }
    }
}

另一个肮脏的方法,但对我有用。 :)

  1. 打包路径,下载zip文件
  2. 解压到一个文件夹。
  3. 根据您的操作系统,
    • 如果使用 Windows,请使用 Notepad++ 使用您的搜索模式在目录下的所有文件中查找替换。
    • 如果 linux,使用 find 或 sed 命令替换 director 中的所有匹配项

AEM ACS TOOLS怎么样?

它是 sling:resourceTypecq:Template 的批量更新工具。

Click here for the article on Getting Started

Click here for the Github Repo

祝你好运...

你也可以看看吊索管。

https://sling.apache.org/documentation/bundles/sling-pipes.html

这是您问题的完美解决方案