/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.google.mail.groups.hook.listeners;
import com.liferay.google.apps.connector.util.GoogleDirectoryUtil;
import com.liferay.google.mail.groups.util.GoogleMailGroupsUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.messaging.DestinationNames;
import com.liferay.portal.kernel.messaging.MessageBusUtil;
import com.liferay.portal.kernel.model.BaseModelListener;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.model.Organization;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.model.UserGroup;
import com.liferay.portal.kernel.process.ProcessCallable;
import com.liferay.portal.kernel.process.ProcessException;
import com.liferay.portal.kernel.service.GroupLocalServiceUtil;
import com.liferay.portal.kernel.service.UserLocalServiceUtil;
import com.liferay.portal.kernel.transaction.TransactionCommitCallbackUtil;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
/**
* @author Matthew Kong
*/
public class GroupModelListener extends BaseModelListener<Group> {
@Override
public void onAfterAddAssociation(
Object classPK, String associationClassName,
Object associationClassPK) {
try {
final Group group = GroupLocalServiceUtil.getGroup((Long)classPK);
final List<User> users = getUsers(
classPK, associationClassName, associationClassPK);
Callable<Void> callable = new Callable<Void>() {
@Override
public Void call() throws Exception {
MessageBusUtil.sendMessage(
DestinationNames.ASYNC_SERVICE,
new OnAssociationProcessCallable(
group, users, "addGroupMembers"));
return null;
}
};
TransactionCommitCallbackUtil.registerCallback(callable);
}
catch (Exception e) {
_log.error(e, e);
}
}
@Override
public void onAfterCreate(Group group) {
if (!GoogleMailGroupsUtil.isSync(group)) {
return;
}
try {
GoogleDirectoryUtil.addGroup(
group.getDescriptiveName(),
GoogleMailGroupsUtil.getGroupEmailAddress(group));
}
catch (Exception e) {
_log.error(e, e);
}
}
@Override
public void onAfterRemove(Group group) {
if (!GoogleMailGroupsUtil.isSync(group)) {
return;
}
try {
GoogleDirectoryUtil.deleteGroup(
GoogleMailGroupsUtil.getGroupEmailAddress(group));
}
catch (Exception e) {
_log.error(e, e);
}
}
@Override
public void onAfterRemoveAssociation(
Object classPK, String associationClassName,
Object associationClassPK) {
try {
final Group group = GroupLocalServiceUtil.getGroup((Long)classPK);
final List<User> users = getUsers(
classPK, associationClassName, associationClassPK);
Callable<Void> callable = new Callable<Void>() {
@Override
public Void call() throws Exception {
MessageBusUtil.sendMessage(
DestinationNames.ASYNC_SERVICE,
new OnAssociationProcessCallable(
group, users, "deleteGroupMembers"));
return null;
}
};
TransactionCommitCallbackUtil.registerCallback(callable);
}
catch (Exception e) {
_log.error(e, e);
}
}
protected List<User> getUsers(
Object classPK, String associationClassName,
Object associationClassPK)
throws PortalException {
if (!associationClassName.equals(Organization.class.getName()) &&
!associationClassName.equals(UserGroup.class.getName())) {
return new ArrayList<>();
}
Group group = GroupLocalServiceUtil.getGroup((Long)classPK);
if (!GoogleMailGroupsUtil.isSync(group)) {
return new ArrayList<>();
}
if (associationClassName.equals(Organization.class.getName())) {
return UserLocalServiceUtil.getOrganizationUsers(
(Long)associationClassPK);
}
return UserLocalServiceUtil.getUserGroupUsers((Long)associationClassPK);
}
private static Log _log = LogFactoryUtil.getLog(GroupModelListener.class);
private static class OnAssociationProcessCallable
implements ProcessCallable<Serializable> {
public OnAssociationProcessCallable(
Group group, List<User> users, String action) {
_group = group;
_users = users;
_action = action;
}
@Override
public Serializable call() throws ProcessException {
try {
if (_action.equals("addGroupMembers")) {
for (User user : _users) {
GoogleDirectoryUtil.addGroupMember(
GoogleMailGroupsUtil.getGroupEmailAddress(_group),
GoogleMailGroupsUtil.getUserEmailAddress(user));
}
}
else {
for (User user : _users) {
if (GroupLocalServiceUtil.hasUserGroup(
user.getUserId(), _group.getGroupId(), true)) {
continue;
}
GoogleDirectoryUtil.deleteGroupMember(
GoogleMailGroupsUtil.getGroupEmailAddress(_group),
GoogleMailGroupsUtil.getUserEmailAddress(user));
}
}
GoogleMailGroupsUtil.checkLargeGroup(_group);
}
catch (Exception e) {
throw new ProcessException(e);
}
return null;
}
private static final long serialVersionUID = 1L;
private String _action;
private Group _group;
private List<User> _users;
}
}