/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/sam/trunk/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/TemplateUpdateListener.java $ * $Id: TemplateUpdateListener.java 106463 2012-04-02 12:20:09Z david.horwitz@uct.ac.za $ *********************************************************************************** * * 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.listener.author; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashSet; import java.util.Iterator; import javax.faces.application.FacesMessage; import javax.faces.context.FacesContext; import javax.faces.event.AbortProcessingException; import javax.faces.event.ActionEvent; import javax.faces.event.ActionListener; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.tool.assessment.data.dao.assessment.AssessmentAccessControl; import org.sakaiproject.tool.assessment.data.dao.assessment.AssessmentFeedback; import org.sakaiproject.tool.assessment.data.dao.assessment.AssessmentMetaData; import org.sakaiproject.tool.assessment.data.dao.assessment.AssessmentTemplateData; import org.sakaiproject.tool.assessment.data.dao.assessment.EvaluationModel; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentAccessControlIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentBaseIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentFeedbackIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentTemplateIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.EvaluationModelIfc; import org.sakaiproject.tool.assessment.facade.AgentFacade; import org.sakaiproject.tool.assessment.facade.TypeFacade; import org.sakaiproject.tool.assessment.services.assessment.AssessmentService; import org.sakaiproject.tool.assessment.ui.bean.author.TemplateBean; import org.sakaiproject.tool.assessment.ui.bean.author.IndexBean; import org.sakaiproject.tool.assessment.ui.listener.util.ContextUtil; import org.sakaiproject.tool.assessment.ui.listener.author.TemplateListener; import org.sakaiproject.tool.assessment.util.TextFormat; import org.sakaiproject.util.FormattedText; /** * <p>Description: Action Listener for template updates</p> * <p>Copyright: Copyright (c) 2004</p> * <p>Organization: Sakai Project</p> * @author Ed Smiley * @version $Id: TemplateUpdateListener.java 106463 2012-04-02 12:20:09Z david.horwitz@uct.ac.za $ */ public class TemplateUpdateListener extends TemplateBaseListener implements ActionListener { private static Log log = LogFactory.getLog(TemplateUpdateListener.class); /** * Normal listener method. * @param ae * @throws AbortProcessingException */ public void processAction(ActionEvent ae) throws AbortProcessingException { FacesContext context = FacesContext.getCurrentInstance(); //log.info("DEBUG: TEMPLATE UPDATE LISTENER."); //log.info("debugging ActionEvent: " + ae); //log.info("debug requestParams: " + requestParams); //log.info("debug reqMap: " + reqMap); TemplateBean templateBean = lookupTemplateBean(context); IndexBean templateIndex = (IndexBean) ContextUtil.lookupBean("templateIndex"); String tempName = TextFormat.convertPlaintextToFormattedTextNoHighUnicode(log, templateBean.getTemplateName()); AssessmentService assessmentService = new AssessmentService(); boolean isUnique = assessmentService.assessmentTitleIsUnique(templateBean.getIdString(),tempName,true); //log.debug("*** is unique="+isUnique); if(tempName!=null && (tempName.trim()).equals("")){ String err1=ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.TemplateMessages","templateName_empty"); context.addMessage(null,new FacesMessage(err1)); templateIndex.setOutcome("editTemplate"); return; } if (!isUnique){ String error=ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.TemplateMessages","duplicateName_error"); context.addMessage(null,new FacesMessage(error)); templateIndex.setOutcome("editTemplate"); return; } if (templateBean.getValueMap().get("submissionModel_isInstructorEditable") != null && ((Boolean) templateBean.getValueMap().get("submissionModel_isInstructorEditable")).booleanValue()) { if (templateBean.getSubmissionModel().equals(AssessmentAccessControlIfc.LIMITED_SUBMISSIONS.toString())) { try { String submissionsAllowed = templateBean.getSubmissionNumber().trim(); int submissionAllowed = Integer.parseInt(submissionsAllowed); if (submissionAllowed < 1) { throw new RuntimeException(); } } catch (RuntimeException e){ String error=ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.TemplateMessages","submissions_allowed_error"); context.addMessage(null,new FacesMessage(error)); templateIndex.setOutcome("editTemplate"); return; } } } templateBean.setTemplateName(tempName); updateAssessment(templateBean); // reset the sortedTemplateList in IndexBean - daisyf TemplateListener lis = new TemplateListener(); lis.processAction(null); // reset templateBean templateBean.setNewName(null); templateIndex.setOutcome("template"); } /** * Update an existing assessment. * @param templateBean * @param template * @param props * @return * @throws java.lang.Exception */ /** * @param templateBean * @param templateId template id or "0" if create new * @return true on success * @throws java.lang.Exception */ public boolean updateAssessment(TemplateBean templateBean) { try { String templateIdString = templateBean.getIdString(); AssessmentService delegate = new AssessmentService(); AssessmentBaseIfc template = null; if ("0".equals(templateIdString)) { template = new AssessmentTemplateData(); template.setAssessmentBaseId(Long.valueOf(0)); AssessmentAccessControl aac = new AssessmentAccessControl(); template.setAssessmentAccessControl(aac); aac.setAssessmentBase(template); EvaluationModel em = new EvaluationModel(); template.setEvaluationModel(em); em.setAssessmentBase(template); AssessmentFeedback feedback = new AssessmentFeedback(); template.setAssessmentFeedback(feedback); feedback.setAssessmentBase(template); template.setTypeId(TypeFacade.TEMPLATE_HOMEWORK); // Dunno what these are for, but it won't work without them. template.setStatus(AssessmentTemplateIfc.ACTIVE_STATUS); template.setParentId(Long.valueOf(0)); template.setComments("comments"); template.setInstructorNotification(Integer.valueOf(1)); template.setTesteeNotification(Integer.valueOf(1)); template.setMultipartAllowed(Integer.valueOf(1)); } else { template = (delegate.getAssessmentTemplate(templateIdString)).getData(); } template.setTitle(templateBean.getTemplateName()); if (templateBean.getTemplateAuthor() != null) templateBean.getValueMap().put ("author", TextFormat.convertPlaintextToFormattedTextNoHighUnicode(log, templateBean.getTemplateAuthor())); template.setDescription(templateBean.getTemplateDescription()); // Assessment Access Control AssessmentAccessControlIfc aac = template.getAssessmentAccessControl(); if (aac == null) { aac = new AssessmentAccessControl(); template.setAssessmentAccessControl(aac); aac.setAssessmentBase(template); } aac.setItemNavigation(Integer.valueOf(templateBean.getItemAccessType())); aac.setAssessmentFormat(Integer.valueOf(templateBean.getDisplayChunking())); aac.setItemNumbering(Integer.valueOf(templateBean.getQuestionNumbering())); if (templateBean.getMarkForReview() != null && templateBean.getMarkForReview().equals(Boolean.TRUE)) { aac.setMarkForReview(Integer.valueOf(1)); } else { aac.setMarkForReview(Integer.valueOf(0)); } aac.setSubmissionsSaved(Integer.valueOf(templateBean.getSubmissionModel())); if (templateBean.getValueMap().get("submissionModel_isInstructorEditable") != null && ((Boolean) templateBean.getValueMap().get("submissionModel_isInstructorEditable")).booleanValue()) { if (templateBean.getSubmissionModel().equals(AssessmentAccessControlIfc.UNLIMITED_SUBMISSIONS.toString())) { aac.setSubmissionsAllowed(null); aac.setUnlimitedSubmissions(Boolean.TRUE); } else{ aac.setSubmissionsAllowed(Integer.valueOf(templateBean.getSubmissionNumber())); aac.setUnlimitedSubmissions(Boolean.FALSE); } } else { // if "Number of Submissions Allowed" is not editable, just default to unlimited aac.setSubmissionsAllowed(null); aac.setUnlimitedSubmissions(Boolean.TRUE); } aac.setLateHandling(Integer.valueOf(templateBean.getLateHandling())); if (templateBean.getValueMap().get("automaticSubmission_isInstructorEditable") == null) { templateBean.setValue("automaticSubmission_isInstructorEditable", "false"); } if (templateBean.getAutomaticSubmission()) { aac.setAutoSubmit(Integer.valueOf("1")); } else { aac.setAutoSubmit(Integer.valueOf("0")); } // Evaluation Model EvaluationModelIfc model = template.getEvaluationModel(); if (model == null) { model = new EvaluationModel(); model.setAssessmentBase(template); template.setEvaluationModel(model); } model.setAssessmentBase(template); model.setAnonymousGrading (Integer.valueOf(templateBean.getAnonymousGrading())); model.setToGradeBook(templateBean.getToGradebook()); model.setScoringType(Integer.valueOf(templateBean.getRecordedScore())); // Assessment Feedback AssessmentFeedbackIfc feedback = template.getAssessmentFeedback(); if (feedback == null) { feedback = new AssessmentFeedback(); feedback.setAssessmentBase(template); template.setAssessmentFeedback(feedback); } feedback.setFeedbackDelivery(Integer.valueOf(templateBean.getFeedbackType())); feedback.setFeedbackAuthoring(Integer.valueOf(templateBean.getFeedbackAuthoring())); Boolean canEditFeedbackComponent=(Boolean)templateBean.getValue("feedbackComponents_isInstructorEditable"); // SAK-3573: looks like at some point the "feedbackComponents_isInstructorEditable" were being used // in place of "EditComponent" but // 1) the changes was not done all the way (see TemplateBean, line 99 is missing) and // 2) "EditComponent" was always set to 1 instead of being updated // correctly to provide backward compatibility to old data. -daisyf if (canEditFeedbackComponent.booleanValue()) feedback.setEditComponents(Integer.valueOf("1")); else feedback.setEditComponents(Integer.valueOf("0")); feedback.setShowQuestionText (templateBean.getFeedbackComponent_QuestionText()); feedback.setShowStudentResponse (templateBean.getFeedbackComponent_StudentResp()); feedback.setShowCorrectResponse (templateBean.getFeedbackComponent_CorrectResp()); feedback.setShowStudentScore (templateBean.getFeedbackComponent_StudentScore()); feedback.setShowStudentQuestionScore (templateBean.getFeedbackComponent_StudentQuestionScore()); feedback.setShowQuestionLevelFeedback (templateBean.getFeedbackComponent_QuestionLevel()); feedback.setShowSelectionLevelFeedback (templateBean.getFeedbackComponent_SelectionLevel()); feedback.setShowGraderComments (templateBean.getFeedbackComponent_GraderComments()); feedback.setShowStatistics (templateBean.getFeedbackComponent_Statistics()); //log.info("templateId = " + templateIdString); if ("0".equals(templateIdString)) // New template { template.setCreatedBy(AgentFacade.getAgentString()); template.setCreatedDate(new Date()); } else { template.setCreatedBy(ContextUtil.lookupParam("createdBy")); SimpleDateFormat format = new SimpleDateFormat(); //log.info("Date is " + templateBean.getCreatedDate()); template.setCreatedDate(format.parse (ContextUtil.lookupParam("createdDate"))); } template.setLastModifiedBy(AgentFacade.getAgentString()); template.setLastModifiedDate(new Date()); //** save template before dealing with meta data set delegate.save((AssessmentTemplateData)template); delegate.deleteAllMetaData((AssessmentTemplateData)template); log.debug("**** after deletion of meta data"); HashSet set = new HashSet(); Iterator iter = templateBean.getValueMap().keySet().iterator(); while (iter.hasNext()) { String label = (String) iter.next(); String value = (String) templateBean.getValueMap().get(label).toString(); //log.info("Label: " + label + ", Value: " + value); AssessmentMetaData data = new AssessmentMetaData(template, label, value); set.add(data); } template.setAssessmentMetaDataSet(set); delegate.save((AssessmentTemplateData)template); } catch (RuntimeException ex) { log.error(ex.getMessage(), ex); return false; } catch (ParseException e) { log.error(e.getMessage(), e); return false; } return true; } }