Hi @sachin_chauhan1 ,
You may use below servlet, I tested on around 2000 nodes you may narrow down rootPath is case timed out
http://localhost:4502/bin/checkComponents?rootPath=/content/project&componentType=proejct/components/cmp1
package com.project.group.v2.core.servlets;//write your package name
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 com.day.cq.wcm.api.Page;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import javax.jcr.Session;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.day.cq.commons.jcr.JcrConstants.NT_UNSTRUCTURED;
import static com.day.cq.wcm.api.NameConstants.NT_PAGE;
import static org.apache.sling.jcr.resource.api.JcrResourceConstants.SLING_RESOURCE_TYPE_PROPERTY;
@Component(
service = {Servlet.class},
property = {
"sling.servlet.paths=/bin/checkComponents"
}
)
public class ComponentCheckerServlet extends SlingSafeMethodsServlet {
@Reference
private transient QueryBuilder queryBuilder;
private String componentType;
@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
throws ServletException, IOException {
String rootPath = request.getParameter("rootPath");
String componentType = request.getParameter("componentType");
if (rootPath == null || componentType == null) {
response.setStatus(SlingHttpServletResponse.SC_BAD_REQUEST);
response.getWriter().write("rootPath and componentType parameters are required.");
return;
}
try {
List<String> pagesWithoutComponent = new ArrayList<>();
Map<String, String> queryMap = new HashMap<>();
queryMap.put("path", rootPath);
queryMap.put("p.limit", "-1");
queryMap.put("p.offset", "0");
queryMap.put("type", NT_PAGE);
queryMap.put("1_property", "jcr:content/jcr:primaryType");
queryMap.put("1_property.value", "cq:PageContent");
ResourceResolver resourceResolver = request.getResourceResolver();
Query query = queryBuilder.createQuery(PredicateGroup.create(queryMap), resourceResolver.adaptTo(Session.class));
SearchResult result = query.getResult();
for (Hit hit : result.getHits()) {
Page page = hit.getResource().adaptTo(Page.class);
if (page != null && !hasComponent(page, componentType, resourceResolver)) {
pagesWithoutComponent.add(page.getPath());
}
}
response.setContentType("application/json");
response.getWriter().write(new ObjectMapper().writeValueAsString(pagesWithoutComponent));//we can use Gson or JSONArray or jackson
} catch (Exception e) {
response.setStatus(SlingHttpServletResponse.SC_INTERNAL_SERVER_ERROR);
response.getWriter().write("An error occurred: " + e.getMessage());
}
}
private boolean hasComponent(Page pageResource, String componentType, ResourceResolver resourceResolver) {
HashMap<String, String> queryMap = new HashMap<>();
queryMap.put("path", pageResource.getPath()+"/jcr:content");
queryMap.put("p.offset", "0");
queryMap.put("type", NT_UNSTRUCTURED);
queryMap.put("1_property", SLING_RESOURCE_TYPE_PROPERTY);
queryMap.put("1_property.value", componentType);
SearchResult searchResult = queryBuilder.createQuery(PredicateGroup.create(queryMap), resourceResolver.adaptTo(Session.class)).getResult();
return searchResult != null && searchResult.getHits() != null && !searchResult.getHits().isEmpty();
}
}
Thanks