MboxifyServlet.java
5.33 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
126
127
128
129
130
131
132
133
134
135
136
137
138
/*
* Decompiled with CFR 0_118.
*
* Could not load the following classes:
* javax.jcr.Item
* javax.jcr.Node
* javax.jcr.NodeIterator
* javax.jcr.Property
* javax.jcr.RepositoryException
* javax.jcr.Session
* javax.servlet.ServletException
* org.apache.sling.api.SlingHttpServletRequest
* org.apache.sling.api.SlingHttpServletResponse
* org.apache.sling.api.request.RequestPathInfo
* org.apache.sling.api.resource.Resource
* 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.day.cq.personalization.impl;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import javax.jcr.Item;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.Property;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.servlet.ServletException;
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.Resource;
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;
public class MboxifyServlet
extends SlingAllMethodsServlet {
private final Logger log = LoggerFactory.getLogger(MboxifyServlet.class);
public static final String MBOX_COMPONENT = "cq/personalization/components/anymbox";
public static final String DEFAULT_NODE = "default";
public static final String REVERT_SELECTOR = "revert";
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
this.log.debug("mboxify servlet called");
boolean revert = MboxifyServlet.hasSelector(request.getRequestPathInfo(), "revert");
boolean success = true;
try {
if (revert) {
this.revertMboxify((Node)request.getResource().adaptTo(Node.class));
} else {
this.mboxify((Node)request.getResource().adaptTo(Node.class));
}
}
catch (RepositoryException e) {
this.log.error("Cannot " + (revert ? "revert mboxification" : "mboxify") + " '" + request.getResource().getPath() + "'", (Throwable)e);
success = false;
}
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
JSONWriter writer = new JSONWriter((Writer)out);
try {
writer.object();
writer.key("success").value(success);
writer.endObject();
}
catch (JSONException e) {
throw new ServletException((Throwable)e);
}
}
private void mboxify(Node component) throws RepositoryException {
String name = component.getName();
Node parent = component.getParent();
Session session = component.getSession();
String nodeAfter = MboxifyServlet.getNodeAfter(component);
String tmpNodePath = MboxifyServlet.moveToTempNode(component, parent);
Node newNode = parent.addNode(name);
newNode.setProperty("sling:resourceType", "cq/personalization/components/anymbox");
parent.orderBefore(name, nodeAfter);
session.move(tmpNodePath, newNode.getPath() + "/" + "default");
session.save();
}
private void revertMboxify(Node component) throws RepositoryException {
if (!component.hasNode("default") && !(component = component.getParent()).hasNode("default")) {
return;
}
String name = component.getName();
Node wrappedComponent = component.getNode("default");
Node parent = component.getParent();
Session session = component.getSession();
String nodeAfter = MboxifyServlet.getNodeAfter(component);
String tmpNodePath = MboxifyServlet.moveToTempNode(wrappedComponent, parent);
String path = component.getPath();
component.remove();
session.move(tmpNodePath, path);
parent.orderBefore(name, nodeAfter);
session.save();
}
public static String getNodeAfter(Node node) throws RepositoryException {
NodeIterator nodes = node.getParent().getNodes();
while (nodes.hasNext()) {
Node n = nodes.nextNode();
if (!n.isSame((Item)node)) continue;
if (nodes.hasNext()) {
return nodes.nextNode().getName();
}
return null;
}
throw new RepositoryException("Could not find node in getParent().getNodes(): " + node.getPath());
}
public static String moveToTempNode(Node node, Node parent) throws RepositoryException {
String tmpName = node.getName() + "_tmp_" + System.currentTimeMillis();
String tmpNodePath = parent.getPath() + "/" + tmpName;
node.getSession().move(node.getPath(), tmpNodePath);
return tmpNodePath;
}
public static boolean hasSelector(RequestPathInfo pathInfo, String selector) {
for (String s : pathInfo.getSelectors()) {
if (!s.equals(selector)) continue;
return true;
}
return false;
}
}