SegmentsDataSourceServlet.java 5.69 KB
/*
 * 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;
        }
    }

}