Expand my Community achievements bar.

Don’t miss the AEM Skill Exchange in SF on Nov 14—hear from industry leaders, learn best practices, and enhance your AEM strategy with practical tips.
SOLVED

ACS Commons MCP is not capturing correct report

Avatar

Level 4

Hi All,

 

I have created a MCP, which captures pages with certain flag, if flag is true then that should be a part of MCP. It seems that while running the process it only fetches recent results. For example pages created on 16thoct will not come in report generated on 17oct, if they come results are truncated. Any help is appreciated.

Please find code of the MCP below.

package com.jh.aem.core.mcp;

import com.adobe.acs.commons.fam.ActionManager;
import com.adobe.acs.commons.mcp.ProcessDefinition;
import com.adobe.acs.commons.mcp.ProcessInstance;
import com.adobe.acs.commons.mcp.form.FormField;
import com.adobe.acs.commons.mcp.form.SelectComponent;
import com.adobe.acs.commons.mcp.model.GenericReport;
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.resource.LoginException;
import org.apache.sling.api.resource.PersistenceException;
import org.apache.sling.api.resource.ResourceResolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.jcr.RepositoryException;
import javax.jcr.Session;
import java.util.*;

public class ProcessManualClinicalTrails extends ProcessDefinition {

private static final Logger LOGGER = LoggerFactory.getLogger(ProcessManualClinicalTrails.class);
private static final String NON_ONCOLOGY_PATH = "/content/health2021/us/en/clinical-trials/non-oncology-studies";
private static final String ONCOLOGY_PATH = "/content/health2021/us/en/clinical-specialties/cancer/clinical-trials";

@FormField(
name = "Clinical Trial Type",
description = "Oncology or Non-Oncology",
component = SelectComponent.EnumerationSelector.class,
options = {"default=ONCOLOGY", "required"})
public ProcessManualClinicalTrails.CTType updateType = ProcessManualClinicalTrails.CTType.ONCOLOGY;


private enum CTType {
ONCOLOGY,
NONONCOLOGY
}

public enum ReportColumns {
PATH,
TYPE,
STATUS
}

private QueryBuilder queryBuilder;

public ProcessManualClinicalTrails(QueryBuilder queryBuilder) {
this.queryBuilder = queryBuilder;
}

List<EnumMap<ProcessManualClinicalTrails.ReportColumns, String>> reportData =
Collections.synchronizedList(new ArrayList<>());

@Override
public void buildProcess(ProcessInstance instance, ResourceResolver rr) throws LoginException, RepositoryException {
instance.defineAction("Importing content", rr, this::getContent);
}

private void getContent(ActionManager manager) throws Exception {
manager.withResolver((rr -> {
List<String> list = new ArrayList<>();
Session session = rr.adaptTo(Session.class);
if (updateType.equals(CTType.ONCOLOGY)) {
getPages(ONCOLOGY_PATH,"ONCOLOGY",session);
} else {
getPages(NON_ONCOLOGY_PATH,"NON-ONCOLOGY",session);
}
}));
}

private void getPages(String path, String type,Session session) throws RepositoryException {
Map<String,String> map = new HashMap<>();
List<String> list = new ArrayList<>();
map.put("path",path);
map.put("type","cq:Page");
map.put("property","jcr:content/manualTrialFlag");
map.put("property.operation", "exists");
map.put("property.value","true");
Query query = queryBuilder.createQuery(PredicateGroup.create(map),session);
SearchResult result = query.getResult();
LOGGER.info(result.getHits().toString());
for(Hit hit:result.getHits()){
list.add(hit.getPath());
LOGGER.info(hit.getPath());
record(hit.getPath(), type, "MANUALLY CREATED");
}
}

private void record(String path, String type, String status) {
EnumMap<ProcessManualClinicalTrails.ReportColumns, String> row =
new EnumMap<>(ProcessManualClinicalTrails.ReportColumns.class);
row.put(ProcessManualClinicalTrails.ReportColumns.PATH, path);
row.put(ProcessManualClinicalTrails.ReportColumns.TYPE, type);
row.put(ProcessManualClinicalTrails.ReportColumns.STATUS, status);
reportData.add(row);
}

@Override
public void storeReport(ProcessInstance instance, ResourceResolver rr) throws RepositoryException, PersistenceException {
GenericReport report = new GenericReport();
report.setName("Pages Processed");
report.setRows(reportData, ProcessManualClinicalTrails.ReportColumns.class);
report.persist(rr, instance.getPath() + "/jcr:content/report");
}

@Override
public void init() throws RepositoryException {

}
}
1 Accepted Solution

Avatar

Correct answer by
Community Advisor

@annkitaaggarwal Yes. it should work. basically p.limit = -1 gives you all the search results instead of returning a subset.

 

View solution in original post

4 Replies

Avatar

Community Advisor

@annkitaaggarwal Can you please add the following in your query map 

 

map.put("p.limit","-1");

This should give you all the results. 

Avatar

Level 4

in my case, report is blank for most of the time and max no of results are 6 or 7. Should i add the limit in this case as well

Avatar

Correct answer by
Community Advisor

@annkitaaggarwal Yes. it should work. basically p.limit = -1 gives you all the search results instead of returning a subset.

 

Avatar

Administrator

@annkitaaggarwal Did you find the suggestions from Harwinder helpful? Please let us know if more information is required. Otherwise, please mark the answer as correct for posterity. If you have found out solution yourself, please share it with the community.



Kautuk Sahni