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}