TeamManagerFactoryImpl.java 6.21 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.cq.projects.api.ProjectMemberRole
 *  com.adobe.granite.security.user.UserManagementService
 *  com.day.cq.wcm.api.Template
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  org.apache.commons.lang3.ArrayUtils
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.ReferenceCardinality
 *  org.apache.felix.scr.annotations.ReferencePolicy
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.jcr.api.SlingRepository
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.cq.projects.impl.team;

import com.adobe.cq.projects.api.ProjectMemberRole;
import com.adobe.cq.projects.impl.team.GenericRole;
import com.adobe.cq.projects.impl.team.ReadOnlyRole;
import com.adobe.cq.projects.impl.team.RoleClass;
import com.adobe.cq.projects.impl.team.RoleProvider;
import com.adobe.cq.projects.impl.team.TeamManager;
import com.adobe.cq.projects.impl.team.TeamManagerFactory;
import com.adobe.cq.projects.impl.team.TeamManagerImpl;
import com.adobe.granite.security.user.UserManagementService;
import com.day.cq.wcm.api.Template;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.ReferencePolicy;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.jcr.api.SlingRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(immediate=1)
@Service(value={TeamManagerFactory.class})
@Reference(name="roleProvider", referenceInterface=RoleProvider.class, cardinality=ReferenceCardinality.MANDATORY_MULTIPLE, policy=ReferencePolicy.DYNAMIC)
public class TeamManagerFactoryImpl
implements TeamManagerFactory {
    private static final Logger log = LoggerFactory.getLogger(TeamManagerFactoryImpl.class);
    @Reference
    private SlingRepository repository = null;
    @Reference
    private UserManagementService userManagementService;
    private final List<RoleProvider> providers = new ArrayList<RoleProvider>();

    @Override
    public TeamManager createTeamManager(Session session, Template template) {
        try {
            return new TeamManagerImpl(this.getRoles(template), session, this.userManagementService);
        }
        catch (RepositoryException e) {
            log.error("Error while acquiring team manager", (Throwable)e);
            return null;
        }
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    protected Map<String, ProjectMemberRole> getRoles(Template template) {
        List<RoleProvider> list = this.providers;
        synchronized (list) {
            HashMap<String, ProjectMemberRole> newRoles = new HashMap<String, ProjectMemberRole>();
            for (RoleProvider provider : this.providers) {
                for (ProjectMemberRole roleFromProvider : provider.getRoles(template)) {
                    if (newRoles.containsKey(roleFromProvider.getId())) {
                        ProjectMemberRole thisRole = newRoles.get(roleFromProvider.getId());
                        if (!(thisRole instanceof GenericRole) || !(roleFromProvider instanceof GenericRole)) continue;
                        GenericRole existingRole = (GenericRole)thisRole;
                        GenericRole additionalRole = (GenericRole)roleFromProvider;
                        Object[] existingDefaultMembers = existingRole.getDefaultMembers();
                        Object[] additionalDefaultMembers = additionalRole.getDefaultMembers();
                        String[] combinedDefaults = (String[])ArrayUtils.addAll((Object[])existingDefaultMembers, (Object[])additionalDefaultMembers);
                        if (existingRole instanceof ReadOnlyRole) {
                            GenericRole updatedRole = new GenericRole(existingRole.getId(), additionalRole.getDisplayName(), existingRole.getRoleClass(), combinedDefaults);
                            newRoles.put(updatedRole.getId(), updatedRole);
                            continue;
                        }
                        existingRole.setDefaultMembers(combinedDefaults);
                        continue;
                    }
                    newRoles.put(roleFromProvider.getId(), roleFromProvider);
                }
            }
            return newRoles;
        }
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    protected void bindRoleProvider(RoleProvider provider) {
        List<RoleProvider> list = this.providers;
        synchronized (list) {
            this.providers.add(provider);
        }
        log.debug("bound new role provider: {}", (Object)provider.getClass().getName());
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    protected void unbindRoleProvider(RoleProvider provider) {
        List<RoleProvider> list = this.providers;
        synchronized (list) {
            if (this.providers.remove(provider)) {
                log.debug("unbound role provider: {}", (Object)provider.getClass().getName());
            } else {
                log.warn("unbind role provider, provider {} not found in list", (Object)provider.getClass().getName());
            }
        }
    }

    protected void bindRepository(SlingRepository slingRepository) {
        this.repository = slingRepository;
    }

    protected void unbindRepository(SlingRepository slingRepository) {
        if (this.repository == slingRepository) {
            this.repository = null;
        }
    }

    protected void bindUserManagementService(UserManagementService userManagementService) {
        this.userManagementService = userManagementService;
    }

    protected void unbindUserManagementService(UserManagementService userManagementService) {
        if (this.userManagementService == userManagementService) {
            this.userManagementService = null;
        }
    }
}