DownloadAssetProcess.java 8.58 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.cq.commons.Externalizer
 *  com.day.cq.dam.api.jobs.AssetDownloadService
 *  com.day.cq.dam.commons.process.AbstractAssetWorkflowProcess
 *  com.day.cq.workflow.WorkflowException
 *  com.day.cq.workflow.WorkflowSession
 *  com.day.cq.workflow.exec.WorkItem
 *  com.day.cq.workflow.exec.WorkflowData
 *  com.day.cq.workflow.metadata.MetaDataMap
 *  javax.jcr.Session
 *  org.apache.commons.lang.StringUtils
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Properties
 *  org.apache.felix.scr.annotations.Property
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.ReferenceCardinality
 *  org.apache.felix.scr.annotations.ReferencePolicy
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.jackrabbit.util.Text
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.cq.dam.core.process;

import com.day.cq.commons.Externalizer;
import com.day.cq.dam.api.jobs.AssetDownloadService;
import com.day.cq.dam.commons.process.AbstractAssetWorkflowProcess;
import com.day.cq.workflow.WorkflowException;
import com.day.cq.workflow.WorkflowSession;
import com.day.cq.workflow.exec.WorkItem;
import com.day.cq.workflow.exec.WorkflowData;
import com.day.cq.workflow.metadata.MetaDataMap;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.zip.ZipOutputStream;
import javax.jcr.Session;
import org.apache.commons.lang.StringUtils;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.ReferencePolicy;
import org.apache.felix.scr.annotations.Service;
import org.apache.jackrabbit.util.Text;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(metatype=0)
@Service
@Properties(value={@Property(name="service.description", value={"Download selected asset(s)."}), @Property(name="process.label", value={"Download Dam Asset"})})
public class DownloadAssetProcess
extends AbstractAssetWorkflowProcess {
    private static final Logger log = LoggerFactory.getLogger(DownloadAssetProcess.class);
    private static final String DOWNLOADASSETS = "downloadAssets";
    private static final String DOWNLOADRENDITIONS = "downloadRenditions";
    private static final String DOWNLOADSUBASSETS = "downloadSubassets";
    private static final String S7EXPORTSETTINGS = "s7exportsettings";
    private static final String EMAILTO = "emailTo";
    private static final String CONTEXTPATH = "contextPath";
    @Reference(cardinality=ReferenceCardinality.MANDATORY_UNARY, policy=ReferencePolicy.STATIC)
    public AssetDownloadService assetDownloadService;

    public void execute(WorkItem workItem, WorkflowSession workflowSession, MetaDataMap metaData) throws WorkflowException {
        try {
            int idx;
            Session session = workflowSession.getSession();
            ResourceResolver rr = this.getResourceResolver(session);
            String payload = workItem.getWorkflowData().getPayload().toString();
            String srcPath = payload.split(".assetdownload.zip")[0];
            srcPath = URLDecoder.decode(srcPath, "UTF-8");
            Resource resource = rr.getResource(srcPath);
            boolean downloadAssets = Boolean.parseBoolean(this.getValueFromPayload("downloadAssets", payload));
            boolean downloadRenditions = Boolean.parseBoolean(this.getValueFromPayload("downloadRenditions", payload));
            boolean downloadSubassets = Boolean.parseBoolean(this.getValueFromPayload("downloadSubassets", payload));
            String s7exportsettings = this.getValueFromPayload("s7exportsettings", payload);
            if (StringUtils.isNotBlank((String)s7exportsettings)) {
                s7exportsettings = Text.unescape((String)s7exportsettings);
            }
            String downloadName = (idx = payload.indexOf("?")) == -1 ? "" : payload.substring(0, idx);
            downloadName = this.getDownloadName(Text.unescape((String)downloadName));
            ArrayList<String> paths = this.getAssetPath(payload);
            HashSet<Resource> downloadSet = new HashSet<Resource>();
            if (paths != null && paths.size() > 0) {
                for (String path : paths) {
                    Resource res = rr.getResource(path = URLDecoder.decode(path, "UTF-8"));
                    if (res == null) continue;
                    downloadSet.add(res);
                }
            } else {
                downloadSet.add(resource);
            }
            MetaDataMap wfMetaDataMap = workItem.getWorkflowData().getMetaDataMap();
            String emailRecipients = (String)wfMetaDataMap.get("emailTo", (Object)new String());
            String downloadUrl = this.assetDownloadService.assetDownload(resource, downloadSet, downloadAssets, downloadRenditions, downloadSubassets, s7exportsettings, null, null, downloadName, emailRecipients);
            if (!StringUtils.isEmpty((String)downloadUrl)) {
                String contextPath = (String)wfMetaDataMap.get("contextPath", (Object)new String());
                downloadUrl = System.getProperty("launchpad.http.server.url", this.getHostPrefix(rr)) + contextPath + downloadUrl;
                wfMetaDataMap.put((Object)"downloadUrl", (Object)downloadUrl);
            } else {
                log.debug("downloadUrl is null or empty.");
            }
        }
        catch (Exception e) {
            log.error("execute: error while processing download asset; work item [{}]: ", (Object)workItem.getId(), (Object)e);
        }
    }

    private ArrayList<String> getAssetPath(String arg) {
        ArrayList<String> paths = new ArrayList<String>();
        try {
            int beginIdx = arg.indexOf("path=");
            while (beginIdx != -1) {
                int endIdx = arg.indexOf("&", beginIdx + 1);
                endIdx = endIdx == -1 ? arg.length() : endIdx;
                String path = arg.substring(beginIdx + "path+".length(), endIdx);
                paths.add(URLDecoder.decode(path, "UTF-8"));
                beginIdx = arg.indexOf("path=", endIdx + 1);
            }
        }
        catch (Exception e) {
            log.error("unable to parse asset paths for download: " + arg, (Throwable)e);
        }
        return paths;
    }

    private String getValueFromPayload(String key, String argment) {
        String value = null;
        int beginIdx = argment.indexOf(key);
        if (beginIdx != -1 && this.validKeyParameter(key, argment.substring(beginIdx - 1, beginIdx + key.length() + 1))) {
            int endIdx = argment.indexOf("&", beginIdx);
            endIdx = endIdx == -1 ? argment.length() : endIdx;
            value = beginIdx == -1 ? "" : argment.substring(beginIdx + (key + "=").length(), endIdx);
        }
        return value;
    }

    private boolean validKeyParameter(String key, String argment) {
        boolean valid = false;
        List<String> params = Arrays.asList(argment.split("&|\\?|="));
        for (String param : params) {
            if (param.length() == 0) continue;
            valid = param.equals(key);
        }
        return valid;
    }

    private String getDownloadName(String pathInfo) {
        String name = pathInfo.substring(pathInfo.lastIndexOf("/") + 1, pathInfo.length());
        name = (name = name.replaceAll("[ :()*|]", "")).endsWith(".zip") ? name : name + ".zip";
        return name;
    }

    private String getHostPrefix(ResourceResolver resolver) {
        Externalizer externalizer = (Externalizer)resolver.adaptTo(Externalizer.class);
        String externalizerHost = externalizer.externalLink(resolver, "local", "");
        if (externalizerHost != null && externalizerHost.endsWith("/")) {
            return externalizerHost.substring(0, externalizerHost.length() - 1);
        }
        return externalizerHost;
    }

    protected void bindAssetDownloadService(AssetDownloadService assetDownloadService) {
        this.assetDownloadService = assetDownloadService;
    }

    protected void unbindAssetDownloadService(AssetDownloadService assetDownloadService) {
        if (this.assetDownloadService == assetDownloadService) {
            this.assetDownloadService = null;
        }
    }
}