양식 첨부 파일이 포함된 zip 파일을 만들기 위해 사용자 지정 프로세스 단계가 구현되었습니다. OSGi 번들 만들기에 익숙하지 않은 경우 다음 지침🔗을 따르십시오.
사용자 지정 프로세스 단계의 코드는 다음을 수행합니다
페이로드 폴더 아래에 있는 모든 적응형 양식 첨부 파일을 쿼리합니다. 폴더 이름이 프로세스 단계에 프로세스 인수로 전달됩니다.
양식 첨부 파일이 포함된 zip 파일을 만들어 페이로드 폴더 아래에 저장합니다.
워크플로우 변수 값 설정(no_of_attachments)
package com.aemforms.formattachments.core;
import javax.jcr.Binary;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.ValueFactory;
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 + "=Zip form attachments",
Constants.SERVICE_VENDOR + "=Adobe Systems",
"process.label" + "=Zip form attachments"
})
public class ZipFormAttachments implements WorkflowProcess {
private static final Logger log = LoggerFactory.getLogger(ZipFormAttachments.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());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zipOut = new ZipOutputStream(baos);
int no_of_attachments = result.getHits().size();
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();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];
while ((nRead = attachmentStream.read(data, 0, data.length)) != -1)
{
buffer.write(data, 0, nRead);
}
buffer.flush();
byte[] byteArray = buffer.toByteArray();
ZipEntry zipEntry = new ZipEntry(hit.getTitle());
zipOut.putNextEntry(zipEntry);
zipOut.write(byteArray);
zipOut.closeEntry();
}
catch (Exception e)
{
log.debug("The error message is " + e.getMessage());
}
}
try
{
zipOut.close();
Node payloadNode = session.getNode(payloadPath);
Node zippedFileNode = payloadNode.addNode("zipped_attachments.zip", "nt:file");
javax.jcr.Node resNode = zippedFileNode.addNode("jcr:content", "nt:resource");
ValueFactory valueFactory = session.getValueFactory();
Document zippedDocument = new Document(baos.toByteArray());
Binary contentValue = valueFactory.createBinary(zippedDocument.getInputStream());
metaDataMap.put("no_of_attachments", no_of_attachments);
workflowSession.updateWorkflowData(workItem.getWorkflow(), workItem.getWorkflow().getWorkflowData());
log.debug("Updated workflow");
resNode.setProperty("jcr:data", contentValue);
session.save();
zippedDocument.close();
}
catch (IOException | RepositoryException e)
{
log.error("Error in closing zipout", e);
}
}
}
이 코드가 작동하려면 워크플로우에서 Double 유형의 no_of_attachments라는 변수가 있는지 확인하십시오.