001package org.nuxeo.ecm.automation.core.operations.services; 002 003import java.io.Serializable; 004import java.util.ArrayList; 005import java.util.HashMap; 006import java.util.List; 007import java.util.Map; 008 009import org.nuxeo.ecm.automation.AutomationService; 010import org.nuxeo.ecm.automation.OperationContext; 011import org.nuxeo.ecm.automation.OperationException; 012import org.nuxeo.ecm.automation.core.Constants; 013import org.nuxeo.ecm.automation.core.annotations.Context; 014import org.nuxeo.ecm.automation.core.annotations.Operation; 015import org.nuxeo.ecm.automation.core.annotations.OperationMethod; 016import org.nuxeo.ecm.automation.core.annotations.Param; 017import org.nuxeo.ecm.automation.core.util.BlobList; 018import org.nuxeo.ecm.core.api.Blob; 019import org.nuxeo.ecm.core.api.CoreSession; 020import org.nuxeo.ecm.core.api.DocumentModel; 021import org.nuxeo.ecm.core.api.blobholder.BlobHolder; 022 023@Operation(id = BlobHolderAttach.ID, category = Constants.CAT_BLOB, label = "Attach File or files to the currentDocument.", description = "Attach the input file(s) to the current document using the BlobHolder abstraction", aliases = { "BlobHolder.Attach" }) 024public class BlobHolderAttach { 025 026 public static final String ID = "BlobHolder.AttachOnCurrentDocument"; 027 028 @Context 029 protected CoreSession session; 030 031 @Context 032 protected AutomationService as; 033 034 @Context 035 protected OperationContext context; 036 037 @Param(name = "useMainBlob", required = false) 038 protected boolean useMainBlob = true; 039 040 protected DocumentModel getCurrentDocument() throws OperationException { 041 String cdRef = (String) context.get("currentDocument"); 042 return as.getAdaptedValue(context, cdRef, DocumentModel.class); 043 } 044 045 @OperationMethod 046 public DocumentModel run(Blob blob) throws OperationException { 047 DocumentModel currentDocument = getCurrentDocument(); 048 BlobHolder bh = currentDocument.getAdapter(BlobHolder.class); 049 if (bh == null) { 050 return currentDocument; 051 } 052 bh.setBlob(blob); 053 currentDocument = session.saveDocument(currentDocument); 054 context.put("currentDocument", currentDocument); 055 return currentDocument; 056 } 057 058 @OperationMethod 059 public DocumentModel run(BlobList blobs) throws OperationException { 060 DocumentModel currentDocument = null; 061 if (useMainBlob) { 062 Blob mainBlob = blobs.remove(0); 063 currentDocument = run(mainBlob); 064 } else { 065 currentDocument = getCurrentDocument(); 066 } 067 if (blobs.size() > 0) { 068 if (currentDocument.hasSchema("files")) { 069 List<Map<String, Object>> existingBlobs = (List<Map<String, Object>>) currentDocument.getPropertyValue("files:files"); 070 if (existingBlobs == null) { 071 existingBlobs = new ArrayList<Map<String, Object>>(); 072 } 073 for (Blob blob : blobs) { 074 Map<String, Object> map = new HashMap<String, Object>(); 075 map.put("file", blob); 076 map.put("filename", blob.getFilename()); 077 existingBlobs.add(map); 078 } 079 currentDocument.setPropertyValue("files:files", (Serializable) existingBlobs); 080 currentDocument = session.saveDocument(currentDocument); 081 } 082 } 083 return currentDocument; 084 } 085 086}