package org.sakaiproject.tool.gradebook.ui.helpers.beans;
import java.util.Map;
import org.sakaiproject.service.gradebook.shared.ConflictingAssignmentNameException;
import org.sakaiproject.service.gradebook.shared.GradebookService;
import org.sakaiproject.tool.gradebook.Assignment;
import org.sakaiproject.tool.gradebook.Category;
import org.sakaiproject.tool.gradebook.Gradebook;
import org.sakaiproject.tool.gradebook.business.GradebookManager;
import org.sakaiproject.tool.gradebook.ui.helpers.producers.AuthorizationFailedProducer;
import uk.org.ponder.beanutil.entity.EntityBeanLocator;
import uk.org.ponder.messageutil.TargettedMessage;
import uk.org.ponder.messageutil.TargettedMessageList;
public class GradebookItemBean {
private static final String CANCEL = "cancel";
private static final String SUBMIT = "submit";
private static final String FAILURE = "failure";
public static final Long CATEGORY_UNASSIGNED = -1L;
public Boolean requireDueDate = false;
private TargettedMessageList messages;
public void setMessages(TargettedMessageList messages) {
this.messages = messages;
}
private Map<String, Assignment> OTPMap;
private EntityBeanLocator assignmentEntityBeanLocator;
@SuppressWarnings("unchecked")
public void setAssignmentEntityBeanLocator(EntityBeanLocator entityBeanLocator) {
this.OTPMap = entityBeanLocator.getDeliveredBeans();
this.assignmentEntityBeanLocator = entityBeanLocator;
}
private GradebookManager gradebookManager;
public void setGradebookManager(GradebookManager gradebookManager) {
this.gradebookManager = gradebookManager;
}
private GradebookService gradebookService;
public void setGradebookService(GradebookService gradebookService) {
this.gradebookService = gradebookService;
}
private Long categoryId;
public void setCategoryId(Long categoryId){
this.categoryId = categoryId;
}
private Long gradebookId;
public void setGradebookId(Long gradebookId){
this.gradebookId = gradebookId;
}
public String processActionAddItem(){
Boolean errorFound = Boolean.FALSE;
Gradebook gradebook = gradebookManager.getGradebook(this.gradebookId);
if (!gradebookService.currentUserHasEditPerm(gradebook.getUid())) {
return AuthorizationFailedProducer.VIEW_ID;
}
for (String key : OTPMap.keySet()) {
Assignment assignment = OTPMap.get(key);
//check for null name
if (assignment.getName() == null || assignment.getName().equals("")) {
messages.addMessage(new TargettedMessage("gradebook.add-gradebook-item.null_name"));
errorFound = Boolean.TRUE;
}
//check for null points
if (assignment.getPointsPossible() == null ||
assignment.getPointsPossible().doubleValue() <= 0) {
if (gradebook.getGrade_type() == GradebookService.GRADE_TYPE_PERCENTAGE) {
messages.addMessage(new TargettedMessage("gradebook.add-gradebook-item.invalid_rel_weight"));
} else {
messages.addMessage(new TargettedMessage("gradebook.add-gradebook-item.invalid_points"));
}
errorFound = Boolean.TRUE;
}
// check for more than 2 decimal places
if (assignment.getPointsPossible() != null) {
String pointsAsString = assignment.getPointsPossible().toString();
String[] decimalSplit = pointsAsString.split("\\.");
if (decimalSplit.length == 2) {
String decimal = decimalSplit[1];
if (decimal != null && decimal.length() > 2) {
messages.addMessage(new TargettedMessage("gradebook.add-gradebook-item.invalid_decimal"));
errorFound = Boolean.TRUE;
}
}
}
if (this.requireDueDate == null || this.requireDueDate == Boolean.FALSE) {
assignment.setDueDate(null);
}
if (assignment.isCounted() && !assignment.isReleased()) {
messages.addMessage(new TargettedMessage("gradebook.add-gradebook-item.counted_not_released"));
errorFound = Boolean.TRUE;
}
if (errorFound) {
return FAILURE;
}
if (key.equals(EntityBeanLocator.NEW_PREFIX + "1")){
//We have a new assignment object
Long id = null;
try {
if (this.categoryId != null && this.categoryId != CATEGORY_UNASSIGNED){
id = gradebookManager.createAssignmentForCategory(this.gradebookId, this.categoryId, assignment.getName(),
assignment.getPointsPossible(), assignment.getDueDate(), assignment.isNotCounted(), assignment.isReleased(), assignment.isExtraCredit());
} else {
id = gradebookManager.createAssignment(this.gradebookId, assignment.getName(), assignment.getPointsPossible(),
assignment.getDueDate(), assignment.isNotCounted(), assignment.isReleased(), assignment.isExtraCredit());
}
assignment.setId(id);
//new UIELBinding("Assignment." + key + ".id", id);
messages.addMessage(new TargettedMessage("gradebook.add-gradebook-item.successful",
new Object[] {assignment.getName() }, TargettedMessage.SEVERITY_INFO));
} catch (ConflictingAssignmentNameException e){
messages.addMessage(new TargettedMessage("gradebook.add-gradebook-item.conflicting_name",
new Object[] {assignment.getName() }, "Assignment." + key + ".name"));
errorFound = Boolean.TRUE;
}
} else {
//we are editing an existing object
try {
if (this.categoryId != null && !this.categoryId.equals(CATEGORY_UNASSIGNED)) {
// we need to retrieve the category and add it to the
// assignment
Category cat = gradebookManager.getCategory(categoryId);
if (cat != null) {
assignment.setCategory(cat);
}
} else {
// this assignment does not have a category
assignment.setCategory(null);
}
gradebookManager.updateAssignment(assignment);
messages.addMessage(new TargettedMessage("gradebook.add-gradebook-item.successful",
new Object[] {assignment.getName() }, TargettedMessage.SEVERITY_INFO));
} catch (ConflictingAssignmentNameException e){
messages.addMessage(new TargettedMessage("gradebook.add-gradebook-item.conflicting_name",
new Object[] {assignment.getName() }, "Assignment." + key + ".name"));
errorFound = Boolean.TRUE;
}
}
}
if(errorFound) {
return FAILURE;
}
return SUBMIT;
}
public String processActionCancel(){
return CANCEL;
}
/**
* this is the fetchMethod for the EntityBeanLocator
* @param assignmentId
* @return
*/
public Assignment getAssignmentById(Long assignmentId){
return gradebookManager.getAssignment(assignmentId);
}
}