PackageManagerServlet.java 7.84 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.cq.replication.Replicator
 *  com.day.jcr.vault.packaging.JcrPackageManager
 *  com.day.jcr.vault.packaging.Packaging
 *  javax.jcr.Session
 *  javax.servlet.Servlet
 *  javax.servlet.ServletException
 *  javax.servlet.http.HttpServlet
 *  javax.servlet.http.HttpServletRequest
 *  javax.servlet.http.HttpServletResponse
 *  org.apache.felix.scr.annotations.Activate
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Deactivate
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.commons.classloader.DynamicClassLoaderManager
 *  org.apache.sling.xss.XSSAPI
 *  org.osgi.service.http.HttpContext
 *  org.osgi.service.http.HttpService
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.crx.packaging.impl;

import com.day.cq.replication.Replicator;
import com.day.crx.packaging.PackageShare;
import com.day.crx.packaging.impl.J2EEPackageManager;
import com.day.crx.packaging.impl.RequestWrapper;
import com.day.crx.packaging.impl.SlingInstallerSupport;
import com.day.crx.packaging.impl.response.BaseResponse;
import com.day.crx.packaging.impl.response.HtmlConsoleResponse;
import com.day.crx.packaging.impl.response.JsonResponse;
import com.day.crx.packaging.impl.response.Response;
import com.day.crx.packaging.impl.response.StreamedScriptResponse;
import com.day.jcr.vault.packaging.JcrPackageManager;
import com.day.jcr.vault.packaging.Packaging;
import java.io.IOException;
import java.util.Dictionary;
import javax.jcr.Session;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.commons.classloader.DynamicClassLoaderManager;
import org.apache.sling.xss.XSSAPI;
import org.osgi.service.http.HttpContext;
import org.osgi.service.http.HttpService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(immediate=1)
@Service(value={Servlet.class})
public class PackageManagerServlet
extends HttpServlet {
    private static final Logger log = LoggerFactory.getLogger(PackageManagerServlet.class);
    @Reference
    private PackageShare psSvc;
    @Reference
    private Packaging packaging;
    @Reference
    private DynamicClassLoaderManager dynLoaderMgr;
    @Reference(target="(contextId=com.day.crx.packmgr.impl.AuthHttpContext)")
    private HttpContext myContext;
    @Reference
    private HttpService httpService;
    @Reference
    private Replicator replicator;
    @Reference
    private SlingInstallerSupport slingInstaller;
    @Reference
    private XSSAPI xssapi;

    @Activate
    protected void activate() {
        try {
            this.httpService.registerServlet("/crx/packmgr/service", (Servlet)this, null, this.myContext);
        }
        catch (Exception e) {
            log.error("Error while registering servlet", (Throwable)e);
        }
    }

    @Deactivate
    protected void deactivate() {
        this.httpService.unregister("/crx/packmgr/service");
    }

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        log.warn("PackageConsoleServlet requested with GET");
        resp.sendError(405, "Method GET is not allowed, use POST");
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        RequestWrapper wrapReq = new RequestWrapper(req);
        try {
            String suffix = req.getPathInfo();
            if (suffix == null || suffix.length() == 0 || "/".equals(suffix)) {
                log.error("no suffix");
                resp.sendError(500);
                return;
            }
            int idx = suffix.indexOf(47, 1);
            String cmd = suffix;
            String path = "";
            if (idx > 0) {
                cmd = suffix.substring(0, idx);
                path = suffix.substring(idx);
            }
            ResourceResolver resolver = (ResourceResolver)req.getAttribute("org.apache.sling.auth.core.ResourceResolver");
            Session session = (Session)resolver.adaptTo(Session.class);
            JcrPackageManager pkgMgr = this.packaging.getPackageManager(session);
            J2EEPackageManager packMgr = new J2EEPackageManager(pkgMgr, this.psSvc, this.dynLoaderMgr.getDynamicClassLoader(), this.replicator, this.slingInstaller);
            Response response = this.getResponse(cmd, wrapReq, resp, session);
            packMgr.doPost(response, path);
        }
        finally {
            wrapReq.discard();
        }
    }

    private Response getResponse(String cmd, RequestWrapper req, HttpServletResponse resp, Session session) {
        BaseResponse response = cmd.endsWith("script.html") ? new StreamedScriptResponse(req.getParameter("pid"), req.getParameter("callback"), session, this.xssapi) : (cmd.endsWith("console.html") ? new HtmlConsoleResponse(session, this.xssapi) : (cmd.endsWith(".json") ? new JsonResponse("true".equals(req.getParameter("jsonInTextarea"))) : new HtmlConsoleResponse(session, this.xssapi)));
        response.setCRXRequestResponse(req, resp);
        return response;
    }

    protected void bindPsSvc(PackageShare packageShare) {
        this.psSvc = packageShare;
    }

    protected void unbindPsSvc(PackageShare packageShare) {
        if (this.psSvc == packageShare) {
            this.psSvc = null;
        }
    }

    protected void bindPackaging(Packaging packaging) {
        this.packaging = packaging;
    }

    protected void unbindPackaging(Packaging packaging) {
        if (this.packaging == packaging) {
            this.packaging = null;
        }
    }

    protected void bindDynLoaderMgr(DynamicClassLoaderManager dynamicClassLoaderManager) {
        this.dynLoaderMgr = dynamicClassLoaderManager;
    }

    protected void unbindDynLoaderMgr(DynamicClassLoaderManager dynamicClassLoaderManager) {
        if (this.dynLoaderMgr == dynamicClassLoaderManager) {
            this.dynLoaderMgr = null;
        }
    }

    protected void bindMyContext(HttpContext httpContext) {
        this.myContext = httpContext;
    }

    protected void unbindMyContext(HttpContext httpContext) {
        if (this.myContext == httpContext) {
            this.myContext = null;
        }
    }

    protected void bindHttpService(HttpService httpService) {
        this.httpService = httpService;
    }

    protected void unbindHttpService(HttpService httpService) {
        if (this.httpService == httpService) {
            this.httpService = null;
        }
    }

    protected void bindReplicator(Replicator replicator) {
        this.replicator = replicator;
    }

    protected void unbindReplicator(Replicator replicator) {
        if (this.replicator == replicator) {
            this.replicator = null;
        }
    }

    protected void bindSlingInstaller(SlingInstallerSupport slingInstallerSupport) {
        this.slingInstaller = slingInstallerSupport;
    }

    protected void unbindSlingInstaller(SlingInstallerSupport slingInstallerSupport) {
        if (this.slingInstaller == slingInstallerSupport) {
            this.slingInstaller = null;
        }
    }

    protected void bindXssapi(XSSAPI xSSAPI) {
        this.xssapi = xSSAPI;
    }

    protected void unbindXssapi(XSSAPI xSSAPI) {
        if (this.xssapi == xSSAPI) {
            this.xssapi = null;
        }
    }
}