PreferencesServlet.java 4.89 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.i18n.LocaleUtil
 *  javax.jcr.Node
 *  javax.jcr.Property
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  javax.jcr.Value
 *  javax.servlet.ServletException
 *  javax.servlet.http.HttpServletRequest
 *  javax.servlet.http.HttpServletResponse
 *  org.apache.jackrabbit.api.JackrabbitSession
 *  org.apache.jackrabbit.api.security.user.Authorizable
 *  org.apache.jackrabbit.api.security.user.UserManager
 *  org.apache.jackrabbit.value.StringValue
 *  org.apache.sling.commons.json.JSONException
 *  org.apache.sling.commons.json.JSONObject
 *  org.apache.sling.commons.json.JSONTokener
 *  org.osgi.framework.BundleContext
 *  org.slf4j.Logger
 */
package com.day.crx.delite.impl.servlets;

import com.adobe.granite.i18n.LocaleUtil;
import com.day.crx.delite.impl.AbstractServlet;
import com.day.crx.delite.impl.support.RequestData;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.Locale;
import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Value;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.jackrabbit.api.JackrabbitSession;
import org.apache.jackrabbit.api.security.user.Authorizable;
import org.apache.jackrabbit.api.security.user.UserManager;
import org.apache.jackrabbit.value.StringValue;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.JSONObject;
import org.apache.sling.commons.json.JSONTokener;
import org.osgi.framework.BundleContext;
import org.slf4j.Logger;

public class PreferencesServlet
extends AbstractServlet {
    public PreferencesServlet(BundleContext bc) {
        super(bc);
    }

    protected void doService(HttpServletRequest request, HttpServletResponse res, Session session) throws ServletException, IOException {
        try {
            RequestData req = new RequestData(request);
            String language = req.getParameter("language");
            String keymap = req.getParameter("keymap");
            if (language == null && keymap == null) {
                return;
            }
            if (!(session instanceof JackrabbitSession)) {
                this.logger.warn("Not a Jackrabbit session. Cannot set preferences.");
                return;
            }
            JackrabbitSession s = (JackrabbitSession)session;
            this.logger.debug("Setting preferences for {}.", (Object)s.getUserID());
            Authorizable user = s.getUserManager().getAuthorizable(s.getUserID());
            if (user == null) {
                this.logger.warn("User is not found for {}.", (Object)s.getUserID());
                return;
            }
            if (language != null) {
                Locale locale = LocaleUtil.parseLocale((String)language);
                this.logger.debug("Setting locale: {}.", (Object)locale);
                user.setProperty("preferences/language", (Value)new StringValue(LocaleUtil.toRFC4646((Locale)locale).toLowerCase()));
            }
            if (keymap != null) {
                Node prefNode = session.getNode(user.getPath()).getNode("preferences");
                Node keymapNode = this.createNode(prefNode, "keymap");
                JSONObject keymapJson = new JSONObject(new JSONTokener(keymap));
                Iterator it = keymapJson.keys();
                while (it.hasNext()) {
                    String key = (String)it.next();
                    Node keyNode = this.createNode(keymapNode, key);
                    this.populateKeyMap(keyNode, keymapJson.getJSONObject(key));
                }
            }
            s.save();
        }
        catch (RepositoryException e) {
            this.logger.error("Error while setting preferences: {}", (Throwable)e);
            res.setStatus(500);
            res.getWriter().println(e.getMessage());
        }
        catch (JSONException e) {
            res.setStatus(400);
            res.getWriter().println("Invalid keymap: " + e.getMessage());
        }
    }

    private Node createNode(Node parent, String relPath) throws RepositoryException {
        return parent.hasNode(relPath) ? parent.getNode(relPath) : parent.addNode(relPath);
    }

    private void populateKeyMap(Node node, JSONObject config) throws RepositoryException, JSONException {
        node.setProperty("name", node.getName());
        if (config.has("alt")) {
            node.setProperty("alt", config.getBoolean("alt"));
        }
        if (config.has("ctrl")) {
            node.setProperty("ctrl", config.getBoolean("ctrl"));
        }
        if (config.has("shift")) {
            node.setProperty("shift", config.getBoolean("shift"));
        }
        if (config.has("key")) {
            node.setProperty("key", (long)config.getInt("key"));
        }
    }
}