CodeServlet.java 6.32 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.cq.widget.HtmlLibraryManager
 *  javax.servlet.RequestDispatcher
 *  javax.servlet.ServletException
 *  javax.servlet.ServletRequest
 *  javax.servlet.ServletResponse
 *  org.apache.commons.lang3.ArrayUtils
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.sling.SlingServlet
 *  org.apache.sling.api.SlingHttpServletRequest
 *  org.apache.sling.api.SlingHttpServletResponse
 *  org.apache.sling.api.request.RequestPathInfo
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.servlets.SlingSafeMethodsServlet
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.granite.contexthub.impl;

import com.adobe.granite.contexthub.api.ContextHub;
import com.adobe.granite.contexthub.impl.Checksum;
import com.adobe.granite.contexthub.impl.CustomResponseWrapper;
import com.day.cq.widget.HtmlLibraryManager;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.request.RequestPathInfo;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SlingServlet(resourceTypes={"/libs/granite/contexthub/cloudsettings/components/baseconfiguration"}, selectors={"kernel", "ui", "config", "styles"}, extensions={"js", "css"}, methods={"GET"})
public class CodeServlet
extends SlingSafeMethodsServlet {
    private static final long serialVersionUID = -3399926862338060558L;
    private static final Logger log = LoggerFactory.getLogger(CodeServlet.class);
    @Reference
    private HtmlLibraryManager htmlLibraryManager;
    @Reference
    private ContextHub contextHub;

    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        CustomResponseWrapper responseWrapper = new CustomResponseWrapper(response);
        String fileExtension = request.getRequestPathInfo().getExtension();
        if ("js".equals(fileExtension)) {
            if (ArrayUtils.contains((Object[])request.getRequestPathInfo().getSelectors(), (Object)"config")) {
                this.sendConfig(request, (SlingHttpServletResponse)responseWrapper);
            } else {
                this.sendCode(request, (SlingHttpServletResponse)responseWrapper);
            }
        }
        if ("css".equals(fileExtension)) {
            this.sendStyles(request, (SlingHttpServletResponse)responseWrapper);
        }
        String result = responseWrapper.toString();
        Checksum checksum = new Checksum();
        checksum.update(result);
        String ETag = "\"" + checksum.toString() + "\"";
        response.setHeader("ETag", ETag);
        response.setHeader("Connection", "close");
        if (ETag.equals(request.getHeader("If-None-Match"))) {
            response.setStatus(304);
        } else if (result.length() > 0) {
            response.getWriter().append(result);
        }
    }

    private void sendStyles(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
        String styles = this.contextHub.getStyles(request);
        styles = styles.replaceAll("(url\\(['\"]?)(coralui/)", "$1../../clientlibs/granite/$2");
        response.setContentType("text/css; charset=utf-8");
        response.setContentLength(styles.getBytes("utf-8").length);
        response.getWriter().append(styles);
    }

    private void sendCode(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
        Object[] selectors = request.getRequestPathInfo().getSelectors();
        String code = ArrayUtils.contains((Object[])selectors, (Object)"kernel") ? this.contextHub.getKernelCode(request, response) : this.contextHub.getUICode(request, response);
        response.setContentType("text/javascript; charset=utf-8");
        response.setContentLength(code.getBytes("utf-8").length);
        response.getWriter().append(code);
    }

    private void sendConfig(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
        String configPath;
        String configVariable;
        Object[] selectors = request.getRequestPathInfo().getSelectors();
        if (ArrayUtils.contains((Object[])selectors, (Object)"ui")) {
            configPath = this.contextHub.getPath(request) + "." + "config_ui" + ".json";
            configVariable = "window.ContextHubUIConfig";
        } else {
            configPath = this.contextHub.getPath(request) + "." + "config_kernel" + ".json";
            configVariable = "window.ContextHubKernelConfig";
        }
        response.setContentType("text/javascript");
        response.getWriter().write(configVariable + " = ");
        try {
            Resource tmp = request.getResourceResolver().resolve(configPath);
            if (tmp != null) {
                RequestDispatcher dispatcher = request.getRequestDispatcher(configPath);
                dispatcher.include((ServletRequest)request, (ServletResponse)response);
            }
        }
        catch (ServletException e) {
            log.warn("ContextHub config endpoint '" + configPath + "' could not be reached: ", (Throwable)e);
        }
        response.getWriter().write(";");
    }

    protected void bindHtmlLibraryManager(HtmlLibraryManager htmlLibraryManager) {
        this.htmlLibraryManager = htmlLibraryManager;
    }

    protected void unbindHtmlLibraryManager(HtmlLibraryManager htmlLibraryManager) {
        if (this.htmlLibraryManager == htmlLibraryManager) {
            this.htmlLibraryManager = null;
        }
    }

    protected void bindContextHub(ContextHub contextHub) {
        this.contextHub = contextHub;
    }

    protected void unbindContextHub(ContextHub contextHub) {
        if (this.contextHub == contextHub) {
            this.contextHub = null;
        }
    }
}