DefaultPageStatusProvider.java 13.6 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.xss.XSSAPI
 *  com.day.cq.wcm.api.LanguageManager
 *  com.day.cq.wcm.api.LanguageManager$Info
 *  com.day.cq.wcm.api.Page
 *  com.day.cq.wcm.api.PageInfoProvider
 *  com.day.cq.wcm.api.PageManager
 *  com.day.cq.wcm.api.Revision
 *  com.day.cq.wcm.api.Template
 *  com.day.cq.wcm.api.designer.Design
 *  com.day.cq.wcm.api.designer.Designer
 *  com.day.cq.wcm.commons.Constants
 *  com.day.cq.workflow.WorkflowException
 *  com.day.cq.workflow.WorkflowService
 *  com.day.cq.workflow.WorkflowSession
 *  com.day.cq.workflow.exec.Workflow
 *  com.day.cq.workflow.metadata.MetaDataMap
 *  com.day.cq.workflow.model.WorkflowModel
 *  com.day.cq.workflow.status.WorkflowStatus
 *  javax.jcr.PathNotFoundException
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  org.apache.commons.lang.time.FastDateFormat
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Property
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.api.SlingHttpServletRequest
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  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.day.cq.wcm.core.impl;

import com.adobe.granite.xss.XSSAPI;
import com.day.cq.wcm.api.LanguageManager;
import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.api.PageInfoProvider;
import com.day.cq.wcm.api.PageManager;
import com.day.cq.wcm.api.Revision;
import com.day.cq.wcm.api.Template;
import com.day.cq.wcm.api.designer.Design;
import com.day.cq.wcm.api.designer.Designer;
import com.day.cq.wcm.commons.Constants;
import com.day.cq.wcm.core.impl.components.ComponentCache;
import com.day.cq.wcm.core.utils.PageInfoUtils;
import com.day.cq.workflow.WorkflowException;
import com.day.cq.workflow.WorkflowService;
import com.day.cq.workflow.WorkflowSession;
import com.day.cq.workflow.exec.Workflow;
import com.day.cq.workflow.metadata.MetaDataMap;
import com.day.cq.workflow.model.WorkflowModel;
import com.day.cq.workflow.status.WorkflowStatus;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import javax.jcr.PathNotFoundException;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import org.apache.commons.lang.time.FastDateFormat;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Property;
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.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
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;

@Component(metatype=0)
@Property(name="service.description", value={"Export meta data related to a pages"})
@Service(value={PageInfoProvider.class})
public class DefaultPageStatusProvider
implements PageInfoProvider {
    private static final Logger log = LoggerFactory.getLogger(DefaultPageStatusProvider.class);
    private static final String SKIP_WORKFLOW = "skipWorkflow";
    @Reference
    private LanguageManager langMgr = null;
    @Reference
    private WorkflowService workflowService = null;
    @Reference
    private ComponentCache componentCache = null;
    @Reference
    private XSSAPI xssAPI;

    public void updatePageInfo(SlingHttpServletRequest request, JSONObject info, Resource resource) throws JSONException {
        Template template;
        String skipWorkflowModels = request.getParameter("skipWorkflow");
        String path = resource.getPath();
        Page page = (Page)resource.adaptTo(Page.class);
        ResourceResolver resolver = resource.getResourceResolver();
        PageManager pageMgr = (PageManager)resolver.adaptTo(PageManager.class);
        Designer designer = (Designer)resolver.adaptTo(Designer.class);
        Design design = designer == null ? null : designer.getDesign(page);
        Session session = (Session)resolver.adaptTo(Session.class);
        JSONObject status = new JSONObject();
        info.put("status", (Object)status);
        status.put("path", (Object)path);
        info.put("isPage", page != null);
        if (page != null) {
            info.put("pageResourceType", (Object)page.getContentResource().getResourceType());
            info.put("pageResourceSuperType", (Object)page.getContentResource().getResourceSuperType());
            status.put("isLocked", page.isLocked());
            status.put("lockOwner", (Object)(page.getLockOwner() == null ? "" : page.getLockOwner()));
            status.put("canUnlock", page.canUnlock());
            Calendar lastModified = page.getLastModified();
            status.put("lastModified", lastModified != null ? lastModified.getTimeInMillis() : 0);
            status.put("lastModifiedBy", (Object)page.getLastModifiedBy());
            Calendar onTime = page.getOnTime();
            Calendar offTime = page.getOffTime();
            status.put("timeUntilValid", page.timeUntilValid());
            status.put("onTime", onTime != null ? onTime.getTimeInMillis() : 0);
            status.put("offTime", offTime != null ? offTime.getTimeInMillis() : 0);
            status.put("replication", (Object)PageInfoUtils.getReplicationStateObject(resource, this.xssAPI));
            try {
                if (design != null) {
                    status.put("isDesignable", session.hasPermission(design.getPath() + "/testProp", "set_property"));
                }
            }
            catch (RepositoryException e) {
                log.warn("Failed to check permission on design: {}", (Throwable)e);
            }
            try {
                status.put("isDeveloper", session.hasPermission("/apps", "add_node"));
            }
            catch (RepositoryException e) {
                log.warn("Failed to check permission on application: {}", (Throwable)e);
            }
        }
        JSONObject workflow = new JSONObject();
        info.put("workflow", (Object)workflow);
        Workflow wf = null;
        WorkflowStatus wfState = (WorkflowStatus)resource.adaptTo(WorkflowStatus.class);
        if (wfState != null) {
            workflow.put("isRunning", wfState.isInRunningWorkflow());
            wf = wfState.getWorkflow();
            if (wf != null) {
                workflow.put("id", (Object)wf.getId());
                workflow.put("state", (Object)wf.getState());
            }
        }
        if (skipWorkflowModels == null || skipWorkflowModels.equals("false")) {
            JSONObject workflows = new JSONObject();
            info.put("workflows", (Object)workflows);
            try {
                WorkflowSession wfSession = this.workflowService.getWorkflowSession(session);
                WorkflowModel[] models = wfSession.getModels();
                JSONObject wcm = new JSONObject();
                workflows.put("wcm", (Object)wcm);
                JSONArray jModels = new JSONArray();
                for (WorkflowModel model : models) {
                    if (!this.doInclude(model, new String[]{"wcm"}, false)) continue;
                    JSONObject jModel = new JSONObject();
                    jModel.put("wid", (Object)model.getId());
                    jModel.put("label", (Object)model.getTitle());
                    if (this.xssAPI != null) {
                        jModel.put("label_xss", (Object)this.xssAPI.filterHTML(model.getTitle()));
                    }
                    jModels.put((Object)jModel);
                }
                wcm.put("models", (Object)jModels);
                JSONArray tjModels = new JSONArray();
                for (WorkflowModel model2 : models) {
                    if (!this.doInclude(model2, new String[]{"wcm.translation"}, false)) continue;
                    JSONObject jModel = new JSONObject();
                    jModel.put("wid", (Object)model2.getId());
                    jModel.put("label", (Object)model2.getTitle());
                    if (this.xssAPI != null) {
                        jModel.put("label_xss", (Object)this.xssAPI.filterHTML(model2.getTitle()));
                    }
                    tjModels.put((Object)jModel);
                }
                JSONObject translation = new JSONObject();
                workflows.put("translation", (Object)translation);
                translation.put("models", (Object)tjModels);
            }
            catch (WorkflowException e) {
                if (e.getCause() instanceof PathNotFoundException) {
                    log.info("Can't access workflow models; maybe missing or due to access restrictions.");
                }
                log.error("Error while retrieving workflow models.", (Throwable)e);
            }
        }
        JSONObject translation = new JSONObject();
        info.put("translation", (Object)translation);
        if (wf != null) {
            try {
                String srcPath = (String)wf.getMetaDataMap().get("srcPath", String.class);
                if (srcPath == null) {
                    Map infos = this.langMgr.getAdjacentLanguageInfo(resolver, path);
                    if (infos == null || infos.isEmpty()) {
                        log.warn("resource {} not below language root?.", (Object)path);
                    } else {
                        srcPath = ((LanguageManager.Info)infos.values().iterator().next()).getPath();
                    }
                }
                if (srcPath != null && pageMgr.getPage(srcPath) != null) {
                    Collection revisions = pageMgr.getRevisions(srcPath, null);
                    JSONObject original = new JSONObject();
                    translation.put("original", (Object)original);
                    original.put("path", (Object)srcPath);
                    JSONArray versions = new JSONArray();
                    original.put("versions", (Object)versions);
                    for (Revision r : revisions) {
                        JSONObject rev = new JSONObject();
                        versions.put((Object)rev);
                        rev.put("id", (Object)r.getId());
                        rev.put("label", (Object)r.getLabel());
                        rev.put("name", (Object)r.getName());
                        rev.put("title", (Object)r.getTitle());
                        rev.put("comment", (Object)r.getComment());
                        Calendar createdDate = r.getCreated();
                        rev.put("created", (Object)Constants.DATE_DEFAULT.format(createdDate.getTime()));
                        rev.put("deleted", r.isDeleted());
                    }
                }
            }
            catch (Exception e) {
                log.error("Error while retrieving translation info.", (Throwable)e);
            }
        }
        if (design != null) {
            Calendar lm = design.getLastModified();
            JSONObject obj = new JSONObject();
            obj.put("path", (Object)design.getPath());
            obj.put("lastModified", lm == null ? 0 : lm.getTimeInMillis());
            info.put("design", (Object)obj);
        }
        if (page != null && (template = page.getTemplate()) != null && template.hasStructureSupport()) {
            Calendar lm = design.getLastModified();
            JSONObject obj = new JSONObject();
            obj.put("path", (Object)(template.getPath() + "/policies"));
            obj.put("lastModified", lm == null ? 0 : lm.getTimeInMillis());
            info.put("design", (Object)obj);
        }
        info.put("componentsRef", (Object)("/libs/wcm/core/content/components." + this.componentCache.getLastModified() + ".json"));
    }

    private boolean doInclude(WorkflowModel model, String[] tags, boolean doStrict) {
        String[] tagStrSplits;
        if (tags.length == 0) {
            return true;
        }
        MetaDataMap metaData = model.getMetaDataMap();
        String tagStr = (String)metaData.get("tags", String.class);
        String[] arrstring = tagStrSplits = tagStr != null && !tagStr.equals("") ? tagStr.trim().split(",") : new String[]{};
        if (tagStrSplits.length == 0 && !doStrict) {
            return true;
        }
        for (String tag : tagStrSplits) {
            for (String checkTag : tags) {
                if (!checkTag.equals(tag)) continue;
                return true;
            }
        }
        return false;
    }

    protected void bindLangMgr(LanguageManager languageManager) {
        this.langMgr = languageManager;
    }

    protected void unbindLangMgr(LanguageManager languageManager) {
        if (this.langMgr == languageManager) {
            this.langMgr = null;
        }
    }

    protected void bindWorkflowService(WorkflowService workflowService) {
        this.workflowService = workflowService;
    }

    protected void unbindWorkflowService(WorkflowService workflowService) {
        if (this.workflowService == workflowService) {
            this.workflowService = null;
        }
    }

    protected void bindComponentCache(ComponentCache componentCache) {
        this.componentCache = componentCache;
    }

    protected void unbindComponentCache(ComponentCache componentCache) {
        if (this.componentCache == componentCache) {
            this.componentCache = null;
        }
    }

    protected void bindXssAPI(XSSAPI xSSAPI) {
        this.xssAPI = xSSAPI;
    }

    protected void unbindXssAPI(XSSAPI xSSAPI) {
        if (this.xssAPI == xSSAPI) {
            this.xssAPI = null;
        }
    }
}