MobileReportsStatusServlet.java 5.82 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.xss.JSONUtil
 *  com.adobe.granite.xss.XSSFilter
 *  javax.servlet.ServletException
 *  org.apache.commons.collections.CollectionUtils
 *  org.apache.commons.lang3.StringUtils
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.ReferencePolicy
 *  org.apache.felix.scr.annotations.sling.SlingServlet
 *  org.apache.sling.api.SlingHttpServletRequest
 *  org.apache.sling.api.SlingHttpServletResponse
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ValueMap
 *  org.apache.sling.api.servlets.SlingAllMethodsServlet
 *  org.apache.sling.commons.json.JSONException
 *  org.apache.sling.commons.json.io.JSONWriter
 */
package com.adobe.cq.mobile.platform.impl.servlets;

import com.adobe.cq.mobile.platform.MobileResource;
import com.adobe.cq.mobile.platform.MobileResourceType;
import com.adobe.granite.xss.JSONUtil;
import com.adobe.granite.xss.XSSFilter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferencePolicy;
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.resource.Resource;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.io.JSONWriter;

@SlingServlet(methods={"GET"}, extensions={"json"}, selectors={"mobileapps.reports"}, resourceTypes={"cq:Page"})
public class MobileReportsStatusServlet
extends SlingAllMethodsServlet {
    public static final String PARAM_REPORT_SUITE = "reportSuite";
    public static final String PARAM_REPORT_NAME = "reportName";
    @Reference(policy=ReferencePolicy.STATIC)
    private XSSFilter xss;

    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        response.setContentType("application/json");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Cache-Control", "no-cache");
        String reportSuite = request.getParameter("reportSuite");
        if (StringUtils.isBlank((CharSequence)reportSuite)) {
            throw new ServletException("Missing mandatory request parameter reportSuite");
        }
        String reportName = request.getParameter("reportName");
        Resource resource = request.getResource();
        MobileResource mobileResource = (MobileResource)resource.adaptTo(MobileResource.class);
        if (mobileResource != null && !mobileResource.isA(MobileResourceType.INSTANCE.getType())) {
            throw new IllegalArgumentException("Resource must be a Mobile Resource of type " + MobileResourceType.INSTANCE.getType());
        }
        PrintWriter out = response.getWriter();
        JSONWriter writer = new JSONWriter((Writer)out);
        try {
            if (StringUtils.isNotBlank((CharSequence)reportName)) {
                Resource report = this.getReport(resource, reportSuite, reportName);
                this.generateReport(report, writer);
            } else {
                List<Resource> reports = this.getReports(resource, reportSuite);
                this.generateReports(reports, writer);
            }
        }
        catch (JSONException e) {
            throw new ServletException((Throwable)e);
        }
    }

    private void generateReports(List<Resource> reports, JSONWriter writer) throws JSONException {
        writer.object();
        writer.key("reports");
        writer.array();
        for (Resource report : reports) {
            this.generateReport(report, writer);
        }
        writer.endArray();
        writer.endObject();
    }

    private void generateReport(Resource report, JSONWriter writer) throws JSONException {
        writer.object();
        if (report == null) {
            writer.endObject();
            return;
        }
        ValueMap map = report.getValueMap();
        JSONUtil.writeProtected((JSONWriter)writer, (String)"reportName", (String)report.getName(), (XSSFilter)this.xss);
        JSONUtil.writeProtected((JSONWriter)writer, (String)"source", (String)((String)map.get("source", String.class)), (XSSFilter)this.xss);
        JSONUtil.writeProtected((JSONWriter)writer, (String)"lastAttempt", (String)((String)map.get("cq:lastAttempt", String.class)), (XSSFilter)this.xss);
        String reportUrl = map.get("report", String.class) != null ? report.getPath() + "/report" : "";
        JSONUtil.writeProtected((JSONWriter)writer, (String)"report", (String)reportUrl, (XSSFilter)this.xss);
        writer.endObject();
    }

    private List<Resource> getReports(Resource appInstance, String reportSuite) {
        Resource reportsResource;
        ArrayList<Resource> reports = new ArrayList<Resource>();
        if (appInstance != null && (reportsResource = appInstance.getChild("jcr:content/reports/" + reportSuite + "/reports")) != null) {
            CollectionUtils.addAll(reports, (Iterator)reportsResource.listChildren());
        }
        return reports;
    }

    private Resource getReport(Resource appInstance, String reportSuite, String reportName) {
        return appInstance.getChild("jcr:content/reports/" + reportSuite + "/reports/" + reportName);
    }

    protected void bindXss(XSSFilter xSSFilter) {
        this.xss = xSSFilter;
    }

    protected void unbindXss(XSSFilter xSSFilter) {
        if (this.xss == xSSFilter) {
            this.xss = null;
        }
    }
}