ContentGeneratorImpl.java 5.84 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.cq.wcm.api.WCMMode
 *  javax.servlet.RequestDispatcher
 *  javax.servlet.ServletException
 *  javax.servlet.ServletRequest
 *  javax.servlet.ServletResponse
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.api.SlingException
 *  org.apache.sling.api.SlingHttpServletRequest
 *  org.apache.sling.api.SlingHttpServletResponse
 *  org.apache.sling.api.request.RequestProgressTracker
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper
 *  org.apache.sling.rewriter.ProcessingContext
 *  org.apache.sling.rewriter.Processor
 *  org.apache.sling.rewriter.ProcessorConfiguration
 *  org.apache.sling.rewriter.ProcessorManager
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.cq.mcm.campaign.impl;

import com.adobe.cq.mcm.campaign.ContentGenerator;
import com.adobe.cq.mcm.campaign.NewsletterException;
import com.adobe.cq.mcm.campaign.impl.BufferedResponse;
import com.adobe.cq.mcm.campaign.impl.ProcessingContextImpl;
import com.day.cq.wcm.api.WCMMode;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.SlingException;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.request.RequestProgressTracker;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper;
import org.apache.sling.rewriter.ProcessingContext;
import org.apache.sling.rewriter.Processor;
import org.apache.sling.rewriter.ProcessorConfiguration;
import org.apache.sling.rewriter.ProcessorManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Service
@Component(metatype=0)
public class ContentGeneratorImpl
implements ContentGenerator {
    private final Logger log;
    @Reference
    private ProcessorManager processorManager;

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

    private Processor getProcessor(BufferedResponse targetResponse, SlingHttpServletRequest request) {
        ProcessingContextImpl processorContext = new ProcessingContextImpl(request, (SlingHttpServletResponse)targetResponse, "text/html");
        Processor found = null;
        List processorConfigs = this.processorManager.getProcessorConfigurations();
        Iterator i = processorConfigs.iterator();
        while (found == null && i.hasNext()) {
            ProcessorConfiguration config = (ProcessorConfiguration)i.next();
            if (!config.match((ProcessingContext)processorContext)) continue;
            try {
                found = this.processorManager.getProcessor(config, (ProcessingContext)processorContext);
                request.getRequestProgressTracker().log("Found processor for post processing {0}", new Object[]{config});
                continue;
            }
            catch (SlingException se) {
                if (processorContext.getRequest().getAttribute("javax.servlet.error.status_code") != null) {
                    request.getRequestProgressTracker().log("Ignoring found processor for post processing {0} as an error occured ({1}) during setup while processing another error.", new Object[]{config, se});
                    continue;
                }
                throw se;
            }
        }
        return found;
    }

    private String rewriteLinks(String html, SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
        BufferedResponse targetResponse = new BufferedResponse(response);
        Processor processor = this.getProcessor(targetResponse, request);
        processor.getWriter().print(html);
        processor.finished(false);
        return targetResponse.getString();
    }

    @Override
    public String createHTML(SlingHttpServletRequest request, SlingHttpServletResponse response) throws NewsletterException {
        String html;
        Resource page = request.getResource().getParent();
        Resource pageRsc = request.getResource().getParent();
        String pagePath = pageRsc.getPath() + ".html";
        RequestDispatcher dispatcher = request.getRequestDispatcher(pagePath);
        WCMMode.DISABLED.toRequest((ServletRequest)request);
        BufferedResponse includeResponse = new BufferedResponse(response);
        try {
            dispatcher.include((ServletRequest)new SlingHttpServletRequestWrapper(request), (ServletResponse)includeResponse);
            html = includeResponse.getString();
        }
        catch (IOException ioe) {
            throw new NewsletterException("Could not determine source HTML for newsletter", ioe);
        }
        catch (ServletException se) {
            throw new NewsletterException("Could not determine source HTML for newsletter", (Throwable)se);
        }
        try {
            html = this.rewriteLinks(html, request, (SlingHttpServletResponse)includeResponse);
        }
        catch (IOException ioe) {
            throw new NewsletterException("Could not rewrite links for newsletter", ioe);
        }
        return html;
    }

    protected void bindProcessorManager(ProcessorManager processorManager) {
        this.processorManager = processorManager;
    }

    protected void unbindProcessorManager(ProcessorManager processorManager) {
        if (this.processorManager == processorManager) {
            this.processorManager = null;
        }
    }
}