ProjectManagerImpl.java 8.5 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.cq.projects.api.Project
 *  com.adobe.cq.projects.api.ProjectException
 *  com.adobe.cq.projects.api.ProjectFilter
 *  com.adobe.cq.projects.api.ProjectManager
 *  com.adobe.granite.workflow.WorkflowException
 *  com.adobe.granite.workflow.WorkflowSession
 *  com.adobe.granite.workflow.metadata.MetaDataMap
 *  com.adobe.granite.workflow.model.WorkflowModel
 *  com.day.cq.wcm.api.Template
 *  org.apache.commons.lang.ArrayUtils
 *  org.apache.commons.lang.StringUtils
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.resource.ResourceUtil
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.cq.projects.impl;

import com.adobe.cq.projects.api.Project;
import com.adobe.cq.projects.api.ProjectException;
import com.adobe.cq.projects.api.ProjectFilter;
import com.adobe.cq.projects.api.ProjectManager;
import com.adobe.cq.projects.impl.ProjectStorageProvider;
import com.adobe.cq.projects.impl.util.ProjectsResourceIterator;
import com.adobe.granite.workflow.WorkflowException;
import com.adobe.granite.workflow.WorkflowSession;
import com.adobe.granite.workflow.metadata.MetaDataMap;
import com.adobe.granite.workflow.model.WorkflowModel;
import com.day.cq.wcm.api.Template;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ProjectManagerImpl
implements ProjectManager {
    private final Logger LOGGER = LoggerFactory.getLogger(ProjectManagerImpl.class);
    private ProjectStorageProvider projectStorageProvider;
    private ResourceResolver resourceResolver;

    public ProjectManagerImpl(ProjectStorageProvider projectStorageProvider, ResourceResolver resourceResolver) {
        this.projectStorageProvider = projectStorageProvider;
        this.resourceResolver = resourceResolver;
    }

    public Iterator<Project> getProjects(ProjectFilter filter, int startIndex, int limit) {
        return this.projectStorageProvider.getProjects(this.resourceResolver, filter, startIndex, limit);
    }

    public Iterator<Resource> getChildren(String folderPath, ProjectFilter filter, int startIndex, int limit) {
        Resource parentResource = this.resourceResolver.getResource(folderPath);
        return new ProjectsResourceIterator(parentResource, filter, startIndex, limit);
    }

    public void deleteProject(Project project) {
        this.deleteProject(project, false, false, false);
    }

    public Project createProject(String title, String template) {
        return this.createProject(this.projectStorageProvider.getProjectHome(), null, title, template);
    }

    public Project createProject(String nodeName, String title, String template) {
        return this.createProject(this.projectStorageProvider.getProjectHome(), nodeName, title, template);
    }

    public Project createProject(String parentPath, String nodeName, String title, String templatePath) {
        return this.projectStorageProvider.createProject(parentPath, nodeName, title, templatePath, this.resourceResolver);
    }

    public Project createProject(String parentPath, String nodeName, String title, String template, String description, String[] teamMemberUserIds, String[] teamMemberRoleIds) {
        return this.projectStorageProvider.createProject(parentPath, nodeName, title, template, this.resourceResolver, description, teamMemberUserIds, teamMemberRoleIds);
    }

    public List<WorkflowModel> getWorkflows(Project project) {
        List<WorkflowModel> templateModels;
        if (project == null) {
            throw new ProjectException("Project must not be null");
        }
        WorkflowSession wfSession = (WorkflowSession)this.resourceResolver.adaptTo(WorkflowSession.class);
        Resource projectResource = (Resource)project.adaptTo(Resource.class);
        String projectState = (String)ResourceUtil.getValueMap((Resource)projectResource).get("state", (Object)"");
        Template projectTemplate = (Template)project.adaptTo(Template.class);
        if (projectTemplate == null) {
            return new ArrayList<WorkflowModel>();
        }
        Resource ptWorkflows = this.resourceResolver.getResource(projectTemplate.getPath() + "/workflows");
        try {
            templateModels = this.getTemplateDefinedModels(ptWorkflows, wfSession, projectState);
        }
        catch (WorkflowException e) {
            throw new ProjectException("Unable to read the list of models from the project template", (Throwable)e);
        }
        return templateModels;
    }

    private List<WorkflowModel> getTemplateDefinedModels(Resource ptWorkflows, WorkflowSession wfSession, String projectState) throws WorkflowException {
        WorkflowModel[] models;
        LinkedHashMap<String, WorkflowModel> wfModelsMap = new LinkedHashMap<String, WorkflowModel>();
        ArrayList<WorkflowModel> wfModels = new ArrayList<WorkflowModel>();
        if (ptWorkflows == null) {
            return wfModels;
        }
        Resource ptWorkflowsState = ptWorkflows.getChild("states/" + projectState);
        String[] tags = ptWorkflowsState != null ? (String[])ResourceUtil.getValueMap((Resource)ptWorkflowsState).get("tags", String[].class) : (String[])ResourceUtil.getValueMap((Resource)ptWorkflows).get("tags", String[].class);
        Resource ptModels = ptWorkflows.getChild("models");
        if (ptModels != null) {
            Iterator modelIterator = ptModels.listChildren();
            while (modelIterator.hasNext()) {
                Resource ptModel = (Resource)modelIterator.next();
                String[] ptModelStates = (String[])ResourceUtil.getValueMap((Resource)ptModel).get("states", String[].class);
                boolean isValidState = this.canModelParticipateInState(ptModelStates, projectState);
                if (!isValidState) continue;
                String modelId = (String)ResourceUtil.getValueMap((Resource)ptModel).get("modelId", (Object)"");
                WorkflowModel wfModel = null;
                try {
                    wfModel = wfSession.getModel(modelId);
                }
                catch (WorkflowException e) {
                    if (this.LOGGER.isDebugEnabled()) {
                        this.LOGGER.debug("Failed to read model {}", (Object)modelId, (Object)e);
                    }
                    this.LOGGER.info("Failed to read model {} - {}", (Object)modelId, (Object)e.getMessage());
                }
                if (wfModel == null) continue;
                wfModelsMap.put(wfModel.getId(), wfModel);
            }
        }
        for (WorkflowModel model : models = wfSession.getModels()) {
            if (!this.doesModelContainTag(model, tags)) continue;
            wfModelsMap.put(model.getId(), model);
        }
        return new ArrayList<WorkflowModel>(wfModelsMap.values());
    }

    private boolean canModelParticipateInState(String[] states, String currentState) {
        if (StringUtils.isBlank((String)currentState) || states == null) {
            return true;
        }
        for (String state : states) {
            if (!state.equals(currentState)) continue;
            return true;
        }
        return false;
    }

    private boolean doesModelContainTag(WorkflowModel model, String[] tags) {
        String[] tagStrSplits;
        if (tags == null || tags.length == 0) {
            return false;
        }
        if (ArrayUtils.contains((Object[])tags, (Object)"*")) {
            return true;
        }
        MetaDataMap metaData = model.getMetaDataMap();
        String tagStr = metaData.get("tags", String.class) != null ? (String)metaData.get("tags", String.class) : null;
        for (String tag : tagStrSplits = StringUtils.isNotEmpty((String)tagStr) ? tagStr.trim().split(",") : new String[]{}) {
            for (String checkTag : tags) {
                if (!checkTag.equals(tag)) continue;
                return true;
            }
        }
        return false;
    }

    public void deleteProject(Project project, boolean deleteProjectGroups, boolean deleteProjectAssetFolder, boolean terminateProjectWorkflows) {
        this.projectStorageProvider.deleteProject(project, deleteProjectGroups, deleteProjectAssetFolder, terminateProjectWorkflows);
    }
}