/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.commons.memberlist.manager;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.olat.basesecurity.BaseSecurity;
import org.olat.core.gui.media.MediaResource;
import org.olat.core.gui.translator.Translator;
import org.olat.core.id.Identity;
import org.olat.core.util.Util;
import org.olat.course.nodes.members.Member;
import org.olat.course.nodes.members.MembersCourseNodeRunController;
import org.olat.group.BusinessGroup;
import org.olat.group.BusinessGroupMembership;
import org.olat.group.BusinessGroupService;
import org.olat.group.ui.run.GroupMembersRunController;
import org.olat.repository.RepositoryEntry;
import org.olat.repository.RepositoryManager;
import org.olat.repository.model.RepositoryEntryMembership;
import org.olat.user.UserManager;
import org.olat.user.propertyhandlers.UserPropertyHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* Initial Date: 28.03.2017
* @author fkiefer, fabian.kiefer@frentix.com, www.frentix.com
*/
@Service
public class MembersExportManager {
public static final String USER_PROPS_ID = MembersCourseNodeRunController.class.getName();
public static final int USER_PROPS_OFFSET = 500;
@Autowired
private RepositoryManager repositoryManager;
@Autowired
protected BaseSecurity securityManager;
@Autowired
private BusinessGroupService businessGroupService;
@Autowired
private UserManager userManager;
public Map<Long,RepositoryEntryMembership> getRepoMembershipMap(RepositoryEntry repoEntry) {
List<RepositoryEntryMembership> repoMemberships = repositoryManager.getRepositoryEntryMembership(repoEntry);
Map<Long,RepositoryEntryMembership> map = new HashMap<>();
for (RepositoryEntryMembership membership : repoMemberships) {
map.put(membership.getIdentityKey(), membership);
}
return map;
}
public Map<Long,BusinessGroupMembership> getGroupMembershipMap(List<BusinessGroup> groups) {
List<BusinessGroupMembership> groupMemberships = businessGroupService.getBusinessGroupsMembership(groups);
Map<Long,BusinessGroupMembership> map = new HashMap<>();
for (BusinessGroupMembership membership : groupMemberships) {
map.put(membership.getIdentityKey(), membership);
}
return map;
}
private void putRoleToMember(List<Identity> rows, Map<Identity, StringBuilder> membersMap, Identity member, String role, Translator roleTranslator) {
if (membersMap.containsKey(member)) {
String roleString = roleTranslator.translate("members." + role);
StringBuilder roleBuilder = membersMap.get(member);
if (!roleBuilder.toString().contains(roleString)) {
roleBuilder.append(", ").append(roleString);
}
} else {
membersMap.put(member, new StringBuilder(roleTranslator.translate("members." + role)));
rows.add(member);
}
}
public MediaResource getXlsMediaResource(boolean showOwners, boolean showCoaches, boolean showParticipants, boolean showWaiting,
List<Identity> owners, List<Identity> coaches, List<Identity> participants, List<Identity> waiting,
Translator translator, List<UserPropertyHandler> userPropertyHandlers, RepositoryEntry repoEntry, BusinessGroup businessGroup) {//TODO
Map<Long,BusinessGroupMembership> groupmemberships;
Map<Long,RepositoryEntryMembership> repomemberships;
if (repoEntry == null) {
List<BusinessGroup> groups = new ArrayList<>();
groups.add(businessGroup);
groupmemberships = getGroupMembershipMap(groups);
repomemberships = new HashMap<>();
} else {
repomemberships = getRepoMembershipMap(repoEntry);
List<BusinessGroup> groups = businessGroupService.findBusinessGroups(null, repoEntry, 0, -1);
groupmemberships = getGroupMembershipMap(groups);
}
List<List<Identity>> roleMembers = new ArrayList<>();
if (showOwners) {
roleMembers.add(owners);
}
if (showCoaches) {
roleMembers.add(coaches);
}
if (showParticipants) {
roleMembers.add(participants);
}
if (showWaiting) {
roleMembers.add(waiting);
}
Translator repoTranslator = Util.createPackageTranslator(Member.class, translator.getLocale());
Translator groupTranslator = Util.createPackageTranslator(GroupMembersRunController.class, translator.getLocale());
Map<Identity, StringBuilder> membersMap = new HashMap<>();
List<Identity> rows = new ArrayList<>();
for (List<Identity> membersList : roleMembers) {
for (Identity member : membersList) {
Long memberKey = member.getKey();
if (repomemberships != null && !repomemberships.isEmpty() && repomemberships.containsKey(memberKey)) {
RepositoryEntryMembership repomembership = repomemberships.get(memberKey);
if (repomembership.isOwner()) {
putRoleToMember(rows, membersMap, member, "owners", repoTranslator);
}
if (repomembership.isCoach()) {
putRoleToMember(rows, membersMap, member, "coaches", repoTranslator);
}
if (repomembership.isParticipant()) {
putRoleToMember(rows, membersMap, member, "participants", repoTranslator);
}
}
if (groupmemberships != null && !groupmemberships.isEmpty() && groupmemberships.containsKey(memberKey)) {
BusinessGroupMembership groupmembership = groupmemberships.get(memberKey);
if (groupmembership.isOwner()) {
putRoleToMember(rows, membersMap, member, "coaches", groupTranslator);
}
if (groupmembership.isParticipant()) {
putRoleToMember(rows, membersMap, member, "participants", groupTranslator);
}
if (groupmembership.isWaiting()) {
putRoleToMember(rows, membersMap, member, "waiting", groupTranslator);
}
}
}
}
Translator handlerTranslator = userManager.getPropertyHandlerTranslator(translator);
XlsMembersExport exporter = new XlsMembersExport();
MediaResource resource = exporter.export(rows, membersMap, handlerTranslator, userPropertyHandlers);
return resource;
}
}