ContentServlet.java 9.51 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.cq.wcm.api.Page
 *  javax.servlet.ServletException
 *  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.servlets.SlingAllMethodsServlet
 *  org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper
 *  org.apache.sling.commons.json.JSONException
 *  org.apache.sling.commons.json.JSONObject
 *  org.apache.sling.commons.json.io.JSONWriter
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.cq.mcm.campaign.servlets;

import com.adobe.cq.mcm.campaign.ContentGenerator;
import com.adobe.cq.mcm.campaign.NewsletterException;
import com.adobe.cq.mcm.campaign.NewsletterManager;
import com.day.cq.wcm.api.Page;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import javax.servlet.ServletException;
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.servlets.SlingAllMethodsServlet;
import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.JSONObject;
import org.apache.sling.commons.json.io.JSONWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SlingServlet(selectors={"campaign.content"}, resourceTypes={"mcm/campaign/components/newsletter", "mcm/campaign/components/campaign_newsletterpage", "mcm/neolane/components/newsletter"}, extensions={"json"}, methods={"GET", "POST"})
public class ContentServlet
extends SlingAllMethodsServlet {
    private static final String PRM_MODIFIED_SINCE = "modifiedSince";
    private final Logger log;
    @Reference
    private ContentGenerator generator;
    @Reference
    private NewsletterManager newsletterManager;

    public ContentServlet() {
        this.log = LoggerFactory.getLogger(this.getClass());
    }

    private void doContent(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException, ServletException {
        String errorMessage = null;
        int statusCode = 500;
        boolean isSuccess = false;
        String html = null;
        String text = null;
        String subject = null;
        long lastModified = 0;
        boolean isApproved = false;
        Exception errorCause = null;
        try {
            Page page = (Page)request.getResource().getParent().adaptTo(Page.class);
            SlingHttpServletRequestWrapper wrappedRequest = new SlingHttpServletRequestWrapper(request){

                public String getMethod() {
                    return "GET";
                }
            };
            html = this.generator.createHTML((SlingHttpServletRequest)wrappedRequest, response);
            text = this.newsletterManager.getPlainText(page);
            subject = this.newsletterManager.getSubject(page);
            lastModified = this.newsletterManager.getLastModified(page);
            isApproved = this.newsletterManager.isApproved(page);
            statusCode = 200;
            this.newsletterManager.publish(page);
            isSuccess = true;
        }
        catch (Exception e) {
            statusCode = 500;
            errorCause = e;
            errorMessage = e.getMessage();
        }
        response.setContentType("application/json; charset=utf-8");
        response.setHeader("Cache-Control", "no-cache");
        response.setStatus(statusCode);
        JSONWriter writer = new JSONWriter((Writer)response.getWriter());
        try {
            writer.object();
            if (isSuccess) {
                writer.key("html").value((Object)html);
                writer.key("text").value((Object)(text != null ? text : ""));
                writer.key("subject").value((Object)subject);
                writer.key("lastModified").value(lastModified);
                writer.key("approved").value(isApproved);
            } else {
                if (errorCause != null) {
                    this.log.warn("Error creating newsletter content and status", (Throwable)errorCause);
                } else {
                    this.log.warn("Error creating newsletter content and status");
                }
                writer.key("message").value((Object)errorMessage);
            }
            writer.endObject();
        }
        catch (JSONException je) {
            this.log.info("Error creating JSON.", (Throwable)je);
        }
    }

    private void doUpdateCheck(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException, ServletException {
        String errorMessage = null;
        int statusCode = 400;
        boolean isSuccess = false;
        Exception errorCause = null;
        Long modifiedSince = null;
        try {
            modifiedSince = Long.parseLong(request.getParameter("modifiedSince"));
        }
        catch (NumberFormatException nfe) {
            errorMessage = "Invalid value of modifiedSince parameter; must be number.";
        }
        boolean isModified = false;
        if (modifiedSince != null) {
            try {
                Page page = (Page)request.getResource().getParent().adaptTo(Page.class);
                isModified = this.newsletterManager.isModifiedSince(page, modifiedSince);
                statusCode = isModified ? 200 : 304;
                isSuccess = true;
            }
            catch (Exception e) {
                statusCode = 500;
                errorMessage = "Could not determine modified state of newsletter.";
                errorCause = e;
            }
        }
        if (isModified) {
            this.doContent(request, response);
        } else {
            response.setContentType("application/json; charset=utf-8");
            response.setHeader("Cache-Control", "no-cache");
            response.setStatus(statusCode);
            if (!isSuccess) {
                try {
                    JSONWriter writer = new JSONWriter((Writer)response.getWriter());
                    if (errorCause != null) {
                        this.log.warn("Error checking modified status of newsletter", (Throwable)errorCause);
                    } else {
                        this.log.warn("Error checking modified status of newsletter");
                    }
                    writer.key("message").value((Object)errorMessage);
                }
                catch (JSONException je) {
                    this.log.info("Error creating JSON.", (Throwable)je);
                }
            }
        }
    }

    private void generateResponse(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException, ServletException {
        if (request.getParameter("modifiedSince") != null) {
            this.doUpdateCheck(request, response);
        } else {
            this.doContent(request, response);
        }
    }

    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException, ServletException {
        String delivery = request.getParameter("delivery");
        if (delivery != null && !delivery.isEmpty()) {
            String msg = "The content GET request did specify a delivery, should use POST";
            this.log.warn(msg);
            response.setContentType("application/json; charset=utf-8");
            response.setStatus(400);
            response.getWriter().write("{\"message\":" + JSONObject.quote((String)msg) + "}");
            return;
        }
        this.generateResponse(request, response);
    }

    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        response.setContentType("application/json; charset=utf-8");
        String delivery = request.getParameter("delivery");
        if (delivery == null || delivery.isEmpty()) {
            String msg = "No delivery specified";
            this.log.warn(msg);
            response.setContentType("application/json; charset=utf-8");
            response.setStatus(400);
            response.getWriter().write("{\"message\":" + JSONObject.quote((String)msg) + "}");
            return;
        }
        Page newsletter = (Page)request.getResource().getParent().adaptTo(Page.class);
        try {
            if (!this.newsletterManager.isLinked(newsletter, delivery)) {
                this.newsletterManager.link(newsletter, delivery);
            }
        }
        catch (NewsletterException e) {
            this.log.warn(e.getMessage());
            response.setStatus(400);
            response.getWriter().write("{\"message\":" + JSONObject.quote((String)e.getMessage()) + "}");
            return;
        }
        this.generateResponse(request, response);
    }

    protected void bindGenerator(ContentGenerator contentGenerator) {
        this.generator = contentGenerator;
    }

    protected void unbindGenerator(ContentGenerator contentGenerator) {
        if (this.generator == contentGenerator) {
            this.generator = null;
        }
    }

    protected void bindNewsletterManager(NewsletterManager newsletterManager) {
        this.newsletterManager = newsletterManager;
    }

    protected void unbindNewsletterManager(NewsletterManager newsletterManager) {
        if (this.newsletterManager == newsletterManager) {
            this.newsletterManager = null;
        }
    }

}