PTiffManagerImpl.java 11 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.cq.dam.dm.process.api.PTiffManager
 *  com.adobe.cq.dam.dm.process.api.PTiffRendition
 *  com.day.cq.dam.api.Asset
 *  com.day.cq.dam.api.Rendition
 *  com.scene7.is.image_server.ImageConverter
 *  com.scene7.is.image_server.TiffMd5sum
 *  com.scene7.is.image_server.image_info.FailedReason
 *  com.scene7.is.image_server.image_info.ImageInfo
 *  com.scene7.is.image_server.image_info.ImageProps
 *  com.scene7.is.scalautil.javautil.EitherUtil
 *  com.scene7.is.scalautil.service.ArgSpec
 *  com.scene7.is.scalautil.service.ArgSpec$ArgValue
 *  com.scene7.is.util.FileUtil
 *  com.scene7.is.util.SizeInt
 *  com.scene7.is.util.collections.CollectionUtil
 *  org.apache.commons.io.FileUtils
 *  org.apache.commons.io.IOUtils
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.api.resource.ValueMap
 *  org.jetbrains.annotations.NotNull
 *  org.jetbrains.annotations.Nullable
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 *  scala.collection.Seq
 *  scala.util.Either
 */
package com.adobe.cq.dam.dm.process.image;

import com.adobe.cq.dam.dm.process.api.PTiffManager;
import com.adobe.cq.dam.dm.process.api.PTiffRendition;
import com.adobe.cq.dam.dm.process.image.FileFormatDetect;
import com.adobe.cq.dam.dm.process.image.PTiffRenditionFactory;
import com.adobe.cq.dam.s7imaging.impl.is.ImageServerComponent;
import com.day.cq.dam.api.Asset;
import com.day.cq.dam.api.Rendition;
import com.scene7.is.image_server.ImageConverter;
import com.scene7.is.image_server.TiffMd5sum;
import com.scene7.is.image_server.image_info.FailedReason;
import com.scene7.is.image_server.image_info.ImageInfo;
import com.scene7.is.image_server.image_info.ImageProps;
import com.scene7.is.scalautil.javautil.EitherUtil;
import com.scene7.is.scalautil.service.ArgSpec;
import com.scene7.is.util.FileUtil;
import com.scene7.is.util.SizeInt;
import com.scene7.is.util.collections.CollectionUtil;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ValueMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import scala.collection.Seq;
import scala.util.Either;

@Service
@Component
public class PTiffManagerImpl
implements PTiffManager {
    private static final Logger log = LoggerFactory.getLogger(PTiffManagerImpl.class);
    private static final String TEMP_DIR_PREFIX = "cqdam-create-ptiff";
    private static final String JPEG_ENCODING = "JPEG Standard";
    @Reference
    private ImageServerComponent imageServer;

    public boolean isEnabled() {
        return this.imageServer.isEnabled();
    }

    public PTiffRendition getPTiffRendition(Asset asset) {
        if (asset != null) {
            return PTiffRenditionFactory.getPTiffRendition(asset);
        }
        return null;
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    public PTiffRendition createPTiffRendition(Rendition rendition, Asset asset, ValueMap options) throws IOException {
        if (rendition == null || asset == null || options == null) {
            throw new IllegalArgumentException();
        }
        if (!this.isEnabled()) {
            throw new UnsupportedOperationException();
        }
        InputStream in = rendition.getStream();
        if (in == null) {
            return null;
        }
        File tmpDir = null;
        try {
            byte[] header = new byte[FileFormatDetect.maxImageFormatHeaderSize()];
            int headerSize = in.read(header);
            if (headerSize <= 0) {
                PTiffRendition pTiffRendition = null;
                return pTiffRendition;
            }
            if (FileFormatDetect.detectImageFormat(header, headerSize).isEmpty()) {
                PTiffRendition pTiffRendition = null;
                return pTiffRendition;
            }
            tmpDir = FileUtil.createTempDirectory((String)"cqdam-create-ptiff");
            File inputFile = new File(tmpDir, "source");
            PTiffManagerImpl.writeInputFile(header, headerSize, in, inputFile);
            boolean original = rendition.getName().equals("original");
            PTiffRendition pTiffRendition = this.imageConvert(tmpDir, inputFile, asset, options, original);
            return pTiffRendition;
        }
        catch (RuntimeException e) {
            log.error("Unable to generate PTIFF for asset: " + asset.getPath(), (Throwable)e);
            PTiffRendition headerSize = null;
            return headerSize;
        }
        finally {
            IOUtils.closeQuietly((InputStream)in);
            FileUtils.deleteQuietly((File)tmpDir);
        }
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    public PTiffRendition createPTiffRendition(File inputFile, Asset asset, ValueMap options) throws IOException {
        if (inputFile == null || asset == null || options == null) {
            throw new IllegalArgumentException();
        }
        if (!this.isEnabled()) {
            throw new UnsupportedOperationException();
        }
        File tmpDir = FileUtil.createTempDirectory((String)"cqdam-create-ptiff");
        try {
            PTiffRendition pTiffRendition = this.imageConvert(tmpDir, inputFile, asset, options, false);
            return pTiffRendition;
        }
        catch (RuntimeException e) {
            log.error("Unable to generate PTIFF for asset: " + asset.getPath(), (Throwable)e);
            PTiffRendition pTiffRendition = null;
            return pTiffRendition;
        }
        finally {
            FileUtils.deleteQuietly((File)tmpDir);
        }
    }

    public void removePTiffRendition(Asset asset) {
        if (asset == null) {
            throw new IllegalArgumentException("Invalid Asset");
        }
        Rendition r = asset.getRendition("cqdam.pyramid.tiff");
        if (r != null) {
            asset.removeRendition("cqdam.pyramid.tiff");
        }
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    private static void writeInputFile(byte[] header, int headerSize, InputStream in, File inputFile) throws IOException {
        FileOutputStream out = FileUtils.openOutputStream((File)inputFile);
        try {
            out.write(header, 0, headerSize);
            IOUtils.copy((InputStream)in, (OutputStream)out);
        }
        finally {
            IOUtils.closeQuietly((OutputStream)out);
        }
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    @Nullable
    private PTiffRendition imageConvert(@NotNull File tmpDir, @NotNull File inputFile, @NotNull Asset asset, @NotNull ValueMap options, boolean original) throws IOException {
        ImageInfo imgInfo = this.imageServer.imageInfo();
        Either result = imgInfo.apply(inputFile, new ArgSpec.ArgValue[0]);
        if (result.isLeft()) {
            switch ((FailedReason)EitherUtil.leftOf((Either)result)) {
                case CantOpenFile: 
                case EmptyFile: 
                case NoSuchFile: {
                    throw new IOException("Unable to access intermediary file: " + inputFile.getAbsolutePath() + " for " + asset.getPath());
                }
                case UnknownReason: 
                case UnsupportedFile: {
                    log.debug("Unable to create ptiff for {} due to {}", (Object)asset.getPath(), EitherUtil.leftOf((Either)result));
                    return null;
                }
            }
        }
        ImageProps imgProps = (ImageProps)EitherUtil.rightOf((Either)result);
        ArrayList<Object> icOptionsList = new ArrayList<Object>();
        icOptionsList.add((Object)ImageConverter.NoUsage());
        icOptionsList.add((Object)ImageConverter.LowerPriority((int)50));
        icOptionsList.add((Object)ImageConverter.DeflateCompress());
        icOptionsList.add((Object)ImageConverter.Downsample8x8());
        icOptionsList.add((Object)ImageConverter.EmbedXmpData());
        icOptionsList.add((Object)ImageConverter.TileSize((int)256, (int)256));
        icOptionsList.add((Object)ImageConverter.ApplyOrientation());
        if (imgProps.encoding().equals("JPEG Standard")) {
            icOptionsList.add((Object)ImageConverter.JpegCompress());
        }
        double usmAmount = Math.max(0.0, Math.min(5.0, (Double)options.get("usmAmount", (Object)1.75)));
        double usmRadius = Math.max(0.0, Math.min(250.0, (Double)options.get("usmRadius", (Object)0.2)));
        long usmThreshold = Math.max(0, Math.min(255, (Integer)options.get("usmThreshold", (Object)2)));
        boolean usmMonochrome = (Boolean)options.get("usmMonochrome", (Object)false);
        icOptionsList.add((Object)ImageConverter.Usm((double)usmAmount, (double)usmRadius, (long)usmThreshold, (boolean)usmMonochrome));
        File outputFile = new File(tmpDir, "pyramid.tif");
        ArgSpec.ArgValue[] icOptions = icOptionsList.toArray((T[])new ArgSpec.ArgValue[icOptionsList.size()]);
        ImageConverter converter = this.imageServer.imageConverter();
        converter.convert(inputFile, outputFile, icOptions);
        HashMap metadata = CollectionUtil.hashMap();
        if (!((Boolean)options.get("dam.internal.OldPTiffRendition", (Object)false)).booleanValue()) {
            metadata.put("ptiff.original", original);
            metadata.put("ptiff.width", imgProps.sizeWithOrientation().width);
            metadata.put("ptiff.height", imgProps.sizeWithOrientation().height);
            metadata.put("ptiff.size", outputFile.length());
            metadata.put("ptiff.md5", this.imageServer.tiffMd5sum().apply(outputFile));
            if (!imgProps.warnings().isEmpty()) {
                metadata.put("ptiff.warnings", PTiffManagerImpl.asJavaStringArray(imgProps.warnings()));
            }
        }
        FileInputStream in = FileUtils.openInputStream((File)outputFile);
        try {
            PTiffRendition pTiffRendition = PTiffRenditionFactory.addPTiffRendition(asset, in, metadata);
            return pTiffRendition;
        }
        finally {
            IOUtils.closeQuietly((InputStream)in);
        }
    }

    @NotNull
    private static String[] asJavaStringArray(@NotNull Seq<String> seq) {
        String[] a = new String[seq.length()];
        seq.copyToArray((Object)a);
        return a;
    }

    protected void bindImageServer(ImageServerComponent imageServerComponent) {
        this.imageServer = imageServerComponent;
    }

    protected void unbindImageServer(ImageServerComponent imageServerComponent) {
        if (this.imageServer == imageServerComponent) {
            this.imageServer = null;
        }
    }

}