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.HashMap; 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 member = _resolver.resolveById(member.getId()); 067 eventNode.setProperty(EVENT_MEMBER_PROPERTY, MemberType.GROUP == member.getType() 068 ? GroupIdentity.groupIdentityToString(member.getGroup()) 069 : UserIdentity.userIdentityToString(member.getUser())); 070 eventNode.setProperty(EVENT_MEMBER_TYPE_PROPERTY, member.getType().name().toLowerCase()); 071 } 072 073 @Override 074 public Map<String, Object> event2JSON(Node eventNode) throws RepositoryException 075 { 076 Map<String, Object> event = super.event2JSON(eventNode); 077 078 String member = eventNode.getProperty(EVENT_MEMBER_PROPERTY).getString(); 079 String type = eventNode.hasProperty(EVENT_MEMBER_TYPE_PROPERTY) ? eventNode.getProperty(EVENT_MEMBER_TYPE_PROPERTY).getString() : MemberType.USER.name(); 080 if (MemberType.GROUP == MemberType.valueOf(type.toUpperCase())) 081 { 082 GroupIdentity groupIdentity = GroupIdentity.stringToGroupIdentity(member); 083 Group group = _groupManager.getGroup(groupIdentity); 084 event.put("member", group != null ? group.getLabel() : member); 085 event.put("identity", member); 086 } 087 else if (MemberType.USER == MemberType.valueOf(type.toUpperCase())) 088 { 089 UserIdentity userIdentity = UserIdentity.stringToUserIdentity(member); 090 User user = _userManager.getUser(userIdentity); 091 092 event.put("member", user != null ? user.getFullName() : (userIdentity != null ? userIdentity.getLogin() : member)); 093 event.put("identity", member); 094 } 095 event.put("memberType", type); 096 097 return event; 098 } 099 100 @Override 101 public Map<String, Object> mergeEvents(List<Map<String, Object>> events) 102 { 103 Map<String, Object> mergedEvent = super.mergeEvents(events); 104 105 Map<String, Map<String, Object>> members = new HashMap<>(); 106 107 for (Map<String, Object> event : events) 108 { 109 if (event.containsKey("identity")) 110 { 111 String identity = (String) event.get("identity"); 112 if (!members.containsKey(identity)) 113 { 114 Map<String, Object> m = new HashMap<>(); 115 m.put("name", event.get("member")); 116 m.put("type", event.get("memberType")); 117 m.put("identity", identity); 118 members.put(identity, m); 119 } 120 } 121 } 122 123 mergedEvent.put("members", members.values()); 124 return mergedEvent; 125 } 126}