CampaignMetaDataServlet.java 12.9 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.cq.wcm.api.Page
 *  com.day.cq.wcm.webservicesupport.Configuration
 *  javax.servlet.ServletException
 *  javax.servlet.ServletOutputStream
 *  javax.servlet.http.HttpServletResponse
 *  org.apache.commons.io.IOUtils
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.ReferenceCardinality
 *  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.PersistenceException
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceUtil
 *  org.apache.sling.api.resource.ValueMap
 *  org.apache.sling.api.servlets.SlingAllMethodsServlet
 *  org.apache.sling.commons.json.JSONException
 *  org.apache.sling.commons.json.JSONObject
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.cq.mcm.campaign.servlets;

import com.adobe.cq.mcm.campaign.MetaDataExtender;
import com.adobe.cq.mcm.campaign.NewsletterException;
import com.adobe.cq.mcm.campaign.NewsletterManager;
import com.day.cq.mcm.campaign.CallResults;
import com.day.cq.mcm.campaign.CampaignConnector;
import com.day.cq.mcm.campaign.CampaignCredentials;
import com.day.cq.mcm.campaign.CampaignException;
import com.day.cq.mcm.campaign.ConfigurationException;
import com.day.cq.mcm.campaign.ConnectionException;
import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.webservicesupport.Configuration;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
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.PersistenceException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceUtil;
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.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SlingServlet(selectors={"campaign.metadata"}, resourceTypes={"mcm/campaign/components/newsletter", "mcm/campaign/components/campaign_newsletterpage", "mcm/campaign/components/profile"}, extensions={"json"}, methods={"GET", "POST"})
public class CampaignMetaDataServlet
extends SlingAllMethodsServlet {
    private final Logger log;
    @Reference
    private CampaignConnector connector;
    @Reference
    private NewsletterManager manager;
    @Reference(policy=ReferencePolicy.DYNAMIC, cardinality=ReferenceCardinality.OPTIONAL_UNARY)
    private volatile MetaDataExtender extender;

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

    private boolean checkAndProcess(Map<String, String> params, CampaignCredentials credentials, HttpServletResponse response, CampaignConnector connector) throws CampaignException {
        boolean isProxied;
        isProxied = false;
        InputStream is = null;
        CallResults callResults = null;
        try {
            callResults = connector.callFunction("amcGetDeliveryMetadata.jssp", params, credentials);
            Map<String, String> headers = callResults.getResponseHeaders();
            for (String name : headers.keySet()) {
                if (this.extender != null && name.equalsIgnoreCase("Content-Length")) continue;
                response.addHeader(name, headers.get(name));
            }
            if (this.extender != null) {
                String jsonStr = callResults.bodyAsString();
                JSONObject root = new JSONObject(jsonStr);
                PrintWriter writer = response.getWriter();
                this.extender.extend(root);
                root.write((Writer)writer);
            } else {
                is = callResults.bodyAsStream();
                ServletOutputStream os = response.getOutputStream();
                IOUtils.copy((InputStream)is, (OutputStream)os);
            }
            isProxied = true;
        }
        catch (ConnectionException ce) {
            if (ce.getStatusCode() != 404) {
                if (ce.getStatusCode() == 500) {
                    throw new CampaignException("Remote error", ce);
                }
                throw new CampaignException("Caught exception while writing response", ce);
            }
        }
        catch (JSONException je) {
            throw new CampaignException("Caught exception while processing JSON", (Throwable)je);
        }
        catch (IOException ioe) {
            throw new CampaignException("Caught exception while writing response", ioe);
        }
        finally {
            IOUtils.closeQuietly((InputStream)is);
            if (callResults != null) {
                callResults.destroy();
            }
        }
        return isProxied;
    }

    private void proxyTemplate(ValueMap values, CampaignCredentials credentials, SlingHttpServletResponse response) throws CampaignException {
        block10 : {
            String templateId = (String)values.get("acTemplateId", String.class);
            if (templateId == null) {
                throw new ConfigurationException("Missing template ID on newsletter");
            }
            InputStream is = null;
            CallResults callResults = null;
            HashMap<String, String> params = new HashMap<String, String>(3);
            params.put("delivery", templateId);
            try {
                callResults = this.connector.callFunction("amcGetDeliveryMetadata.jssp", params, credentials);
                Map<String, String> headers = callResults.getResponseHeaders();
                for (String name : headers.keySet()) {
                    if (this.extender != null && name.equalsIgnoreCase("Content-Length")) continue;
                    response.addHeader(name, headers.get(name));
                }
                if (this.extender != null) {
                    String jsonStr = callResults.bodyAsString();
                    JSONObject root = new JSONObject(jsonStr);
                    PrintWriter writer = response.getWriter();
                    this.extender.extend(root);
                    root.write((Writer)writer);
                    break block10;
                }
                is = callResults.bodyAsStream();
                ServletOutputStream os = response.getOutputStream();
                IOUtils.copy((InputStream)is, (OutputStream)os);
            }
            catch (IOException ioe) {
                throw new CampaignException("Caught exception while writing response", ioe);
            }
            catch (JSONException je) {
                throw new CampaignException("Caught exception while processing JSON", (Throwable)je);
            }
            finally {
                IOUtils.closeQuietly((InputStream)is);
                if (callResults != null) {
                    callResults.destroy();
                }
            }
        }
    }

    private void perform(SlingHttpServletRequest request, SlingHttpServletResponse response, boolean doUnlink) throws CampaignException {
        Resource resource = request.getResource();
        Page page = (Page)resource.getParent().adaptTo(Page.class);
        try {
            if (this.manager.isNewsletter(page)) {
                this.performNewsletter(response, page, doUnlink);
            } else {
                this.performTemplate(response, page);
            }
        }
        catch (NewsletterException ne) {
            throw new CampaignException("Internal error", ne);
        }
    }

    private void performNewsletter(SlingHttpServletResponse response, Page page, boolean doUnlink) throws NewsletterException, CampaignException {
        Resource resource = page.getContentResource();
        ValueMap values = ResourceUtil.getValueMap((Resource)resource);
        Configuration config = this.connector.getWebserviceConfig(resource);
        CampaignCredentials credentials = this.connector.retrieveCredentials(config);
        String[] links = this.manager.getLinkedDeliveries(page);
        if (links != null) {
            boolean isProxied = false;
            HashMap<String, String> params = new HashMap<String, String>(3);
            for (String deliveryId : links) {
                this.log.debug("Trying delivery '{}'.", (Object)deliveryId);
                params.put("delivery", deliveryId);
                isProxied = this.checkAndProcess(params, credentials, (HttpServletResponse)response, this.connector);
                if (isProxied) {
                    this.log.debug("Success; using meta data of delivery '{}'.", (Object)deliveryId);
                    break;
                }
                if (!doUnlink) continue;
                try {
                    this.manager.unlink(page, deliveryId);
                    continue;
                }
                catch (NewsletterException ne) {
                    this.log.warn("Could not remove link to non-existent delivery '{}'", (Object)deliveryId);
                    continue;
                }
                catch (PersistenceException pe) {
                    this.log.warn("Could not remove link to non-existent delivery '{}'", (Object)deliveryId);
                }
            }
            if (!isProxied) {
                this.log.debug("Using template as no linked delivery matched.");
                this.proxyTemplate(values, credentials, response);
            }
        } else {
            this.log.debug("Using template; no linked deliveries available.");
            this.proxyTemplate(values, credentials, response);
        }
    }

    private void performTemplate(SlingHttpServletResponse response, Page page) throws NewsletterException, CampaignException {
        Resource resource = page.getContentResource();
        ValueMap values = ResourceUtil.getValueMap((Resource)resource);
        Configuration config = this.connector.getWebserviceConfig(resource);
        CampaignCredentials credentials = this.connector.retrieveCredentials(config);
        this.proxyTemplate(values, credentials, response);
    }

    protected final void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        try {
            this.perform(request, response, true);
        }
        catch (ConfigurationException e) {
            this.log.info("Webservice configuration not found or invalid");
            response.sendError(500, e.getMessage());
        }
        catch (ConnectionException e) {
            this.log.warn("Could not connect to Adobe Campaign", (Throwable)e);
            response.sendError(500, e.getMessage());
        }
        catch (Exception e) {
            this.log.info("Internal error while retrieving meta data; see log file.", (Throwable)e);
            response.sendError(500, e.getMessage());
        }
    }

    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        try {
            this.perform(request, response, false);
        }
        catch (ConfigurationException e) {
            this.log.info("Webservice configuration not found or invalid");
            response.sendError(500, e.getMessage());
        }
        catch (ConnectionException e) {
            this.log.warn("Could not connect to Adobe Campaign", (Throwable)e);
            response.sendError(500, e.getMessage());
        }
        catch (Exception e) {
            this.log.info("Internal error while proxying data; see log file.", (Throwable)e);
            response.sendError(500, e.getMessage());
        }
    }

    protected void bindConnector(CampaignConnector campaignConnector) {
        this.connector = campaignConnector;
    }

    protected void unbindConnector(CampaignConnector campaignConnector) {
        if (this.connector == campaignConnector) {
            this.connector = null;
        }
    }

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

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

    protected void bindExtender(MetaDataExtender metaDataExtender) {
        this.extender = metaDataExtender;
    }

    protected void unbindExtender(MetaDataExtender metaDataExtender) {
        if (this.extender == metaDataExtender) {
            this.extender = null;
        }
    }
}