CreateLiveCopyCommand.java 10.4 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.cq.commons.servlets.HtmlStatusResponseHelper
 *  com.day.cq.i18n.I18n
 *  com.day.cq.wcm.api.Page
 *  com.day.cq.wcm.api.PageManager
 *  com.day.cq.wcm.api.commands.WCMCommandContext
 *  com.day.cq.wcm.msm.api.LiveCopy
 *  com.day.cq.wcm.msm.api.LiveRelationship
 *  com.day.cq.wcm.msm.api.LiveRelationshipManager
 *  com.day.cq.wcm.msm.api.RolloutManager
 *  com.day.text.Text
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  javax.servlet.http.HttpServletRequest
 *  org.apache.commons.lang.StringUtils
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.api.SlingHttpServletRequest
 *  org.apache.sling.api.SlingHttpServletResponse
 *  org.apache.sling.api.request.RequestParameterMap
 *  org.apache.sling.api.resource.NonExistingResource
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.servlets.HtmlResponse
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.cq.wcm.msm.impl.commands;

import com.day.cq.commons.servlets.HtmlStatusResponseHelper;
import com.day.cq.i18n.I18n;
import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.api.PageManager;
import com.day.cq.wcm.api.commands.WCMCommandContext;
import com.day.cq.wcm.msm.api.LiveCopy;
import com.day.cq.wcm.msm.api.LiveRelationship;
import com.day.cq.wcm.msm.api.LiveRelationshipManager;
import com.day.cq.wcm.msm.api.RolloutManager;
import com.day.cq.wcm.msm.impl.LiveCopyManagerImpl;
import com.day.cq.wcm.msm.impl.LiveCopyServiceImpl;
import com.day.cq.wcm.msm.impl.Utils;
import com.day.cq.wcm.msm.impl.commands.LiveCommand;
import com.day.text.Text;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
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.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.request.RequestParameterMap;
import org.apache.sling.api.resource.NonExistingResource;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.servlets.HtmlResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(metatype=0)
@Service
public class CreateLiveCopyCommand
extends LiveCommand {
    static final String MISSING_PAGE_PARAM = "missingPage";
    static final String EXCLUDE_SUB_PAGES_PARAM = "excludeSubPages";
    private static final Logger log = LoggerFactory.getLogger(CreateLiveCopyCommand.class);
    @Reference
    private LiveCopyServiceImpl liveCopyService = null;

    public String getCommandName() {
        return "createLiveCopy";
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    public HtmlResponse performCommand(WCMCommandContext ctx, SlingHttpServletRequest request, SlingHttpServletResponse response, PageManager pageManager) {
        HtmlResponse missingPages;
        try {
            HtmlResponse e;
            Page master;
            Page targetPage;
            boolean isCreateLiveCopy;
            String dstPath = request.getParameter("destPath");
            if (StringUtils.isEmpty((String)dstPath)) {
                HtmlResponse htmlResponse = HtmlStatusResponseHelper.createStatusResponse((boolean)false, (String)I18n.get((HttpServletRequest)request, (String)"Either destination or parent needs to be specified."));
                return htmlResponse;
            }
            missingPages = request.getParameterValues("missingPage");
            boolean isMissingPages = !this.isEmpty((String[])missingPages);
            String srcPath = request.getParameter("srcPath");
            boolean bl = isCreateLiveCopy = !StringUtils.isEmpty((String)srcPath);
            if (!isMissingPages && !isCreateLiveCopy) {
                HtmlResponse htmlResponse = HtmlStatusResponseHelper.createStatusResponse((boolean)false, (String)I18n.get((HttpServletRequest)request, (String)"Incomplete request: No valid source path or missing page provided."));
                return htmlResponse;
            }
            ResourceResolver resolver = request.getResourceResolver();
            if (isMissingPages) {
                targetPage = pageManager.getPage(dstPath);
                if (targetPage == null) {
                    HtmlResponse e2 = HtmlStatusResponseHelper.createStatusResponse((int)500, (String)I18n.get((HttpServletRequest)request, (String)"No Page at destination"), (String)dstPath);
                    return e2;
                }
                LiveRelationship lr = this.relationshipManager.getLiveRelationship(targetPage.getContentResource(), false);
                if (lr == null) {
                    HtmlResponse session = HtmlStatusResponseHelper.createStatusResponse((boolean)false, (String)I18n.get((HttpServletRequest)request, (String)"No live relationship, can not un-skipp Page"), (String)targetPage.getPath());
                    return session;
                }
                Page source = pageManager.getPage(Text.getRelativeParent((String)lr.getSourcePath(), (int)1));
                if (source == null) {
                    HtmlResponse session = HtmlStatusResponseHelper.createStatusResponse((boolean)false, (String)(I18n.get((HttpServletRequest)request, (String)"Source Page for un-skipp does not exist at ") + lr.getSourcePath()), (String)targetPage.getPath());
                    return session;
                }
                boolean includeSubPages = !"true".equals(request.getParameter("excludeSubPages"));
                LiveCopyManagerImpl lcm = this.liveCopyService.createLiveCopyManager(resolver);
                LiveCopyManagerImpl.LiveCopyImpl copy = lcm.get(lr.getLiveCopy().getPath());
                for (HtmlResponse missingPage : missingPages) {
                    String absPath = Utils.appendPath(targetPage.getPath(), (String)missingPage);
                    Page master2 = pageManager.getPage(Utils.appendPath(source.getPath(), (String)missingPage));
                    if (master2 == null) {
                        log.warn("Request to un-skipp Page at that does not exist in Blueprint: ignore", (Object)absPath);
                        continue;
                    }
                    copy.removeExclusion(absPath.substring(copy.getPath().length() + 1));
                    if (copy.contains(absPath)) {
                        lr = this.relationshipManager.getLiveRelationship((Resource)new NonExistingResource(resolver, Utils.appendPath(absPath, "jcr:content")), true);
                        this.rolloutManager.rollout(resolver, lr, true, false);
                        if (includeSubPages) {
                            Page lcPage = pageManager.getPage(absPath);
                            if (lcPage != null) {
                                this.rollout(master2, lcPage, lr, true, resolver);
                            } else {
                                log.warn("Target Page not created by roll-out to un-skip at {}", (Object)absPath);
                            }
                        }
                        resolver.commit();
                        continue;
                    }
                    this.createLiveCopy(master2, dstPath, resolver, includeSubPages, null, new String[0]);
                }
            }
            if (!isCreateLiveCopy) {
                targetPage = HtmlStatusResponseHelper.createStatusResponse((boolean)true, (String)I18n.get((HttpServletRequest)request, (String)"Un-skipped pages for {0}", (String)null, (Object[])missingPages));
                return targetPage;
            }
            Resource resource = resolver.getResource(srcPath);
            Page page = master = resource == null ? null : (Page)resource.adaptTo(Page.class);
            if (master == null) {
                e = HtmlStatusResponseHelper.createStatusResponse((boolean)false, (String)I18n.get((HttpServletRequest)request, (String)"Error during operation. Source path does not point to a Page: {0}", (String)null, (Object[])new Object[]{srcPath}));
                return e;
            }
            if (Text.isDescendantOrEqual((String)srcPath, (String)dstPath)) {
                e = HtmlStatusResponseHelper.createStatusResponse((boolean)false, (String)I18n.get((HttpServletRequest)request, (String)"Destination path cannot contain source path."));
                return e;
            }
            boolean copyShallow = "true".equals(request.getParameter("shallow"));
            Page lcPage = this.createLiveCopy(master, dstPath, resolver, !copyShallow, request.getRequestParameterMap(), request.getParameterValues("cq:rolloutConfigs"));
            HtmlResponse e3 = HtmlStatusResponseHelper.createStatusResponse((boolean)true, (String)I18n.get((HttpServletRequest)request, (String)"Live Copy created"), (String)lcPage.getPath());
            return e3;
        }
        catch (IllegalStateException is) {
            log.debug("Error during Live Copy creation Relation would result in a Circle {}", (Object)is.getMessage());
            missingPages = HtmlStatusResponseHelper.createStatusResponse((boolean)false, (String)is.getMessage());
            return missingPages;
        }
        catch (Exception e) {
            log.error("Error during Live Copy creation.", (Throwable)e);
            missingPages = HtmlStatusResponseHelper.createStatusResponse((boolean)false, (String)e.getMessage());
            return missingPages;
        }
        finally {
            Session session = (Session)request.getResourceResolver().adaptTo(Session.class);
            try {
                if (session != null && session.hasPendingChanges()) {
                    session.refresh(false);
                    log.debug("Reverted uncommitted changes, due to Exception");
                }
            }
            catch (RepositoryException e) {
                log.error("Failed to revert changes {}", (Object)e.getMessage());
            }
        }
    }

    protected void bindLiveCopyService(LiveCopyServiceImpl liveCopyServiceImpl) {
        this.liveCopyService = liveCopyServiceImpl;
    }

    protected void unbindLiveCopyService(LiveCopyServiceImpl liveCopyServiceImpl) {
        if (this.liveCopyService == liveCopyServiceImpl) {
            this.liveCopyService = null;
        }
    }
}