AuthorizablesDataSource.java 10.6 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.ui.components.Config
 *  com.adobe.granite.ui.components.PagingIterator
 *  com.adobe.granite.ui.components.ds.AbstractDataSource
 *  com.adobe.granite.ui.components.ds.DataSource
 *  com.adobe.granite.ui.components.ds.ValueMapResource
 *  com.google.common.base.Function
 *  com.google.common.collect.Iterators
 *  javax.annotation.Nullable
 *  javax.jcr.AccessDeniedException
 *  javax.jcr.RangeIterator
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  javax.jcr.ValueFactory
 *  javax.servlet.ServletException
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.sling.SlingServlet
 *  org.apache.jackrabbit.api.security.user.Authorizable
 *  org.apache.jackrabbit.api.security.user.Group
 *  org.apache.jackrabbit.api.security.user.Query
 *  org.apache.jackrabbit.api.security.user.QueryBuilder
 *  org.apache.jackrabbit.api.security.user.User
 *  org.apache.jackrabbit.api.security.user.UserManager
 *  org.apache.jackrabbit.commons.jackrabbit.user.AuthorizableQueryManager
 *  org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal
 *  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.resource.ResourceResolver
 *  org.apache.sling.api.resource.ValueMap
 *  org.apache.sling.api.servlets.SlingAllMethodsServlet
 *  org.apache.sling.api.wrappers.ValueMapDecorator
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.granite.security.user.internal.servlets;

import com.adobe.granite.security.user.UserProperties;
import com.adobe.granite.security.user.UserPropertiesManager;
import com.adobe.granite.security.user.UserPropertiesService;
import com.adobe.granite.security.user.util.AuthorizableUtil;
import com.adobe.granite.ui.components.Config;
import com.adobe.granite.ui.components.PagingIterator;
import com.adobe.granite.ui.components.ds.AbstractDataSource;
import com.adobe.granite.ui.components.ds.DataSource;
import com.adobe.granite.ui.components.ds.ValueMapResource;
import com.google.common.base.Function;
import com.google.common.collect.Iterators;
import java.io.IOException;
import java.security.Principal;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.annotation.Nullable;
import javax.jcr.AccessDeniedException;
import javax.jcr.RangeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.ValueFactory;
import javax.servlet.ServletException;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.jackrabbit.api.security.user.Authorizable;
import org.apache.jackrabbit.api.security.user.Group;
import org.apache.jackrabbit.api.security.user.Query;
import org.apache.jackrabbit.api.security.user.QueryBuilder;
import org.apache.jackrabbit.api.security.user.User;
import org.apache.jackrabbit.api.security.user.UserManager;
import org.apache.jackrabbit.commons.jackrabbit.user.AuthorizableQueryManager;
import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
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.resource.ResourceResolver;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.api.wrappers.ValueMapDecorator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SlingServlet(resourceTypes={"granite/security/components/datasource/authorizables"})
public class AuthorizablesDataSource
extends SlingAllMethodsServlet {
    private static final Logger LOG = LoggerFactory.getLogger(AuthorizablesDataSource.class);
    private static String DEFAULT_USER_PHOTO = "/libs/granite/security/clientlib/themes/default/resources/sample-user-thumbnail.36.png";
    private static String DEFAULT_GROUP_PHOTO = "/libs/granite/security/clientlib/themes/default/resources/sample-group-thumbnail.36.png";
    @Reference
    private UserPropertiesService upService;

    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        Resource resource = request.getResource();
        Config cfg = new Config(resource.getChild(Config.DATASOURCE));
        final ResourceResolver resolver = request.getResourceResolver();
        try {
            Session session = (Session)resolver.adaptTo(Session.class);
            UserManager userManager = (UserManager)resolver.adaptTo(UserManager.class);
            String[] selectors = request.getRequestPathInfo().getSelectors();
            final int offset = selectors.length >= 2 ? Integer.parseInt(selectors[0]) : 0;
            final int limit = selectors.length >= 2 ? Integer.parseInt(selectors[1]) : 40;
            String query = (String)cfg.get("query", String.class);
            final String itemResourceType = (String)cfg.get("itemResourceType", String.class);
            final long memberLimit = (Long)cfg.get("memberLimit", (Object)2000);
            AuthorizableQueryManager queryManager = new AuthorizableQueryManager(userManager, session.getValueFactory());
            final UserPropertiesManager userPropManager = this.upService.createUserPropertiesManager(session, resolver);
            final Iterator authorizables = query != null ? queryManager.execute(query) : Collections.emptySet().iterator();
            AbstractDataSource ds = new AbstractDataSource(){

                public Iterator<Resource> iterator() {
                    PagingIterator it = new PagingIterator(authorizables, Integer.valueOf(offset), Integer.valueOf(limit));
                    return Iterators.transform((Iterator)it, (Function)new Function<Authorizable, Resource>(){

                        @Nullable
                        public Resource apply(Authorizable authorizable) {
                            try {
                                ValueMapDecorator vm = new ValueMapDecorator(new HashMap());
                                vm.put((Object)"synthetic", (Object)true);
                                vm.put((Object)"home", (Object)authorizable.getPath());
                                vm.put((Object)"name", (Object)AuthorizableUtil.getName(authorizable));
                                vm.put((Object)"loginName", (Object)authorizable.getID());
                                String photoPath = authorizable.isGroup() ? DEFAULT_GROUP_PHOTO : DEFAULT_USER_PHOTO;
                                UserProperties userProperties = userPropManager.getUserProperties(authorizable.getID(), "profile");
                                if (userProperties != null) {
                                    String description;
                                    Resource photo;
                                    String jobTitle = userProperties.getProperty("jobTitle");
                                    if (jobTitle != null) {
                                        vm.put((Object)"title", (Object)jobTitle);
                                    }
                                    if ((photo = userProperties.getResource("photos/primary/image")) != null) {
                                        photoPath = photo.getPath();
                                    }
                                    if ((description = userProperties.getProperty("aboutMe")) != null) {
                                        vm.put((Object)"description", (Object)description);
                                    }
                                }
                                vm.put((Object)"photo", (Object)photoPath);
                                if (authorizable.isGroup()) {
                                    vm.put((Object)"members", (Object)AuthorizablesDataSource.this.getMembersCount(resolver, (Group)authorizable, memberLimit));
                                }
                                return new ValueMapResource(resolver, authorizable.getPath(), itemResourceType, (ValueMap)vm);
                            }
                            catch (RepositoryException e) {
                                throw new RuntimeException((Throwable)e);
                            }
                        }
                    });
                }

            };
            request.setAttribute(DataSource.class.getName(), (Object)ds);
        }
        catch (AccessDeniedException e) {
            LOG.error(e.getMessage(), (Throwable)e);
        }
        catch (RepositoryException e) {
            LOG.error(e.getMessage(), (Throwable)e);
        }
        catch (IOException e) {
            LOG.error(e.getMessage(), (Throwable)e);
        }
    }

    private String getMembersCount(ResourceResolver resolver, Group group, long limit) throws RepositoryException {
        Iterator<Authorizable> membersIt;
        long cnt;
        Iterator<Authorizable> iterator = membersIt = EveryonePrincipal.getInstance().equals((Object)group.getPrincipal()) ? this.getEveryoneCount(resolver, limit) : group.getMembers();
        if (membersIt instanceof RangeIterator) {
            cnt = ((RangeIterator)membersIt).getSize();
        } else {
            boolean noLimit;
            boolean bl = noLimit = limit == -1;
            for (cnt = 0; membersIt.hasNext() && (noLimit || cnt < limit); ++cnt) {
                membersIt.next();
            }
            if (membersIt.hasNext()) {
                return Long.toString(cnt) + "+";
            }
        }
        return Long.toString(cnt);
    }

    private Iterator<Authorizable> getEveryoneCount(ResourceResolver resolver, final long limit) {
        Object allMembers = Iterators.emptyIterator();
        try {
            UserManager userManager = (UserManager)resolver.adaptTo(UserManager.class);
            allMembers = userManager.findAuthorizables(new Query(){

                public <T> void build(QueryBuilder<T> builder) {
                    builder.setSelector(User.class);
                    builder.setLimit(0, limit);
                }
            });
        }
        catch (RepositoryException e) {
            LOG.error("Error while getting members for 'everyone' group!", (Throwable)e);
        }
        return allMembers;
    }

    protected void bindUpService(UserPropertiesService userPropertiesService) {
        this.upService = userPropertiesService;
    }

    protected void unbindUpService(UserPropertiesService userPropertiesService) {
        if (this.upService == userPropertiesService) {
            this.upService = null;
        }
    }

}