package org.sakaiproject.lessonbuildertool.tool.beans;
import java.util.ArrayList;
import java.util.List;
import java.util.HashSet;
import java.util.Set;
import java.util.Collection;
import org.sakaiproject.lessonbuildertool.SimplePageComment;
import org.sakaiproject.lessonbuildertool.SimplePage;
import org.sakaiproject.lessonbuildertool.SimplePageItem;
import org.sakaiproject.lessonbuildertool.SimplePageQuestionResponse;
import org.sakaiproject.lessonbuildertool.SimpleStudentPage;
import org.sakaiproject.lessonbuildertool.model.SimplePageToolDao;
import org.sakaiproject.lessonbuildertool.service.GradebookIfc;
import org.sakaiproject.authz.cover.AuthzGroupService;
import org.sakaiproject.authz.api.Member;
import org.sakaiproject.authz.api.AuthzGroup;
public class GradingBean {
public String id;
public String points;
public String jsId;
public String type;
private SimplePageToolDao simplePageToolDao;
private GradebookIfc gradebookIfc;
private SimplePageBean simplePageBean;
public void setSimplePageToolDao(SimplePageToolDao simplePageToolDao) {
this.simplePageToolDao = simplePageToolDao;
}
public void setGradebookIfc(GradebookIfc gradebookIfc) {
this.gradebookIfc = gradebookIfc;
}
public void setSimplePageBean(SimplePageBean simplePageBean) {
this.simplePageBean = simplePageBean;
}
public String[] getResults() {
if(simplePageBean.getEditPrivs() != 0) {
return new String[]{"failure", jsId, "-1"};
}
// Make sure they gave us a valid amount of points.
try {
Double.valueOf(points);
}catch(Exception ex) {
return new String[]{"failure", jsId, "-1"};
}
boolean r = false;
if("comment".equals(type)) {
r = gradeComment();
}else if("student".equals(type)) {
r = gradeStudentPage();
}else if("question".equals(type)) {
r = gradeQuestion();
}
if(r) {
return new String[] {"success", jsId, String.valueOf(Double.valueOf(points))};
}else {
return new String[]{"failure", jsId, "-1"};
}
}
private boolean gradeComment() {
boolean r = false;
SimplePageComment comment = simplePageToolDao.findCommentByUUID(id);
SimplePageItem commentItem = simplePageToolDao.findItem(comment.getItemId());
SimpleStudentPage studentPage = null; // comments on student page only
SimplePageItem topItem = null; // comments on student page only
if(commentItem.getPageId() <= 0) {
studentPage = simplePageToolDao.findStudentPage(Long.valueOf(commentItem.getSakaiId()));
topItem = simplePageToolDao.findItem(studentPage.getItemId());
}
String gradebookId = null;
if (studentPage != null) {
gradebookId = topItem.getAltGradebook();
} else {
gradebookId = commentItem.getGradebookId();
}
if(Double.valueOf(points).equals(comment.getPoints())) {
return true;
}
try {
r = gradebookIfc.updateExternalAssessmentScore(simplePageBean.getCurrentSiteId(), gradebookId, comment.getAuthor(), Double.toString(Double.valueOf(points)));
}catch(Exception ex) {
ex.printStackTrace();
}
if(r) {
List<SimplePageComment> comments;
if(commentItem.getPageId() > 0) {
comments = simplePageToolDao.findCommentsOnItemByAuthor(comment.getItemId(), comment.getAuthor());
}else {
List<SimpleStudentPage> studentPages = simplePageToolDao.findStudentPages(studentPage.getItemId());
List<Long> commentsItemIds = new ArrayList<Long>();
for(SimpleStudentPage p : studentPages) {
commentsItemIds.add(p.getCommentsSection());
}
comments = simplePageToolDao.findCommentsOnItemsByAuthor(commentsItemIds, comment.getAuthor());
}
// Make sure all of the comments by this person have the grade.
for(SimplePageComment c : comments) {
c.setPoints(Double.valueOf(points));
simplePageBean.update(c, false);
}
}
return r;
}
private boolean gradeStudentPage() {
boolean r = false;
SimpleStudentPage page = simplePageToolDao.findStudentPage(Long.valueOf(id));
SimplePageItem pageItem = simplePageToolDao.findItem(page.getItemId());
// the idea was to not update if there's no change in points
// but there can be reasons to want to force grades back to the gradebook,
// particually for group pages where the group may have changed
//if(Double.valueOf(points).equals(page.getPoints())) {
// return new String[] {"success", jsId, String.valueOf(page.getPoints())};
//}
try {
String owner = page.getOwner();
String group = page.getGroup();
if (group == null)
r = gradebookIfc.updateExternalAssessmentScore(simplePageBean.getCurrentSiteId(), pageItem.getGradebookId(), page.getOwner(), Double.toString(Double.valueOf(points)));
else {
group = "/site/" + simplePageBean.getCurrentSiteId() + "/group/" + group;
AuthzGroup g = AuthzGroupService.getAuthzGroup(group);
Set<Member> members = g.getMembers();
// if we have more than one user, in theory some might fail and some succeed. For the
// moment just update the grade
r = true;
for (Member m: members)
gradebookIfc.updateExternalAssessmentScore(simplePageBean.getCurrentSiteId(), pageItem.getGradebookId(),
m.getUserId(), Double.toString(Double.valueOf(points)));
}
}catch(Exception ex) {
System.out.println("Exception updating grade " + ex);
}
if(r) {
page.setPoints(Double.valueOf(points));
simplePageBean.update(page, false);
}
return r;
}
private boolean gradeQuestion() {
boolean r = false;
SimplePageQuestionResponse response = simplePageToolDao.findQuestionResponse(Long.valueOf(id));
SimplePageItem questionItem = simplePageBean.findItem(response.getQuestionId());
r = "true".equals(questionItem.getAttribute("questionGraded")) || questionItem.getGradebookId() != null;
if (questionItem.getGradebookId() != null)
try {
r = gradebookIfc.updateExternalAssessmentScore(simplePageBean.getCurrentSiteId(), questionItem.getGradebookId(), response.getUserId(), Double.toString(Double.valueOf(points)));
}catch(Exception ex) {
System.out.println("Exception updating grade " + ex);
}
if(r) {
response.setPoints(Double.valueOf(points));
// Only set the answer as correct if they got the maximum number of points.
// Unfortunately, points don't map well to the boolean correct/incorrect model,
// but I'd rather not clutter the faculty interface with more options.
if (questionItem.getGradebookPoints() == null || points == null)
return false;
if(Double.valueOf(points).equals(Double.valueOf(questionItem.getGradebookPoints()))) {
response.setCorrect(true);
}else {
response.setCorrect(false);
}
response.setOverridden(true);
simplePageBean.update(response);
}
return r;
}
}