/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/sam/trunk/samigo-services/src/java/org/sakaiproject/tool/assessment/integration/helper/integrated/SectionAwareServiceHelperImpl.java $ * $Id: SectionAwareServiceHelperImpl.java 117665 2012-12-13 19:42:39Z ktsao@stanford.edu $ *********************************************************************************** * * Copyright (c) 2004, 2005, 2006, 2008, 2009 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.tool.assessment.integration.helper.integrated; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.exception.IdUnusedException; import org.sakaiproject.section.api.SectionAwareness; import org.sakaiproject.section.api.coursemanagement.CourseSection; import org.sakaiproject.section.api.coursemanagement.EnrollmentRecord; import org.sakaiproject.section.api.facade.Role; import org.sakaiproject.site.api.Group; import org.sakaiproject.site.api.Site; import org.sakaiproject.site.cover.SiteService; import org.sakaiproject.tool.assessment.integration.helper.ifc.SectionAwareServiceHelper; import org.sakaiproject.tool.assessment.services.PersistenceService; /** * An implementation of Samigo-specific authorization (based on Gradebook's) needs based * on the shared Section Awareness API. */ public class SectionAwareServiceHelperImpl extends AbstractSectionsImpl implements SectionAwareServiceHelper { private static final Log log = LogFactory.getLog(SectionAwareServiceHelperImpl.class); public boolean isUserAbleToGrade(String siteid, String userUid) { return (getSectionAwareness().isSiteMemberInRole(siteid, userUid, Role.INSTRUCTOR) || getSectionAwareness().isSiteMemberInRole(siteid, userUid, Role.TA)); } public boolean isUserAbleToGradeAll(String siteid, String userUid) { return getSectionAwareness().isSiteMemberInRole(siteid, userUid, Role.INSTRUCTOR); } public boolean isUserAbleToGradeSection(String sectionUid, String userUid) { return getSectionAwareness().isSectionMemberInRole(sectionUid, userUid, Role.TA); } public boolean isUserAbleToEdit(String siteid, String userUid) { return getSectionAwareness().isSiteMemberInRole(siteid, userUid, Role.INSTRUCTOR); } public boolean isUserGradable(String siteid, String userUid) { return getSectionAwareness().isSiteMemberInRole(siteid, userUid, Role.STUDENT); } /** */ public List getAvailableEnrollments(String siteid, String userUid) { List enrollments; if ("-1".equals(userUid) || isUserAbleToGradeAll(siteid, userUid)) { enrollments = getSectionAwareness().getSiteMembersInRole(siteid, Role.STUDENT); } else { // We use a map because we may have duplicate students among the section // participation records. Map enrollmentMap = new HashMap(); List sections = getAvailableSections(siteid, userUid); for (Iterator iter = sections.iterator(); iter.hasNext(); ) { CourseSection section = (CourseSection)iter.next(); List sectionEnrollments = getSectionEnrollmentsTrusted(section.getUuid(), userUid); for (Iterator eIter = sectionEnrollments.iterator(); eIter.hasNext(); ) { EnrollmentRecord enr = (EnrollmentRecord)eIter.next(); enrollmentMap.put(enr.getUser().getUserUid(), enr); } } enrollments = new ArrayList(enrollmentMap.values()); } return enrollments; } /** * added by gopalrc - Jan 2008 * @param siteid * @param userUid * @return */ public List getGroupReleaseEnrollments(String siteid, String userUid, String publishedAssessmentId) { List availEnrollments = getAvailableEnrollments(siteid, userUid); List enrollments = new ArrayList(); HashSet<String> membersInReleaseGroups = new HashSet<String>(0); try { List releaseGroupIds = PersistenceService.getInstance().getPublishedAssessmentFacadeQueries().getReleaseToGroupIdsForPublishedAssessment(publishedAssessmentId); Set<String> releaseGroupIdsSet = new HashSet<String>(releaseGroupIds); Site site = siteService.getInstance().getSite(siteid); // this follows the way the service is already written but it is a bad practice membersInReleaseGroups = new HashSet<String>( site.getMembersInGroups(releaseGroupIdsSet) ); } catch (IdUnusedException ex) { // no site found, just log a warning log.warn("Unable to find a site with id ("+siteid+") in order to get the enrollments, will return 0 enrollments"); } for (Iterator eIter = availEnrollments.iterator(); eIter.hasNext(); ) { EnrollmentRecord enr = (EnrollmentRecord)eIter.next(); if (membersInReleaseGroups.contains( enr.getUser().getUserUid())) { enrollments.add(enr); } } return enrollments; } /** * added by gopalrc - Jan 2008 */ private SiteService siteService; public void setSiteService(SiteService siteService) { this.siteService = siteService; } /** * added by gopalrc - Jan 2008 * @param userId * @param siteId * @return */ private boolean isUserInReleaseGroup(String userId, String siteId, String publishedAssessmentId) { //String functionName="assessment.takeAssessment"; Collection siteGroups = null; try { siteGroups = siteService.getSite(siteId).getGroupsWithMember(userId); } catch (IdUnusedException ex) { // no site found } List releaseGroupIds = PersistenceService.getInstance() .getPublishedAssessmentFacadeQueries() .getReleaseToGroupIdsForPublishedAssessment(publishedAssessmentId); if (siteGroups == null) { return false; } Iterator groupsIter = siteGroups.iterator(); while (groupsIter.hasNext()) { Group group = (Group) groupsIter.next(); for (Iterator releaseGroupIdsIter = releaseGroupIds.iterator(); releaseGroupIdsIter.hasNext();) { //if this group is a release group if (group.getId().equals((String)releaseGroupIdsIter.next())) { return true; } } } return false; } public List getAvailableSections(String siteid, String userUid) { List availableSections = new ArrayList(); SectionAwareness sectionAwareness = getSectionAwareness(); if (sectionAwareness ==null) { } else { // Get the list of sections. For now, just use whatever default // sorting we get from the Section Awareness component. /* List sectionCategories = sectionAwareness.getSectionCategories(siteid); for (Iterator catIter = sectionCategories.iterator(); catIter.hasNext(); ) { String category = (String)catIter.next(); List sections = sectionAwareness.getSectionsInCategory(siteid, category); for (Iterator iter = sections.iterator(); iter.hasNext(); ) { CourseSection section = (CourseSection)iter.next(); if (isUserAbleToGradeAll(siteid, userUid) || isUserAbleToGradeSection(section.getUuid(), userUid)) { availableSections.add(section); } } } */ List sections = sectionAwareness.getSections(siteid); for (Iterator iter = sections.iterator(); iter.hasNext(); ) { CourseSection section = (CourseSection)iter.next(); // if (isUserAbleToGradeAll(gradebookUid) || isUserAbleToGradeSection(section.getUuid())) { if (isUserAbleToGradeAll(siteid, userUid) || isUserAbleToGradeSection(section.getUuid(), userUid)) { availableSections.add(section); } } } return availableSections; } public List getSectionEnrollmentsTrusted(String sectionUid) { return getSectionEnrollmentsTrusted(sectionUid, null); } private List getSectionEnrollmentsTrusted(String sectionUid, String userUid) { return getSectionAwareness().getSectionMembersInRole(sectionUid, Role.STUDENT); } public List getSectionEnrollments(String siteid, String sectionUid, String userUid) { List enrollments; if (isUserAbleToGradeAll(siteid, userUid) || isUserAbleToGradeSection(sectionUid, userUid)) { enrollments = getSectionEnrollmentsTrusted(sectionUid, userUid); } else { enrollments = new ArrayList(); log.warn("getSectionEnrollments for sectionUid=" + sectionUid + " called by unauthorized userUid=" + userUid); } return enrollments; } public List findMatchingEnrollments(String siteid, String searchString, String optionalSectionUid, String userUid) { List enrollments; List allEnrollmentsFilteredBySearch = getSectionAwareness().findSiteMembersInRole(siteid, Role.STUDENT, searchString); if (allEnrollmentsFilteredBySearch.isEmpty() || ((optionalSectionUid == null) && isUserAbleToGradeAll(siteid, userUid))) { enrollments = allEnrollmentsFilteredBySearch; } else { if (optionalSectionUid == null) { enrollments = getAvailableEnrollments(siteid, userUid); } else { // The user has selected a particular section. enrollments = getSectionEnrollments(siteid, optionalSectionUid, userUid); } Set availableStudentUids = FacadeUtils.getStudentUids(enrollments); enrollments = new ArrayList(); for (Iterator iter = allEnrollmentsFilteredBySearch.iterator(); iter.hasNext(); ) { EnrollmentRecord enr = (EnrollmentRecord)iter.next(); if (availableStudentUids.contains(enr.getUser().getUserUid())) { enrollments.add(enr); } } } return enrollments; } public boolean isSectionMemberInRoleStudent(String sectionId, String studentId) { return getSectionAwareness().isSectionMemberInRole(sectionId, studentId, Role.STUDENT); } }