CtxRequestHandler.java 6.94 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.scene7.is.provider.DebugInfoEnum
 *  com.scene7.is.provider.ProcessingStatus
 *  com.scene7.is.provider.RequestTypeEnum
 *  com.scene7.is.provider.Response
 *  com.scene7.is.provider.ResponseData
 *  com.scene7.is.provider.TextResponseGenerator
 *  com.scene7.is.provider.TextResponseTypeEnum
 *  com.scene7.is.sleng.CacheEnum
 *  com.scene7.is.sleng.FXGServer
 *  com.scene7.is.sleng.ImageAccessException
 *  com.scene7.is.sleng.ImageServer
 *  com.scene7.is.sleng.SlengPrinter
 *  com.scene7.is.util.DigestAdler32
 *  com.scene7.is.util.MimeTypeEnum
 *  com.scene7.is.util.SizeInt
 *  com.scene7.is.util.TextEncodingTypeEnum
 *  com.scene7.is.util.XMLUtil
 *  com.scene7.is.util.text.ParameterException
 *  org.jetbrains.annotations.NotNull
 */
package com.scene7.is.ps.provider;

import com.scene7.is.provider.DebugInfoEnum;
import com.scene7.is.provider.ProcessingStatus;
import com.scene7.is.provider.RequestTypeEnum;
import com.scene7.is.provider.Response;
import com.scene7.is.provider.ResponseData;
import com.scene7.is.provider.TextResponseGenerator;
import com.scene7.is.provider.TextResponseTypeEnum;
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.Util;
import com.scene7.is.ps.provider.defs.ModifierEnum;
import com.scene7.is.ps.provider.fvctx.FvctxImageProps;
import com.scene7.is.ps.provider.fvctx.FvctxImagePropsBuilder;
import com.scene7.is.ps.provider.fvctx.FvctxImagePropsBuilderImpl;
import com.scene7.is.sleng.CacheEnum;
import com.scene7.is.sleng.FXGServer;
import com.scene7.is.sleng.ImageAccessException;
import com.scene7.is.sleng.ImageServer;
import com.scene7.is.sleng.SlengPrinter;
import com.scene7.is.util.DigestAdler32;
import com.scene7.is.util.MimeTypeEnum;
import com.scene7.is.util.SizeInt;
import com.scene7.is.util.TextEncodingTypeEnum;
import com.scene7.is.util.XMLUtil;
import com.scene7.is.util.text.ParameterException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Properties;
import org.jetbrains.annotations.NotNull;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

class CtxRequestHandler
implements RequestHandler {
    private static final String PROTOCOL_VERSION = "3.0";
    @NotNull
    private final FvctxImagePropsBuilder imagePropsBuilder;

    CtxRequestHandler(@NotNull ImageServer server, @NotNull FXGServer fxgServer) {
        this.imagePropsBuilder = new FvctxImagePropsBuilderImpl(server, fxgServer);
    }

    @NotNull
    @Override
    public Response getResponse(@NotNull Request parsedRequest, @NotNull ProcessingStatus status) throws ImageAccessException, ParameterException, IZoomException {
        if (parsedRequest.getDebugInfo() == DebugInfoEnum.SLENG) {
            RequestTypeEnum requestType = parsedRequest.getType();
            FvctxImageProps imageProps = this.buildImageProps(parsedRequest);
            String slengText = SlengPrinter.decompileCode((byte[])imageProps.getSleng());
            return new Response().setData(ResponseData.createResponseMessage((String)slengText, (MimeTypeEnum)MimeTypeEnum.TEXT_PLAIN)).setRequestType(requestType);
        }
        return this.getContext(parsedRequest);
    }

    @NotNull
    private Response getContext(@NotNull Request request) throws ParameterException, ImageAccessException, IZoomException {
        FvctxImageProps imageProps = this.buildImageProps(request);
        String imageVersion = DigestAdler32.createSignature((long)FvctxImageProps.updateImageDigest(DigestAdler32.createMessageDigest(), imageProps).getValue());
        String metadataVersion = DigestAdler32.createSignature((long)FvctxImageProps.updateMetaDigest(DigestAdler32.createMessageDigest(), imageProps).getValue());
        ResponseData data = TextResponseTypeEnum.XML == request.getResponseType() ? CtxRequestHandler.generateXml(request, imageProps, imageVersion, metadataVersion) : CtxRequestHandler.generateProps(request, imageProps, imageVersion, metadataVersion);
        long expires = Util.computeNonImgExpiration(request);
        return new Response().setData(data).setExpiration(expires).setClientCacheUse(CacheEnum.ON).setRequestType(request.getType());
    }

    @NotNull
    private FvctxImageProps buildImageProps(@NotNull Request request) throws ParameterException, IZoomException, ImageAccessException {
        return this.imagePropsBuilder.buildImageProps(request, false);
    }

    @NotNull
    private static ResponseData generateXml(@NotNull Request request, @NotNull FvctxImageProps imageProps, @NotNull String imageVersion, @NotNull String metadataVersion) {
        Document doc = XMLUtil.createDocument();
        Element root = XMLUtil.createElement((Document)doc, (String)"ctx");
        root.setAttribute("iv", imageVersion);
        root.setAttribute("mv", metadataVersion);
        root.setAttribute("dx", String.valueOf(imageProps.getSize().width));
        root.setAttribute("dy", String.valueOf(imageProps.getSize().height));
        root.setAttribute("pv", "3.0");
        doc.appendChild(root);
        return ResponseData.createResponseMessage((String)XMLUtil.toXMLString((Document)doc, (TextEncodingTypeEnum)request.getResponseEncoding(), (boolean)false), (TextEncodingTypeEnum)request.getResponseEncoding(), (MimeTypeEnum)request.getResponseType().getMimeType());
    }

    @NotNull
    private static ResponseData generateProps(@NotNull Request request, @NotNull FvctxImageProps imageProps, @NotNull String imageVersion, @NotNull String metadataVersion) {
        ModifierSet attr = request.getGlobalAttributes();
        String urlId = CtxRequestHandler.generateUrlId(attr, imageVersion);
        String jsonId = attr.get(ModifierEnum.ID, "");
        String jsonHandler = attr.get(ModifierEnum.HANDLER, "");
        Properties props = new Properties();
        props.setProperty("context.id", urlId);
        props.setProperty("image.rect", "0,0," + imageProps.getSize().width + ',' + imageProps.getSize().height);
        props.setProperty("protocol.version", "3.0");
        props.setProperty("image.version", imageVersion);
        props.setProperty("metadata.version", metadataVersion);
        return ResponseData.createResponseData((byte[])TextResponseGenerator.generate((Properties)props, (TextResponseTypeEnum)request.getResponseType(), (String)jsonId, (String)jsonHandler), (MimeTypeEnum)request.getResponseType().getMimeType());
    }

    @NotNull
    private static String generateUrlId(@NotNull ModifierSet attr, @NotNull String imageVersion) {
        try {
            String netPath = attr.getOrDie(ModifierEnum.I_NET_PATH);
            String query = attr.getOrDie(ModifierEnum.I_NET_QUERY);
            return URLEncoder.encode(netPath + '?' + query + '&' + "id=" + imageVersion, "UTF-8");
        }
        catch (UnsupportedEncodingException e) {
            throw new AssertionError(e);
        }
    }
}