ConfigurationServlet.java 8.67 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  javax.jcr.Session
 *  javax.servlet.Servlet
 *  javax.servlet.ServletException
 *  javax.servlet.http.HttpServletResponse
 *  org.apache.commons.lang.StringUtils
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Properties
 *  org.apache.felix.scr.annotations.Property
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.jackrabbit.api.security.user.Authorizable
 *  org.apache.sling.api.SlingHttpServletRequest
 *  org.apache.sling.api.SlingHttpServletResponse
 *  org.apache.sling.api.request.RequestPathInfo
 *  org.apache.sling.api.resource.PersistableValueMap
 *  org.apache.sling.api.resource.PersistenceException
 *  org.apache.sling.api.servlets.HtmlResponse
 *  org.apache.sling.commons.json.JSONArray
 *  org.apache.sling.commons.json.JSONException
 *  org.apache.sling.commons.json.io.JSONWriter
 */
package com.day.cq.wcm.notification.impl;

import com.day.cq.wcm.notification.AbstractSubscription;
import com.day.cq.wcm.notification.NotificationManager;
import com.day.cq.wcm.notification.NotificationUtil;
import com.day.cq.wcm.notification.impl.AbstractServlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.jcr.Session;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
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.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.jackrabbit.api.security.user.Authorizable;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.request.RequestPathInfo;
import org.apache.sling.api.resource.PersistableValueMap;
import org.apache.sling.api.resource.PersistenceException;
import org.apache.sling.api.servlets.HtmlResponse;
import org.apache.sling.commons.json.JSONArray;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.io.JSONWriter;

@Component(metatype=0)
@Service(value={Servlet.class})
@Properties(value={@Property(name="sling.servlet.paths", value={"/bin/wcm/notification/config"}), @Property(name="sling.servlet.methods", value={"GET", "POST"})})
public class ConfigurationServlet
extends AbstractServlet {
    public static final String USER_PARAM = "user";
    @Reference
    protected NotificationManager notificationManager;

    protected boolean hasCommand(SlingHttpServletRequest request) throws ServletException {
        return true;
    }

    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        String extension = request.getRequestPathInfo().getExtension();
        String userId = request.getParameter("user");
        if ("json".equals(extension)) {
            try {
                AbstractServlet.RequestInfo info = new AbstractServlet.RequestInfo(request, userId);
                response.setContentType("application/json");
                JSONWriter writer = new JSONWriter((Writer)response.getWriter());
                this.writeJSONString(info, writer);
            }
            catch (JSONException e) {
                throw new ServletException("Exception during response creation.", (Throwable)e);
            }
        } else {
            response.setStatus(404);
        }
    }

    protected void performCommand(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        String extension = request.getRequestPathInfo().getExtension();
        String userId = request.getParameter("user");
        if ("json".equals(extension)) {
            AbstractServlet.RequestInfo info = new AbstractServlet.RequestInfo(request, userId);
            this.update(info, request);
            HtmlResponse r = new HtmlResponse();
            r.setStatus(200, "Configuration updated.");
            r.send((HttpServletResponse)response, true);
        } else {
            response.setStatus(404);
        }
    }

    protected AbstractSubscription.Filter getPageSubscriptionConfiguration(AbstractServlet.RequestInfo info) {
        Iterator<PersistableValueMap> iter = this.notificationManager.getSubscriptionConfigurations(info.user, info.session);
        AbstractSubscription.Filter sub = null;
        while (iter.hasNext()) {
            PersistableValueMap config = iter.next();
            if (!NotificationUtil.getSubscriptionType((Map)config).equals("page")) continue;
            sub = new AbstractSubscription.Filter(config);
        }
        return sub;
    }

    protected void update(AbstractServlet.RequestInfo info, SlingHttpServletRequest request) throws PersistenceException {
        Object config;
        AbstractSubscription.Filter oldPageSub = this.getPageSubscriptionConfiguration(info);
        String oldChannel = null;
        if (oldPageSub != null) {
            config = oldPageSub.getConfiguration();
            oldChannel = (String)config.get("channel");
        } else {
            config = new HashMap();
        }
        config.put("type", "page");
        config.put("actions", request.getParameterValues("actions"));
        config.put("channel", request.getParameter("type"));
        String[] entries = null;
        try {
            JSONArray jo = new JSONArray(request.getParameter("configs"));
            entries = new String[jo.length()];
            for (int i = 0; i < jo.length(); ++i) {
                JSONArray array = (JSONArray)jo.get(i);
                entries[i] = array.getString(0) + '|' + array.getString(1) + '|' + array.getString(2);
            }
        }
        catch (JSONException e) {
            // empty catch block
        }
        config.put("paths", entries);
        if (oldPageSub != null && oldChannel != null && oldChannel.equals(config.get("channel"))) {
            oldPageSub.getConfiguration().save();
        } else {
            String[] paths;
            if (null != oldPageSub && (paths = (String[])oldPageSub.getConfiguration().get("paths", (Object)new String[0])).length > 0) {
                String subscriptionPath = StringUtils.split((String)paths[0], (String)"|")[0];
                this.notificationManager.unsubscribe(info.user, subscriptionPath, info.session);
            }
            this.notificationManager.subscribe(info.user, (Map<String, Object>)config, info.session);
        }
    }

    private void writeJSONString(AbstractServlet.RequestInfo info, JSONWriter writer) throws JSONException {
        int i;
        int count = 0;
        AbstractSubscription.Filter pageSub = this.getPageSubscriptionConfiguration(info);
        PersistableValueMap channelConfig = null;
        if (pageSub != null) {
            count = pageSub.getEntries().length;
            channelConfig = this.notificationManager.getChannelConfiguration(info.user, (Map)pageSub.getConfiguration(), info.session);
        }
        writer.object();
        writer.key("type");
        if (channelConfig == null) {
            writer.value((Object)"inbox");
        } else {
            writer.value((Object)NotificationUtil.getChannelType((Map)channelConfig));
        }
        writer.key("actions");
        writer.array();
        if (pageSub != null) {
            String[] actions = pageSub.getActions();
            for (i = 0; i < actions.length; ++i) {
                writer.value((Object)actions[i]);
            }
        }
        writer.endArray();
        writer.key("results").value((long)count);
        writer.key("configs");
        writer.array();
        if (pageSub != null) {
            AbstractSubscription.Entry[] entries = pageSub.getEntries();
            for (i = 0; i < entries.length; ++i) {
                writer.object();
                writer.key("path").value((Object)entries[i].path);
                writer.key("allow").value((Object)String.valueOf(entries[i].allow));
                writer.key("exact").value((Object)String.valueOf(entries[i].exact));
                writer.endObject();
            }
        }
        writer.endArray();
        writer.endObject();
    }

    protected void bindNotificationManager(NotificationManager notificationManager) {
        this.notificationManager = notificationManager;
    }

    protected void unbindNotificationManager(NotificationManager notificationManager) {
        if (this.notificationManager == notificationManager) {
            this.notificationManager = null;
        }
    }
}