Se ha implementado un paso de proceso personalizado para rellenar las variables de flujo de trabajo de la lista de matriz. Si no está familiarizado con la creación de un paquete OSGi, siga estas instrucciones
El código del paso de proceso personalizado hace lo siguiente
Consulte todos los archivos adjuntos de formularios adaptables de la carpeta de carga útil. El nombre de la carpeta se pasa como argumento de proceso al paso de proceso.
Rellenar la variable de flujo de trabajo listOfDocuments
Rellenar la variable de flujo de trabajo attachmentNames
Establezca el valor de la variable de flujo de trabajo (no_of_attachments
)
package com.aemforms.formattachments.core;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import javax.jcr.Node;
import javax.jcr.Session;
import org.osgi.framework.Constants;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.adobe.aemfd.docmanager.Document;
import com.adobe.granite.workflow.WorkflowException;
import com.adobe.granite.workflow.WorkflowSession;
import com.adobe.granite.workflow.exec.WorkItem;
import com.adobe.granite.workflow.exec.WorkflowProcess;
import com.adobe.granite.workflow.metadata.MetaDataMap;
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;
@Component(property = {
Constants.SERVICE_DESCRIPTION + "=PopulateListOfDocuments",
"process.label" + "=PopulateListOfDocuments"
})
public class PopulateListOfDocuments implements WorkflowProcess {
private static final Logger log = LoggerFactory.getLogger(PopulateListOfDocuments.class);
@Reference
QueryBuilder queryBuilder;
@Override
public void execute(WorkItem workItem, WorkflowSession workflowSession, MetaDataMap processArguments) throws WorkflowException
{
String payloadPath = workItem.getWorkflowData().getPayload().toString();
log.debug("The payload path is" + payloadPath);
MetaDataMap metaDataMap = workItem.getWorkflow().getWorkflowData().getMetaDataMap();
Session session = workflowSession.adaptTo(Session.class);
Map < String, String > map = new HashMap < String, String > ();
map.put("path", workItem.getWorkflowData().getPayload().toString() + "/" + processArguments.get("PROCESS_ARGS", "string").toString());
map.put("type", "nt:file");
Query query = queryBuilder.createQuery(PredicateGroup.create(map), workflowSession.adaptTo(Session.class));
query.setStart(0);
query.setHitsPerPage(20);
SearchResult result = query.getResult();
log.debug("Get result hits " + result.getHits().size());
int no_of_attachments = result.getHits().size();
Document[] listOfDocuments = new Document[no_of_attachments];
String[] attachmentNames = new String[no_of_attachments];
int i = 0;
for (Hit hit: result.getHits()) {
try {
String attachmentPath = hit.getPath();
log.debug("The hit path is" + hit.getPath());
Node attachmentNode = session.getNode(attachmentPath + "/jcr:content");
InputStream attachmentStream = attachmentNode.getProperty("jcr:data").getBinary().getStream();
listOfDocuments[i] = new Document(attachmentStream);
attachmentNames[i] = new String(hit.getTitle());
log.debug("Added " + hit.getTitle() + "to the list");
i++;
} catch (Exception e) {
log.error("Unable to obtain attachment", e);
}
}
metaDataMap.put("no_of_attachments", no_of_attachments);
metaDataMap.put("listOfDocuments", listOfDocuments);
metaDataMap.put("attachmentNames", attachmentNames);
log.debug("Updated workflow");
}
}
Asegúrese de que tiene las siguientes variables definidas en el flujo de trabajo para que el código funcione
listOfDocuments - variable de tipo ArrayList of Documents
attachmentNames - variable de tipo ArrayList de String
no_of_attachment: variable de tipo Double