PublishAsset.java 9.3 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.cq.dam.api.Asset
 *  com.day.cq.dam.api.Rendition
 *  com.day.cq.replication.ReplicationActionType
 *  com.scene7.is.catalog.CatalogRecord
 *  com.scene7.is.catalog.service.publish.atomic.PublishingService
 *  com.scene7.is.catalog.service.publish.atomic.Rendition
 *  com.scene7.is.catalog.util.ObjectTypeEnum
 *  com.scene7.is.provider.ImageSet
 *  com.scene7.is.provider.ImageSet$Builder
 *  com.scene7.is.provider.ImageSetItem
 *  com.scene7.is.scalautil.io.StreamReadable
 *  com.scene7.is.scalautil.io.StreamableUtil
 *  com.scene7.is.scalautil.javautil.OptionUtil
 *  com.scene7.is.util.AbstractPath
 *  com.scene7.is.util.callbacks.Func
 *  com.scene7.is.util.callbacks.Func1
 *  com.scene7.is.util.callbacks.Option
 *  com.scene7.is.util.collections.CollectionUtil
 *  javax.jcr.RepositoryException
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.resource.ValueMap
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 *  scala.Option
 *  scala.Tuple2
 */
package com.adobe.cq.dam.aod.replication.helpers;

import com.adobe.cq.dam.aod.replication.DamLayout;
import com.adobe.cq.dam.aod.replication.helpers.Replicator;
import com.adobe.cq.dam.s7imaging.impl.catalog.NodeToRecordConverter;
import com.day.cq.dam.api.Asset;
import com.day.cq.dam.api.Rendition;
import com.day.cq.replication.ReplicationActionType;
import com.scene7.is.catalog.CatalogRecord;
import com.scene7.is.catalog.service.publish.atomic.PublishingService;
import com.scene7.is.catalog.util.ObjectTypeEnum;
import com.scene7.is.provider.ImageSet;
import com.scene7.is.provider.ImageSetItem;
import com.scene7.is.scalautil.io.StreamReadable;
import com.scene7.is.scalautil.io.StreamableUtil;
import com.scene7.is.scalautil.javautil.OptionUtil;
import com.scene7.is.util.AbstractPath;
import com.scene7.is.util.callbacks.Func;
import com.scene7.is.util.callbacks.Func1;
import com.scene7.is.util.collections.CollectionUtil;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.jcr.RepositoryException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ValueMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import scala.Option;
import scala.Tuple2;

final class PublishAsset
extends Replicator {
    private static final Logger LOGGER = LoggerFactory.getLogger(PublishAsset.class);
    private static final NodeToRecordConverter TO_RECORD = NodeToRecordConverter.nodeToRecordConverter();
    private static final Pattern VIDEO_RENDITION = Pattern.compile("(.*)/jcr:content/renditions/cqdam\\.video\\..*");
    private static final Replicator INSTANCE = new PublishAsset();

    static Replicator instance() {
        return INSTANCE;
    }

    @Override
    void build(ReplicationActionType actionType, ResourceResolver resolver, String path, PublishingService delegate) throws RepositoryException {
        Tuple2<String, String> parts = DamLayout.assetParts(path);
        String tenantId = (String)parts._1();
        String assetId = (String)parts._2();
        switch (actionType) {
            case DELETE: 
            case DEACTIVATE: {
                long timeStamp = System.currentTimeMillis();
                delegate.deleteAsset(tenantId, assetId, ObjectTypeEnum.IS, timeStamp);
                delegate.deleteAsset(tenantId, assetId, ObjectTypeEnum.STATIC, timeStamp);
                break;
            }
            case ACTIVATE: {
                Resource resource = resolver.getResource(path);
                if (resource != null) {
                    PublishAsset.buildAsset(resource, tenantId, assetId, ObjectTypeEnum.STATIC, delegate);
                    PublishAsset.buildAsset(resource, tenantId, assetId, ObjectTypeEnum.IS, delegate);
                    break;
                }
                LOGGER.warn("s7delivery replication agent can't access: {}", (Object)path);
                break;
            }
            default: {
                throw new AssertionError((Object)("Unexpected replication action: " + (Object)actionType));
            }
        }
    }

    private static void buildAsset(Resource resource, String rootId, String assetId, ObjectTypeEnum type, PublishingService agent) throws RepositoryException {
        com.scene7.is.util.callbacks.Option<Rendition> rendition = PublishAsset.getRendition(resource, type);
        long timeStamp = System.currentTimeMillis();
        for (CatalogRecord record : PublishAsset.getRecord(resource, rootId, assetId, type)) {
            record.setImageSet(PublishAsset.fixImageSet(record.imageSet(), rootId));
            if (rendition.isDefined()) {
                record.setPath(null);
            }
            record.setLastModified(Long.valueOf(timeStamp));
            for (CatalogRecord avsRelation : PublishAsset.getAvsRelations(record, resource.getResourceResolver())) {
                avsRelation.setLastModified(Long.valueOf(timeStamp));
                agent.updateAsset(avsRelation, OptionUtil.none());
            }
            com.scene7.is.util.callbacks.Option rnd = com.scene7.is.util.callbacks.Option.none();
            for (Rendition r : rendition) {
                long ts = PublishAsset.getLastModified(r);
                String publishInfo = "Path: " + r.getPath() + "Size: " + r.getSize() + "MimeType: " + r.getMimeType();
                rnd = com.scene7.is.util.callbacks.Option.some((Object)com.scene7.is.catalog.service.publish.atomic.Rendition.rendition((long)ts, (String)publishInfo, (StreamReadable)StreamableUtil.streamReadableStream((InputStream)r.getStream())));
            }
            agent.updateAsset(record, OptionUtil.fromNullable((Object)rnd.orNull()));
        }
    }

    private static List<CatalogRecord> getAvsRelations(CatalogRecord record, ResourceResolver resolver) throws RepositoryException {
        List rv = CollectionUtil.list((int)record.getImageSet().size());
        String rootId = record.getRootId();
        for (ImageSetItem item : record.getImageSet().items) {
            Resource resource;
            String path = PublishAsset.urlDecode(item.asset);
            if (!PublishAsset.isAvsRendition(path) || (resource = resolver.getResource(path)) == null) continue;
            String assetId = PublishAsset.extractRecordId(rootId, path);
            for (CatalogRecord avsRecord : PublishAsset.getRecord(resource, rootId, assetId, ObjectTypeEnum.STATIC)) {
                rv.add(avsRecord);
            }
        }
        return rv;
    }

    private static String extractRecordId(String rootId, String jcrPath) {
        assert (jcrPath.startsWith("/"));
        if (rootId.isEmpty()) {
            return jcrPath.substring(1);
        }
        String prefix = "/content/dam/mac/" + rootId + '/';
        assert (jcrPath.startsWith(prefix));
        return jcrPath.substring(prefix.length());
    }

    private static boolean isAvsRendition(String path) {
        return VIDEO_RENDITION.matcher(path).matches();
    }

    private static String urlDecode(String src) {
        try {
            return URLDecoder.decode(src, "UTF-8");
        }
        catch (UnsupportedEncodingException e) {
            throw new AssertionError(e);
        }
    }

    private static com.scene7.is.util.callbacks.Option<Rendition> getRendition(Resource resource, ObjectTypeEnum type) {
        String name = type == ObjectTypeEnum.IS ? "cqdam.pyramid.tiff" : "original";
        for (Asset asset : com.scene7.is.util.callbacks.Option.some((Object)resource.adaptTo(Asset.class))) {
            String mimeType = asset.getMimeType();
            if (mimeType != null && mimeType.startsWith("video/") && type == ObjectTypeEnum.STATIC) {
                return com.scene7.is.util.callbacks.Option.none();
            }
            Iterator i$ = com.scene7.is.util.callbacks.Option.some((Object)asset.getRendition(name)).iterator();
            if (!i$.hasNext()) continue;
            Rendition rendition = (Rendition)i$.next();
            return com.scene7.is.util.callbacks.Option.some((Object)rendition);
        }
        return com.scene7.is.util.callbacks.Option.none();
    }

    private static long getLastModified(Rendition rendition) {
        Long value = (Long)rendition.getProperties().get("jcr:lastModified", Long.class);
        if (value == null) {
            throw new IllegalStateException("jcr:lastModified property must be defined for: " + rendition.getPath());
        }
        return value;
    }

    private static com.scene7.is.util.callbacks.Option<CatalogRecord> getRecord(Resource resource, String rootId, String assetId, ObjectTypeEnum type) throws RepositoryException {
        return TO_RECORD.toRecord(rootId, assetId, type, resource, Func.identity());
    }

    private static ImageSet fixImageSet(ImageSet src, String rootId) {
        if (rootId.isEmpty()) {
            ImageSet.Builder builder = new ImageSet.Builder();
            for (ImageSetItem item : src.items) {
                if (item.asset == null) continue;
                builder.addAsset(item.separator, item.asset.trim());
            }
            return builder.getProduct();
        }
        return src;
    }

    private PublishAsset() {
    }

}