CampaignCopyTracker.java 6.31 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  javax.servlet.Filter
 *  javax.servlet.FilterChain
 *  javax.servlet.FilterConfig
 *  javax.servlet.ServletException
 *  javax.servlet.ServletRequest
 *  javax.servlet.ServletResponse
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Properties
 *  org.apache.felix.scr.annotations.Property
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.api.SlingHttpServletRequest
 *  org.apache.sling.api.SlingHttpServletResponse
 *  org.apache.sling.api.request.RequestPathInfo
 *  org.apache.sling.api.resource.ModifiableValueMap
 *  org.apache.sling.api.resource.PersistenceException
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.cq.mcm.campaign.servlets;

import com.adobe.cq.mcm.campaign.Constants;
import com.adobe.cq.mcm.campaign.impl.BufferedResponse;
import java.io.IOException;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
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.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
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.ModifiableValueMap;
import org.apache.sling.api.resource.PersistenceException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(metatype=0)
@Service
@Properties(value={@Property(name="filter.scope", value={"request"}, propertyPrivate=1), @Property(name="filter.order", intValue={-2100}, propertyPrivate=1)})
public class CampaignCopyTracker
implements Filter {
    private final Logger log;

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

    private void cleanUp(Resource resource) throws PersistenceException {
        this.log.debug("Cleaning up '{}' after copy", (Object)resource.getPath());
        Resource contentResource = resource.getChild("jcr:content");
        if (contentResource != null) {
            ModifiableValueMap props = (ModifiableValueMap)contentResource.adaptTo(ModifiableValueMap.class);
            for (String toRemove : Constants.PN_REMOVE_ON_COPY) {
                if (!props.containsKey((Object)toRemove)) continue;
                props.remove((Object)toRemove);
            }
        }
        Iterator children = resource.listChildren();
        while (children.hasNext()) {
            Resource child = (Resource)children.next();
            if ("jcr:content".equals(child.getName())) continue;
            this.cleanUp(child);
        }
    }

    private String parse(String html, String id) {
        if (html == null) {
            return null;
        }
        String divStart = "<div id=\"" + id + "\">";
        String divEnd = "</div>";
        Pattern pattern = Pattern.compile("(?s)(.*)" + Pattern.quote(divStart) + "(.*?)" + Pattern.quote(divEnd) + "(.*)");
        Matcher matcher = pattern.matcher(html);
        return matcher.replaceAll("$2");
    }

    public void init(FilterConfig filterConfig) throws ServletException {
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        block10 : {
            String cmd;
            SlingHttpServletRequest slingRequest = (SlingHttpServletRequest)servletRequest;
            String rscPath = slingRequest.getRequestPathInfo().getResourcePath();
            Object actualResponse = servletResponse;
            boolean isIntercepted = false;
            BufferedResponse response = null;
            if ("/bin/wcmcommand".equals(rscPath) && "copyPage".equals(cmd = slingRequest.getParameter("cmd"))) {
                isIntercepted = true;
                this.log.debug("intercepting wcmcommand copy request.");
                response = new BufferedResponse((SlingHttpServletResponse)servletResponse);
                actualResponse = response;
            }
            filterChain.doFilter(servletRequest, (ServletResponse)actualResponse);
            if (isIntercepted) {
                try {
                    String html = response.getString();
                    String statusStr = this.parse(html, "Status");
                    int status = -1;
                    if (statusStr != null) {
                        try {
                            status = Integer.parseInt(statusStr);
                        }
                        catch (NumberFormatException nfe) {
                            // empty catch block
                        }
                    }
                    if (status != 200) break block10;
                    this.log.debug("intercepted copy succeeded, trying to determine destination");
                    String destination = this.parse(html, "Message");
                    if (destination == null) break block10;
                    destination = destination.replaceAll("[\n\r]", "");
                    this.log.debug("destination parsed successfully, is {}", (Object)destination);
                    ResourceResolver resolver = slingRequest.getResourceResolver();
                    Resource destResource = resolver.getResource(destination);
                    if (destResource == null) break block10;
                    this.cleanUp(destResource);
                    try {
                        resolver.commit();
                    }
                    catch (PersistenceException pe) {
                        this.log.error("Could not clean up Campaign properties after copy", (Throwable)pe);
                    }
                }
                finally {
                    response.forward();
                }
            }
        }
    }

    public void destroy() {
    }
}