ExperienceServlet.java 11.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.granite.ui.components.HtmlResponse
 *  com.adobe.granite.xss.XSSAPI
 *  com.day.cq.i18n.I18n
 *  com.day.cq.wcm.api.Template
 *  javax.jcr.Node
 *  javax.jcr.Property
 *  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.commons.JcrUtils
 *  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.ResourceUtil
 *  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.impl.ProjectLinkImpl;
import com.adobe.granite.ui.components.HtmlResponse;
import com.adobe.granite.xss.XSSAPI;
import com.day.cq.i18n.I18n;
import com.day.cq.wcm.api.Template;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import javax.jcr.Node;
import javax.jcr.Property;
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.commons.JcrUtils;
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.ResourceUtil;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SlingServlet(metatype=0, methods={"POST"}, resourceTypes={"cq/gui/components/projects/admin/pod/channelpod"})
public class ExperienceServlet
extends SlingAllMethodsServlet {
    private static final Logger LOGGER = LoggerFactory.getLogger(ExperienceServlet.class);
    @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 redirect = request.getParameter(":redirect");
        String operation = request.getParameter(":operation");
        try {
            if (StringUtils.equals((CharSequence)operation, (CharSequence)"deleteExperience")) {
                this.deleteExperienceLink(request, response, i18n, res, redirect);
            } else if (StringUtils.equals((CharSequence)operation, (CharSequence)"addExperience")) {
                this.createExperienceLink(request, response, i18n, res, redirect);
            } else {
                res.setGeneralError(500);
                res.send((HttpServletResponse)response, true);
            }
        }
        catch (ProjectException e) {
            LOGGER.error("ProjectUpdateServlet exception: " + e.getMessage(), (Throwable)e);
            res.setGeneralError(500);
            res.send((HttpServletResponse)response, true);
        }
    }

    private void deleteExperienceLink(SlingHttpServletRequest request, SlingHttpServletResponse response, I18n i18n, HtmlResponse res, String redirect) throws IOException {
        String[] params = request.getParameterValues("link");
        List<String> experiencesToDelete = Arrays.asList(params);
        ArrayList<String> errors = new ArrayList<String>();
        ArrayList<String> deleted = new ArrayList<String>();
        Resource experienceResource = request.getResource();
        Iterator experienceIterator = experienceResource.listChildren();
        while (experienceIterator.hasNext()) {
            Resource resource = (Resource)experienceIterator.next();
            String path = resource.getPath();
            if (!experiencesToDelete.contains(path)) continue;
            try {
                request.getResourceResolver().delete(resource);
                res.onDeleted(path);
                deleted.add(path);
            }
            catch (PersistenceException e) {
                LOGGER.debug("Unable to delete experience {0}", (Object)path, (Object)e);
                errors.add(path);
            }
        }
        if (errors.size() == 0) {
            request.getResourceResolver().commit();
            String redirectUrl = this.getRedirectLocation(request, redirect);
            res.setStatus(200, i18n.get("Experience Deleted"));
            res.setTitle(i18n.get("Experience Deleted"));
            String msg = deleted.size() == 1 ? i18n.get("The experience has been deleted") : i18n.get("The experiences have been deleted");
            res.setDescription(msg);
            res.addRedirectLink(this.xssAPI.getValidHref(redirectUrl), i18n.get("Done"));
            res.send((HttpServletResponse)response, true);
        } else {
            res.setGeneralError(500);
            res.setTitle(i18n.get("Link deletion error"));
            String msg = errors.size() == 1 ? i18n.get("An error has occurred attempting to delete experience<br>") : i18n.get("An error has occurred attempting to delete experiences<br>");
            StringBuilder builder = new StringBuilder(msg);
            for (String error : errors) {
                builder.append(error + "<br>");
            }
            res.setDescription(builder.toString());
            res.send((HttpServletResponse)response, true);
        }
    }

    private void createExperienceLink(SlingHttpServletRequest request, SlingHttpServletResponse response, I18n i18n, HtmlResponse res, String redirect) throws IOException {
        ProjectLinkImpl link;
        Resource projectResource = this.getProject(request.getResource());
        if (projectResource == null) {
            res.setGeneralError(500);
            res.setTitle(i18n.get("Project Exception"));
            res.setDescription(i18n.get("Unable to locate the associated project."));
            res.send((HttpServletResponse)response, true);
        }
        ResourceResolver resolver = request.getResourceResolver();
        Project project = (Project)projectResource.adaptTo(Project.class);
        String title = request.getParameter("jcr:title");
        title = Text.escapeIllegalJcrChars((String)title);
        Node node = null;
        try {
            Node parentNode = (Node)request.getResource().adaptTo(Node.class);
            node = JcrUtils.getOrCreateUniqueByPath((Node)parentNode, (String)title, (String)"nt:unstructured");
            Resource folderLink = resolver.getResource(node.getPath());
            link = new ProjectLinkImpl(project, folderLink);
            Calendar now = Calendar.getInstance();
            try {
                parentNode.setProperty("jcr:lastModified", now);
            }
            catch (RepositoryException e) {
                throw new ProjectException("Unable to update the last modified value", (Throwable)e);
            }
        }
        catch (RepositoryException e) {
            throw new ProjectException("Unable to create link", (Throwable)e);
        }
        Map params = request.getParameterMap();
        try {
            RequestParameter thumbnailParameter = request.getRequestParameter("coverImage");
            if (thumbnailParameter != null && thumbnailParameter.getSize() > 0) {
                String mimeType = thumbnailParameter.getContentType();
                InputStream thumbnailStream = thumbnailParameter.getInputStream();
                link.setCoverImage(mimeType, thumbnailStream);
            }
            ModifiableValueMap valueMap = (ModifiableValueMap)link.adaptTo(ModifiableValueMap.class);
            for (Object o : params.keySet()) {
                String key = (String)o;
                if (key.startsWith("_") || key.startsWith(":") || StringUtils.equals((CharSequence)"coverImage", (CharSequence)key)) continue;
                String value = ((String[])params.get(key))[0];
                valueMap.put((Object)key, (Object)value);
            }
            request.getResourceResolver().commit();
            String redirectUrl = this.getRedirectLocation(request, redirect);
            Resource linkResource = (Resource)link.adaptTo(Resource.class);
            res.onCreated(linkResource.getPath());
            res.setStatus(201, i18n.get("Link Created"));
            res.setTitle(i18n.get("Link Created"));
            res.setDescription(i18n.get("The link {0} has been created", null, new Object[]{link.getTitle()}));
            res.addRedirectLink(this.xssAPI.getValidHref(redirectUrl), i18n.get("Done"));
            res.send((HttpServletResponse)response, true);
        }
        catch (Exception e) {
            res.setGeneralError(500);
            res.setTitle(i18n.get("Link creation error"));
            res.setDescription(i18n.get("An error has occurred trying to create the link."));
            res.setError((Throwable)e);
            res.send((HttpServletResponse)response, true);
        }
    }

    private Resource getProject(Resource requestResource) {
        for (Resource tmp = requestResource; tmp != null && !ResourceUtil.isNonExistingResource((Resource)tmp); tmp = tmp.getParent()) {
            if (!tmp.isResourceType("cq/gui/components/projects/admin/card/projectcard")) continue;
            return tmp;
        }
        return null;
    }

    private String getRedirectLocation(SlingHttpServletRequest request, String redirect) {
        String gotoUrl = redirect;
        Resource projectResource = this.getProject(request.getResource());
        if (StringUtils.isBlank((CharSequence)redirect)) {
            Resource templateResource;
            String detailsHref = null;
            Project project = (Project)projectResource.adaptTo(Project.class);
            Template template = (Template)project.adaptTo(Template.class);
            if (template != null && (templateResource = (Resource)template.adaptTo(Resource.class)) != null) {
                Resource content = templateResource.getChild("jcr:content");
                detailsHref = (String)ResourceUtil.getValueMap((Resource)content).get("detailsHref", String.class);
            }
            gotoUrl = StringUtils.isNotBlank((CharSequence)detailsHref) ? detailsHref : "/projects/details.html";
            gotoUrl = gotoUrl + projectResource.getPath();
        }
        return gotoUrl;
    }

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

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