RequestDispatcher.java 9.42 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.RequestTypeSpec
 *  com.scene7.is.provider.Response
 *  com.scene7.is.provider.ResponseData
 *  com.scene7.is.sleng.FXGServer
 *  com.scene7.is.sleng.ImageServer
 *  com.scene7.is.sleng.ipp.IppConnectionException
 *  com.scene7.is.util.MimeTypeEnum
 *  com.scene7.is.util.ServerCacheUseEnum
 *  com.scene7.is.util.Statistics
 *  com.scene7.is.util.callbacks.Option
 *  com.scene7.is.util.diskcache.Cache
 *  com.scene7.is.util.error.ApplicationException
 *  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.RequestTypeSpec;
import com.scene7.is.provider.Response;
import com.scene7.is.provider.ResponseData;
import com.scene7.is.ps.provider.CatalogPropertiesHandler;
import com.scene7.is.ps.provider.ClearCacheRequestHandler;
import com.scene7.is.ps.provider.CtxRequestHandler;
import com.scene7.is.ps.provider.DebugInfoHandler;
import com.scene7.is.ps.provider.ExistsHandler;
import com.scene7.is.ps.provider.FileReleaseRequestHandler;
import com.scene7.is.ps.provider.FileSaveRequestHandler;
import com.scene7.is.ps.provider.HotSpotHandler;
import com.scene7.is.ps.provider.ImageRequestHandler;
import com.scene7.is.ps.provider.ImageResponsePropertiesHandler;
import com.scene7.is.ps.provider.ImageSetHandler;
import com.scene7.is.ps.provider.InvalidRequestHandler;
import com.scene7.is.ps.provider.MessageHandler;
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.ResolveRequestHandler;
import com.scene7.is.ps.provider.ServerStatisticsHandler;
import com.scene7.is.ps.provider.TargetHandler;
import com.scene7.is.ps.provider.TranslationPropertiesHandler;
import com.scene7.is.ps.provider.UserDataHandler;
import com.scene7.is.ps.provider.ValidateHandler;
import com.scene7.is.ps.provider.XmpDataHandler;
import com.scene7.is.ps.provider.defs.ModifierEnum;
import com.scene7.is.ps.provider.util.CacheAgent;
import com.scene7.is.sleng.FXGServer;
import com.scene7.is.sleng.ImageServer;
import com.scene7.is.sleng.ipp.IppConnectionException;
import com.scene7.is.util.MimeTypeEnum;
import com.scene7.is.util.ServerCacheUseEnum;
import com.scene7.is.util.Statistics;
import com.scene7.is.util.callbacks.Option;
import com.scene7.is.util.diskcache.Cache;
import com.scene7.is.util.error.ApplicationException;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.EnumMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jetbrains.annotations.NotNull;

class RequestDispatcher {
    private EnumMap<RequestTypeEnum, RequestHandler> handlers = new EnumMap(RequestTypeEnum.class);
    private static final RequestHandler DEBUG_INFO_HANDLER = new DebugInfoHandler();
    private static final Logger LOGGER = Logger.getLogger(RequestDispatcher.class.getName());

    RequestDispatcher(@NotNull Cache cache, @NotNull ImageServer server, @NotNull FXGServer fxgServer, @NotNull Statistics stats, boolean extendedCommandSet, @NotNull Map<RequestTypeEnum, RequestHandler> handlersParam, @NotNull CacheAgent cacheAgent) {
        InvalidRequestHandler invalidRequestHandler = new InvalidRequestHandler();
        for (RequestTypeEnum r : RequestTypeEnum.values()) {
            this.handlers.put(r, invalidRequestHandler);
        }
        this.handlers.put(RequestTypeEnum.CATALOG_PROPS, new CatalogPropertiesHandler(server));
        this.handlers.put(RequestTypeEnum.TRANSLATION_PROPS, new TranslationPropertiesHandler());
        this.handlers.put(RequestTypeEnum.IMG, new ImageRequestHandler(server, fxgServer, cacheAgent));
        this.handlers.put(RequestTypeEnum.TMB, this.handlers.get((Object)RequestTypeEnum.IMG));
        this.handlers.put(RequestTypeEnum.MASK, this.handlers.get((Object)RequestTypeEnum.IMG));
        this.handlers.put(RequestTypeEnum.TARGETS, new TargetHandler(server));
        this.handlers.put(RequestTypeEnum.HOTSPOTS, new HotSpotHandler(server, fxgServer));
        this.handlers.put(RequestTypeEnum.CTX, new CtxRequestHandler(server, fxgServer));
        this.handlers.put(RequestTypeEnum.TILE, this.handlers.get((Object)RequestTypeEnum.IMG));
        this.handlers.put(RequestTypeEnum.USERDATA, new UserDataHandler(server));
        this.handlers.put(RequestTypeEnum.IMAGE_SET, ImageSetHandler.apply());
        this.handlers.put(RequestTypeEnum.CLEARCACHE, new ClearCacheRequestHandler(server));
        this.handlers.put(RequestTypeEnum.RELEASE_FILE, new FileReleaseRequestHandler());
        this.handlers.put(RequestTypeEnum.MESSAGE, new MessageHandler());
        this.handlers.put(RequestTypeEnum.RESPONSE_PROPS, new ImageResponsePropertiesHandler(cache, server, fxgServer));
        this.handlers.put(RequestTypeEnum.RESOLVE_REQUEST, new ResolveRequestHandler());
        this.handlers.put(RequestTypeEnum.LOAD_CACHE, new ImageRequestHandler(server, fxgServer, cacheAgent));
        this.handlers.put(RequestTypeEnum.SERVER_STATISTICS, new ServerStatisticsHandler(server, cache, stats));
        this.handlers.put(RequestTypeEnum.VALIDATE, new ValidateHandler());
        this.handlers.put(RequestTypeEnum.EXISTS, new ExistsHandler());
        this.handlers.put(RequestTypeEnum.XMP, new XmpDataHandler(server, fxgServer));
        for (Map.Entry<RequestTypeEnum, RequestHandler> entry : handlersParam.entrySet()) {
            RequestTypeEnum requestType = entry.getKey();
            RequestHandler handler = entry.getValue();
            if (handler instanceof FileSaveRequestHandler && !extendedCommandSet) continue;
            this.handlers.put(requestType, handler);
        }
    }

    public Response getResponse(Request request, ProcessingStatus status) throws ApplicationException {
        RequestHandler handler = this.getHandler(request);
        try {
            Response response = handler.getResponse(request, status);
            if (request.getDebugInfo() == DebugInfoEnum.RESPONSE_PROPS) {
                return RequestDispatcher.getResponseProps(response);
            }
            return response;
        }
        catch (IppConnectionException e) {
            LOGGER.warning(Thread.currentThread().toString() + ": " + e.toString() + ". Retrying request...");
            LOGGER.log(Level.FINER, "More info: ", (Throwable)e);
            try {
                return handler.getResponse(request, status);
            }
            catch (IppConnectionException ignored) {
                throw new IppConnectionException(4, (Throwable)e);
            }
        }
    }

    private static Response getResponseProps(Response response) {
        Response result = new Response().setRequestType(response.getRequestType());
        Properties props = new Properties();
        props.setProperty("size", String.valueOf(response.getData().getSize()));
        props.setProperty("type", String.valueOf((Object)response.getRequestType()));
        props.setProperty("digest", String.valueOf(response.getData().getDigest()));
        props.setProperty("cache-use", String.valueOf((Object)response.getServerCacheUse()));
        for (String cacheKey : response.getCacheKey()) {
            props.setProperty("cache-key", String.valueOf(cacheKey));
        }
        props.setProperty("expiration", String.valueOf(response.getExpiration()));
        props.setProperty("lastModified", String.valueOf(response.getLastModified()));
        props.setProperty("content-type", String.valueOf(response.getData().getContentType()));
        props.setProperty("client-cache-enabled", String.valueOf(response.isClientCacheEnabled()));
        props.setProperty("status", String.valueOf(response.getStatus()));
        props.setProperty("substitute", String.valueOf(response.isMissingImage()));
        props.setProperty("errorImage", String.valueOf(response.isErrorImage()));
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        try {
            props.store(buffer, "Response Properties");
            buffer.close();
            result.setData(ResponseData.createResponseData((byte[])buffer.toByteArray(), (MimeTypeEnum)MimeTypeEnum.TEXT_PLAIN));
            return result;
        }
        catch (IOException e) {
            throw new AssertionError(e);
        }
    }

    private RequestHandler getHandler(Request request) {
        DebugInfoEnum debugInfo = request.getDebugInfo();
        switch (debugInfo) {
            case REQUEST: 
            case QUERY: 
            case CATALOG: 
            case RECORD: 
            case RULESET: {
                return DEBUG_INFO_HANDLER;
            }
            case SERVER_PROPS: {
                return this.handlers.get((Object)RequestTypeEnum.SERVER_PROPS);
            }
            case SERVER_STATISTICS: {
                return this.handlers.get((Object)RequestTypeEnum.SERVER_STATISTICS);
            }
        }
        RequestTypeEnum requestType = request.getGlobalAttributes().getOrDie(ModifierEnum.REQ).type;
        if (requestType == RequestTypeEnum.SERVER_STATISTICS) {
            return new InvalidRequestHandler();
        }
        return this.handlers.get((Object)requestType);
    }

}