LinkServlet.java 5.96 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.cq.commons.Externalizer
 *  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.request.RequestPathInfo
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.servlets.SlingAllMethodsServlet
 *  org.apache.sling.commons.json.JSONArray
 *  org.apache.sling.commons.json.JSONException
 *  org.apache.sling.commons.json.JSONObject
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.cq.mcm.campaign.servlets;

import com.adobe.cq.mcm.campaign.NewsletterException;
import com.adobe.cq.mcm.campaign.NewsletterManager;
import com.day.cq.commons.Externalizer;
import com.day.cq.wcm.api.Page;
import java.io.IOException;
import java.io.PrintWriter;
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.request.RequestPathInfo;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.commons.json.JSONArray;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SlingServlet(resourceTypes={"mcm/campaign/components/newsletter", "mcm/campaign/components/campaign_newsletterpage", "mcm/neolane/components/newsletter"}, selectors={"campaign.link", "campaign.unlink"}, methods={"POST"}, extensions={"json"})
public class LinkServlet
extends SlingAllMethodsServlet {
    @Reference
    private NewsletterManager newsletterManager;
    @Reference
    private Externalizer externalizer;
    private final Logger log;

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

    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        response.setContentType("application/json");
        response.setCharacterEncoding("utf-8");
        try {
            JSONObject result = this.handlePost(request, response);
            response.getWriter().write(result.toString());
        }
        catch (Exception e) {
            this.log.error("Caught exception while serving link/unlink request", (Throwable)e);
            response.setStatus(500);
            response.getWriter().write("{\"message\":" + JSONObject.quote((String)e.getMessage()) + "}");
        }
    }

    private JSONObject handlePost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException, JSONException {
        String delivery = request.getParameter("delivery");
        if (delivery == null || delivery.isEmpty()) {
            String msg = "No delivery specified";
            this.log.warn(msg);
            response.setStatus(400);
            return new JSONObject().put("message", (Object)msg);
        }
        Page newsletter = (Page)request.getResource().getParent().adaptTo(Page.class);
        String selector = request.getRequestPathInfo().getSelectorString();
        try {
            if ("campaign.link".equals(selector)) {
                String uuid = this.newsletterManager.link(newsletter, delivery);
                String selfURL = request.getRequestURL().toString();
                String permalinkURL = this.externalizer.authorLink(request.getResourceResolver(), "/libs/mcm/campaign/content/newsletters/" + uuid);
                return this.getSirenEntity(newsletter, selfURL, permalinkURL);
            }
            this.newsletterManager.unlink(newsletter, delivery);
            return new JSONObject();
        }
        catch (NewsletterException e) {
            this.log.warn(e.getMessage());
            response.setStatus(400);
            return new JSONObject().put("message", (Object)e.getMessage());
        }
    }

    private JSONObject getSirenEntity(Page newsletter, String selfURL, String permalinkURL) throws JSONException, NewsletterException {
        JSONObject result = new JSONObject();
        result.append("class", (Object)"/api/classes/page");
        JSONObject properties = new JSONObject();
        properties.put("name", (Object)newsletter.getName());
        properties.put("title", (Object)newsletter.getTitle());
        properties.put("description", (Object)newsletter.getDescription());
        properties.put("lastModified", this.newsletterManager.getLastModified(newsletter));
        result.put("properties", (Object)properties);
        result.put("entities", (Object)new JSONArray());
        result.put("actions", (Object)new JSONArray());
        result.put("test", (Object)null);
        JSONObject link = new JSONObject().put("rel", (Object)"self").put("href", (Object)selfURL);
        result.accumulate("links", (Object)link);
        link = new JSONObject().put("rel", (Object)"/api/classes/permalink").put("href", (Object)permalinkURL);
        result.accumulate("links", (Object)link);
        return result;
    }

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

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

    protected void bindExternalizer(Externalizer externalizer) {
        this.externalizer = externalizer;
    }

    protected void unbindExternalizer(Externalizer externalizer) {
        if (this.externalizer == externalizer) {
            this.externalizer = null;
        }
    }
}