001/*
002 *  Copyright 2015 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.core.group;
017
018import java.util.ArrayList;
019import java.util.Collections;
020import java.util.Comparator;
021import java.util.HashMap;
022import java.util.Iterator;
023import java.util.List;
024import java.util.Map;
025import java.util.Set;
026
027import org.apache.avalon.framework.parameters.Parameters;
028import org.apache.avalon.framework.service.ServiceException;
029import org.apache.avalon.framework.service.ServiceManager;
030import org.apache.cocoon.acting.ServiceableAction;
031import org.apache.cocoon.environment.ObjectModelHelper;
032import org.apache.cocoon.environment.Redirector;
033import org.apache.cocoon.environment.Request;
034import org.apache.cocoon.environment.SourceResolver;
035
036import org.ametys.core.cocoon.JSonReader;
037import org.ametys.core.group.Group;
038import org.ametys.core.group.GroupManager;
039import org.ametys.core.user.User;
040import org.ametys.core.user.UserIdentity;
041import org.ametys.core.user.UserManager;
042import org.ametys.plugins.core.user.UserHelper;
043
044/**
045 * Get the users of a group
046 *
047 */
048public class UsersGroupAction extends ServiceableAction
049{
050    private static final int _DEFAULT_COUNT_VALUE = Integer.MAX_VALUE;
051    private static final int _DEFAULT_OFFSET_VALUE = 0;
052    
053    private UserHelper _userHelper;
054    private UserManager _userManager;
055    private GroupManager _groupManager;
056    
057    @Override
058    public void service(ServiceManager smanager) throws ServiceException
059    {
060        super.service(smanager);
061        _userHelper = (UserHelper) smanager.lookup(UserHelper.ROLE);
062        _userManager = (UserManager) smanager.lookup(UserManager.ROLE);
063        _groupManager = (GroupManager) smanager.lookup(GroupManager.ROLE);
064    }
065    
066    public Map act(Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters parameters) throws Exception
067    {
068        List<Map<String, Object>> users = new ArrayList<>();
069        
070        @SuppressWarnings("unchecked")
071        Map<String, Object> jsParameters = (Map<String, Object>) objectModel.get(ObjectModelHelper.PARENT_CONTEXT);
072        String groupDirectoryId = (String) jsParameters.get("groupDirectoryId");
073
074        int offset = parameters.getParameterAsInteger("limit", _DEFAULT_COUNT_VALUE);
075        if (offset == -1)
076        {
077            offset = Integer.MAX_VALUE;
078        }
079
080        int begin = parameters.getParameterAsInteger("start", _DEFAULT_OFFSET_VALUE);
081        
082        Group group = _groupManager.getGroup(groupDirectoryId, source);
083        if (group != null)
084        {
085            List<User> sortedUsers = _getSortedUsers(group);
086            Iterator<User> it = sortedUsers.iterator();
087            
088            int index = 0;
089            while (it.hasNext() && index < begin + offset)
090            {
091                User user = it.next();
092                
093                if (index >= begin)
094                {
095                    users.add(_userHelper.user2json(user, true));
096                    
097                }
098                index++;
099            }
100        }
101        
102        Map<String, Object> result = new HashMap<>();
103        result.put("users", users);
104        result.put("group", source);
105
106        Request request = ObjectModelHelper.getRequest(objectModel);
107        request.setAttribute(JSonReader.OBJECT_TO_READ, result);
108
109        return EMPTY_MAP;
110    }
111    
112    private List<User> _getSortedUsers (Group group)
113    {
114        List<User> users = new ArrayList<>();
115        
116        Set<UserIdentity> groupUsers = group.getUsers();
117        for (UserIdentity identity : groupUsers)
118        {
119            String login = identity.getLogin();
120            String populationId = identity.getPopulationId();
121            User user = _userManager.getUser(populationId, login);
122            if (user != null)
123            {
124                users.add(user);
125            }
126        }
127        
128        Collections.sort(users, new Comparator<User>()
129        {
130            public int compare(User u1, User u2) 
131            {
132                int compare = u1.getLastName().toLowerCase().compareTo(u2.getLastName().toLowerCase());
133                return compare != 0 ? compare : u1.getFirstName().toLowerCase().compareTo(u2.getFirstName().toLowerCase()); 
134            }
135        });
136        
137        return users;
138    }
139
140}