ProjectServlet.java 15.8 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.ProjectManager
 *  com.adobe.granite.ui.components.HtmlResponse
 *  com.adobe.granite.xss.XSSAPI
 *  com.day.cq.i18n.I18n
 *  javax.jcr.RepositoryException
 *  javax.servlet.ServletException
 *  javax.servlet.http.HttpServletRequest
 *  javax.servlet.http.HttpServletResponse
 *  org.apache.commons.lang3.StringUtils
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.sling.SlingServlet
 *  org.apache.jackrabbit.util.Text
 *  org.apache.sling.api.SlingHttpServletRequest
 *  org.apache.sling.api.SlingHttpServletResponse
 *  org.apache.sling.api.request.RequestParameter
 *  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.apache.sling.api.resource.ResourceResolverFactory
 *  org.apache.sling.api.servlets.SlingAllMethodsServlet
 *  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.ProjectException;
import com.adobe.cq.projects.api.ProjectManager;
import com.adobe.cq.projects.impl.ProjectManagerImpl;
import com.adobe.cq.projects.impl.servlet.ProjectServletUtil;
import com.adobe.cq.projects.impl.util.ProjectUtils;
import com.adobe.granite.ui.components.HtmlResponse;
import com.adobe.granite.xss.XSSAPI;
import com.day.cq.i18n.I18n;
import java.io.IOException;
import java.io.InputStream;
import java.util.Locale;
import java.util.Map;
import javax.jcr.RepositoryException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.jackrabbit.util.Text;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.request.RequestParameter;
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.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SlingServlet(methods={"POST"}, resourceTypes={"cq/projects"})
public class ProjectServlet
extends SlingAllMethodsServlet {
    private static final Logger LOGGER = LoggerFactory.getLogger(ProjectServlet.class);
    private static final Logger TIMINGLOGGER = LoggerFactory.getLogger((String)"com.adobe.cq.projects.impl.servlet.ProjectServlet.TIMING");
    @Reference
    private ResourceResolverFactory resourceResolverFactory;
    @Reference
    private XSSAPI xssAPI;

    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        I18n i18n = new I18n((HttpServletRequest)request);
        HtmlResponse res = new HtmlResponse(this.xssAPI, i18n, request.getLocale());
        String operation = request.getParameter(":operation");
        LOGGER.debug("ProjectServlet with operation {}", (Object)operation);
        if (StringUtils.equals((CharSequence)"projects:createfolder", (CharSequence)operation)) {
            try {
                String title = request.getParameter("./jcr:title");
                String nameHint = request.getParameter(":nameHint");
                if (StringUtils.isBlank((CharSequence)nameHint)) {
                    nameHint = title;
                }
                String primaryType = request.getParameter("./jcr:primaryType");
                LOGGER.debug("Got a folder request {} {}", (Object)title, (Object)nameHint);
                String parentPath = request.getParameter("parentPath");
                if (StringUtils.isBlank((CharSequence)parentPath)) {
                    parentPath = request.getResource().getPath();
                }
                String strThumbnailURL = request.getParameter("folderthumbnailurl");
                String folderPath = ProjectUtils.createFolder(parentPath, title, nameHint, primaryType, strThumbnailURL, request.getResourceResolver());
                request.getResourceResolver().commit();
                res.onCreated(folderPath);
                res.onChange("test", new String[]{folderPath, "folderPath"});
                res.setStatus(201, i18n.get("Folder {0} created", "The named project folder was successfully created", new Object[]{folderPath}));
                res.setTitle(i18n.get("Folder created"));
                res.setDescription(i18n.get("Your folder has been created"));
                res.addLink("cq-projects-admin-createfolder-open", this.xssAPI.getValidHref("/projects.html" + folderPath), i18n.get("Open folder"));
                res.send((HttpServletResponse)response, true);
            }
            catch (Exception e) {
                LOGGER.error("Unable to create folder", (Throwable)e);
                res.setStatus(500, i18n.get("Unable to create folder"));
                res.send((HttpServletResponse)response, true);
            }
        } else if (StringUtils.equals((CharSequence)"projects:deletefolder", (CharSequence)operation)) {
            try {
                String[] paths;
                Resource folderResource;
                for (String pathToDelete2 : paths = request.getParameterValues("paths")) {
                    folderResource = request.getResourceResolver().getResource(pathToDelete2);
                    if (folderResource != null && folderResource.isResourceType("cq/gui/components/projects/admin/card/foldercard")) {
                        if (ProjectUtils.isEmptyFolder(folderResource)) continue;
                        String message = i18n.get("The folder '{0}' is not empty and thus cannot be deleted", "Failed to delete non-empty project folder", new Object[]{folderResource.getName()});
                        res.setStatus(500, message);
                        res.setTitle(i18n.get("Failed to delete non-empty project folder"));
                        res.setDescription(message);
                        res.send((HttpServletResponse)response, true);
                        return;
                    }
                    String message = i18n.get("The specified path '{0}' is not a project folder", "the provided path is not a project folder", new Object[]{pathToDelete2});
                    res.setStatus(500, message);
                    res.setTitle(i18n.get("Failed to delete non-project folder"));
                    res.setDescription(message);
                    res.send((HttpServletResponse)response, true);
                    return;
                }
                for (String pathToDelete2 : paths) {
                    folderResource = request.getResourceResolver().getResource(pathToDelete2);
                    if (folderResource != null) {
                        request.getResourceResolver().delete(folderResource);
                        request.getResourceResolver().commit();
                        continue;
                    }
                    LOGGER.error("Project folder deletion: previously verified resource is no longer found: '{}'", (Object)pathToDelete2);
                }
                res.setStatus(200, i18n.get("Folder deleted", "The folder was successfully deleted"));
                res.setTitle(i18n.get("Folder deleted"));
                res.setDescription(i18n.get("Successfully created folder."));
                res.send((HttpServletResponse)response, true);
            }
            catch (Exception e) {
                request.getResourceResolver().revert();
                LOGGER.error("Unable to delete folder", (Throwable)e);
                res.setStatus(500, i18n.get("Unable to delete folder"));
                res.send((HttpServletResponse)response, true);
            }
        } else if (StringUtils.equals((CharSequence)"projectcreate", (CharSequence)operation)) {
            ResourceResolver resourceResolver = request.getResourceResolver();
            String title = request.getParameter("jcr:title");
            String nodeName = request.getParameter("name");
            String template = request.getParameter("template");
            String description = request.getParameter("jcr:description");
            String parentPath = request.getParameter("parentPath");
            if (StringUtils.isBlank((CharSequence)parentPath)) {
                parentPath = "/content/projects";
            }
            RequestParameter thumbnailParameter = request.getRequestParameter("coverImage");
            String mimeType = null;
            InputStream thumbnailStream = null;
            if (thumbnailParameter != null && thumbnailParameter.getSize() > 0) {
                mimeType = thumbnailParameter.getContentType();
                thumbnailStream = thumbnailParameter.getInputStream();
            }
            String[] teamMemberUserIds = request.getParameterValues("teamMemberUserId");
            String[] teamMemberRoleIds = request.getParameterValues("teamMemberRoleId");
            try {
                Project project = ProjectServlet.createProject(resourceResolver, parentPath, nodeName, title, template, description, mimeType, thumbnailStream, teamMemberUserIds, teamMemberRoleIds, ProjectServletUtil.convertParameterMap(request, null));
                Resource projectResource = (Resource)project.adaptTo(Resource.class);
                String detailsUrl = ProjectServletUtil.getProjectDetailsUrl(projectResource);
                String homeUrl = "/projects.html" + parentPath;
                String projectPath = Text.escapePath((String)projectResource.getPath());
                detailsUrl = detailsUrl + projectPath;
                res.onCreated(projectPath);
                res.setStatus(201, i18n.get("Project created"));
                res.setTitle(i18n.get("Project created"));
                res.setDescription(i18n.get("Your project has been created."));
                res.addRedirectLink(this.xssAPI.getValidHref(homeUrl), i18n.get("Done"));
                res.addLink("cq-projects-admin-createproject-edit", this.xssAPI.getValidHref(detailsUrl), i18n.get("Open project"));
                res.send((HttpServletResponse)response, true);
            }
            catch (Exception e) {
                LOGGER.error("Unable to create project", (Throwable)e);
                res.setGeneralError(500);
                res.send((HttpServletResponse)response, true);
            }
        } else if (StringUtils.equals((CharSequence)"projectdelete", (CharSequence)operation)) {
            String[] paths;
            boolean deleteProjectGroups = "true".equals(request.getParameter("removeGroups"));
            boolean deleteProjectAssetFolder = "true".equals(request.getParameter("deleteProjectAssetFolder"));
            boolean terminateProjectWorkflows = "true".equals(request.getParameter("terminateProjectWorkflows"));
            ProjectManager pm = (ProjectManager)request.getResourceResolver().adaptTo(ProjectManager.class);
            ProjectManagerImpl projectManagerImpl = pm instanceof ProjectManagerImpl ? (ProjectManagerImpl)pm : null;
            for (String path : paths = request.getParameterValues("path")) {
                Resource projectResource = request.getResourceResolver().getResource(path);
                try {
                    if (projectResource == null) {
                        throw new ProjectException("User " + request.getResourceResolver().getUserID() + " can't delete project. Project " + path + " not found");
                    }
                    Project projectToDelete = (Project)projectResource.adaptTo(Project.class);
                    if (projectToDelete == null) continue;
                    if (projectManagerImpl != null) {
                        projectManagerImpl.deleteProject(projectToDelete, deleteProjectGroups, deleteProjectAssetFolder, terminateProjectWorkflows);
                    } else {
                        pm.deleteProject(projectToDelete);
                    }
                    res.onDeleted(path);
                    continue;
                }
                catch (ProjectException e) {
                    LOGGER.error("Unable to delete project " + path, (Throwable)e);
                    res.setGeneralError(500);
                    res.send((HttpServletResponse)response, true);
                    return;
                }
            }
            res.setStatus(200, i18n.get("Project(s) delete"));
            res.setTitle(i18n.get("Project(s) delete"));
            res.setDescription(i18n.get("Successfully delete project(s)."));
            res.send((HttpServletResponse)response, true);
        } else {
            res.setGeneralError(400);
            res.setStatus(400, i18n.get("Operation not supported"));
            res.setTitle(i18n.get("Error"));
            res.setDescription(i18n.get("The requested operation is not supported {0}", null, new Object[]{operation}));
            res.send((HttpServletResponse)response, true);
        }
    }

    public static Project createProject(ResourceResolver resourceResolver, String parentPath, String label, String title, String template, String description, String mimeType, InputStream thumbnailStream, String[] teamMemberUserIds, String[] teamMemberRoleIds, Map<String, Object> parameterMap) throws PersistenceException, RepositoryException {
        long startTime = System.currentTimeMillis();
        ProjectManager pm = (ProjectManager)resourceResolver.adaptTo(ProjectManager.class);
        if (!(pm instanceof ProjectManagerImpl)) {
            throw new ProjectException("Unexpected project manager implementation");
        }
        ProjectManagerImpl pmImpl = (ProjectManagerImpl)pm;
        Project project = pmImpl.createProject(parentPath, label, title, template, description, teamMemberUserIds, teamMemberRoleIds);
        long time_1 = System.currentTimeMillis();
        long timingCreateProject = time_1 - startTime;
        if (thumbnailStream != null) {
            project.setProjectCover(mimeType, thumbnailStream);
        }
        if (parameterMap != null && !parameterMap.isEmpty()) {
            Resource projectResource = (Resource)project.adaptTo(Resource.class);
            Resource projectContent = projectResource.getChild("jcr:content");
            ModifiableValueMap modifiableValueMap = (ModifiableValueMap)projectContent.adaptTo(ModifiableValueMap.class);
            modifiableValueMap.putAll(parameterMap);
        }
        long time_4 = System.currentTimeMillis();
        long timingUpdateMetadata = time_4 - time_1;
        resourceResolver.commit();
        long time_5 = System.currentTimeMillis();
        long timingSecondCommit = time_5 - time_4;
        long timingTotal = time_5 - startTime;
        if (TIMINGLOGGER.isDebugEnabled()) {
            TIMINGLOGGER.debug("Timing for createProject of {} (createProject,updatemetadata,secondcommit,total):\t{}\t{}\t{}\t{}", new Object[]{label, timingCreateProject, timingUpdateMetadata, timingSecondCommit, timingTotal});
        }
        return project;
    }

    protected void bindResourceResolverFactory(ResourceResolverFactory resourceResolverFactory) {
        this.resourceResolverFactory = resourceResolverFactory;
    }

    protected void unbindResourceResolverFactory(ResourceResolverFactory resourceResolverFactory) {
        if (this.resourceResolverFactory == resourceResolverFactory) {
            this.resourceResolverFactory = null;
        }
    }

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

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