PlatformServerImpl.java 12.9 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.scene7.is.catalog.util.IPAddressFilter
 *  com.scene7.is.provider.CacheSpec
 *  com.scene7.is.provider.DebugInfoEnum
 *  com.scene7.is.provider.EmbeddedProvider
 *  com.scene7.is.provider.EmbeddedRequest
 *  com.scene7.is.provider.HTTPHeader
 *  com.scene7.is.provider.HTTPHeader$ModPolicy
 *  com.scene7.is.provider.ProcessingStatus
 *  com.scene7.is.provider.RequestContext
 *  com.scene7.is.provider.RequestContextEnum
 *  com.scene7.is.provider.RequestTypeEnum
 *  com.scene7.is.provider.RequestTypeSpec
 *  com.scene7.is.provider.Response
 *  com.scene7.is.provider.catalog.Catalog
 *  com.scene7.is.provider.catalog.MissingRecordTracker
 *  com.scene7.is.provider.catalog.ObjectRecord
 *  com.scene7.is.provider.ruleset.RuleAttributeEnum
 *  com.scene7.is.provider.ruleset.RuleAttributeValueMap
 *  com.scene7.is.provider.ruleset.RuleAttributeValueMap$Builder
 *  com.scene7.is.provider.ruleset.RuleListProcessor
 *  com.scene7.is.provider.ruleset.RuleSetDebugInfo
 *  com.scene7.is.provider.ruleset.RuleSetResults
 *  com.scene7.is.provider.ruleset.RuleSetResultsBuilder
 *  com.scene7.is.sleng.CacheEnum
 *  com.scene7.is.sleng.CacheStorageEnum
 *  com.scene7.is.sleng.FXGServer
 *  com.scene7.is.sleng.ImageServer
 *  com.scene7.is.util.Size
 *  com.scene7.is.util.Statistics
 *  com.scene7.is.util.callbacks.Option
 *  com.scene7.is.util.diskcache.Cache
 *  com.scene7.is.util.error.ApplicationException
 *  javax.servlet.http.HttpServletRequest
 *  org.jetbrains.annotations.NotNull
 */
package com.scene7.is.ps.provider;

import com.scene7.is.catalog.util.IPAddressFilter;
import com.scene7.is.provider.CacheSpec;
import com.scene7.is.provider.DebugInfoEnum;
import com.scene7.is.provider.EmbeddedProvider;
import com.scene7.is.provider.EmbeddedRequest;
import com.scene7.is.provider.HTTPHeader;
import com.scene7.is.provider.ProcessingStatus;
import com.scene7.is.provider.RequestContext;
import com.scene7.is.provider.RequestContextEnum;
import com.scene7.is.provider.RequestTypeEnum;
import com.scene7.is.provider.RequestTypeSpec;
import com.scene7.is.provider.Response;
import com.scene7.is.provider.catalog.Catalog;
import com.scene7.is.provider.catalog.MissingRecordTracker;
import com.scene7.is.provider.catalog.ObjectRecord;
import com.scene7.is.provider.ruleset.RuleAttributeEnum;
import com.scene7.is.provider.ruleset.RuleAttributeValueMap;
import com.scene7.is.provider.ruleset.RuleListProcessor;
import com.scene7.is.provider.ruleset.RuleSetDebugInfo;
import com.scene7.is.provider.ruleset.RuleSetResults;
import com.scene7.is.provider.ruleset.RuleSetResultsBuilder;
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.PlatformServer;
import com.scene7.is.ps.provider.Request;
import com.scene7.is.ps.provider.RequestBuilder;
import com.scene7.is.ps.provider.RequestBuilderUtil;
import com.scene7.is.ps.provider.RequestDispatcher;
import com.scene7.is.ps.provider.RequestHandler;
import com.scene7.is.ps.provider.ResponseStatistics;
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.sleng.CacheEnum;
import com.scene7.is.sleng.CacheStorageEnum;
import com.scene7.is.sleng.FXGServer;
import com.scene7.is.sleng.ImageServer;
import com.scene7.is.util.Size;
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.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import org.jetbrains.annotations.NotNull;

public class PlatformServerImpl
implements PlatformServer {
    @NotNull
    private final RequestBuilder requestBuilder;
    @NotNull
    private final RequestDispatcher requestDispatcher;
    @NotNull
    private final ResponseStatistics statistics;
    private final long cacheExpiration;
    private final boolean allowDefaultCatalogRequests;
    @NotNull
    private final ImageServer imageServer;

    public PlatformServerImpl(@NotNull ImageServer imageServer, @NotNull FXGServer fxgServer, @NotNull Cache cache, boolean extendedCommandSet, long cacheExpiration, @NotNull ResponseStatistics statistics, @NotNull RequestBuilder requestBuilder, boolean allowDefaultCatalogRequests, @NotNull Map<RequestTypeEnum, RequestHandler> handlers, @NotNull CacheAgent cacheAgent) {
        this.statistics = statistics;
        this.requestDispatcher = new RequestDispatcher(cache, imageServer, fxgServer, statistics, extendedCommandSet, handlers, cacheAgent);
        this.requestBuilder = requestBuilder;
        this.cacheExpiration = cacheExpiration;
        this.allowDefaultCatalogRequests = allowDefaultCatalogRequests;
        this.imageServer = imageServer;
    }

    @NotNull
    @Override
    public String getVersion() {
        return this.statistics.getVersion();
    }

    @NotNull
    @Override
    public String getRevision() {
        return this.statistics.getRevision();
    }

    @NotNull
    public String getBuildNumber() {
        return this.statistics.getBuildNumber();
    }

    @Override
    public void addEmbeddedProvider(String prefix, EmbeddedProvider provider) {
        this.requestBuilder.addEmbeddedProvider(prefix, provider);
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    @Override
    public Response getResponse(ProcessingStatus status, RequestContext context, String netPath, String netQuery, String imageId, RuleSetResults ruleSetResults, String remoteAddress, HttpServletRequest req) throws ApplicationException {
        Response response;
        block17 : {
            this.statistics.enter();
            status.setOverlap(this.statistics.getRequestOverlap());
            this.imageServer.okToChangeConnection();
            response = null;
            try {
                Request request;
                MissingRecordTracker missingRecordTracker;
                try {
                    request = this.requestBuilder.buildRequest(context, ruleSetResults, remoteAddress, false);
                }
                finally {
                    status.notifyParsed();
                }
                RuleSetDebugInfo assetRuleDebugInfo = (RuleSetDebugInfo)req.getAttribute("DebugAssetRule");
                if (assetRuleDebugInfo != null) {
                    ((RuleSetDebugInfo)ruleSetResults.ruleSetDebugInfo.get()).addMatchedRules(assetRuleDebugInfo.matchedRules);
                    ((RuleSetDebugInfo)ruleSetResults.ruleSetDebugInfo.get()).originalUrl = assetRuleDebugInfo.originalUrl;
                }
                request.setRuleSetResults(ruleSetResults);
                if (context.getCatalog().getRootId().isEmpty()) {
                    RequestTypeEnum requestType = request.getGlobalAttributes().getOrDie(ModifierEnum.REQ).type;
                    if (!this.allowDefaultCatalogRequests && !requestType.isAllowDefaultCatalogRequests()) {
                        throw new IZoomException(IZoomException.DEFAULT_CATALOG_FORBIDDEN, "Access to default catalog is not permitted for request type " + (Object)requestType, null);
                    }
                }
                if ((missingRecordTracker = context.getMissingRecordTracker()).shouldGenerateError(request.getType(), request.getDebugInfo())) {
                    CatalogRecordException catalogRecordException = new CatalogRecordException(CatalogRecordException.INVALID_CATALOG_RECORD, missingRecordTracker.generateMissingRecordError(), missingRecordTracker.getMissingRecord(), null);
                    if (!request.getGlobalAttributes().contains(ModifierEnum.I_DEFAULT_IMAGE_REQUEST)) {
                        throw catalogRecordException;
                    }
                    if (!this.allMissingRecordsAreForDefaultImage(missingRecordTracker, request.getDefaultImage())) {
                        request.getGlobalAttributes().set(ModifierEnum.I_CATALOG_RECORD_EXCEPTION, catalogRecordException);
                    }
                }
                request.getGlobalAttributes().set(ModifierEnum.I_CACHE_EXPIRATION, this.cacheExpiration);
                try {
                    response = this.requestDispatcher.getResponse(request, status);
                }
                finally {
                    status.notifyFetched();
                }
                List origHeaders = ruleSetResults.customHeaders;
                for (HTTPHeader entry : origHeaders) {
                    String headerName = entry.getName();
                    String headerValue = entry.getValue();
                    HTTPHeader.ModPolicy modPolicy = entry.getModPolicy();
                    headerName = RequestBuilderUtil.variableSubstitutionURLSource(headerName, request);
                    headerValue = RequestBuilderUtil.variableSubstitutionURLSource(headerValue, request);
                    response.addCustomHeader(new HTTPHeader(headerName, headerValue, modPolicy));
                }
                response.setTrial(context.getCatalog().getIsTrial());
                response.setPathBasedAccess(missingRecordTracker.getPathBasedAccess());
                response.setVirtualPathAccess(missingRecordTracker.getVirtualPathAccess());
                long lastModified = Util.computeLastModified(request);
                response.setLastModified(lastModified);
                if (request.getType() == RequestTypeEnum.MESSAGE) {
                    response.setClientCacheUse(CacheEnum.OFF);
                    break block17;
                }
                CacheSpec cacheUse = request.getGlobalAttributes().get(ModifierEnum.CACHE, CacheSpec.ON);
                response.setClientCacheUse(cacheUse.getClient());
            }
            finally {
                this.statistics.leave(response, status);
            }
        }
        return response;
    }

    @Override
    public Response getErrorResponse(String netPath, String netQuery, String remoteAddress) throws ApplicationException {
        ProcessingStatus status = new ProcessingStatus();
        Request request = this.requestBuilder.buildCompleteRequest(netPath, netQuery, remoteAddress);
        Response response = this.requestDispatcher.getResponse(request, status);
        response.setLastModified(Util.computeLastModified(request));
        response.setClientCacheUse(request.getGlobalAttributes().get(ModifierEnum.CACHE, CacheSpec.ON).getClient());
        return response;
    }

    @NotNull
    @Override
    public EmbeddedRequest parseEmbeddedRequest(@NotNull RequestContext context, String path, String query, String remoteAddress, boolean doComments) throws ApplicationException {
        Catalog catalog = context.getCatalog();
        String imageId = RequestBuilderUtil.parseImageId(catalog, path);
        RuleSetResults ruleSetResults = RuleListProcessor.processRuleSet((Iterable)catalog.getRules(), (String)imageId, (String)query, (String)remoteAddress, (RequestContextEnum)RequestContextEnum.IS, (Option)context.getIPAddressOverride(), this.requestBuilder.getAllowIPOverrideAddressList());
        if (!((Boolean)ruleSetResults.getAttribute(RuleAttributeEnum.DEFAULTPIXAPPLYNESTED, (Object)false)).booleanValue()) {
            RuleSetResultsBuilder builder = ruleSetResults.getBuilder();
            builder.attributes.put(RuleAttributeEnum.DEFAULTPIX, (Object)Size.zeroSize());
            ruleSetResults = builder.getProduct();
        }
        Request request = this.requestBuilder.buildRequest(context, ruleSetResults, remoteAddress, true);
        SlengCompiler compiler = new SlengCompiler(this.imageServer, true, doComments, false);
        byte[] sleng = compiler.compileRequest(request);
        CacheSpec cacheToDisk = request.getGlobalAttributes().get(ModifierEnum.CACHE, CacheSpec.OFF);
        CacheStorageEnum cacheStorage = cacheToDisk.getClient() == CacheEnum.ON ? CacheStorageEnum.PERSISTENT : CacheStorageEnum.MEMORY;
        boolean cachePyramidLevels = false;
        long timeToLive = Util.computeTimeToLive(request);
        boolean useLastModified = Util.computeLastModified(request) != -1;
        long catalogTimeStamp = Util.computeCatalogTimeStamp(request);
        return new EmbeddedRequest(sleng, cacheStorage, cachePyramidLevels, timeToLive, useLastModified, catalogTimeStamp);
    }

    @Override
    public void destroy() {
        this.requestBuilder.dispose();
    }

    private boolean allMissingRecordsAreForDefaultImage(MissingRecordTracker missingRecordTracker, String defaultImage) {
        Map missingRecords = missingRecordTracker.getMissingRecords();
        boolean allDefaultImage = true;
        for (String missing : missingRecords.keySet()) {
            if (missing.endsWith(defaultImage)) continue;
            allDefaultImage = false;
        }
        return allDefaultImage;
    }
}