PageDataServlet.java 5.94 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.cq.commons.TidyJSONWriter
 *  com.day.cq.tagging.Tag
 *  com.day.cq.wcm.api.Page
 *  com.day.cq.wcm.api.PageManager
 *  com.day.cq.wcm.api.Template
 *  com.day.cq.wcm.api.WCMException
 *  com.day.cq.wcm.core.stats.PageViewStatistics
 *  javax.servlet.ServletException
 *  org.apache.commons.codec.digest.DigestUtils
 *  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.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.resource.ValueMap
 *  org.apache.sling.api.servlets.SlingSafeMethodsServlet
 *  org.apache.sling.commons.json.JSONException
 *  org.apache.sling.commons.json.io.JSONWriter
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.cq.contexthub.impl.servlet;

import com.day.cq.commons.TidyJSONWriter;
import com.day.cq.tagging.Tag;
import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.api.PageManager;
import com.day.cq.wcm.api.Template;
import com.day.cq.wcm.api.WCMException;
import com.day.cq.wcm.core.stats.PageViewStatistics;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import javax.servlet.ServletException;
import org.apache.commons.codec.digest.DigestUtils;
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.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.io.JSONWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SlingServlet(resourceTypes={"sling/servlet/default"}, selectors={"pagedata"}, extensions={"json"}, methods={"GET"})
public class PageDataServlet
extends SlingSafeMethodsServlet {
    private static final String CONTENTTYPE_JAVASCRIPT = "application/json; charset=utf-8";
    private final Logger LOGGER;
    @Reference
    private PageViewStatistics pws;

    public PageDataServlet() {
        this.LOGGER = LoggerFactory.getLogger(this.getClass());
    }

    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        try {
            response.setContentType("application/json; charset=utf-8");
            ResourceResolver resolver = request.getResourceResolver();
            StringWriter buffer = new StringWriter();
            TidyJSONWriter writer = new TidyJSONWriter((Writer)buffer);
            writer.setTidy(true);
            PageManager pageMgr = (PageManager)resolver.adaptTo(PageManager.class);
            if (pageMgr != null) {
                Page page = pageMgr.getContainingPage(request.getResource());
                this.setData((JSONWriter)writer, page);
            }
            String ETag = "\"" + DigestUtils.md5Hex((String)writer.toString()) + "\"";
            response.addHeader("ETag", ETag);
            if (ETag.equals(request.getHeader("If-None-Match"))) {
                response.setStatus(304);
            } else {
                response.getWriter().write(buffer.toString());
            }
        }
        catch (JSONException e) {
            this.LOGGER.error("Error while generating JSON pagedata.", (Throwable)e);
            response.sendError(500, "Error while generating JSON pagedata.");
        }
    }

    private void setData(JSONWriter writer, Page page) throws JSONException {
        writer.object();
        if (page != null) {
            Page topLevelPage;
            writer.key("title").value((Object)page.getTitle());
            String descr = (String)page.getProperties().get("jcr:description", (Object)"");
            writer.key("description").value((Object)descr);
            writer.key("path").value((Object)page.getPath());
            long monthlyHits = 0;
            try {
                Object[] hits = this.pws.report(page);
                if (hits != null && hits.length > 2) {
                    monthlyHits = (Long)hits[2];
                }
            }
            catch (WCMException ex) {
                monthlyHits = -1;
            }
            writer.key("hits").value(monthlyHits);
            String navTitle = page.getNavigationTitle();
            if (navTitle == null) {
                navTitle = page.getTitle();
            }
            if (navTitle == null) {
                navTitle = page.getName();
            }
            writer.key("navTitle").value((Object)navTitle);
            if (page.getTemplate() != null) {
                writer.key("template").value((Object)page.getTemplate().getPath());
                writer.key("thumbnail").value((Object)page.getTemplate().getThumbnailPath());
            }
            Tag[] tags = page.getTags();
            String tagsStr = "";
            for (Tag tag : tags) {
                tagsStr = tagsStr + tag.getTitle() + " ";
            }
            writer.key("tags").value((Object)tagsStr);
            Page siteLevelPage = page.getAbsoluteParent(2);
            if (siteLevelPage != null) {
                writer.key("sitesection").value((Object)siteLevelPage.getName());
            }
            if ((topLevelPage = page.getAbsoluteParent(3)) != null) {
                writer.key("subsection").value((Object)topLevelPage.getName());
            }
        }
        writer.endObject();
    }

    protected void bindPws(PageViewStatistics pageViewStatistics) {
        this.pws = pageViewStatistics;
    }

    protected void unbindPws(PageViewStatistics pageViewStatistics) {
        if (this.pws == pageViewStatistics) {
            this.pws = null;
        }
    }
}