SegmentsDataSourceServlet.java
5.69 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
139
140
141
142
143
144
/*
* Decompiled with CFR 0_118.
*
* Could not load the following classes:
* com.adobe.granite.ui.components.ds.DataSource
* com.adobe.granite.ui.components.ds.SimpleDataSource
* com.adobe.granite.ui.components.ds.ValueMapResource
* javax.servlet.ServletException
* org.apache.felix.scr.annotations.sling.SlingServlet
* org.apache.sling.api.SlingHttpServletRequest
* org.apache.sling.api.SlingHttpServletResponse
* org.apache.sling.api.resource.AbstractResourceVisitor
* org.apache.sling.api.resource.Resource
* org.apache.sling.api.resource.ResourceMetadata
* org.apache.sling.api.resource.ResourceResolver
* org.apache.sling.api.resource.ValueMap
* org.apache.sling.api.servlets.SlingSafeMethodsServlet
* org.apache.sling.api.wrappers.ValueMapDecorator
* org.apache.sling.commons.json.JSONException
* org.apache.sling.commons.json.JSONObject
* org.slf4j.Logger
* org.slf4j.LoggerFactory
*/
package com.day.cq.personalization;
import com.adobe.granite.ui.components.ds.DataSource;
import com.adobe.granite.ui.components.ds.SimpleDataSource;
import com.adobe.granite.ui.components.ds.ValueMapResource;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.*;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
import org.apache.sling.api.wrappers.ValueMapDecorator;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.ServletException;
import java.io.IOException;
import java.util.*;
@SlingServlet(methods={"GET"}, resourceTypes={"cq/personalization/touch-ui/datasource/segmentsdatasource"})
public class SegmentsDataSourceServlet
extends SlingSafeMethodsServlet {
private static final String SEGMENT_RESOURCE_TYPE = "cq/personalization/components/segmentpage";
private static final String SEGMENTATION_ROOT = "/etc/segmentation";
private final Logger log;
public SegmentsDataSourceServlet() {
this.log = LoggerFactory.getLogger(this.getClass());
}
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
ArrayList<ValueMapResource> resourceList = new ArrayList<ValueMapResource>();
ResourceResolver resolver = request.getResourceResolver();
Resource root = resolver.getResource("/etc/segmentation");
SegmentsRetriever visitor = new SegmentsRetriever();
visitor.accept(root);
List<JSONObject> segments = visitor.getSegments();
Collections.sort(segments, new SegmentsComparator());
try {
for (JSONObject segment : segments) {
HashMap<String, Object> segmentEntry = new HashMap<String, Object>();
segmentEntry.put("value", segment.get("path"));
segmentEntry.put("text", segment.get("title"));
ValueMapResource vmRes = new ValueMapResource(resolver, new ResourceMetadata(), "", (ValueMap)new ValueMapDecorator(segmentEntry));
resourceList.add(vmRes);
}
}
catch (JSONException e) {
this.log.error(e.getMessage(), (Throwable)e);
}
request.setAttribute(DataSource.class.getName(), (Object)new SimpleDataSource(resourceList.iterator()));
}
class SegmentsComparator
implements Comparator<JSONObject> {
SegmentsComparator() {
}
@Override
public int compare(JSONObject o1, JSONObject o2) {
if (!o1.has("title") || !o2.has("title")) {
return -1;
}
try {
String o1Title = (String)o1.get("title");
String o2Title = (String)o2.get("title");
return o1Title.compareTo(o2Title);
}
catch (Exception e) {
SegmentsDataSourceServlet.this.log.error(e.getMessage(), (Throwable)e);
return -1;
}
}
}
class SegmentsRetriever
extends AbstractResourceVisitor {
private List<JSONObject> segments;
SegmentsRetriever() {
this.segments = new ArrayList<JSONObject>();
}
protected void visit(Resource resource) {
if ("cq/personalization/components/segmentpage".equals(resource.getResourceType())) {
Resource parentPage = resource.getParent();
ValueMap vm = (ValueMap)resource.adaptTo(ValueMap.class);
JSONObject object = new JSONObject();
String title = (String)vm.get("jcr:title", (Object)"") + (this.hasTargetTrait(resource) ? " (from Adobe Target)" : "");
try {
object.put("title", (Object)title);
object.put("name", (Object)parentPage.getName());
object.put("path", (Object)parentPage.getPath());
}
catch (JSONException e) {
e.printStackTrace();
}
this.segments.add(object);
}
}
private boolean hasTargetTrait(Resource res) {
if ("cq/personalization/components/traits/tandt".equals(res.getResourceType())) {
return true;
}
Iterator resourceIterator = res.listChildren();
if (resourceIterator.hasNext()) {
Resource currentResource = (Resource)resourceIterator.next();
return this.hasTargetTrait(currentResource);
}
return false;
}
public List<JSONObject> getSegments() {
return this.segments;
}
}
}