GroupsServlet.java 6.93 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.jcr.vault.packaging.JcrPackage
 *  com.day.jcr.vault.packaging.JcrPackageDefinition
 *  com.day.jcr.vault.packaging.JcrPackageManager
 *  com.day.jcr.vault.packaging.PackageId
 *  com.day.jcr.vault.packaging.PackagingService
 *  javax.jcr.Node
 *  javax.jcr.NodeIterator
 *  javax.jcr.Property
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  javax.servlet.ServletException
 *  javax.servlet.http.HttpServletRequest
 *  javax.servlet.http.HttpServletResponse
 *  org.apache.sling.commons.json.io.JSONWriter
 *  org.osgi.framework.BundleContext
 *  org.slf4j.Logger
 */
package com.day.crx.packmgr.impl.servlets;

import com.day.crx.packmgr.impl.AbstractServlet;
import com.day.jcr.vault.packaging.JcrPackage;
import com.day.jcr.vault.packaging.JcrPackageDefinition;
import com.day.jcr.vault.packaging.JcrPackageManager;
import com.day.jcr.vault.packaging.PackageId;
import com.day.jcr.vault.packaging.PackagingService;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
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 javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.sling.commons.json.io.JSONWriter;
import org.osgi.framework.BundleContext;
import org.slf4j.Logger;

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

    private Group getOrAddGroup(Map<String, Group> groups, String name) throws RepositoryException {
        Group g = groups.get(name);
        if (g == null) {
            g = new Group();
            g.name = name;
            groups.put(g.name, g);
        }
        return g;
    }

    private Map<String, Group> getGroups(JcrPackageManager packMgr, boolean compressVersion) throws RepositoryException {
        TreeMap<String, Group> groups = new TreeMap<String, Group>();
        HashMap<String, Boolean> names = new HashMap<String, Boolean>();
        for (JcrPackage pack : packMgr.listPackages()) {
            boolean include;
            String name = pack.getDefinition().getId().getName();
            String groupName = pack.getDefinition().getId().getGroup();
            Group g = this.getOrAddGroup(groups, groupName);
            boolean bl = include = !compressVersion || compressVersion && !names.containsKey(groupName + ":" + name);
            if (include) {
                ++g.count;
                ++g.deepCount;
                names.put(groupName + ":" + name, true);
            }
            if (g.isRoot()) continue;
            do {
                int pos;
                groupName = (pos = groupName.lastIndexOf("/")) >= 0 ? groupName.substring(0, pos) : "";
                g = this.getOrAddGroup(groups, groupName);
                if (!include) continue;
                ++g.deepCount;
            } while (!g.isRoot());
        }
        return groups;
    }

    private void findEmptyGroups(Node node, Map<String, Group> groups) throws RepositoryException {
        NodeIterator nodeIter = node.getNodes();
        while (nodeIter.hasNext()) {
            Node n = nodeIter.nextNode();
            if (n.isNodeType("nt:file") || n.getName().startsWith(".")) continue;
            String name = n.getPath().substring("/etc/packages/".length());
            this.getOrAddGroup(groups, name);
            this.findEmptyGroups(n, groups);
        }
    }

    @Override
    protected void doService(HttpServletRequest request, HttpServletResponse res, Session session) throws ServletException, IOException {
        res.setContentType("application/json");
        res.setCharacterEncoding("UTF-8");
        try {
            PrintWriter pw = res.getWriter();
            JSONWriter w = new JSONWriter((Writer)pw);
            w.object();
            w.key("groups").array();
            boolean compressVersion = "true".equals(request.getParameter("compressVersion"));
            JcrPackageManager packMgr = PackagingService.getPackageManager((Session)session);
            Map<String, Group> groups = this.getGroups(packMgr, compressVersion);
            Node packRoot = packMgr.getPackageRoot(true);
            if (packRoot != null) {
                this.findEmptyGroups(packRoot, groups);
            }
            boolean includeAll = "true".equals(request.getParameter("includeAll"));
            boolean includeRoot = "true".equals(request.getParameter("includeRoot"));
            boolean includeMyPackages = "true".equals(request.getParameter("includeMyPackages"));
            boolean onlyTopLevel = "true".equals(request.getParameter("onlyTopLevel"));
            if (includeAll) {
                int total = 0;
                for (Group g : groups.values()) {
                    total += g.count;
                }
                w.object();
                w.key("name").value((Object)null);
                w.key("title").value((Object)"All");
                w.key("count").value((long)total);
                w.key("deepCount").value((long)total);
                w.endObject();
            }
            if (includeMyPackages && !groups.containsKey("my_packages")) {
                w.object();
                w.key("name").value((Object)"my_packages");
                w.key("title").value((Object)"my_packages");
                w.key("count").value(0);
                w.key("deepCount").value(0);
                w.endObject();
            }
            for (Group g : groups.values()) {
                String title;
                if (onlyTopLevel && !g.isTopLevel() || !includeRoot && g.isRoot()) continue;
                w.object();
                w.key("name").value((Object)g.name);
                String string = title = g.isRoot() ? "(none)" : g.name;
                if (!g.isRoot() && packRoot != null && packRoot.hasProperty(g.name + "/jcr:title")) {
                    title = packRoot.getProperty(g.name + "/jcr:title").getString();
                }
                w.key("title").value((Object)title);
                w.key("count").value((long)g.count);
                w.key("deepCount").value(g.isRoot() ? (long)g.count : (long)g.deepCount);
                w.endObject();
            }
            w.endArray();
            w.endObject();
        }
        catch (Exception e) {
            this.logger.error("Error while retrieving infos: {}", (Object)e.toString());
            res.sendError(500);
        }
    }

    private static class Group {
        public String name;
        public int count = 0;
        public int deepCount = 0;

        private Group() {
        }

        boolean isRoot() {
            return this.name.length() == 0;
        }

        boolean isTopLevel() {
            return this.name.indexOf("/") < 0;
        }
    }

}