/********************************************************************************** * * $Id: GraderRulesBean.java 20001 2007-04-01 19:41:33Z wagnermr@iupui.edu $ * *********************************************************************************** * * Copyright (c) 2005, 2006, 2007, 2008 The Sakai Foundation, The MIT Corporation * * 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.gradebook.ui; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Iterator; import java.util.HashMap; import java.util.Map; import javax.faces.event.ActionEvent; import javax.faces.event.ValueChangeEvent; import javax.faces.model.SelectItem; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.tool.gradebook.Category; import org.sakaiproject.tool.gradebook.jsf.FacesUtil; import org.sakaiproject.tool.gradebook.Permission; import org.sakaiproject.section.api.coursemanagement.CourseSection; import org.sakaiproject.section.api.coursemanagement.ParticipationRecord; import org.sakaiproject.section.api.coursemanagement.User; import org.sakaiproject.section.api.facade.Role; import org.sakaiproject.service.gradebook.shared.GradebookService; public class GraderRulesBean extends GradebookDependentBean implements Serializable { private static final Log logger = LogFactory.getLog(GraderRulesBean.class); private List graderList; private String selectedGraderId; private Grader selectedGrader; private List rulesToRemove; private boolean assistantsDefined; private boolean categoriesDefined; private boolean sectionsDefined; private List sectionSelectMenu; private Map sectionUuidNameMap; private Map categoryIdNameMap; private List categorySelectMenu; private Map graderDisplayIdUidMap; private Map graderIdSortNameMap; private Map graderIdDisplayNameMap; private List graderNameSelectMenu; private static final String NONE = ""; private static final String ALL = ""; private static final String GRADER_RULES_PG = "graderRules"; private static final String ROW_INDEX_PARAM = "rowIndex"; private List gradeOrViewMenu; private boolean refreshView = true; protected void init() { // first, load data that is non-grader specific. only load first time through if (refreshView) { rulesToRemove = new ArrayList(); List taList = getSectionAwareness().getSiteMembersInRole(getGradebookUid(), Role.TA); if (taList == null || taList.size() <= 0) { assistantsDefined = false; return; } assistantsDefined = true; // set up the select menu of grader names and maps for single lookup graderDisplayIdUidMap = new HashMap(); // so we don't display Uid in html graderIdSortNameMap = new HashMap(); graderIdDisplayNameMap = new HashMap(); graderNameSelectMenu = new ArrayList(); graderNameSelectMenu.add(new SelectItem(NONE, FacesUtil.getLocalizedString("grader_rules_select_menu_none"))); for (Iterator taIter = taList.iterator(); taIter.hasNext();) { ParticipationRecord participationRecord = (ParticipationRecord)taIter.next(); User user = participationRecord.getUser(); graderDisplayIdUidMap.put(user.getDisplayId(), user.getUserUid()); graderIdSortNameMap.put(user.getDisplayId(), user.getSortName()); graderIdDisplayNameMap.put(user.getDisplayId(), user.getDisplayName()); graderNameSelectMenu.add(new SelectItem(user.getDisplayId(), user.getSortName())); } // set up the section information sectionUuidNameMap = new HashMap(); sectionSelectMenu = new ArrayList(); List sectionList = getAllSections(); sectionsDefined = sectionList != null && sectionList.size() > 0; if (sectionsDefined) { sectionSelectMenu.add(new SelectItem(ALL, FacesUtil.getLocalizedString("grader_rules_all_section"))); for (Iterator sectionIter = sectionList.iterator(); sectionIter.hasNext();) { CourseSection section = (CourseSection)sectionIter.next(); sectionUuidNameMap.put(section.getUuid(), section.getTitle()); sectionSelectMenu.add(new SelectItem(section.getUuid(), section.getTitle())); } } // set up the category information categoryIdNameMap = new HashMap(); categorySelectMenu = new ArrayList(); if (getCategoriesEnabled()) { List categoryList = getGradebookManager().getCategories(getGradebookId()); categoriesDefined = categoryList != null && categoryList.size() > 0; if (categoriesDefined) { categorySelectMenu.add(new SelectItem(ALL, FacesUtil.getLocalizedString("grader_rules_all_category"))); for (Iterator catIter = categoryList.iterator(); catIter.hasNext();) { Category category = (Category)catIter.next(); categoryIdNameMap.put(category.getId(), category.getName()); categorySelectMenu.add(new SelectItem(category.getId().toString(), category.getName())); } } } else { categoriesDefined = false; } // set up grade or view menu gradeOrViewMenu = new ArrayList(); gradeOrViewMenu.add(new SelectItem(GradebookService.viewPermission, FacesUtil.getLocalizedString("grader_rules_view"))); gradeOrViewMenu.add(new SelectItem(GradebookService.gradePermission, FacesUtil.getLocalizedString("grader_rules_grade"))); refreshView = false; } if (selectedGrader == null) { if (selectedGraderId == null || selectedGraderId.equals(NONE) || !graderDisplayIdUidMap.containsKey(selectedGraderId)) { selectedGrader = null; } else { selectedGrader = new Grader(); selectedGrader.setGraderName((String)graderIdDisplayNameMap.get(selectedGraderId)); selectedGrader.setGraderId(selectedGraderId); selectedGrader.setGraderUid((String)graderDisplayIdUidMap.get(selectedGraderId)); selectedGrader.setGraderRules(getGraderRulesForUser((String)graderDisplayIdUidMap.get(selectedGraderId))); } } } private void refreshSelectedGraderRules() { selectedGrader.setGraderRules(getGraderRulesForUser(selectedGrader.getGraderUid())); rulesToRemove = new ArrayList(); } public void setGraderList(List graderList) { this.graderList = graderList; } public List getGraderList() { return graderList; } public void setSelectedGraderId(String selectedGraderId) { this.selectedGraderId = selectedGraderId; } public String getSelectedGraderId() { return selectedGraderId; } public void setSelectedGrader(Grader selectedGrader) { this.selectedGrader = selectedGrader; } public Grader getSelectedGrader() { return selectedGrader; } public void setSectionSelectMenu(List sectionSelectMenu) { this.sectionSelectMenu = sectionSelectMenu; } public List getSectionSelectMenu() { return sectionSelectMenu; } public void setCategorySelectMenu(List categorySelectMenu) { this.categorySelectMenu = categorySelectMenu; } public List getCategorySelectMenu() { return categorySelectMenu; } public void setGradeOrViewMenu(List gradeOrViewMenu) { this.gradeOrViewMenu = gradeOrViewMenu; } public List getGradeOrViewMenu() { return gradeOrViewMenu; } public void setGraderNameSelectMenu(List graderNameSelectMenu) { this.graderNameSelectMenu = graderNameSelectMenu; } public List getGraderNameSelectMenu() { return graderNameSelectMenu; } public boolean isAssistantsDefined() { return assistantsDefined; } public boolean isCategoriesDefined() { return categoriesDefined; } public boolean isSectionsDefined() { return sectionsDefined; } public boolean isUserHasRules() { if (selectedGrader == null || selectedGrader.getGraderRules() == null || selectedGrader.getGraderRules().size() <= 0) return false; return true; } public String processSelectGrader(ValueChangeEvent event) { try { String newUserId = (String)event.getNewValue(); selectedGraderId = newUserId; selectedGrader = null; } catch(Exception e) { // do nothing } return GRADER_RULES_PG; } public String processRemoveRule(ActionEvent event) { if (selectedGrader == null || selectedGrader.getGraderRules() == null) return GRADER_RULES_PG; try { Map params = FacesUtil.getEventParameterMap(event); Integer index = (Integer) params.get(ROW_INDEX_PARAM); if (index == null) { return GRADER_RULES_PG; } int indexToRemove = index.intValue(); List graderRulesList = selectedGrader.getGraderRules(); GraderRule ruleToRemove = (GraderRule)graderRulesList.get(indexToRemove); if (ruleToRemove != null) { Permission permToRemove = ruleToRemove.getPermission(); if (permToRemove != null) { rulesToRemove.add(permToRemove); } graderRulesList.remove(ruleToRemove); } selectedGrader.setGraderRules(graderRulesList); } catch(Exception e) { // do nothing } return GRADER_RULES_PG; } public String processAddRule() { if (selectedGrader == null) return GRADER_RULES_PG; List rules = selectedGrader.getGraderRules(); if (rules == null) rules = new ArrayList(); GraderRule newRule = new GraderRule(); newRule.setGradeOrViewValue(GradebookService.viewPermission); rules.add(newRule); selectedGrader.setGraderRules(rules); return GRADER_RULES_PG; } /** * * @param userUid * @return list of GraderRules for this user id */ private List getGraderRulesForUser(String userUid) { List graderRules = new ArrayList(); if (userUid == null) return null; List currPerms = getGradebookManager().getPermissionsForUser(getGradebookId(), userUid); if (currPerms == null || currPerms.size() <= 0) // there are no grader perms for this user return null; for (Iterator permIter = currPerms.iterator(); permIter.hasNext();) { /* iterate through each perm to make sure category and section still exist. * if not, delete it from the table to clean things up. */ Permission permission = (Permission) permIter.next(); String sectionUuid = permission.getGroupId(); Long categoryId = permission.getCategoryId(); if ((sectionUuid != null && !sectionUuidNameMap.containsKey(sectionUuid)) || (categoryId != null && !categoryIdNameMap.containsKey(categoryId))) { logger.info("unknown category or section. Permission " + permission.getId() + " was deleted"); getGradebookManager().deletePermission(permission); } else { GraderRule graderRule = new GraderRule(); graderRule.setGradeOrViewValue(permission.getFunction()); if (categoryId == null) { graderRule.setSelectedCategoryId(ALL); } else { graderRule.setSelectedCategoryId(categoryId.toString()); } if (sectionUuid == null) { graderRule.setSelectedSectionUuid(ALL); } else { graderRule.setSelectedSectionUuid(sectionUuid); } graderRule.setPermission(permission); graderRules.add(graderRule); } } return graderRules; } public String processSaveGraderRules() { if (selectedGrader == null) { FacesUtil.addErrorMessage(getLocalizedString("grader_rules_no_grader_selected")); return "failure"; } // first, remove all marked rules boolean updated = false; if (rulesToRemove != null) { for (Iterator removeIter = rulesToRemove.iterator(); removeIter.hasNext();) { Permission permToRemove = (Permission) removeIter.next(); getGradebookManager().deletePermission(permToRemove); updated = true; } } List graderRules = selectedGrader.getGraderRules(); if (graderRules != null && graderRules.size() > 0) { for (Iterator rulesIter = graderRules.iterator(); rulesIter.hasNext();) { GraderRule rule = (GraderRule) rulesIter.next(); String selGradeOrViewVal = rule.getGradeOrViewValue(); String selCategoryId = rule.getSelectedCategoryId(); String selSectionId = rule.getSelectedSectionUuid(); // check for valid Grade/View selection if (selGradeOrViewVal == null || (!selGradeOrViewVal.equals(GradebookService.viewPermission) && !selGradeOrViewVal.equals(GradebookService.gradePermission))) { FacesUtil.addErrorMessage(getLocalizedString("grader_rules_invalid_function")); return GRADER_RULES_PG; } // convert category id to a Long Long selCatIdAsLong = null; if (selCategoryId != null && selCategoryId.length() > 0 && !selCategoryId.equals(ALL)) { try { selCatIdAsLong = new Long(selCategoryId); } catch (NumberFormatException nfe) { FacesUtil.addErrorMessage(getLocalizedString("grader_rules_invalid_category")); return GRADER_RULES_PG; } } // empty string signals "All sections", which is defined by null in db if (selSectionId == null || selSectionId.equals(ALL)) { selSectionId = null; } Permission rulePerm = rule.getPermission(); if (rulePerm != null) { boolean hasChanged = false; Long ruleCategoryId = rulePerm.getCategoryId(); String ruleSectionId = rulePerm.getGroupId(); if (!rulePerm.getFunction().equals(selGradeOrViewVal)) hasChanged = true; else if (ruleCategoryId != null && selCatIdAsLong != null && !ruleCategoryId.equals(selCatIdAsLong)) hasChanged = true; else if ((ruleCategoryId == null && selCatIdAsLong != null) || (ruleCategoryId != null && selCatIdAsLong == null)) hasChanged = true; else if (ruleSectionId != null && selSectionId != null && !ruleSectionId.equals(selSectionId)) hasChanged = true; else if ((ruleSectionId == null && selSectionId != null) || (ruleSectionId != null && selSectionId == null)) hasChanged = true; if (hasChanged) { // there has been a change, so update rec rulePerm.setCategoryId(selCatIdAsLong); rulePerm.setFunction(rule.getGradeOrViewValue()); rulePerm.setGroupId(selSectionId); getGradebookManager().updatePermission(rulePerm); updated = true; } } else { // this is a new rule getGradebookManager().addPermission(getGradebookId(), selectedGrader.getGraderUid(), rule.getGradeOrViewValue(), selCatIdAsLong, selSectionId); updated = true; } } } if (updated) { FacesUtil.addRedirectSafeMessage(getLocalizedString("grader_rules_saved")); refreshSelectedGraderRules(); return GRADER_RULES_PG; } else { FacesUtil.addErrorMessage(getLocalizedString("grader_rules_no_changes")); return GRADER_RULES_PG; } } public String processCancelChanges() { refreshSelectedGraderRules(); return GRADER_RULES_PG; } public class Grader implements Serializable { private String graderId; private String graderUid; private String graderName; private List graderRules; public Grader() { } public void setGraderId(String graderId) { this.graderId = graderId; } public String getGraderId() { return graderId; } public void setGraderUid(String graderUid) { this.graderUid = graderUid; } public String getGraderUid() { return graderUid; } public void setGraderName(String graderName) { this.graderName = graderName; } public String getGraderName() { return graderName; } public void setGraderRules(List graderRules) { this.graderRules = graderRules; } public List getGraderRules() { return graderRules; } } }