/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/sam/trunk/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/evaluation/SubmissionStatusBean.java $
* $Id: SubmissionStatusBean.java 106463 2012-04-02 12:20:09Z david.horwitz@uct.ac.za $
***********************************************************************************
*
* Copyright (c) 2004, 2005, 2006, 2007, 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.ui.bean.evaluation;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import javax.faces.event.ActionEvent;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.jsf.model.PhaseAware;
import org.sakaiproject.tool.assessment.business.entity.RecordingData;
import org.sakaiproject.tool.assessment.services.assessment.PublishedAssessmentService;
import org.sakaiproject.tool.assessment.ui.bean.util.Validator;
import org.sakaiproject.tool.assessment.ui.listener.evaluation.SubmissionStatusListener;
import org.sakaiproject.tool.assessment.ui.listener.util.ContextUtil;
/**
* <p>Description: class form for evaluating submission status</p>
*
*
*/
public class SubmissionStatusBean
implements Serializable, PhaseAware
{
private String assessmentId;
private String publishedId;
/** Use serialVersionUID for interoperability. */
private final static long serialVersionUID = 5517587781720762296L;
private String assessmentName;
private String anonymous;
private String groupName;
private String maxScore;
private Collection agents;
private Collection sortedAgents;
private String totalScore;
private String adjustmentTotalScore;
private String totalScoreComments;
private String sortProperty;
private String lateHandling; // read-only property set for UI late handling
private String dueDate;
private String sortType;
private boolean sortAscending = true;
private String roleSelection;
private String allSubmissions;
private RecordingData recordingData;
private String totalPeople;
private String firstItem;
private HashMap answeredItems;
private static Log log = LogFactory.getLog(SubmissionStatusBean.class);
// modified by gopalrc - Jan 2008
//private String selectedSectionFilterValue = TotalScoresBean.ALL_SECTIONS_SELECT_VALUE;
private String selectedSectionFilterValue = null;
private ArrayList allAgents;
// Paging.
private int firstScoreRow;
private int maxDisplayedScoreRows;
private int scoreDataRows;
// Searching
private String searchString;
private String defaultSearchString;
private Boolean releasedToGroups = null; // added by gopalrc - Jan 2008
/**
* Creates a new SubmissionStatusBean object.
*/
public SubmissionStatusBean()
{
log.debug("Creating a new SubmissionStatusBean");
resetFields();
}
protected void init() {
defaultSearchString = ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.EvaluationMessages", "search_default_student_search_string");
if (searchString == null) {
searchString = defaultSearchString;
}
// Get allAgents only at the first time
if (allAgents == null) {
allAgents = getAllAgents();
}
ArrayList matchingAgents;
if (isFilteredSearch()) {
matchingAgents = findMatchingAgents(searchString);
}
else {
matchingAgents = allAgents;
}
scoreDataRows = matchingAgents.size();
ArrayList newAgents = new ArrayList();
if (maxDisplayedScoreRows == 0) {
newAgents = matchingAgents;
} else {
int nextPageRow = Math.min(firstScoreRow + maxDisplayedScoreRows, scoreDataRows);
newAgents = new ArrayList(matchingAgents.subList(firstScoreRow, nextPageRow));
log.debug("init(): subList " + firstScoreRow + ", " + nextPageRow);
}
agents = newAgents;
}
// Following three methods are for interface PhaseAware
public void endProcessValidators() {
log.debug("endProcessValidators");
}
public void endProcessUpdates() {
log.debug("endProcessUpdates");
}
public void startRenderResponse() {
log.debug("startRenderResponse");
init();
}
/**
* get assessment name
*
* @return the name
*/
public String getAssessmentName()
{
return Validator.check(assessmentName, "N/A");
}
/**
* set assessment name
*
* @param passessmentName the name
*/
public void setAssessmentName(String passessmentName)
{
assessmentName = passessmentName;
}
/**
* get assessment id
*
* @return the assessment id
*/
public String getAssessmentId()
{
return Validator.check(assessmentId, "0");
}
/**
* set assessment id
*
* @param passessmentId the id
*/
public void setAssessmentId(String passessmentId)
{
assessmentId = passessmentId;
}
/**
* get published id
*
* @return the published id
*/
public String getPublishedId()
{
return Validator.check(publishedId, "0");
}
/**
* set published id
*
* @param passessmentId the id
*/
public void setPublishedId(String ppublishedId)
{
publishedId = ppublishedId;
/*
//added by gopalrc - Jan 2007
if (isReleasedToGroups()) {
setSelectedSectionFilterValue(TotalScoresBean.RELEASED_SECTIONS_GROUPS_SELECT_VALUE);
}
else {
setSelectedSectionFilterValue(TotalScoresBean.ALL_SECTIONS_SELECT_VALUE);
}
*/
}
/**
* Is this anonymous grading?
*
* @return anonymous grading? true or false
*/
public String getAnonymous()
{
return Validator.check(anonymous, "false");
}
/**
* Set switch if this is anonymous grading.
*
* @param panonymous anonymous grading? true or false
*/
public void setAnonymous(String panonymous)
{
anonymous = panonymous;
}
/**
* Get the group name
* @return group name
*/
public String getGroupName()
{
return Validator.check(groupName, "N/A");
}
/**
* set the group name
*
* @param pgroupName the name
*/
public void setGroupName(String pgroupName)
{
groupName = pgroupName;
}
/**
* get the max score
*
* @return the max score
*/
public String getMaxScore()
{
return Validator.check(maxScore, "N/A");
}
/**
* set max score
*
* @param pmaxScore set the max score
*/
public void setMaxScore(String pmaxScore)
{
maxScore = pmaxScore;
}
/**
* get an agent result collection
*
* @return the collection
*/
public Collection getAgents()
{
if (agents == null)
return new ArrayList();
return agents;
}
/**
* set the agent collection
*
* @param pagents the collection
*/
public void setAgents(Collection pagents)
{
agents = pagents;
}
/** This is a read-only calculated property.
* @return list of uppercase student initials
*/
public String getAgentInitials()
{
Collection c = getAgents();
StringBuilder initialsbuf = new StringBuilder();
if (c.isEmpty())
{
return "";
}
Iterator it = c.iterator();
while (it.hasNext())
{
try
{
AgentResults ar = (AgentResults) it.next();
String initial = ar.getLastInitial();
initialsbuf.append(initial);
}
catch (Exception ex)
{
// if there is any problem, we skip, and go on
log.warn(ex.getMessage());
}
}
String initials = initialsbuf.toString();
return initials.toUpperCase();
}
/**
* get agent resutls as an array
*
* @return the array
*/
public Object[] getAgentArray()
{
if (agents == null)
return new Object[0];
return agents.toArray();
}
/**
* get the total number of students for this assessment
*
* @return the number
*/
public String getTotalPeople()
{
return Validator.check(totalPeople, "N/A");
}
/**
* set the total number of people
*
* @param ptotalPeople the total
*/
public void setTotalPeople(String ptotalPeople)
{
totalPeople = ptotalPeople;
}
/**
*
* @return the total score
*/
public String getTotalScore()
{
return Validator.check(totalScore, "N/A");
}
/**
* set the total score
*
* @param pTotalScore the total score
*/
public void setTotalScore(String pTotalScore)
{
totalScore = pTotalScore;
}
/**
* get the adjustment to the total score
*
* @return the total score
*/
public String getAdjustmentTotalScore()
{
return Validator.check(adjustmentTotalScore, "N/A");
}
/**
* set the adjustment to total score
*
* @param pAdjustmentTotalScore the adjustment
*/
public void setAdjustmentTotalScore(String pAdjustmentTotalScore)
{
adjustmentTotalScore = pAdjustmentTotalScore;
}
/**
* get total score
*
* @return the total score
*/
public String getTotalScoreComments()
{
return Validator.check(totalScoreComments, "");
}
/**
* set comments for totals score
*
* @param pTotalScoreComments the comments
*/
public void setTotalScoreComments(String pTotalScoreComments)
{
log.debug("setting total score comments to " + pTotalScoreComments);
totalScoreComments = pTotalScoreComments;
}
/**
* get late handling
*
* @return late handlign
*/
public String getLateHandling()
{
return Validator.check(lateHandling, "1");
}
/**
* set late handling
*
* @param plateHandling the late handling
*/
public void setLateHandling(String plateHandling)
{
lateHandling = plateHandling;
}
/**
* get the due date
*
* @return the due date as a String
*/
public String getDueDate()
{
return Validator.check(dueDate, "N/A");
}
/**
* set due date string
*
* @param dateString the date string
*/
public void setDueDate(String dateString)
{
dueDate = dateString;
}
/**
* get sort type
* @return sort type
*/
public String getSortType()
{
return Validator.check(sortType, "lastName");
}
/**
* set sort type, trigger property sorts
* @param psortType the type
*/
public void setSortType(String psortType)
{
sortType = psortType;
}
/**
* is scores table sorted in ascending order
* @return true if it is
*/
public boolean isSortAscending()
{
return sortAscending;
}
/**
*
* @param sortAscending is scores table sorted in ascending order
*/
public void setSortAscending(boolean sortAscending)
{
this.sortAscending = sortAscending;
}
/**
* Is this an all submissions or, just the largest
* @return true if is is, else false
*/
public String getAllSubmissions()
{
return Validator.check(allSubmissions, "false");
}
/**
* set whether all submissions are to be exposed
* @param pallSubmissions true if it is
*/
public void setAllSubmissions(String pallSubmissions)
{
allSubmissions = pallSubmissions;
}
/**
* DOCUMENTATION PENDING
*
* @return DOCUMENTATION PENDING
*/
public String getRoleSelection()
{
return Validator.check(roleSelection, "N/A");
}
/**
* DOCUMENTATION PENDING
*
* @param proleSelection DOCUMENTATION PENDING
*/
public void setRoleSelection(String proleSelection)
{
roleSelection = proleSelection;
}
/**
* DOCUMENTATION PENDING
*
* @return DOCUMENTATION PENDING
*/
public String getFirstItem()
{
return Validator.check(firstItem, "");
}
/**
* DOCUMENTATION PENDING
*
* @param proleSelection DOCUMENTATION PENDING
*/
public void setFirstItem(String pfirstItem)
{
firstItem = pfirstItem;
}
/**
* reset the fields
*/
public void resetFields()
{
agents = new ArrayList();
setAgents(agents);
}
/**
* encapsulates audio recording info
* @return recording data
*/
public RecordingData getRecordingData()
{
return this.recordingData;
}
/**
* encapsulates audio recording info
* @param rd
*/
public void setRecordingData(RecordingData rd)
{
this.recordingData = rd;
}
/**
* This returns a map of which items actually have answers.
* Used by QuestionScores.
*/
public HashMap getAnsweredItems()
{
return answeredItems;
}
/**
* This stores a map of which items actually have answers.
* Used by QuestionScores.
*/
public void setAnsweredItems(HashMap newItems)
{
answeredItems = newItems;
}
public String getSelectedSectionFilterValue() {
// lazy initialization added by gopalrc - Jan 2008
if (selectedSectionFilterValue == null) {
if (isReleasedToGroups()) {
setSelectedSectionFilterValue(TotalScoresBean.RELEASED_SECTIONS_GROUPS_SELECT_VALUE);
}
else {
setSelectedSectionFilterValue(TotalScoresBean.ALL_SECTIONS_SELECT_VALUE);
}
}
return selectedSectionFilterValue;
}
public void setSelectedSectionFilterValue(String param) {
if (!param.equals(this.selectedSectionFilterValue)) {
this.selectedSectionFilterValue = param;
setFirstRow(0); // clear the paging when we update the search
}
}
public int getFirstRow() {
return firstScoreRow;
}
public void setFirstRow(int firstRow) {
firstScoreRow = firstRow;
}
public int getMaxDisplayedRows() {
return maxDisplayedScoreRows;
}
public void setMaxDisplayedRows(int maxDisplayedRows) {
maxDisplayedScoreRows = maxDisplayedRows;
}
public int getDataRows() {
return scoreDataRows;
}
public void setAllAgents(ArrayList allAgents) {
this.allAgents = allAgents;
}
public ArrayList getAllAgents()
{
log.debug("getAllAgents()");
TotalScoresBean totalScoresBean = (TotalScoresBean) ContextUtil.lookupBean("totalScores");
String publishedId = ContextUtil.lookupParam("publishedId");
SubmissionStatusListener submissionStatusListener = new SubmissionStatusListener();
if (!submissionStatusListener.submissionStatus(publishedId, this, totalScoresBean, false)) {
throw new RuntimeException("failed to call questionScores.");
}
return allAgents;
}
public String getSearchString() {
return searchString;
}
public void setSearchString(String searchString) {
if (StringUtils.trimToNull(searchString) == null) {
searchString = defaultSearchString;
}
if (!StringUtils.equals(searchString, this.searchString)) {
log.debug("setSearchString " + searchString);
this.searchString = searchString;
setFirstRow(0); // clear the paging when we update the search
}
}
public void search(ActionEvent event) {
// We don't need to do anything special here, since init will handle the search
log.debug("search");
}
public void clear(ActionEvent event) {
log.debug("clear");
setSearchString(null);
}
private boolean isFilteredSearch() {
return !StringUtils.equals(searchString, defaultSearchString);
}
public ArrayList findMatchingAgents(final String pattern) {
ArrayList filteredList = new ArrayList();
// name1 example: John Doe
StringBuilder name1;
// name2 example: Doe, John
StringBuilder name2;
for(Iterator iter = allAgents.iterator(); iter.hasNext();) {
AgentResults result = (AgentResults)iter.next();
// name1 example: John Doe
name1 = new StringBuilder(result.getFirstName());
name1.append(" ");
name1.append(result.getLastName());
// name2 example: Doe, John
name2 = new StringBuilder(result.getLastName());
name2.append(", ");
name2.append(result.getFirstName());
if (result.getFirstName().toLowerCase().startsWith(pattern.toLowerCase()) ||
result.getLastName().toLowerCase().startsWith(pattern.toLowerCase()) ||
result.getAgentEid().toLowerCase().startsWith(pattern.toLowerCase()) ||
name1.toString().toLowerCase().startsWith(pattern.toLowerCase()) ||
name2.toString().toLowerCase().startsWith(pattern.toLowerCase())) {
filteredList.add(result);
}
}
return filteredList;
}
/**
* added by gopalrc - jan 2008
* @return
*/
public boolean isReleasedToGroups() {
if (releasedToGroups == null) {
PublishedAssessmentService publishedAssessmentService = new PublishedAssessmentService();
releasedToGroups = publishedAssessmentService.isReleasedToGroups(publishedId);
}
return releasedToGroups;
}
}