PreferencesServlet.java
4.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
* 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"));
}
}
}