ImageRequestHandler.java 11.1 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.scene7.is.provider.CacheSpec
 *  com.scene7.is.provider.DebugInfoEnum
 *  com.scene7.is.provider.DefaultImageModeSpecConverter
 *  com.scene7.is.provider.FmtSpec
 *  com.scene7.is.provider.ProcessingStatus
 *  com.scene7.is.provider.RequestTypeEnum
 *  com.scene7.is.provider.RequestTypeSpec
 *  com.scene7.is.provider.RequestTypeSpec$Builder
 *  com.scene7.is.provider.Response
 *  com.scene7.is.provider.ResponseData
 *  com.scene7.is.provider.catalog.ObjectRecord
 *  com.scene7.is.sleng.CacheEnum
 *  com.scene7.is.sleng.DefaultImageModeEnum
 *  com.scene7.is.sleng.DefaultImageModeSpec
 *  com.scene7.is.sleng.FXGServer
 *  com.scene7.is.sleng.ImageAccessException
 *  com.scene7.is.sleng.ImageServer
 *  com.scene7.is.sleng.ResponseFormatEnum
 *  com.scene7.is.sleng.SlengPrinter
 *  com.scene7.is.sleng.ipp.IppBadImageAnchorException
 *  com.scene7.is.util.IOUtil
 *  com.scene7.is.util.MimeTypeEnum
 *  com.scene7.is.util.error.ApplicationException
 *  com.scene7.is.util.error.Scaffold
 *  com.scene7.is.util.text.ParameterException
 *  org.jetbrains.annotations.NotNull
 */
package com.scene7.is.ps.provider;

import com.scene7.is.provider.CacheSpec;
import com.scene7.is.provider.DebugInfoEnum;
import com.scene7.is.provider.DefaultImageModeSpecConverter;
import com.scene7.is.provider.FmtSpec;
import com.scene7.is.provider.ProcessingStatus;
import com.scene7.is.provider.RequestTypeEnum;
import com.scene7.is.provider.RequestTypeSpec;
import com.scene7.is.provider.Response;
import com.scene7.is.provider.ResponseData;
import com.scene7.is.provider.catalog.ObjectRecord;
import com.scene7.is.ps.provider.CatalogRecordException;
import com.scene7.is.ps.provider.IZoomException;
import com.scene7.is.ps.provider.ModifierSet;
import com.scene7.is.ps.provider.Request;
import com.scene7.is.ps.provider.RequestHandler;
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.util.CacheAgent;
import com.scene7.is.ps.provider.util.CachingPolicy;
import com.scene7.is.ps.provider.util.Requester;
import com.scene7.is.sleng.CacheEnum;
import com.scene7.is.sleng.DefaultImageModeEnum;
import com.scene7.is.sleng.DefaultImageModeSpec;
import com.scene7.is.sleng.FXGServer;
import com.scene7.is.sleng.ImageAccessException;
import com.scene7.is.sleng.ImageServer;
import com.scene7.is.sleng.ResponseFormatEnum;
import com.scene7.is.sleng.SlengPrinter;
import com.scene7.is.sleng.ipp.IppBadImageAnchorException;
import com.scene7.is.util.IOUtil;
import com.scene7.is.util.MimeTypeEnum;
import com.scene7.is.util.error.ApplicationException;
import com.scene7.is.util.error.Scaffold;
import com.scene7.is.util.text.ParameterException;
import java.util.Date;
import org.jetbrains.annotations.NotNull;

class ImageRequestHandler
implements RequestHandler {
    private static final Boolean[] SUPPORTED_FORMAT = new Boolean[ResponseFormatEnum.class.getEnumConstants().length];
    private final CacheAgent cacheAgent;
    private final ImageServer imageServer;
    private final FXGServer fxgServer;
    private static final long ONE_YEAR = 31536000000L;

    ImageRequestHandler(@NotNull ImageServer server, @NotNull FXGServer fxgServer, @NotNull CacheAgent cacheAgent) {
        this.cacheAgent = cacheAgent;
        this.imageServer = server;
        this.fxgServer = fxgServer;
    }

    @NotNull
    @Override
    public Response getResponse(@NotNull Request parsedRequest, @NotNull ProcessingStatus status) throws ParameterException, IZoomException, ImageAccessException {
        Response response;
        ModifierSet attr = parsedRequest.getGlobalAttributes();
        DebugInfoEnum debugInfo = parsedRequest.getDebugInfo();
        if (debugInfo == DebugInfoEnum.SLENG) {
            boolean postProcess = ImageRequestHandler.shouldPostProcess(attr);
            SlengCompiler compiler = new SlengCompiler(this.imageServer, postProcess, true, false);
            byte[] code = Util.doOptimize(parsedRequest) ? compiler.compileOptimizedRequest(this.fxgServer, parsedRequest) : compiler.compileRequest(parsedRequest);
            return new Response().setData(ResponseData.createResponseMessage((String)SlengPrinter.decompileCode((byte[])code), (MimeTypeEnum)MimeTypeEnum.TEXT_PLAIN)).setRequestType(parsedRequest.getType());
        }
        if (attr.contains(ModifierEnum.I_CATALOG_RECORD_EXCEPTION)) {
            return this.handleDefaultResponse(attr, debugInfo, attr.getOrDie(ModifierEnum.I_CATALOG_RECORD_EXCEPTION), parsedRequest);
        }
        try {
            response = this.getImageData(parsedRequest, debugInfo);
        }
        catch (IppBadImageAnchorException e) {
            response = this.handleDefaultResponse(attr, debugInfo, (ApplicationException)e, parsedRequest);
        }
        return response;
    }

    private Response getImageData(Request request, DebugInfoEnum debugInfo) throws ParameterException, IZoomException, ImageAccessException {
        ModifierSet attr = request.getGlobalAttributes();
        FmtSpec fmt = attr.getOrDie(ModifierEnum.FMT);
        ResponseFormatEnum format = fmt.format;
        if (!SUPPORTED_FORMAT[format.ordinal()].booleanValue()) {
            throw new IZoomException(IZoomException.INVALID_REQUEST, "Invalid response format: " + (Object)format, null);
        }
        boolean doComments = debugInfo == DebugInfoEnum.SLENG || debugInfo == DebugInfoEnum.RUN_DEBUGGER;
        boolean postProcess = ImageRequestHandler.shouldPostProcess(attr);
        SlengCompiler compiler = new SlengCompiler(this.imageServer, postProcess, doComments, false);
        byte[] code = compiler.compileRequest(request);
        CachingPolicy policy = Util.getCachingPolicy(request);
        Requester requester = Util.getRequester(code, request, compiler, this.imageServer, this.fxgServer);
        Response response = this.cacheAgent.getResponse(request.getRootId(), requester, policy);
        this.setExpiration(request, response);
        ModifierSet attributes = request.getGlobalAttributes();
        CacheSpec cacheUse = attributes.get(ModifierEnum.CACHE, CacheSpec.ON);
        response.setClientCacheUse(cacheUse.getClient());
        response.setRequestType(request.getType());
        RequestTypeEnum reqType = attr.getOrDie(ModifierEnum.REQ).type;
        if (RequestTypeEnum.LOAD_CACHE.equals((Object)reqType)) {
            byte[] data = IOUtil.toByteArray((String[])new String[]{"#S7Z OK", "" + '#' + new Date().toString(), "image.length=" + response.getData().getSize()});
            return new Response().setData(ResponseData.createResponseData((byte[])data, (MimeTypeEnum)MimeTypeEnum.TEXT_PLAIN)).setClientCacheUse(CacheEnum.ON).setRequestType(request.getType());
        }
        return response;
    }

    private void setExpiration(Request request, Response response) throws IZoomException {
        ModifierSet atts = request.getGlobalAttributes();
        if (atts.contains(ModifierEnum.ID) && request.getType() == RequestTypeEnum.TILE) {
            response.setExpiration(System.currentTimeMillis() + 31536000000L);
        } else {
            response.setExpiration(Util.computeExpiration(request, this.imageServer));
        }
    }

    private Response handleDefaultResponse(ModifierSet attr, DebugInfoEnum debugInfo, ApplicationException e, Request originalRequest) throws ParameterException, IZoomException, ImageAccessException {
        Response response;
        if (attr.contains(ModifierEnum.I_DEFAULT_IMAGE_REQUEST)) {
            Request request = attr.getOrDie(ModifierEnum.I_DEFAULT_IMAGE_REQUEST);
            if (attr.getOrDie(ModifierEnum.REQ).type == RequestTypeEnum.TMB) {
                RequestTypeSpec.Builder builder = new RequestTypeSpec.Builder();
                builder.type(RequestTypeEnum.TMB);
                request.setModifier(ModifierEnum.REQ, builder.getProduct());
            }
            if (attr.contains(ModifierEnum.CACHE)) {
                CacheSpec cacheSpec = attr.getOrDie(ModifierEnum.CACHE);
                request.setModifier(ModifierEnum.CACHE, cacheSpec);
            }
            response = this.getImageData(request, debugInfo);
            response.setMissingImage(true);
            response.setDefaultImage(true);
            response.setExpiration(Util.computeDefaultExpiration(attr.getOrDie(ModifierEnum.I_DEFAULT_IMAGE_REQUEST)));
            response.setException((Throwable)e);
            DefaultImageModeSpec defaultImageMode = originalRequest.getCatalogValue(ModifierEnum.DEFAULT_IMAGE_MODE, DefaultImageModeSpecConverter.DEFAULT_SPEC);
            if (defaultImageMode.defaultImageMode == DefaultImageModeEnum.LAYER) {
                response.setDefaultImageRecord(request.getGlobalAttributes().getOrDie(ModifierEnum.I_DEFAULT_IMAGE_RECORD));
            }
        } else {
            assert (e instanceof ImageAccessException);
            throw (ImageAccessException)e;
        }
        return response;
    }

    private static boolean shouldPostProcess(@NotNull ModifierSet attr) {
        RequestTypeSpec requestType = attr.getOrDie(ModifierEnum.REQ);
        return requestType.type != RequestTypeEnum.TILE;
    }

    static {
        ImageRequestHandler.SUPPORTED_FORMAT[ResponseFormatEnum.GIF.ordinal()] = true;
        ImageRequestHandler.SUPPORTED_FORMAT[ResponseFormatEnum.JPEG.ordinal()] = true;
        ImageRequestHandler.SUPPORTED_FORMAT[ResponseFormatEnum.PJPEG.ordinal()] = true;
        ImageRequestHandler.SUPPORTED_FORMAT[ResponseFormatEnum.PNG.ordinal()] = true;
        ImageRequestHandler.SUPPORTED_FORMAT[ResponseFormatEnum.PNG8.ordinal()] = true;
        ImageRequestHandler.SUPPORTED_FORMAT[ResponseFormatEnum.SWF.ordinal()] = true;
        ImageRequestHandler.SUPPORTED_FORMAT[ResponseFormatEnum.SWF3.ordinal()] = true;
        ImageRequestHandler.SUPPORTED_FORMAT[ResponseFormatEnum.TIF.ordinal()] = true;
        ImageRequestHandler.SUPPORTED_FORMAT[ResponseFormatEnum.EPS.ordinal()] = true;
        ImageRequestHandler.SUPPORTED_FORMAT[ResponseFormatEnum.PTIF.ordinal()] = true;
        ImageRequestHandler.SUPPORTED_FORMAT[ResponseFormatEnum.PCX.ordinal()] = true;
        ImageRequestHandler.SUPPORTED_FORMAT[ResponseFormatEnum.DEFLATE.ordinal()] = true;
        ImageRequestHandler.SUPPORTED_FORMAT[ResponseFormatEnum.PDF.ordinal()] = true;
        ImageRequestHandler.SUPPORTED_FORMAT[ResponseFormatEnum.PROPS.ordinal()] = false;
        ImageRequestHandler.SUPPORTED_FORMAT[ResponseFormatEnum.XML.ordinal()] = false;
        ImageRequestHandler.SUPPORTED_FORMAT[ResponseFormatEnum.HTML.ordinal()] = false;
        ImageRequestHandler.SUPPORTED_FORMAT[ResponseFormatEnum.JAVA_SCRIPT.ordinal()] = false;
        ImageRequestHandler.SUPPORTED_FORMAT[ResponseFormatEnum.SIMPLE.ordinal()] = true;
        ImageRequestHandler.SUPPORTED_FORMAT[ResponseFormatEnum.F4M.ordinal()] = false;
        ImageRequestHandler.SUPPORTED_FORMAT[ResponseFormatEnum.M3U8.ordinal()] = false;
        ImageRequestHandler.SUPPORTED_FORMAT[ResponseFormatEnum.PSD.ordinal()] = false;
        ImageRequestHandler.SUPPORTED_FORMAT[ResponseFormatEnum.WEBP.ordinal()] = true;
        Scaffold.validateMapping(ResponseFormatEnum.class, (Object[])SUPPORTED_FORMAT);
    }
}