001/* 002 * Copyright 2016 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.workspaces.events.projects; 017 018import java.util.ArrayList; 019import java.util.List; 020import java.util.Map; 021 022import javax.jcr.Node; 023import javax.jcr.RepositoryException; 024 025import org.apache.avalon.framework.service.ServiceException; 026import org.apache.avalon.framework.service.ServiceManager; 027 028import org.ametys.core.group.Group; 029import org.ametys.core.group.GroupIdentity; 030import org.ametys.core.group.GroupManager; 031import org.ametys.core.user.User; 032import org.ametys.core.user.UserIdentity; 033import org.ametys.core.user.UserManager; 034import org.ametys.plugins.repository.RepositoryConstants; 035import org.ametys.plugins.repository.events.EventType; 036import org.ametys.plugins.workspaces.members.JCRProjectMember; 037import org.ametys.plugins.workspaces.members.JCRProjectMember.MemberType; 038 039/** 040 * {@link EventType} implementation for the addition of a member 041 */ 042public class MemberAddedEventType extends ProjectsEventType 043{ 044 /** Constant for event's member */ 045 public static final String EVENT_MEMBER_PROPERTY = RepositoryConstants.NAMESPACE_PREFIX + ":member"; 046 /** Constant for event's member type */ 047 public static final String EVENT_MEMBER_TYPE_PROPERTY = RepositoryConstants.NAMESPACE_PREFIX + ":memberType"; 048 049 private UserManager _userManager; 050 private GroupManager _groupManager; 051 052 @Override 053 public void service(ServiceManager serviceManager) throws ServiceException 054 { 055 super.service(serviceManager); 056 _userManager = (UserManager) serviceManager.lookup(UserManager.ROLE); 057 _groupManager = (GroupManager) serviceManager.lookup(GroupManager.ROLE); 058 } 059 060 @Override 061 protected void storeAdditionalEventData(Node eventNode, Map<String, Object> parameters) throws RepositoryException 062 { 063 super.storeAdditionalEventData(eventNode, parameters); 064 065 JCRProjectMember member = (JCRProjectMember) parameters.get(org.ametys.plugins.workspaces.ObservationConstants.ARGS_MEMBER); 066 eventNode.setProperty(EVENT_MEMBER_PROPERTY, MemberType.GROUP.toString().equals(member.getType()) 067 ? GroupIdentity.groupIdentityToString(member.getGroup()) 068 : UserIdentity.userIdentityToString(member.getUser())); 069 eventNode.setProperty(EVENT_MEMBER_TYPE_PROPERTY, member.getType()); 070 } 071 072 @Override 073 public Map<String, Object> event2JSON(Node eventNode) throws RepositoryException 074 { 075 Map<String, Object> event = super.event2JSON(eventNode); 076 077 String member = eventNode.getProperty(EVENT_MEMBER_PROPERTY).getString(); 078 String type = eventNode.hasProperty(EVENT_MEMBER_TYPE_PROPERTY) ? eventNode.getProperty(EVENT_MEMBER_TYPE_PROPERTY).getString() : MemberType.USER.toString(); 079 if (MemberType.GROUP.toString().equals(type)) 080 { 081 GroupIdentity groupIdentity = GroupIdentity.stringToGroupIdentity(member); 082 Group group = _groupManager.getGroup(groupIdentity); 083 event.put("member", group != null ? group.getLabel() : member); 084 } 085 else if (MemberType.USER.toString().equals(type)) 086 { 087 UserIdentity userIdentity = UserIdentity.stringToUserIdentity(member); 088 User user = _userManager.getUser(userIdentity); 089 090 event.put("member", user != null ? user.getFullName() : (userIdentity != null ? userIdentity.getLogin() : member)); 091 } 092 event.put("memberType", type); 093 094 return event; 095 } 096 097 @Override 098 public Map<String, Object> mergeEvents(List<Map<String, Object>> events) 099 { 100 Map<String, Object> mergedEvent = super.mergeEvents(events); 101 102 List<String> members = new ArrayList<>(); 103 104 for (Map<String, Object> event : events) 105 { 106 if (event.containsKey("member")) 107 { 108 String member = (String) event.get("member"); 109 if (!members.contains(member)) 110 { 111 members.add(member); 112 } 113 } 114 } 115 mergedEvent.put("members", members); 116 117 return mergedEvent; 118 } 119}