HotSpotHandler.java 7.14 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.scene7.is.catalog.util.localization.LocaleMap
 *  com.scene7.is.provider.DebugInfoEnum
 *  com.scene7.is.provider.FmtSpec
 *  com.scene7.is.provider.ProcessingStatus
 *  com.scene7.is.provider.RequestTypeEnum
 *  com.scene7.is.provider.RequestTypeSpec
 *  com.scene7.is.provider.Response
 *  com.scene7.is.provider.ResponseData
 *  com.scene7.is.provider.TextResponseTypeEnum
 *  com.scene7.is.sleng.CacheEnum
 *  com.scene7.is.sleng.Engine
 *  com.scene7.is.sleng.FXGServer
 *  com.scene7.is.sleng.HotSpot
 *  com.scene7.is.sleng.ImageAccessException
 *  com.scene7.is.sleng.ImageServer
 *  com.scene7.is.sleng.LayerFactory
 *  com.scene7.is.sleng.LayerFactoryTypeEnum
 *  com.scene7.is.sleng.ResponseFormatEnum
 *  com.scene7.is.sleng.Sleng
 *  com.scene7.is.sleng.SlengCodeInterpreter
 *  com.scene7.is.sleng.SlengNeedImageServerAccess
 *  com.scene7.is.sleng.SlengPrinter
 *  com.scene7.is.util.MimeTypeEnum
 *  com.scene7.is.util.TextEncodingTypeEnum
 *  com.scene7.is.util.text.ParameterException
 *  org.jetbrains.annotations.NotNull
 */
package com.scene7.is.ps.provider;

import com.scene7.is.catalog.util.localization.LocaleMap;
import com.scene7.is.provider.DebugInfoEnum;
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.TextResponseTypeEnum;
import com.scene7.is.ps.provider.HotSpotResponseGenerator;
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.sleng.CacheEnum;
import com.scene7.is.sleng.Engine;
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.sleng.LayerFactory;
import com.scene7.is.sleng.LayerFactoryTypeEnum;
import com.scene7.is.sleng.ResponseFormatEnum;
import com.scene7.is.sleng.Sleng;
import com.scene7.is.sleng.SlengCodeInterpreter;
import com.scene7.is.sleng.SlengNeedImageServerAccess;
import com.scene7.is.sleng.SlengPrinter;
import com.scene7.is.util.MimeTypeEnum;
import com.scene7.is.util.TextEncodingTypeEnum;
import com.scene7.is.util.text.ParameterException;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.jetbrains.annotations.NotNull;

public class HotSpotHandler
implements RequestHandler {
    private final ImageServer imageServer;
    private final FXGServer fxgServer;

    public HotSpotHandler(@NotNull ImageServer imageServer, @NotNull FXGServer fxgServer) {
        this.imageServer = imageServer;
        this.fxgServer = fxgServer;
    }

    @NotNull
    @Override
    public Response getResponse(@NotNull Request parsedRequest, @NotNull ProcessingStatus status) throws ParameterException, IZoomException, ImageAccessException {
        String responseString;
        ModifierSet attr = parsedRequest.getGlobalAttributes();
        DebugInfoEnum debugInfo = parsedRequest.getDebugInfo();
        if (debugInfo == DebugInfoEnum.SLENG) {
            SlengCompiler compiler = new SlengCompiler(this.imageServer, true, true, true);
            byte[] code = compiler.compileRequest(parsedRequest);
            return new Response().setData(ResponseData.createResponseMessage((String)SlengPrinter.decompileCode((byte[])code), (MimeTypeEnum)MimeTypeEnum.TEXT_PLAIN)).setClientCacheUse(CacheEnum.ON).setRequestType(parsedRequest.getType());
        }
        SlengCompiler compiler = new SlengCompiler(this.imageServer, true, debugInfo != DebugInfoEnum.NONE, true);
        byte[] code = compiler.compileRequest(parsedRequest);
        TextResponseTypeEnum format = HotSpotHandler.deriveResponseType(attr);
        TextEncodingTypeEnum encoding = parsedRequest.getResponseEncoding();
        List<HotSpot> hotSpots = this.getHotSpots(code);
        LocaleMap localeMap = parsedRequest.getCatalogValue(ModifierEnum.I_LOCALE_STR_MAP);
        String locale = parsedRequest.getGlobalAttributes().getOrDie(ModifierEnum.LOCALE);
        switch (format) {
            case XML: {
                responseString = HotSpotResponseGenerator.toXml(localeMap, locale, hotSpots, encoding);
                break;
            }
            case HTML: 
            case TEXT: {
                responseString = HotSpotResponseGenerator.toHtml(localeMap, locale, hotSpots);
                break;
            }
            case JSON: {
                String id = attr.get(ModifierEnum.ID, "");
                String handler = attr.get(ModifierEnum.HANDLER, "");
                responseString = HotSpotResponseGenerator.toJson(localeMap, locale, hotSpots, id, handler);
                break;
            }
            default: {
                throw new IZoomException(IZoomException.UNSUPPORTED_FORMAT, String.valueOf((Object)format), null);
            }
        }
        return new Response().setData(ResponseData.createResponseMessage((String)responseString, (TextEncodingTypeEnum)parsedRequest.getResponseEncoding(), (MimeTypeEnum)format.getMimeType())).setExpiration(Util.computeExpiration(parsedRequest, this.imageServer)).setRequestType(parsedRequest.getType());
    }

    private static TextResponseTypeEnum deriveResponseType(@NotNull ModifierSet attr) throws ParameterException {
        RequestTypeSpec requestTypeSpec = attr.get(ModifierEnum.REQ);
        if (requestTypeSpec.format != null) {
            return requestTypeSpec.format;
        }
        if (attr.contains(ModifierEnum.FMT)) {
            FmtSpec fmt = attr.getOrDie(ModifierEnum.FMT);
            switch (fmt.format) {
                case PROPS: {
                    return TextResponseTypeEnum.PROPS;
                }
                case XML: {
                    return TextResponseTypeEnum.XML;
                }
                case JAVA_SCRIPT: {
                    return TextResponseTypeEnum.JAVASCRIPT;
                }
                case HTML: {
                    return TextResponseTypeEnum.HTML;
                }
            }
        }
        return TextResponseTypeEnum.TEXT;
    }

    private List<HotSpot> getHotSpots(byte[] slengCode) throws ImageAccessException {
        boolean needIsAccess = SlengNeedImageServerAccess.needImageServerAccess((byte[])slengCode);
        Engine engine = new Engine(this.imageServer.getLayerFactory(LayerFactoryTypeEnum.HOTSPOTS, needIsAccess), this.fxgServer, CacheEnum.ON);
        SlengCodeInterpreter interpreter = new SlengCodeInterpreter((Sleng)engine);
        try {
            interpreter.run((InputStream)new ByteArrayInputStream(slengCode));
            List list = engine.getHotSpots();
            return list;
        }
        catch (IOException e) {
            throw new AssertionError(e);
        }
        finally {
            engine.dispose();
        }
    }

}