/** * 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.OrganizationLocalServiceUtil; 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.Arrays; import java.util.List; import java.util.concurrent.Callable; /** * @author Matthew Kong */ public class UserModelListener extends BaseModelListener<User> { @Override public void onAfterAddAssociation( Object classPK, String associationClassName, Object associationClassPK) { try { final List<Group> groups = getGroups( associationClassName, associationClassPK); final User user = UserLocalServiceUtil.getUser((Long)classPK); Callable<Void> callable = new Callable<Void>() { @Override public Void call() throws Exception { MessageBusUtil.sendMessage( DestinationNames.ASYNC_SERVICE, new OnAssociationProcessCallable( groups, user, "addGroupMembers")); return null; } }; TransactionCommitCallbackUtil.registerCallback(callable); } catch (Exception e) { _log.error(e, e); } } @Override public void onAfterRemoveAssociation( Object classPK, String associationClassName, Object associationClassPK) { try { final List<Group> groups = getGroups( associationClassName, associationClassPK); final User user = UserLocalServiceUtil.getUser((Long)classPK); Callable<Void> callable = new Callable<Void>() { @Override public Void call() throws Exception { MessageBusUtil.sendMessage( DestinationNames.ASYNC_SERVICE, new OnAssociationProcessCallable( groups, user, "deleteGroupMembers")); return null; } }; TransactionCommitCallbackUtil.registerCallback(callable); } catch (Exception e) { _log.error(e, e); } } protected List<Group> getGroups( String associationClassName, Object associationClassPK) throws PortalException { if (associationClassName.equals(Group.class.getName())) { return Arrays.asList( GroupLocalServiceUtil.getGroup((Long)associationClassPK)); } if (associationClassName.equals(Organization.class.getName())) { Organization organization = OrganizationLocalServiceUtil.getOrganization( (Long)associationClassPK); return Arrays.asList(organization.getGroup()); } if (associationClassName.equals(UserGroup.class.getName())) { return GroupLocalServiceUtil.getUserGroupGroups( (Long)associationClassPK); } return new ArrayList<>(); } private static Log _log = LogFactoryUtil.getLog(UserModelListener.class); private static class OnAssociationProcessCallable implements ProcessCallable<Serializable> { public OnAssociationProcessCallable( List<Group> groups, User user, String action) { _groups = groups; _user = user; _action = action; } @Override public Serializable call() throws ProcessException { try { for (Group group : _groups) { if (!GoogleMailGroupsUtil.isSync(group)) { continue; } if (_action.equals("addGroupMembers")) { GoogleDirectoryUtil.addGroupMember( GoogleMailGroupsUtil.getGroupEmailAddress(group), GoogleMailGroupsUtil.getUserEmailAddress(_user)); } else { 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 List<Group> _groups; private User _user; } }