/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/providers/trunk/cm-authz-provider/src/java/org/sakaiproject/coursemanagement/impl/provider/CourseOfferingRoleResolver.java $
* $Id: CourseOfferingRoleResolver.java 105079 2012-02-24 23:08:11Z ottenhoff@longsight.com $
***********************************************************************************
*
* Copyright (c) 2006, 2007, 2008 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**********************************************************************************/
package org.sakaiproject.coursemanagement.impl.provider;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.coursemanagement.api.CourseManagementService;
import org.sakaiproject.coursemanagement.api.CourseOffering;
import org.sakaiproject.coursemanagement.api.Membership;
import org.sakaiproject.coursemanagement.api.Section;
/**
* Resolves user roles in CourseOfferings.
*
*/
public class CourseOfferingRoleResolver extends BaseRoleResolver {
private static final Log log = LogFactory.getLog(CourseOfferingRoleResolver.class);
// Configuration keys.
public static final String COURSE_OFFERING_ROLE_TO_SITE_ROLE = "courseOfferingRoleToSiteRole";
/**
* Internal configuration.
*/
public void init() {
if (configuration != null) {
setRoleMap((Map<String, String>)configuration.get(COURSE_OFFERING_ROLE_TO_SITE_ROLE));
}
}
/**
* {@inheritDoc}
*/
public Map<String, String> getUserRoles(CourseManagementService cmService, Section section) {
Map<String, String> userRoleMap = new HashMap<String, String>();
// Don't bother doing anything if the integration is configured to ignore
// CourseOffering memberships.
if ((roleMap == null) || (roleMap.size() == 0)) {
return userRoleMap;
}
String coEid = section.getCourseOfferingEid();
// Get the members of this course offering
Set<Membership> coMembers = cmService.getCourseOfferingMemberships(coEid);
Set<Membership> equivMembers = new HashSet<Membership>();
// Get the members of equivalent course offerings, and add them to the set of equivalent memberships
Set<CourseOffering> equivalentCourseOfferings = cmService.getEquivalentCourseOfferings(coEid);
for(Iterator<CourseOffering> iter = equivalentCourseOfferings.iterator(); iter.hasNext();) {
CourseOffering equivCo = iter.next();
equivMembers.addAll(cmService.getCourseOfferingMemberships(equivCo.getEid()));
}
// Add the course offering members
addMemberRoles(userRoleMap, coMembers);
// Add the equivalent course offering members (but don't override any roles in the original course offering)
addMemberRoles(userRoleMap, equivMembers);
return userRoleMap;
}
private void addMemberRoles(Map<String, String> userRoleMap, Set<Membership>coMembers) {
for(Iterator<Membership> iter = coMembers.iterator(); iter.hasNext();) {
Membership membership = iter.next();
if(userRoleMap.containsKey(membership.getUserId())) {
// Don't override existing roles in the map.
} else {
String sakaiRole = convertRole(membership.getRole());
if(sakaiRole != null) {
userRoleMap.put(membership.getUserId(), sakaiRole);
}
}
}
}
/**
* {@inheritDoc}
*/
public Map<String, String> getGroupRoles(CourseManagementService cmService, String userEid) {
Map<String, String> sectionRoles = new HashMap<String, String>();
// Don't bother doing anything if the integration is configured to ignore
// CourseOffering memberships.
if ((roleMap == null) || (roleMap.size() == 0)) {
return sectionRoles;
}
// Find all of the course offerings for which this user is a member
Map<String, String> courseOfferingRoles = cmService.findCourseOfferingRoles(userEid);
if(log.isDebugEnabled()) log.debug("Found " + courseOfferingRoles.size() + " course offering roles for " + userEid);
// Add all of the equivalent course offerings-> role mappings for this user
Set<String> coEids = new HashSet<String>(courseOfferingRoles.keySet());
for(String coEid : coEids) {
Set<CourseOffering> equivOfferings = cmService.getEquivalentCourseOfferings(coEid);
for(Iterator<CourseOffering> equivIter = equivOfferings.iterator(); equivIter.hasNext();) {
CourseOffering equiv = equivIter.next();
// Use the role in the original course offering for this equivalent course offering
courseOfferingRoles.put(equiv.getEid(), courseOfferingRoles.get(coEid));
}
}
for(Iterator<Entry<String, String>> coIter = courseOfferingRoles.entrySet().iterator(); coIter.hasNext();) {
Entry<String, String> entry = coIter.next();
String coEid = entry.getKey();
String coRole = entry.getValue();
// If this role shouldn't be part of the site, ignore the membership in this course offering
String sakaiRole = convertRole(coRole);
if(sakaiRole == null) {
if(log.isDebugEnabled()) log.debug("Course offering role " + coRole + " is not mapped to a sakai role. Skipping this membership.");
continue;
}
if(log.isDebugEnabled()) log.debug(userEid + " has role=" + coRole + " in course offering " + coEid);
// Get the sections in each course offering
Set<Section> sections = cmService.getSections(coEid);
for(Iterator<Section> secIter = sections.iterator(); secIter.hasNext();) {
// Add the section EIDs and the converted *CourseOffering* role to the sectionRoles map
Section section = secIter.next();
sectionRoles.put(section.getEid(), sakaiRole);
}
}
return sectionRoles;
}
}