001    /**
002     * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.sites.action;
016    
017    import com.liferay.portal.NoSuchGroupException;
018    import com.liferay.portal.kernel.servlet.SessionErrors;
019    import com.liferay.portal.kernel.util.ArrayUtil;
020    import com.liferay.portal.kernel.util.Constants;
021    import com.liferay.portal.kernel.util.ParamUtil;
022    import com.liferay.portal.kernel.util.StringUtil;
023    import com.liferay.portal.kernel.util.Validator;
024    import com.liferay.portal.liveusers.LiveUsers;
025    import com.liferay.portal.model.User;
026    import com.liferay.portal.security.auth.PrincipalException;
027    import com.liferay.portal.service.OrganizationServiceUtil;
028    import com.liferay.portal.service.ServiceContext;
029    import com.liferay.portal.service.ServiceContextFactory;
030    import com.liferay.portal.service.UserGroupGroupRoleServiceUtil;
031    import com.liferay.portal.service.UserGroupRoleServiceUtil;
032    import com.liferay.portal.service.UserGroupServiceUtil;
033    import com.liferay.portal.service.UserLocalServiceUtil;
034    import com.liferay.portal.service.UserServiceUtil;
035    import com.liferay.portal.struts.PortletAction;
036    import com.liferay.portal.theme.ThemeDisplay;
037    import com.liferay.portal.util.PortalUtil;
038    import com.liferay.portal.util.WebKeys;
039    
040    import java.util.HashSet;
041    import java.util.Set;
042    
043    import javax.portlet.ActionRequest;
044    import javax.portlet.ActionResponse;
045    import javax.portlet.PortletConfig;
046    import javax.portlet.RenderRequest;
047    import javax.portlet.RenderResponse;
048    
049    import org.apache.struts.action.ActionForm;
050    import org.apache.struts.action.ActionForward;
051    import org.apache.struts.action.ActionMapping;
052    
053    /**
054     * @author Brian Wing Shun Chan
055     */
056    public class EditGroupAssignmentsAction extends PortletAction {
057    
058            @Override
059            public void processAction(
060                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
061                            ActionRequest actionRequest, ActionResponse actionResponse)
062                    throws Exception {
063    
064                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
065    
066                    try {
067                            if (cmd.equals("group_organizations")) {
068                                    updateGroupOrganizations(actionRequest);
069                            }
070                            else if (cmd.equals("group_user_groups")) {
071                                    updateGroupUserGroups(actionRequest);
072                            }
073                            else if (cmd.equals("group_users")) {
074                                    updateGroupUsers(actionRequest);
075                            }
076                            else if (cmd.equals("user_group_group_role")) {
077                                    updateUserGroupGroupRole(actionRequest);
078                            }
079                            else if (cmd.equals("user_group_role")) {
080                                    updateUserGroupRole(actionRequest);
081                            }
082    
083                            if (Validator.isNotNull(cmd)) {
084                                    String redirect = ParamUtil.getString(
085                                            actionRequest, "assignmentsRedirect");
086    
087                                    if (Validator.isNull(redirect)) {
088                                            redirect = ParamUtil.getString(actionRequest, "redirect");
089                                    }
090    
091                                    sendRedirect(actionRequest, actionResponse, redirect);
092                            }
093                    }
094                    catch (Exception e) {
095                            if (e instanceof NoSuchGroupException ||
096                                    e instanceof PrincipalException) {
097    
098                                    SessionErrors.add(actionRequest, e.getClass());
099    
100                                    setForward(actionRequest, "portlet.sites_admin.error");
101                            }
102                            else {
103                                    throw e;
104                            }
105                    }
106            }
107    
108            @Override
109            public ActionForward render(
110                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
111                            RenderRequest renderRequest, RenderResponse renderResponse)
112                    throws Exception {
113    
114                    try {
115                            ActionUtil.getGroup(renderRequest);
116                    }
117                    catch (Exception e) {
118                            if (e instanceof NoSuchGroupException ||
119                                    e instanceof PrincipalException) {
120    
121                                    SessionErrors.add(renderRequest, e.getClass());
122    
123                                    return mapping.findForward("portlet.sites_admin.error");
124                            }
125                            else {
126                                    throw e;
127                            }
128                    }
129    
130                    return mapping.findForward(
131                            getForward(
132                                    renderRequest, "portlet.sites_admin.edit_site_assignments"));
133            }
134    
135            protected long[] filterUserIds(long groupId, long[] userIds)
136                    throws Exception {
137    
138                    Set<Long> filteredUserIds = new HashSet<Long>(userIds.length);
139    
140                    for (long userId : userIds) {
141                            if (!UserLocalServiceUtil.hasGroupUser(groupId, userId)) {
142                                    filteredUserIds.add(userId);
143                            }
144                    }
145    
146                    return ArrayUtil.toArray(
147                            filteredUserIds.toArray(new Long[filteredUserIds.size()]));
148            }
149    
150            protected void updateGroupOrganizations(ActionRequest actionRequest)
151                    throws Exception {
152    
153                    long groupId = ParamUtil.getLong(actionRequest, "groupId");
154    
155                    long[] addOrganizationIds = StringUtil.split(
156                            ParamUtil.getString(actionRequest, "addOrganizationIds"), 0L);
157                    long[] removeOrganizationIds = StringUtil.split(
158                            ParamUtil.getString(actionRequest, "removeOrganizationIds"), 0L);
159    
160                    OrganizationServiceUtil.addGroupOrganizations(
161                            groupId, addOrganizationIds);
162                    OrganizationServiceUtil.unsetGroupOrganizations(
163                            groupId, removeOrganizationIds);
164            }
165    
166            protected void updateGroupUserGroups(ActionRequest actionRequest)
167                    throws Exception {
168    
169                    long groupId = ParamUtil.getLong(actionRequest, "groupId");
170    
171                    long[] addUserGroupIds = StringUtil.split(
172                            ParamUtil.getString(actionRequest, "addUserGroupIds"), 0L);
173                    long[] removeUserGroupIds = StringUtil.split(
174                            ParamUtil.getString(actionRequest, "removeUserGroupIds"), 0L);
175    
176                    UserGroupServiceUtil.addGroupUserGroups(groupId, addUserGroupIds);
177                    UserGroupServiceUtil.unsetGroupUserGroups(groupId, removeUserGroupIds);
178            }
179    
180            protected void updateGroupUsers(ActionRequest actionRequest)
181                    throws Exception {
182    
183                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
184                            WebKeys.THEME_DISPLAY);
185    
186                    long groupId = ParamUtil.getLong(actionRequest, "groupId");
187    
188                    long[] addUserIds = StringUtil.split(
189                            ParamUtil.getString(actionRequest, "addUserIds"), 0L);
190    
191                    addUserIds = filterUserIds(groupId, addUserIds);
192    
193                    long[] removeUserIds = StringUtil.split(
194                            ParamUtil.getString(actionRequest, "removeUserIds"), 0L);
195    
196                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
197                            actionRequest);
198    
199                    UserServiceUtil.addGroupUsers(groupId, addUserIds, serviceContext);
200                    UserServiceUtil.unsetGroupUsers(groupId, removeUserIds, serviceContext);
201    
202                    LiveUsers.joinGroup(themeDisplay.getCompanyId(), groupId, addUserIds);
203                    LiveUsers.leaveGroup(
204                            themeDisplay.getCompanyId(), groupId, removeUserIds);
205            }
206    
207            protected void updateUserGroupGroupRole(ActionRequest actionRequest)
208                    throws Exception {
209    
210                    long groupId = ParamUtil.getLong(actionRequest, "groupId");
211    
212                    long userGroupId = ParamUtil.getLong(actionRequest, "userGroupId");
213    
214                    long[] addRoleIds = StringUtil.split(
215                            ParamUtil.getString(actionRequest, "addRoleIds"), 0L);
216                    long[] removeRoleIds = StringUtil.split(
217                            ParamUtil.getString(actionRequest, "removeRoleIds"), 0L);
218    
219                    UserGroupGroupRoleServiceUtil.addUserGroupGroupRoles(
220                            userGroupId, groupId, addRoleIds);
221                    UserGroupGroupRoleServiceUtil.deleteUserGroupGroupRoles(
222                            userGroupId, groupId, removeRoleIds);
223            }
224    
225            protected void updateUserGroupRole(ActionRequest actionRequest)
226                    throws Exception {
227    
228                    User user = PortalUtil.getSelectedUser(actionRequest, false);
229    
230                    if (user == null) {
231                            return;
232                    }
233    
234                    long groupId = ParamUtil.getLong(actionRequest, "groupId");
235    
236                    long[] addRoleIds = StringUtil.split(
237                            ParamUtil.getString(actionRequest, "addRoleIds"), 0L);
238                    long[] removeRoleIds = StringUtil.split(
239                            ParamUtil.getString(actionRequest, "removeRoleIds"), 0L);
240    
241                    UserGroupRoleServiceUtil.addUserGroupRoles(
242                            user.getUserId(), groupId, addRoleIds);
243                    UserGroupRoleServiceUtil.deleteUserGroupRoles(
244                            user.getUserId(), groupId, removeRoleIds);
245            }
246    
247    }