/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/sam/trunk/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/evaluation/HistogramQuestionScoresBean.java $
* $Id: HistogramQuestionScoresBean.java 130512 2013-10-15 23:46:40Z 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.ui.bean.evaluation;
import java.io.Serializable;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Set;
import java.util.TreeSet;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.tool.assessment.ui.bean.util.Validator;
/**
* <p>
* Title: sakaiproject.org
* </p>
*
* <p>
* Description: AAM - form class for edit/access.jsp
* </p>
*
* <p>
* Copyright: Copyright (c) 2003
* </p>
*
* Used to be org.navigoproject.ui.web.form.evaluation.HistogramQuestionScoresForm.java
*
* @author Huong Nguyen
* @version 1.0
*/
public class HistogramQuestionScoresBean
implements Serializable
{
private String assessmentName;
private String title;
/** Use serialVersionUID for interoperability. */
private final static long serialVersionUID = -584855389374044609L;
private String assessmentId;
private String agent;
private String groupName;
private String maxScore; // heighest score
private String totalScore; //total possible score
private String adjustedScore;
private boolean allSubmissions;
private String questionLabelFormat;
private String questionNumber;
private String questionText;
private String questionType;
private String poolName;
private String percentCorrect;
private String partNumber;
private String mean;
private String median;
private String mode;
private String highestRange;
private String standDev;
private String lowerQuartile; //medidan of lowest-median
private String upperQuartile; //median of median-highest
private int interval; // number interval breaks down
private Collection info;
private int[] numStudentCollection =
{};
private String[] rangeCollection =
{};
private int[] columnHeight =
{};
private int arrayLength; //length of array
private String range; // range of student Score lowest-highest
private int numResponses;
private String q1;
private String q2;
private String q3;
private String q4;
String correctAnswer;
private int totalResponses;
private HistogramBarBean[] histogramBars;
private boolean randomType; // this part is a random draw part
private static Log log = LogFactory.getLog(HistogramQuestionScoresBean.class);
/**
* Creates a new HistogramQuestionScoresBean object.
*/
public HistogramQuestionScoresBean()
{
}
/**
* set the agent
*
* @param pagent the agent
*/
public void setAgent(String pagent)
{
agent = pagent;
}
/**
* get the agent
*
* @return the agent
*/
public String getAgent()
{
return Validator.check(agent, "N/A");
}
/**
* get the assessment name
*
* @return the name
*/
public String getAssessmentName()
{
return Validator.check(assessmentName, "N/A");
}
/**
* set the assessment name
*
* @param passessmentName the name
*/
public void setAssessmentName(String passessmentName)
{
assessmentName = passessmentName;
}
/**
* get the question title
*
* @return the title
*/
public String getTitle()
{
return Validator.check(title, "N/A");
}
/**
* set the question title
*
* @param ptitle The title.
*/
public void setTitle(String ptitle)
{
title = ptitle;
}
/**
* get the assessment id
*
* @return the id
*/
public String getAssessmentId()
{
return Validator.check(assessmentId, "0");
}
/**
* set the assessment id
*
* @param passessmentId the id
*/
public void setAssessmentId(String passessmentId)
{
assessmentId = passessmentId;
}
/**
* get the group name
*
* @return the name
*/
public String getGroupName()
{
return Validator.check(groupName, "N/A");
}
/**
* all submissions
*
* @return all submissions true or false
*/
public boolean getAllSubmissions()
{
return allSubmissions;
}
/**
* all submissions
*
* @param pallSubmissions all submissions true or false
*/
public void setAllSubmissions(boolean pallSubmissions)
{
allSubmissions = pallSubmissions;
}
/**
* set the group name
*
* @param pgroupName the name
*/
public void setGroupName(String pgroupName)
{
groupName = pgroupName;
}
/**
* get the range collection
*
* @return the range collection
*/
public String[] getRangeCollection()
{
if (rangeCollection == null)
return new String[0];
return rangeCollection;
}
/**
* set the range collection
*
* @param prange the range collection
*/
public void setRangeCollection(String[] prange)
{
rangeCollection = prange;
}
/**
* get the number of students for each bar
*
* @return the number array
*/
public int[] getNumStudentCollection()
{
if (numStudentCollection == null)
return new int[0];
return numStudentCollection;
}
/**
* set the number of students for each bar
*
* @param pnumStudent the nunber array
*/
public void setNumStudentCollection(int[] pnumStudent)
{
numStudentCollection = pnumStudent;
}
/**
* get column height, or width if horizontal
*
* @return the array of height for each bar
*/
public int[] getColumnHeight()
{
if (columnHeight == null)
return new int[0];
return columnHeight;
}
/**
* set the column heigh array
*
* @param pcolumnHeight the column height array
*/
public void setColumnHeight(int[] pcolumnHeight)
{
columnHeight = pcolumnHeight;
}
/**
* get the number of bars
*
* @return the number
*/
public int getArrayLength()
{
return arrayLength;
}
/**
* set the number of bars
*
* @param parrayLength number
*/
public void setArrayLength(int parrayLength)
{
arrayLength = parrayLength;
}
/**
* get the interval
*
* @return the interval
*/
public int getInterval()
{
return interval;
}
/**
* set the interval
*
* @param pinterval the interval
*/
public void setInterval(int pinterval)
{
interval = pinterval;
}
/**
* get info
*
* @return info
*/
public Collection getInfo()
{
if (info == null)
return new ArrayList();
return info;
}
/**
* set info
*
* @param pinfo info
*/
public void setInfo(Collection pinfo)
{
info = pinfo;
}
/**
* set the maximum score
*
* @return score
*/
public String getMaxScore()
{
return Validator.check(maxScore, "N/A");
}
/**
* set the maximum score
*
* @param pmaxScore maxscore
*/
public void setMaxScore(String pmaxScore)
{
maxScore = pmaxScore;
}
/**
* get the total score
*
* @return the total score
*/
public String getTotalScore()
{
return Validator.check(totalScore, "N/A");
}
/**
* set the total score
*
* @param ptotalScore total score
*/
public void setTotalScore(String ptotalScore)
{
totalScore = ptotalScore;
}
/**
* get the adjusted score
*
* @return the adjusted score
*/
public String getAdjustedScore()
{
return Validator.check(adjustedScore, "N/A");
}
/**
* set the adjusted score
*
* @param padjustedScoret the adjusted score
*/
public void setAdjustedScore(String padjustedScore)
{
adjustedScore = padjustedScore;
}
/**
* get the question number
*
* @return the question number
*/
public String getQuestionNumber()
{
return Validator.check(questionNumber, "N/A");
}
/**
* set the question number
*
* @param pquestionNumber the question number
*/
public void setQuestionNumber(String pquestionNumber)
{
questionNumber = pquestionNumber;
}
/**
* get the question text
*
* @return the question text
*/
public String getQuestionText()
{
return Validator.check(questionText, "N/A");
}
/**
* set the question text
*
* @param pquestionText the question text
*/
public void setQuestionText(String pquestionText)
{
questionText = pquestionText;
}
/**
* get correct answer
*
* @return the correct answer
*/
public String getCorrectAnswer()
{
return Validator.check(correctAnswer, "N/A");
}
/**
* set correct answer
*
* @param pcorrectAnswer the correct answer
*/
public void setCorrectAnswer(String pcorrectAnswer)
{
correctAnswer = pcorrectAnswer;
}
/**
* get the question type
*
* @return the question type
*/
public String getQuestionType()
{
return Validator.check(questionType, "0");
}
/**
* set the the question type
*
* @param pquestionType the question type
*/
public void setQuestionType(String pquestionType)
{
questionType = pquestionType;
}
/**
* get the pool name
*
* @return the pool name
*/
public String getPoolName()
{
return poolName;
}
/**
* set the the pool name
*
* @param qpoolName the pool name
*/
public void setPoolName(String qpoolName)
{
poolName = qpoolName;
}
/**
* get the percent correct
*
* @return the percent correct
*/
public String getPercentCorrect()
{
return Validator.check(percentCorrect, "N/A");
}
/**
* set the percent correct
*
* @param ppercentCorrect the percent correct
*/
public void setPercentCorrect(String ppercentCorrect)
{
percentCorrect = ppercentCorrect;
}
/**
* get the part number
*
* @return the part number
*/
public String getPartNumber()
{
return Validator.check(partNumber, "N/A");
}
/**
* set the part number
*
* @param ppartNumber the part number
*/
public void setPartNumber(String ppartNumber)
{
partNumber = ppartNumber;
}
/**
* get mean
*
* @return mean
*/
public String getMean()
{
return Validator.check(mean, "N/A");
}
/**
* set mean
*
* @param pmean mean
*/
public void setMean(String pmean)
{
mean = pmean;
}
/**
* get median
*
* @return median
*/
public String getMedian()
{
return Validator.check(median, "N/A");
}
/**
* set median
*
* @param pmedian median
*/
public void setMedian(String pmedian)
{
median = pmedian;
}
/**
* get mode
*
* @return mode
*/
public String getMode()
{
return Validator.check(mode, "N/A");
}
/**
* set mode
*
* @param pmode mode
*/
public void setMode(String pmode)
{
mode = pmode;
}
/**
* get the standard deviation
*
* @return the standard deviation
*/
public String getStandDev()
{
return Validator.check(standDev, "N/A");
}
/**
* set the standard deviation
*
* @param pstandDev the standard deviation
*/
public void setStandDev(String pstandDev)
{
standDev = pstandDev;
}
/**
* get the lower quartile
*
* @return the lower quartile
*/
public String getLowerQuartile()
{
return Validator.check(lowerQuartile, "N/A");
}
/**
* set the lower quartile
*
* @param plowerQuartile the lower quartile
*/
public void setLowerQuartile(String plowerQuartile)
{
lowerQuartile = plowerQuartile;
}
/**
* get the upper quartile
*
* @return the upper quartile
*/
public String getUpperQuartile()
{
return Validator.check(upperQuartile, "N/A");
}
/**
* set the upper quartile
*
* @param pupperQuartile the upper quartile
*/
public void setUpperQuartile(String pupperQuartile)
{
upperQuartile = pupperQuartile;
}
/**
* get the first quartile
*
* @return the first quartile
*/
public String getQ1()
{
return Validator.check(q1, "N/A");
}
/**
* set the first quartile
*
* @param pq1 the first quartile
*/
public void setQ1(String pq1)
{
q1 = pq1;
}
/**
* get the second quartile
*
* @return the second quartile
*/
public String getQ2()
{
return Validator.check(q2, "N/A");
}
/**
* set the second quartile
*
* @param pq2 the second quartile
*/
public void setQ2(String pq2)
{
q2 = pq2;
}
/**
* get the third quartile
*
* @return the third quartile
*/
public String getQ3()
{
return Validator.check(q3, "N/A");
}
/**
* set the third quartile
*
* @param pq3 the third quartile
*/
public void setQ3(String pq3)
{
q3 = pq3;
}
/**
* get the fourth quartile
*
* @return the fourth quartile
*/
public String getQ4()
{
return Validator.check(q4, "N/A");
}
/**
* set the fourth quartile
*
* @param pq4 the fourth quartile
*/
public void setQ4(String pq4)
{
q4 = pq4;
}
/**
* get range
*
* @return range
*/
public String getRange()
{
return Validator.check(range, "N/A");
}
/**
* set range
*
* @param prange range
*/
public void setRange(String prange)
{
range = prange;
}
/**
* get the number of responses
*
* @return the number of responses
*/
public int getNumResponses()
{
return numResponses;
}
/**
* set the number of responses
*
* @param pnumResponses the number of responses
*/
public void setNumResponses(int pnumResponses)
{
numResponses = pnumResponses;
}
/**
* get the total number of responses
*
* @return the total number of responses
*/
public int getTotalResponses()
{
return totalResponses;
}
/**
* set the total number of responses
*
* @param ptotalResponses the total number of responses
*/
public void setTotalResponses(int ptotalResponses)
{
totalResponses = ptotalResponses;
}
/**
* HistogramBar arrray
*
* @return HistogramBar arrray
*/
public HistogramBarBean[] getHistogramBars()
{
if (histogramBars != null)
{
return histogramBars;
}
// note we cache this value, calc only once.
int length = getColumnHeight().length;
int[] height = getColumnHeight();
int[] nums = getNumStudentCollection();
String[] range = getRangeCollection();
histogramBars = new HistogramBarBean[length];
for (int i = 0; i < length; i++)
{
histogramBars[i] = new HistogramBarBean();
histogramBars[i].setColumnHeight(Integer.toString(height[i]));
histogramBars[i].setNumStudents(nums[i]);
histogramBars[i].setRangeInfo(range[i]);
}
return histogramBars;
}
/**
* HistogramBar array
*
* @param bars HistogramBar arrray
*/
public void setHistogramBars(HistogramBarBean[] bars)
{
histogramBars = bars;
}
/**
* Do we show detailed statistics for this question
* @return boolean true if we do
*/
public boolean getDetailedStats()
{
if ("True False".equals(questionType) ||
"Multiple Choice".equals(questionType) ||
"Multiple Correct Answer".equals(questionType) ||
"Multiple Correct Single Selection".equals(questionType)
)
{
return false; //shouldn't happen
}
else
{
return true;
}
}
public void setDetailedStats(boolean ignored)
{
}
public boolean getRandomType()
{
return randomType;
}
public void setRandomType(boolean param)
{
randomType= param;
}
// Below added by gopalrc Nov 2007
/**
* added by gopalrc Nov 2007
*
* The set of students with all answers correct for this question
*/
private Set studentsWithAllCorrect;
/**
* added by gopalrc Nov 2007
*
* The set of students who responded to this question
*/
private Set studentsResponded;
/**
* added by gopalrc Nov 2007
*
* Percentage of students in the overall upper 25%
* who got this question right
*/
private String percentCorrectFromUpperQuartileStudents;
/**
* added by gopalrc Nov 2007
*
* Percentage of students in the overall lower 25%
* who got this question right
*/
private String percentCorrectFromLowerQuartileStudents;
/**
* added by gopalrc Nov 2007
*
* Discrimination value of this question
*/
private String discrimination;
/**
* added by gopalrc Dec 2007
*
* Count of selected answer frequencies
* plus numberOfStudentsWithZeroAnswers
*/
private String n;
/**
* added by gopalrc Dec 2007
*
* Number of students who selected no answer
*/
private int numberOfStudentsWithZeroAnswers = 0;
/**
* added by gopalrc Dec 2007
*
* The published item (question) id
*/
private Long itemId;
/**
* added by gopalrc Dec 2007
*
* The published item (question) id
*/
private int numberOfParts;
public String getQuestionLabel() {
if(questionLabelFormat == null){
String label = "Q" + questionNumber;
if(randomType && poolName != null){
label = label + "-Pool:" + poolName;
}
if (getNumberOfParts() > 1) {
return "P" + partNumber + "-" + label;
}
else {
return label;
}
}else{
return MessageFormat.format(questionLabelFormat, questionNumber, partNumber, poolName);
}
}
public void setQuestionLabelFormat(String questionLabelFormat){
this.questionLabelFormat = questionLabelFormat;
}
public void addStudentWithAllCorrect(String agentId) {
if (studentsWithAllCorrect == null) {
studentsWithAllCorrect = new TreeSet();
}
studentsWithAllCorrect.add(agentId);
}
public void addStudentResponded(String agentId) {
if (studentsResponded == null) {
studentsResponded = new TreeSet();
}
studentsResponded.add(agentId);
}
public void clearStudentsWithAllCorrect() {
studentsWithAllCorrect = null;
}
public void clearStudentsResponded() {
studentsResponded = null;
}
public Set getStudentsWithAllCorrect() {
return studentsWithAllCorrect;
}
public Set getStudentsResponded() {
return studentsResponded;
}
public String getDiscrimination() {
return discrimination;
}
public void setDiscrimination(String discrimination) {
this.discrimination = discrimination;
}
public String getPercentCorrectFromUpperQuartileStudents() {
return percentCorrectFromUpperQuartileStudents;
}
public void setPercentCorrectFromUpperQuartileStudents(
String percentCorrectFromUpperQuartileStudents) {
this.percentCorrectFromUpperQuartileStudents = percentCorrectFromUpperQuartileStudents;
}
public String getPercentCorrectFromLowerQuartileStudents() {
return percentCorrectFromLowerQuartileStudents;
}
public void setPercentCorrectFromLowerQuartileStudents(
String percentCorrectFromLowerQuartileStudents) {
this.percentCorrectFromLowerQuartileStudents = percentCorrectFromLowerQuartileStudents;
}
public String getN() {
/*
if (histogramBars == null) return "0";
int numberOfStudents = 0;
for (int i=0; i<histogramBars.length; i++) {
numberOfStudents += histogramBars[i].getNumStudents();
}
int n = numberOfStudents + getNumberOfStudentsWithZeroAnswers();
*/
/*
int n = getNumResponses() + getNumberOfStudentsWithZeroAnswers();
return "" + n;
*/
return n;
}
public void setN(String n) {
this.n = n;
}
public int getNumberOfStudentsWithZeroAnswers() {
return numberOfStudentsWithZeroAnswers;
}
public void setNumberOfStudentsWithZeroAnswers(
int numberOfStudentsWithZeroAnswers) {
this.numberOfStudentsWithZeroAnswers = numberOfStudentsWithZeroAnswers;
}
public Long getItemId() {
return itemId;
}
public void setItemId(Long itemId) {
this.itemId = itemId;
}
public int getNumberOfParts() {
return numberOfParts;
}
public void setNumberOfParts(int numberOfParts) {
this.numberOfParts = numberOfParts;
}
public boolean getShowPercentageCorrectAndDiscriminationFigures() {
return !getQuestionType().equals("3");
}
public int getSumOfStudentResponsesInUndisplayedItemAnalysisColumns() {
if (histogramBars==null || histogramBars.length<13) {
return 0;
}
else {
int sum = 0;
for (int i=12; i<histogramBars.length; i++) {
sum += histogramBars[i].getNumStudents();
}
return sum;
}
}
public String getStudentResponsesInUndisplayedItemAnalysisColumns() {
if (histogramBars==null || histogramBars.length<13) {
return "";
}
else {
String sep = " | ";
StringBuilder responsesbuf = new StringBuilder(sep);
for (int i=12; i<histogramBars.length; i++) {
if (histogramBars[i].getIsCorrect()) {
responsesbuf.append("(" + histogramBars[i].getNumStudents() + ")" + sep);
}
else {
responsesbuf.append(histogramBars[i].getNumStudents() + sep);
}
}
String responses = responsesbuf.toString();
return responses;
}
}
}