001/*
002 *  Copyright 2018 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.Collections;
019import java.util.HashMap;
020import java.util.List;
021import java.util.Map;
022
023import org.apache.avalon.framework.service.ServiceException;
024import org.apache.avalon.framework.service.ServiceManager;
025import org.apache.commons.collections4.MapUtils;
026import org.slf4j.Logger;
027
028import org.ametys.cms.repository.Content;
029import org.ametys.cms.repository.ModifiableDefaultContent;
030import org.ametys.core.user.UserManager;
031import org.ametys.plugins.contentio.synchronize.impl.LDAPSynchronizableContentsCollection;
032import org.ametys.plugins.userdirectory.DeleteUserComponent;
033
034/**
035 * SQL synchronizable collection for users
036 */
037public class LDAPSynchronizableUsersCollection extends LDAPSynchronizableContentsCollection
038{
039    private static final String __PARAM_LDAP_TABLE_LOGIN = "login";
040    private static final String __PARAM_POPULATION_ID = "populationId";
041    
042    /** The user manager */
043    protected UserManager _userManager;
044
045    /** The user SCC helper */
046    protected UserSCCHelper _userSCCHelper;
047
048    /** The delete user component */
049    protected DeleteUserComponent _deleteUserComponent;
050    
051    @Override
052    public void service(ServiceManager smanager) throws ServiceException
053    {
054        super.service(smanager);
055        _userSCCHelper = (UserSCCHelper) smanager.lookup(UserSCCHelper.ROLE);
056        _userManager = (UserManager) smanager.lookup(UserManager.ROLE);
057        _deleteUserComponent = (DeleteUserComponent) smanager.lookup(DeleteUserComponent.ROLE);
058    }
059    
060    public boolean handleRightAssignmentContext()
061    {
062        return false;
063    }
064    
065    @Override
066    public String getIdField()
067    {
068        return UserSCCHelper.USER_UNIQUE_ID_METADATA_NAME;
069    }
070    
071    @Override
072    public Map<String, List<String>> getMapping()
073    {
074        Map<String, List<String>> mapping = super.getMapping();
075        mapping.put(getIdField(), Collections.singletonList(getLoginLDAPColumnName()));
076        
077        return mapping;
078    }
079    
080    /**
081     * Get the login column name of user LDAP
082     * @return The login column name of user LDAP
083     */
084    public String getLoginLDAPColumnName()
085    {
086        return (String) getParameterValues().get(__PARAM_LDAP_TABLE_LOGIN);
087    }
088    
089    /**
090     * Get population Id
091     * @return The population Id
092     */
093    public String getPopulationId()
094    {
095        return (String) getParameterValues().get(__PARAM_POPULATION_ID);
096    }
097    
098    @Override
099    protected boolean _fillContent(Map<String, List<Object>> remoteValues, ModifiableDefaultContent content, boolean create, Logger logger)
100    {
101        boolean hasChanges = super._fillContent(remoteValues, content, create, logger);
102        
103        String newLogin = remoteValues.get(getIdField()).get(0).toString();
104        hasChanges = _userSCCHelper.synchronizeUserMetadata(newLogin, getPopulationId(), content, logger) || hasChanges;
105        
106        return hasChanges;
107    }
108    
109    @Override
110    protected Map<String, Map<String, Object>> internalSearch(Map<String, Object> parameters, int offset, int limit, List<Object> sort, Logger logger)
111    {
112        Map<String, Map<String, Object>> internalSearch = super.internalSearch(parameters, offset, limit, sort, logger);
113        
114        String population = getPopulationId();
115        Map<String, Map<String, Object>> filteredSearchResult = new HashMap<>();
116        for (String login : internalSearch.keySet())
117        {
118            if (_userManager.getUser(population, login) != null)
119            {
120                filteredSearchResult.put(login, internalSearch.get(login));
121            }
122            else
123            {
124                logger.warn("The user " + login + " don't belong to population " + population);
125            }
126        }
127        
128        return filteredSearchResult;
129    }
130    
131    @Override
132    protected int _deleteContents(List<Content> contentsToRemove, Logger logger)
133    {
134        return _deleteUserComponent.deleteContentsWithLog(contentsToRemove, MapUtils.EMPTY_SORTED_MAP, MapUtils.EMPTY_SORTED_MAP, logger);
135    }
136    
137}