배열 목록 워크플로우 변수를 채우도록 사용자 지정 프로세스 단계가 구현되었습니다. OSGi 번들 만들기에 익숙하지 않은 경우 다음 지침🔗을 따르십시오.
사용자 지정 프로세스 단계의 코드는 다음을 수행합니다
페이로드 폴더 아래에 있는 모든 적응형 양식 첨부 파일을 쿼리합니다. 폴더 이름이 프로세스 단계에 프로세스 인수로 전달됩니다.
listOfDocuments
워크플로우 변수 채우기
attachmentNames
워크플로우 변수 채우기
워크플로우 변수(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");
}
}
코드가 작동하려면 워크플로우에 다음 변수가 정의되어 있는지 확인하십시오
listOfDocuments - ArrayList 형식의 변수입니다.
attachmentNames - String의 ArrayList 형식의 변수입니다.
no_of_attachments - Double 유형의 변수