Les sélections de l’utilisateur sont stockées dans un champ masqué. La valeur de ce champ masqué est transmise au servlet qui combine les sélections dans un pdf à l’aide de Service Forms Assembler.
Le code suivant effectue l’assemblage des newsletters sélectionnées. Le code crée une carte des documents à partir des sélections de l’utilisateur. À partir de cette carte, un DDX est créé et ce DDX ainsi que le mappage des documents sont transmis à la méthode invoke du service Assembler pour obtenir le document combiné. Le pdf assemblé est stocké dans le référentiel et son chemin d’accès est renvoyé à l’application appelante.
protected void doPost(SlingHttpServletRequest request,SlingHttpServletResponse response)
{
String []newsletters = request.getParameter("selectedNewsLetters").split(",");
Map<String, Object> mapOfDocuments = new HashMap<String, Object>();
for(int i= 0;i<newsletters.length;i++)
{
Resource resource = request.getResourceResolver().getResource(newsletters[i]);
log.debug("The resource name is "+resource.getName());
Document newsletter = new Document(resource.getPath());
mapOfDocuments.put(resource.getName(), newsletter);
}
log.debug("The newsletters selected: "+newsletters);
Document ddxDocument = createDDXFromMapOfDocuments(mapOfDocuments);
AssemblerOptionSpec aoSpec = new AssemblerOptionSpec();
aoSpec.setFailOnError(true);
AssemblerResult ar = null;
try {
ar = assemblerService.invoke(ddxDocument, mapOfDocuments, aoSpec);
Document assembledPDF = ar.getDocuments().get("GeneratedPDF.pdf");
// This is my custom code to get fd-service user
ResourceResolver formsServiceResolver = getResolver.getFormsServiceResolver();
Resource nodeResource = formsServiceResolver.getResource("/content/newsletters");
UUID uuid = UUID.randomUUID();
String uuidString = uuid.toString();
javax.jcr.Node assembledNewsletters = nodeResource.adaptTo(Node.class);
javax.jcr.Node assembledNewsletter = assembledNewsletters.addNode(uuidString + ".pdf", "nt:file");
javax.jcr.Node resNode = assembledNewsletter.addNode("jcr:content", "nt:resource");
ValueFactory valueFactory = formsServiceResolver.adaptTo(Session.class).getValueFactory();
Binary contentValue = valueFactory.createBinary(assembledPDF.getInputStream());
resNode.setProperty("jcr:data", contentValue);
formsServiceResolver.commit();
PrintWriter out = response.getWriter();
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
JsonObject asset = new JsonObject();
asset.addProperty("assetPath", assembledNewsletter.getPath());
out.print(new Gson().toJson(asset));
out.flush();
}
catch (IOException | OperationException | RepositoryException e)
{
log.error("Error is "+e.getMessage());
}
}
Les fonctions utilitaires suivantes ont été utilisées pour assembler les newsletters. Ces fonctions d’utilitaire créent DDX à partir du mappage de documents et convertissent l’objet de document org.w3c.dom.Document en AEMFD.
public Document createDDXFromMapOfDocuments(Map<String, Object> mapOfDocuments)
{
final DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
org.w3c.dom.Document ddx = null;
try
{
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
ddx = docBuilder.newDocument();
Element rootElement = ddx.createElementNS("http://ns.adobe.com/DDX/1.0/", "DDX");
ddx.appendChild(rootElement);
Element pdfResult = ddx.createElement("PDF");
pdfResult.setAttribute("result","GeneratedPDF.pdf");
rootElement.appendChild(pdfResult);
for (String key : mapOfDocuments.keySet())
{
log.debug(key + " " + mapOfDocuments.get(key));
Element pdfSourceElement = ddx.createElement("PDF");
pdfSourceElement.setAttribute("source", key);
pdfSourceElement.setAttribute("bookmarkTitle",key);
pdfResult.appendChild(pdfSourceElement);
}
return orgw3cDocumentToAEMFDDocument(ddx);
}
catch (ParserConfigurationException e)
{
log.debug("Error:"+e.getMessage());
}
return null;
}
public Document orgw3cDocumentToAEMFDDocument( org.w3c.dom.Document xmlDocument)
{
final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
DOMSource source = new DOMSource(xmlDocument);
log.debug("$$$$In orgW3CDocumentToAEMFDDocument method");
StreamResult outputTarget = new StreamResult(outputStream);
try
{
TransformerFactory.newInstance().newTransformer().transform(source, outputTarget);
InputStream is1 = new ByteArrayInputStream(outputStream.toByteArray());
Document xmlAEMFDDocument = new Document(is1);
if (log.isDebugEnabled())
{
xmlAEMFDDocument.copyToFile(new File("dataxmldocument.xml"));
}
return xmlAEMFDDocument;
}
catch (Exception e)
{
log.error("Error in generating ddx " + e.getMessage());
return null;
}
}