001/*
002 *  Copyright 2025 Anyware Services
003 *
004 *  Licensed under the Apache License, Version 2.0 (the "License");
005 *  you may not use this file except in compliance with the License.
006 *  You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 */
016package org.ametys.plugins.userdirectory.synchronize;
017
018import java.util.ArrayList;
019import java.util.HashMap;
020import java.util.List;
021import java.util.Map;
022
023import org.apache.avalon.framework.component.Component;
024import org.apache.avalon.framework.service.ServiceException;
025import org.apache.avalon.framework.service.ServiceManager;
026import org.apache.avalon.framework.service.Serviceable;
027import org.apache.commons.lang3.StringUtils;
028
029import org.ametys.core.ui.Callable;
030import org.ametys.core.user.directory.UserDirectory;
031import org.ametys.core.user.directory.UserDirectoryFactory;
032import org.ametys.core.user.directory.UserDirectoryModel;
033import org.ametys.core.user.population.UserPopulation;
034import org.ametys.core.user.population.UserPopulationDAO;
035import org.ametys.plugins.core.impl.user.directory.JdbcUserDirectory;
036import org.ametys.plugins.core.impl.user.directory.LdapUserDirectory;
037import org.ametys.runtime.plugin.component.AbstractLogEnabled;
038
039/**
040 * Helper for User Population Synchronizable Contents Collections.
041 */
042public class UserPopulationSynchronizableContentsCollectionHelper extends AbstractLogEnabled implements Component, Serviceable
043{
044    private UserPopulationDAO _userPopulationDAO;
045    private UserDirectoryFactory _userDirectoryFactory;
046    
047    public void service(ServiceManager manager) throws ServiceException
048    {
049        _userPopulationDAO = (UserPopulationDAO) manager.lookup(UserPopulationDAO.ROLE);
050        _userDirectoryFactory = (UserDirectoryFactory) manager.lookup(UserDirectoryFactory.ROLE);
051    }
052    
053    /**
054     * Gets the supported user directories (i.e. user directories based on a datasource) of the population in a json map
055     * @param populationId The id of the user population
056     * @return the supported user directories (i.e. user directories based on a datasource) of the population in a json map
057     */
058    @Callable (rights = "Runtime_Rights_Admin_Access", context = "/admin") // used by 'edition.populationMapping' widget
059    public List<Map<String, Object>> getSupportedUserDirectories(String populationId)
060    {
061        List<Map<String, Object>> result = new ArrayList<>();
062        
063        UserPopulation userPopulation = _userPopulationDAO.getUserPopulation(populationId);
064        List<UserDirectory> userDirectories = userPopulation.getUserDirectories();
065        for (String udId : _getDatasourceBasedUserDirectories(userDirectories))
066        {
067            UserDirectory userDirectory = userPopulation.getUserDirectory(udId);
068            String udModelId = userDirectory.getUserDirectoryModelId();
069            UserDirectoryModel udModel = _userDirectoryFactory.getExtension(udModelId);
070            Map<String, Object> udMap = new HashMap<>();
071            
072            udMap.put("id", udId);
073            udMap.put("modelLabel", udModel.getLabel());
074            
075            String label = userDirectory.getLabel();
076            if (StringUtils.isNotBlank(label))
077            {
078                udMap.put("label", label);
079            }
080            
081            if (userDirectory instanceof JdbcUserDirectory)
082            {
083                udMap.put("type", "SQL");
084            }
085            else if (userDirectories instanceof LdapUserDirectory)
086            {
087                udMap.put("type", "LDAP");
088            }
089            
090            result.add(udMap);
091        }
092        
093        return result;
094    }
095    
096    private List<String> _getDatasourceBasedUserDirectories(List<UserDirectory> userDirectories)
097    {
098        List<String> ids = new ArrayList<>();
099        for (UserDirectory userDirectory : userDirectories)
100        {
101            if (userDirectory instanceof JdbcUserDirectory || userDirectory instanceof LdapUserDirectory)
102            {
103                ids.add(userDirectory.getId());
104            }
105        }
106        
107        return ids;
108    }
109}