TaskDetailsServlet.java 5.32 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.taskmanagement.Task
 *  com.adobe.granite.taskmanagement.TaskManager
 *  com.adobe.granite.taskmanagement.TaskManagerException
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  javax.servlet.Servlet
 *  javax.servlet.ServletException
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Properties
 *  org.apache.felix.scr.annotations.Property
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.api.SlingHttpServletRequest
 *  org.apache.sling.api.SlingHttpServletResponse
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.servlets.SlingAllMethodsServlet
 *  org.apache.sling.commons.json.JSONException
 *  org.apache.sling.commons.json.io.JSONWriter
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.granite.taskmanagement.impl.servlet;

import com.adobe.granite.taskmanagement.Task;
import com.adobe.granite.taskmanagement.TaskManager;
import com.adobe.granite.taskmanagement.TaskManagerException;
import com.adobe.granite.taskmanagement.impl.servlet.TaskServletUtils;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.io.JSONWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component
@Service(value={Servlet.class})
@Properties(value={@Property(name="sling.servlet.paths", value={"/libs/granite/taskmanager/details.json"})})
public class TaskDetailsServlet
extends SlingAllMethodsServlet {
    private static final Logger logger = LoggerFactory.getLogger(TaskDetailsServlet.class);
    private static final String PARNAME_LOAD_TASK_STRUCTURE = "loadTaskStructure";
    private static final String PARNAME_TASK_ID = "taskId";
    private static final String PARNAME_FROM_RESOURCE = "fromResource";

    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        logger.debug("TaskListServlet.doGet called");
        String taskId = "";
        try {
            taskId = request.getParameter("taskId");
            if (taskId == null) {
                throw new ServletException("no taskId parameter specified");
            }
            boolean fromResource = Boolean.parseBoolean(request.getParameter("fromResource"));
            String parameter = request.getParameter("loadTaskStructure");
            boolean loadTaskStructure = false;
            if (parameter != null && Boolean.parseBoolean(parameter)) {
                loadTaskStructure = true;
            }
            ResourceResolver resolver = request.getResourceResolver();
            TaskManager taskManager = this.getTaskManager(resolver, fromResource, taskId, "read");
            Task task = taskManager.getTask(taskId, loadTaskStructure);
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            JSONWriter w = new JSONWriter((Writer)response.getWriter());
            w.setTidy(true);
            TaskServletUtils.writeTaskInfo(w, task);
        }
        catch (TaskManagerException e) {
            throw new ServletException("Failed to retrieve task for id '" + taskId + "'", (Throwable)e);
        }
        catch (JSONException e) {
            throw new ServletException("Failed to retrieve task for id '" + taskId + "'", (Throwable)e);
        }
    }

    private TaskManager getTaskManager(ResourceResolver resolver, boolean fromResource, String taskId, String permission) throws ServletException {
        TaskManager taskManager = null;
        if (fromResource) {
            if (taskId == null) {
                throw new ServletException("taskId parameter required");
            }
            if (this.hasWriteAccess(resolver, taskId, permission)) {
                Resource taskResource = resolver.getResource(taskId);
                taskManager = (TaskManager)taskResource.adaptTo(TaskManager.class);
            } else {
                taskManager = (TaskManager)resolver.adaptTo(TaskManager.class);
            }
        }
        if (taskManager == null) {
            taskManager = (TaskManager)resolver.adaptTo(TaskManager.class);
        }
        return taskManager;
    }

    private boolean hasWriteAccess(ResourceResolver resourceResolver, String taskId, String permission) {
        Session session = (Session)resourceResolver.adaptTo(Session.class);
        try {
            return session.hasPermission(taskId, permission);
        }
        catch (RepositoryException e) {
            logger.error("error checking access for task: " + taskId, (Throwable)e);
            return false;
        }
    }
}