FvctxRequester.java 9.84 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.scene7.is.catalog.util.localization.LocaleMap
 *  com.scene7.is.provider.ImageSet
 *  com.scene7.is.provider.PSModifierEnum
 *  com.scene7.is.provider.Query
 *  com.scene7.is.provider.QueryModifier
 *  com.scene7.is.provider.QueryModifierType
 *  com.scene7.is.provider.QueryParser
 *  com.scene7.is.provider.RequestContext
 *  com.scene7.is.provider.RequestTypeSpec
 *  com.scene7.is.provider.ResponseData
 *  com.scene7.is.provider.ZoomTargets
 *  com.scene7.is.provider.catalog.Catalog
 *  com.scene7.is.provider.catalog.ObjectRecord
 *  com.scene7.is.sleng.CacheEnum
 *  com.scene7.is.sleng.FXGServer
 *  com.scene7.is.sleng.HotSpot
 *  com.scene7.is.sleng.ImageAccessException
 *  com.scene7.is.sleng.ImageServer
 *  com.scene7.is.util.ArrayUtil
 *  com.scene7.is.util.ConversionUtil
 *  com.scene7.is.util.Digest
 *  com.scene7.is.util.MimeTypeEnum
 *  com.scene7.is.util.TextEncodingTypeEnum
 *  com.scene7.is.util.XMLUtil
 *  com.scene7.is.util.collections.CollectionUtil
 *  com.scene7.is.util.diskcache.CacheKey
 *  com.scene7.is.util.diskcache.DigestKey
 *  com.scene7.is.util.text.ParameterException
 *  org.jetbrains.annotations.NotNull
 */
package com.scene7.is.ps.provider.fvctx;

import com.scene7.is.catalog.util.localization.LocaleMap;
import com.scene7.is.provider.ImageSet;
import com.scene7.is.provider.PSModifierEnum;
import com.scene7.is.provider.Query;
import com.scene7.is.provider.QueryModifier;
import com.scene7.is.provider.QueryModifierType;
import com.scene7.is.provider.QueryParser;
import com.scene7.is.provider.RequestContext;
import com.scene7.is.provider.RequestTypeSpec;
import com.scene7.is.provider.ResponseData;
import com.scene7.is.provider.ZoomTargets;
import com.scene7.is.provider.catalog.Catalog;
import com.scene7.is.provider.catalog.ObjectRecord;
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.defs.ModifierEnum;
import com.scene7.is.ps.provider.fvctx.FvctxFilter;
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.ps.provider.fvctx.FvctxImageSetRequest;
import com.scene7.is.ps.provider.fvctx.FvctxNode;
import com.scene7.is.ps.provider.fvctx.FvctxNodeFilter;
import com.scene7.is.ps.provider.fvctx.FvctxNodeNestingLimiter;
import com.scene7.is.ps.provider.fvctx.FvctxNodeXmlWriter;
import com.scene7.is.ps.provider.fvctx.FvctxPipelineBuilderImpl;
import com.scene7.is.ps.provider.fvctx.FvctxPipelineProcessor;
import com.scene7.is.ps.provider.fvctx.FvctxRequestBuilder;
import com.scene7.is.ps.provider.parsers.query.PSModifierKeyConverter;
import com.scene7.is.ps.provider.util.Requester;
import com.scene7.is.sleng.CacheEnum;
import com.scene7.is.sleng.FXGServer;
import com.scene7.is.sleng.HotSpot;
import com.scene7.is.sleng.ImageAccessException;
import com.scene7.is.sleng.ImageServer;
import com.scene7.is.util.ArrayUtil;
import com.scene7.is.util.ConversionUtil;
import com.scene7.is.util.Digest;
import com.scene7.is.util.MimeTypeEnum;
import com.scene7.is.util.TextEncodingTypeEnum;
import com.scene7.is.util.XMLUtil;
import com.scene7.is.util.collections.CollectionUtil;
import com.scene7.is.util.diskcache.CacheKey;
import com.scene7.is.util.diskcache.DigestKey;
import com.scene7.is.util.text.ParameterException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.util.List;
import java.util.Set;
import org.jetbrains.annotations.NotNull;
import org.w3c.dom.Document;

public class FvctxRequester
implements Requester {
    @NotNull
    private final FvctxRequestBuilder requestBuilder;
    @NotNull
    private final RequestContext context;
    @NotNull
    private final FvctxImageSetRequest imageSetRequest;
    @NotNull
    private final FvctxFilter filter;
    private final int maxFramesPerFrameset;
    private final int nestingLimit;
    private CacheKey cacheKey;
    private final ImageServer imageServer;
    private final FXGServer fxgServer;
    private static final int FVCTX_MIN_VERSION = 3;
    private static final int FVCTX_MAX_VERSION = 4;
    private static final Set<PSModifierEnum> FVCTX_EXCLUDED_MODIFIERS = CollectionUtil.enumSetOf(PSModifierEnum.class, (Enum[])new PSModifierEnum[]{PSModifierEnum.CACHE});

    public FvctxRequester(@NotNull FvctxRequestBuilder requestBuilder, @NotNull RequestContext context, @NotNull FvctxImageSetRequest imageSetRequest, @NotNull FvctxFilter filter, int maxFramesPerFrameset, int nestingLimit, @NotNull ImageServer imageServer, @NotNull FXGServer fxgServer) {
        this.requestBuilder = requestBuilder;
        this.context = context;
        this.imageSetRequest = imageSetRequest;
        this.filter = filter;
        this.maxFramesPerFrameset = maxFramesPerFrameset;
        this.nestingLimit = nestingLimit;
        this.imageServer = imageServer;
        this.fxgServer = fxgServer;
    }

    @NotNull
    @Override
    public CacheKey getCacheKey() {
        if (this.cacheKey == null) {
            this.cacheKey = this.createCacheKey();
        }
        return this.cacheKey;
    }

    @NotNull
    @Override
    public ResponseData createResponseData(@NotNull byte[] data) {
        return ResponseData.createResponseData((byte[])data, (TextEncodingTypeEnum)this.imageSetRequest.request.getResponseEncoding(), (MimeTypeEnum)MimeTypeEnum.TEXT_XML);
    }

    @NotNull
    @Override
    public byte[] getPixels(CacheEnum cacheSetting) throws IZoomException {
        Request request = this.imageSetRequest.request;
        ModifierSet attr = request.getGlobalAttributes();
        int fvctxVersion = FvctxRequester.getFvctxVersion(attr.getOrDie(ModifierEnum.REQ));
        LocaleMap localeMap = request.getCatalogValue(ModifierEnum.I_LOCALE_STR_MAP);
        String locale = attr.getOrDie(ModifierEnum.LOCALE);
        String labelKey = attr.get(ModifierEnum.LABELKEY, "");
        FvctxImagePropsBuilderImpl imagePropsBuilder = new FvctxImagePropsBuilderImpl(this.imageServer, this.fxgServer);
        ZoomTargets publicTargets = ZoomTargets.zoomTargets();
        List<HotSpot> publicMaps = CollectionUtil.list();
        if (this.imageSetRequest.isImageSet()) {
            try {
                FvctxImageProps props = imagePropsBuilder.buildImageProps(request, false);
                publicTargets = props.getTargets();
                publicMaps = props.getMaps();
            }
            catch (ImageAccessException e) {
                throw new IZoomException(IZoomException.FVCTX_PUBLIC_MAPS_TARGETS_ERROR, e.getMessage(), (Throwable)e);
            }
            catch (ParameterException e) {
                throw new IZoomException(IZoomException.FVCTX_PUBLIC_MAPS_TARGETS_ERROR, e.getMessage(), (Throwable)e);
            }
        }
        FvctxNodeXmlWriter xmlWriter = new FvctxNodeXmlWriter(fvctxVersion, localeMap, locale, labelKey, publicTargets, publicMaps);
        FvctxNodeNestingLimiter nestingLimiter = new FvctxNodeNestingLimiter(this.nestingLimit, xmlWriter);
        FvctxNodeFilter node = new FvctxNodeFilter(this.filter, nestingLimiter);
        FvctxPipelineBuilderImpl pipelineBuilder = new FvctxPipelineBuilderImpl(this.requestBuilder, imagePropsBuilder, node, this.maxFramesPerFrameset);
        if (!this.imageSetRequest.isEmpty()) {
            if (this.imageSetRequest.isSingleImage()) {
                FvctxNode pipeline = pipelineBuilder.createSingleImagePipeline();
                FvctxPipelineProcessor.processSingleImageRequest(request, pipeline);
            } else {
                Catalog mainCatalog = this.imageSetRequest.request.getRecord().getCatalog();
                FvctxNode pipeline = pipelineBuilder.createImageSetPipeline(mainCatalog);
                FvctxPipelineProcessor.processImageSet(this.imageSetRequest.imageset, pipeline);
            }
        }
        try {
            Document document = xmlWriter.getProduct();
            return XMLUtil.toXMLBytes((Document)document, (TextEncodingTypeEnum)request.getResponseEncoding(), (boolean)false);
        }
        catch (UnsupportedEncodingException e) {
            throw new IZoomException(IZoomException.XML_ENCODING_ERROR, this.imageSetRequest.request.getResponseEncoding().toString(), e);
        }
    }

    @NotNull
    @Override
    public byte[] getVersionKey(CacheEnum cacheSetting) throws ImageAccessException {
        return ArrayUtil.byteArrayOf((byte[])new byte[0]);
    }

    private CacheKey createCacheKey() {
        ModifierSet attr = this.imageSetRequest.request.getGlobalAttributes();
        MessageDigest digest = Digest.createMessageDigest();
        Digest.updateDigest((MessageDigest)digest, (String)this.context.getCatalog().getRootId());
        Digest.updateDigest((MessageDigest)digest, (String)attr.getOrDie(ModifierEnum.I_NET_PATH));
        Query query = QueryParser.queryParser().parse(attr.getOrDie(ModifierEnum.I_NET_QUERY));
        for (QueryModifier modifier : query.getModifiers()) {
            PSModifierEnum key;
            if (modifier.getType() == QueryModifierType.MODIFIER && ((key = (PSModifierEnum)PSModifierKeyConverter.psModifierKeyConverter().convert((Object)modifier.getKey())) == null || FVCTX_EXCLUDED_MODIFIERS.contains((Object)key))) continue;
            digest.update(ConversionUtil.toByte((int)modifier.getType().ordinal()));
            Digest.updateDigest((MessageDigest)digest, (String)modifier.getKey());
            Digest.updateDigest((MessageDigest)digest, (String)modifier.getValue());
        }
        return DigestKey.createDigestKey((MessageDigest)digest);
    }

    private static int getFvctxVersion(@NotNull RequestTypeSpec requestType) {
        if (requestType.version < 3) {
            return 3;
        }
        if (requestType.version > 4) {
            return 4;
        }
        return requestType.version;
    }
}