ProjectPackageCreator.java 9.25 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.cq.projects.api.Project
 *  com.adobe.cq.projects.api.ProjectMemberRole
 *  com.day.cq.wcm.api.Template
 *  com.day.jcr.vault.fs.api.ImportMode
 *  com.day.jcr.vault.fs.api.PathFilterSet
 *  com.day.jcr.vault.fs.api.ProgressTrackerListener
 *  com.day.jcr.vault.fs.api.WorkspaceFilter
 *  com.day.jcr.vault.fs.config.DefaultWorkspaceFilter
 *  com.day.jcr.vault.packaging.JcrPackage
 *  com.day.jcr.vault.packaging.JcrPackageDefinition
 *  com.day.jcr.vault.packaging.JcrPackageManager
 *  com.day.jcr.vault.packaging.PackagingService
 *  com.day.jcr.vault.util.DefaultProgressListener
 *  javax.jcr.Node
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  org.apache.commons.lang.StringUtils
 *  org.apache.jackrabbit.api.security.user.Group
 *  org.apache.sling.api.SlingHttpServletRequest
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.resource.ResourceUtil
 *  org.apache.sling.api.resource.ValueMap
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.cq.projects.impl.servlet;

import com.adobe.cq.projects.api.Project;
import com.adobe.cq.projects.api.ProjectMemberRole;
import com.adobe.cq.projects.impl.team.Team;
import com.adobe.cq.projects.impl.team.TeamException;
import com.adobe.cq.projects.impl.team.TeamManager;
import com.adobe.cq.projects.impl.team.TeamManagerFactory;
import com.adobe.cq.projects.impl.util.ProjectUtils;
import com.day.cq.wcm.api.Template;
import com.day.jcr.vault.fs.api.ImportMode;
import com.day.jcr.vault.fs.api.PathFilterSet;
import com.day.jcr.vault.fs.api.ProgressTrackerListener;
import com.day.jcr.vault.fs.api.WorkspaceFilter;
import com.day.jcr.vault.fs.config.DefaultWorkspaceFilter;
import com.day.jcr.vault.packaging.JcrPackage;
import com.day.jcr.vault.packaging.JcrPackageDefinition;
import com.day.jcr.vault.packaging.JcrPackageManager;
import com.day.jcr.vault.packaging.PackagingService;
import com.day.jcr.vault.util.DefaultProgressListener;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import org.apache.commons.lang.StringUtils;
import org.apache.jackrabbit.api.security.user.Group;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceUtil;
import org.apache.sling.api.resource.ValueMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ProjectPackageCreator {
    private static final Logger LOGGER = LoggerFactory.getLogger(ProjectPackageCreator.class);

    public static JcrPackage create(SlingHttpServletRequest request, TeamManagerFactory teamManagerFactory) throws Exception {
        HashSet<String> mergedFilters = new HashSet<String>();
        String packageName = request.getParameter("packageName");
        String packageGroup = request.getParameter("packageGroup");
        boolean includeTemplate = ProjectPackageCreator.getBooleanParameter(request, "includeTemplate", true);
        boolean includeExperienceAssets = ProjectPackageCreator.getBooleanParameter(request, "includeExperienceAssets", false);
        boolean includeDamAssetFilters = ProjectPackageCreator.getBooleanParameter(request, "includeExtraDamAssets", false);
        boolean isOverwrite = ProjectPackageCreator.getBooleanParameter(request, "overwriteExistingPackage", false);
        Session jcrSession = (Session)request.getResourceResolver().adaptTo(Session.class);
        JcrPackageManager packMgr = PackagingService.getPackageManager((Session)jcrSession);
        Project project = (Project)request.getResource().adaptTo(Project.class);
        if (StringUtils.isBlank((String)packageName)) {
            packageName = request.getResource().getName();
        }
        if (StringUtils.isBlank((String)packageGroup)) {
            packageGroup = packageName;
        }
        String packPath = packageGroup + "/" + packageName + ".zip";
        Node packages = packMgr.getPackageRoot();
        if (packages.hasNode(packPath)) {
            if (isOverwrite) {
                LOGGER.debug("Package {}-{} already exists, isOverwrite is true: removing existing pacakge {}", (Object)packPath);
                packages.getNode(packPath).remove();
                packages.getSession().save();
            } else {
                LOGGER.debug("Package {}-{} already exists, and isOverwrite is false: aborting", (Object)packageGroup, (Object)packageName);
                throw new Exception("Package exists already and overwrite was not specified");
            }
        }
        LOGGER.debug("Creating package {}-{}", (Object)packageGroup, (Object)packageName);
        JcrPackage pack = packMgr.create(packageGroup, packageName);
        pack.getDefinition().set("cqVersion", "6.0", true);
        pack.getDefinition().set("acHandling", "merge_preserve", true);
        if (StringUtils.isNotBlank((String)project.getDescription())) {
            pack.getDefinition().set("jcr:description", project.getDescription(), true);
        }
        mergedFilters.add(request.getResource().getPath());
        Resource damAssetFolder = project.getAssetFolder();
        if (damAssetFolder != null && !ResourceUtil.isNonExistingResource((Resource)damAssetFolder)) {
            mergedFilters.add(damAssetFolder.getPath());
        }
        ProjectPackageCreator.addRoleGroups(request.getResource().getPath(), jcrSession, teamManagerFactory, project, mergedFilters);
        if (includeTemplate) {
            Template template = (Template)project.adaptTo(Template.class);
            mergedFilters.add(template.getPath());
        }
        if (includeExperienceAssets) {
            ProjectPackageCreator.addExperienceFilters(request.getResource(), mergedFilters);
        }
        if (includeDamAssetFilters) {
            ProjectPackageCreator.addDamFilters(request.getResource(), project, mergedFilters);
        }
        DefaultWorkspaceFilter filters = new DefaultWorkspaceFilter();
        for (String path : mergedFilters) {
            LOGGER.debug("Adding filter for path {}", (Object)path);
            PathFilterSet pathFilterSet = new PathFilterSet(path);
            pathFilterSet.setImportMode(ImportMode.MERGE);
            filters.add(pathFilterSet);
        }
        pack.getDefinition().setFilter((WorkspaceFilter)filters, true);
        LOGGER.debug("Assembling package {}", (Object)pack.getNode().getParent());
        packMgr.assemble(pack, (ProgressTrackerListener)new DefaultProgressListener());
        return pack;
    }

    private static boolean getBooleanParameter(SlingHttpServletRequest request, String parameterName, boolean defaultValue) {
        String parameterValue = request.getParameter(parameterName);
        return parameterValue != null ? Boolean.parseBoolean(parameterValue) : defaultValue;
    }

    private static void addExperienceFilters(Resource resource, Set<String> filters) {
        Resource gadgetResource = ProjectUtils.getGadgetFolder(resource);
        for (Resource gadget : gadgetResource.getChildren()) {
            if (!gadget.isResourceType("cq/gui/components/projects/admin/pod/channelpod")) continue;
            for (Resource child : gadget.getChildren()) {
                Resource suffixResource;
                ValueMap childMap = ResourceUtil.getValueMap((Resource)child);
                String suffix = (String)childMap.get("suffix", String.class);
                if (!StringUtils.isNotBlank((String)suffix) || (suffixResource = resource.getResourceResolver().getResource(suffix)) == null || ResourceUtil.isNonExistingResource((Resource)suffixResource)) continue;
                filters.add(suffixResource.getPath());
            }
        }
    }

    private static void addDamFilters(Resource resource, Project project, Set<String> filters) {
        Resource gadgetResource = ProjectUtils.getGadgetFolder(resource);
        for (Resource gadget : gadgetResource.getChildren()) {
            String suffix;
            Resource suffixResource;
            ValueMap childMap;
            if (!gadget.isResourceType("cq/gui/components/projects/admin/pod/assetpod") || !StringUtils.isNotBlank((String)(suffix = (String)(childMap = ResourceUtil.getValueMap((Resource)gadget)).get("assetPath", String.class))) || (suffixResource = resource.getResourceResolver().getResource(suffix)) == null || ResourceUtil.isNonExistingResource((Resource)suffixResource)) continue;
            filters.add(suffixResource.getPath());
        }
    }

    private static void addRoleGroups(String projectPath, Session jcrSession, TeamManagerFactory teamManagerFactory, Project project, Set<String> filters) throws TeamException, RepositoryException {
        TeamManager teamManager = teamManagerFactory.createTeamManager(jcrSession, (Template)project.adaptTo(Template.class));
        Team projectTeam = null;
        if (project != null) {
            projectTeam = teamManager.getTeam(project);
        }
        Map<String, ProjectMemberRole> teamRoles = teamManager.getRoles();
        for (ProjectMemberRole role : teamRoles.values()) {
            Group roleGroup = projectTeam.getGroup(role);
            filters.add(roleGroup.getPath());
        }
    }
}