ImageResponsePropertiesHandler.java 12.7 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.scene7.is.provider.CacheSpec
 *  com.scene7.is.provider.FmtSpec
 *  com.scene7.is.provider.JpegQualityConverter
 *  com.scene7.is.provider.JpegQualitySpec
 *  com.scene7.is.sleng.CacheEnum
 *  com.scene7.is.sleng.Color
 *  com.scene7.is.sleng.ColorProfileInfo
 *  com.scene7.is.sleng.ColorSpaceEnum
 *  com.scene7.is.sleng.FXGServer
 *  com.scene7.is.sleng.ImageAccess
 *  com.scene7.is.sleng.ImageAccessException
 *  com.scene7.is.sleng.ImageServer
 *  com.scene7.is.sleng.ResponseFormatEnum
 *  com.scene7.is.sleng.ipp.IppImageAccess
 *  com.scene7.is.util.DigestAdler32
 *  com.scene7.is.util.MimeTypeEnum
 *  com.scene7.is.util.SizeInt
 *  com.scene7.is.util.diskcache.Cache
 *  com.scene7.is.util.diskcache.CacheAccess
 *  com.scene7.is.util.diskcache.CacheException
 *  com.scene7.is.util.diskcache.CacheKey
 *  com.scene7.is.util.text.ParameterException
 *  com.scene7.is.util.text.converters.BooleanConverter
 *  com.scene7.is.util.text.converters.DoubleConverter
 *  com.scene7.is.util.text.converters.IntegerConverter
 *  org.jetbrains.annotations.NotNull
 *  org.jetbrains.annotations.Nullable
 */
package com.scene7.is.ps.provider;

import com.scene7.is.provider.CacheSpec;
import com.scene7.is.provider.FmtSpec;
import com.scene7.is.provider.JpegQualityConverter;
import com.scene7.is.provider.JpegQualitySpec;
import com.scene7.is.ps.provider.CacheEntry;
import com.scene7.is.ps.provider.IZoomException;
import com.scene7.is.ps.provider.ModifierSet;
import com.scene7.is.ps.provider.PropertiesHandler;
import com.scene7.is.ps.provider.Request;
import com.scene7.is.ps.provider.SlengCompiler;
import com.scene7.is.ps.provider.Util;
import com.scene7.is.ps.provider.defs.ModifierEnum;
import com.scene7.is.ps.provider.fvctx.FvctxImageProps;
import com.scene7.is.ps.provider.fvctx.FvctxImagePropsBuilderImpl;
import com.scene7.is.ps.provider.parsers.ColorConverter;
import com.scene7.is.ps.provider.util.Requester;
import com.scene7.is.sleng.CacheEnum;
import com.scene7.is.sleng.Color;
import com.scene7.is.sleng.ColorProfileInfo;
import com.scene7.is.sleng.ColorSpaceEnum;
import com.scene7.is.sleng.FXGServer;
import com.scene7.is.sleng.ImageAccess;
import com.scene7.is.sleng.ImageAccessException;
import com.scene7.is.sleng.ImageServer;
import com.scene7.is.sleng.ResponseFormatEnum;
import com.scene7.is.sleng.ipp.IppImageAccess;
import com.scene7.is.util.DigestAdler32;
import com.scene7.is.util.MimeTypeEnum;
import com.scene7.is.util.SizeInt;
import com.scene7.is.util.diskcache.Cache;
import com.scene7.is.util.diskcache.CacheAccess;
import com.scene7.is.util.diskcache.CacheException;
import com.scene7.is.util.diskcache.CacheKey;
import com.scene7.is.util.text.ParameterException;
import com.scene7.is.util.text.converters.BooleanConverter;
import com.scene7.is.util.text.converters.DoubleConverter;
import com.scene7.is.util.text.converters.IntegerConverter;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

class ImageResponsePropertiesHandler
extends PropertiesHandler {
    private static final String IMAGE_BGC = "image.bgc";
    private static final String IMAGE_TYPE = "image.type";
    private static final String IMAGE_ICC_PROFILE = "image.iccProfile";
    private static final String IMAGE_ICC_EMBED = "image.iccEmbed";
    private static final String IMAGE_XMP_EMBED = "image.xmpEmbed";
    private static final String IMAGE_PATH_EMBED = "image.pathEmbed";
    private static final String IMAGE_PRINT_RES = "image.printRes";
    private static final String IMAGE_WIDTH = "image.width";
    private static final String IMAGE_HEIGHT = "image.height";
    private static final String IMAGE_PIX_TYP = "image.pixTyp";
    private static final String IMAGE_MASK = "image.mask";
    private static final String IMAGE_QUALITY = "image.quality";
    private static final String IMAGE_LENGTH = "image.length";
    private static final String IMAGE_VERSION = "image.version";
    private static final String METADATA_VERSION = "metadata.version";
    private static final String WARNING = "warning";
    private static final Logger LOGGER = Logger.getLogger(ImageResponsePropertiesHandler.class.getName());
    @NotNull
    private final ImageServer imageServer;
    @NotNull
    private final FXGServer fxgServer;
    @NotNull
    private final Cache cache;

    private static void setRequestProps(Map<String, Object> props, Request request) {
        Color bgc = request.getBgc();
        ModifierSet attr = request.getGlobalAttributes();
        ResponseFormatEnum format = attr.getOrDie(ModifierEnum.FMT).format;
        ImageResponsePropertiesHandler.setProperty(props, "image.bgc", (String)ColorConverter.colorConverter().revert((Object)bgc));
        if (attr.contains(ModifierEnum.QLT)) {
            JpegQualitySpec qltSpec = attr.getOrDie(ModifierEnum.QLT);
            ImageResponsePropertiesHandler.setProperty(props, "image.quality", (String)JpegQualityConverter.jpegQualityConverter().revert((Object)qltSpec));
        }
        MimeTypeEnum mimeType = Util.getMimeType(format);
        ImageResponsePropertiesHandler.setProperty(props, "image.type", mimeType.toString());
    }

    private static void setProfileInfo(@NotNull Map<String, Object> props, @NotNull IppImageAccess imageAccess, boolean iccEmbed) {
        ColorProfileInfo profileInfo = imageAccess.getProfileInfo();
        String profileName = profileInfo.getDescription();
        ImageResponsePropertiesHandler.setProperty(props, "image.iccProfile", profileName);
        ImageResponsePropertiesHandler.setProperty(props, "image.iccEmbed", (String)BooleanConverter.booleanConverter().revert((Object)(profileName != null && iccEmbed)));
    }

    private static void setErrorProps(Map<String, Object> props, ImageAccessException e) throws ImageAccessException {
        if (e.getCode() == 15) {
            StringBuilder buffer = new StringBuilder();
            buffer.append("Profile conflict detected.");
            buffer.append(" Internal: ").append(e.getProperty("internalProfile"));
            buffer.append(" External: ").append(e.getProperty("externalProfile"));
            ImageResponsePropertiesHandler.setProperty(props, "warning", buffer.toString());
        } else if (e.getCode() == 16) {
            StringBuilder buffer = new StringBuilder();
            buffer.append("Color profile not found: ");
            buffer.append(e.getProperty("profilePath"));
            ImageResponsePropertiesHandler.setProperty(props, "warning", buffer.toString());
        } else {
            throw e;
        }
    }

    private static void setProperty(@NotNull Map<String, Object> dst, @NotNull String name, @Nullable String value) {
        if (value != null && !value.isEmpty()) {
            dst.put(name, value);
        }
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    private static void setLength(Map<String, Object> props, CacheAccess cacheEntry) throws CacheException {
        block4 : {
            try {
                if (cacheEntry.isCacheHit()) {
                    CacheEntry entry = (CacheEntry)cacheEntry.getPayload();
                    ImageResponsePropertiesHandler.setProperty(props, "image.length", String.valueOf(entry.pixels.length));
                    break block4;
                }
                ImageResponsePropertiesHandler.setProperty(props, "image.length", "0");
            }
            finally {
                cacheEntry.dispose();
            }
        }
    }

    ImageResponsePropertiesHandler(@NotNull Cache cache, @NotNull ImageServer imageServer, @NotNull FXGServer fxgServer) {
        this.imageServer = imageServer;
        this.fxgServer = fxgServer;
        this.cache = cache;
    }

    @Override
    public Map<String, Object> getProperties(Request request) throws ImageAccessException, IZoomException {
        try {
            HashMap<String, Object> props = new HashMap<String, Object>();
            SlengCompiler compiler = new SlengCompiler(this.imageServer, true, false, false);
            byte[] unoptimizedSleng = compiler.compileRequest(request);
            byte[] sleng = Util.doOptimize(request) ? compiler.optimizeSleng(this.fxgServer, unoptimizedSleng) : unoptimizedSleng;
            ImageResponsePropertiesHandler.setRequestProps(props, request);
            this.setImageProps(props, request, sleng);
            this.setImageVersion(props, request);
            this.setCacheProps(props, request, unoptimizedSleng);
            return props;
        }
        catch (ParameterException e) {
            throw new IZoomException(IZoomException.INVALID_REQUEST, "", (Throwable)e);
        }
    }

    private void setImageVersion(@NotNull Map<String, Object> props, Request request) throws ParameterException, IZoomException, ImageAccessException {
        FvctxImagePropsBuilderImpl imagePropsBuilder = new FvctxImagePropsBuilderImpl(this.imageServer, this.fxgServer);
        FvctxImageProps imageProps = imagePropsBuilder.buildImageProps(request, true);
        String imageVersion = DigestAdler32.createSignature((long)FvctxImageProps.updateImageDigest(DigestAdler32.createMessageDigest(), imageProps).getValue());
        String metadataVersion = DigestAdler32.createSignature((long)FvctxImageProps.updateMetaDigest(DigestAdler32.createMessageDigest(), imageProps).getValue());
        props.put("image.version", imageVersion);
        props.put("metadata.version", metadataVersion);
    }

    private void setImageProps(@NotNull Map<String, Object> props, @NotNull Request request, @NotNull byte[] slengCode) throws ImageAccessException {
        try {
            this.setIppProps(props, request, slengCode);
        }
        catch (ImageAccessException e) {
            ImageResponsePropertiesHandler.setErrorProps(props, e);
        }
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    private void setIppProps(@NotNull Map<String, Object> props, @NotNull Request request, @NotNull byte[] slengCode) throws ImageAccessException {
        IppImageAccess imageAccess = this.getImageAccess(CacheEnum.ON, slengCode);
        try {
            SizeInt size = imageAccess.getSize();
            ImageResponsePropertiesHandler.setProperty(props, "image.printRes", (String)DoubleConverter.doubleConverter().revert((Object)imageAccess.getXDpi()));
            ImageResponsePropertiesHandler.setProperty(props, "image.width", (String)IntegerConverter.integerConverter().revert((Object)size.width));
            ImageResponsePropertiesHandler.setProperty(props, "image.height", (String)IntegerConverter.integerConverter().revert((Object)size.height));
            ImageResponsePropertiesHandler.setProperty(props, "image.pixTyp", imageAccess.getColorModel().pixelType);
            ImageResponsePropertiesHandler.setProperty(props, "image.mask", (String)BooleanConverter.booleanConverter().revert((Object)imageAccess.hasAlpha()));
            ImageResponsePropertiesHandler.setProfileInfo(props, imageAccess, request.getIccEmbed());
            boolean pathEmbed = request.shallEmbedPath();
            boolean hasPsPaths = imageAccess.hasEmbeddedPhotshopPaths();
            ImageResponsePropertiesHandler.setProperty(props, "image.pathEmbed", (String)BooleanConverter.booleanConverter().revert((Object)(pathEmbed && hasPsPaths)));
            boolean xmpEmbed = request.getXmpEmbed();
            boolean hasXmpData = imageAccess.hasEmbeddedXmpData();
            ImageResponsePropertiesHandler.setProperty(props, "image.xmpEmbed", (String)BooleanConverter.booleanConverter().revert((Object)(xmpEmbed && hasXmpData)));
        }
        finally {
            imageAccess.dispose();
        }
    }

    private IppImageAccess getImageAccess(CacheEnum cacheSetting, byte[] slengCode) throws ImageAccessException {
        return (IppImageAccess)this.imageServer.getImageAccess(this.fxgServer, cacheSetting, slengCode);
    }

    private void setCacheProps(@NotNull Map<String, Object> props, @NotNull Request request, @NotNull byte[] slengCode) throws ParameterException, IZoomException {
        ModifierSet globalAttributes = request.getGlobalAttributes();
        CacheSpec cacheUse = globalAttributes.get(ModifierEnum.CACHE, CacheSpec.ON);
        if (cacheUse.getServer() != CacheEnum.ON) {
            ImageResponsePropertiesHandler.setProperty(props, "image.length", "0");
            return;
        }
        try {
            Requester requester = Util.getRequester(slengCode, request, null, this.imageServer, this.fxgServer);
            ImageResponsePropertiesHandler.setLength(props, this.cache.lookup(requester.getCacheKey()));
        }
        catch (CacheException e) {
            LOGGER.log(Level.SEVERE, "Failed to access cache entry", (Throwable)e);
        }
    }
}